X7$ ?BOOT-U-No boot on volume ߋtve4@%S's:[ S'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۶m< kQ\&kQ&%&[&kQ&xQ&r &v&(%,&kQ:8wkQWkQv"kQiwp%iwp[iwpkQ iwpxQiwpriwpv  &kQ KqIq 9g&|t&$ykQO$XL"kQO$9g&kQO$9g&۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m   @ƎMICROVMS MICROVMS09 SYSTEM DECFILE11B U q~ MICROVMS.[SYS0.SYSHLP]EDTHELP.HLB;111l MICROVMS.NBACKUP/VERIFY _DUB0: _DUA1:[000000]MICROVMS/SAVESET/IMAGE/INTERCHANGE/NOREWIND SYSTEM @ƎY4.4 _::  _DUA1: V4.4 ~   |C.TITLE DATEI Version 2.3 (Find) .ENABL LC ; .CALL DATEI DAT IDATE ; DAT is a 10 character array ; which contains the date or 10 spaces on return. ; IDATE is an optional parameter ; if specified it is assumed to be the date ; to be converted rather than the system date. ; If IDATE is omitted the system is returned. ; The calling sequence is the standard RT-11 Fortran sequence. ; D. N. Tanner ; Livermore, Ca 94550 ; MACRO .CALL ; SETS UP STANDARD SUBROUTINE CALL USING ; THE FORTRAN CALL CONVENTION (JSR PC,SUB) .nlist .MACRO .CALL .NAME .A1,.A2,.A3,.A4,.A5,.A6,.A7,.A8,.A9,.A10,?A .NARG .NUM ;Get number of arguments .NUM = .NUM-1 ;Don't count .NAME .IIF GT .NUM-10. .NUM=10. ;Limit is 10 arguments MOV #A,%5 ;Point R5 to argument list JSR %7,.NAME ;Call subroutine BR .+4+<.NUM*2> ;Branch past argument list A: .BYTE .NUM,0 ;Number of arguments .IIF GT .NUM .WORD .A1 ;Include only arguments needed .IIF GT .NUM-1 .WORD .A2 .IIF GT .NUM-2 .WORD .A3 .IIF GT .NUM-3 .WORD .A4 .IIF GT .NUM-4 .WORD .A5 .IIF GT .NUM-5 .WORD .A6 .IIF GT .NUM-6 .WORD .A7 .IIF GT .NUM-7 .WORD .A8 .IIF GT .NUM-8. .WORD .A9 .IIF GT .NUM-9. .WORD .A10 ; Branch to here, the next instruction in the program .ENDM .list .GLOBL DATEI,IOASC,SAVER,RESTOR .MCALL .DATE DATEI: JSR PC,SAVER ;save Registers CLR MODE CMP (R5)+,#2 ;Test for IDATE Argument BLT 1$ ;No INC MODE ;MODE=1 indicates IDATE argument 1$: MOV (R5),R4 ;Get location of DATE MOV #10.,R1 10$: MOVB SPACE,(R4)+ ;Set output to 10 spaces SOB R1,10$ TST MODE ;Do we have a user date? BEQ 2$ ;No, use system date MOV @2(R5),R0 ;Yes, Get the date for IDATE BR 3$ 2$: .DATE ;System date 3$: MOV R0,R2 ;copy the date, BNE DAT0 ;do we have one? JSR PC,RESTOR ;No, just return with the blanks DAT0: BIC #177740,R0 ;Extract the year from the date ADD #72.,R0 ;offset is 72, can't be earlier than 72 MOV R0,-(SP) ;Save it for later MOV R2,R0 ;Get a new copy of the date ASL R0 ASL R0 ASL R0 SWAB R0 SWAB R2 ASR R2 ASR R2 BIC #177760,R2 ;Extract the month MOV R2,-(SP) ;Save it for later BIC #177740,R0 ;Extract the day MOV R0,I ;Save it for conversion to ASCII MOV (R5),-(SP) ;Save DAT location, Output string .CALL IOASC I,N2,CHR ;Convert day to ASCII MOV (SP)+,R0 ;Restore DAT pointer MOVB CHR,(R0)+ ;Deposit the ASCII day MOVB CHR+1,(R0)+ MOVB #'-,(R0)+ ;Add the dash MOV (SP),R1 ;Get the month and multiply by 3 ; for a table pointer ASL R1 ADD (SP)+,R1 ADD #MOS-3,R1 ;Add in the table start location MOVB (R1)+,(R0)+ ;Deposit the 3 letter month name MOVB (R1)+,(R0)+ MOVB (R1),(R0)+ MOVB #'-,(R0)+ ;Another dash MOV (SP)+,I ;Now get the year MOV R0,-(SP) ;Save the output pointer .CALL IOASC I,N2,CHR ;Convert the year to ASCII MOV (SP)+,R0 ;Restore the DAT pointer MOVB CHR,(R0)+ ;Copy the year MOVB CHR+1,(R0)+ JSR PC,RESTOR ;Restore registers and return MOS: .ASCII /JanFebMarApr/ ;Month name table .ASCII /MayJunJulAug/ .ASCII /SepOctNovDec/ .EVEN I: .WORD 0 N2: .WORD 2 SPACE: .BYTE 40,40 CHR: .WORD 0 MODE: .WORD 0 .END .TITLE FETCH ; Does a device handler fetch into high memory. ; CALL FETCH (DEV) ; DEV is the device name in RAD50 ; On return R0 contains an error code. (Same as Syslib IFETCH) ; Author: D. N. Tanner ; Livermore, Ca 94550 .MCALL .DSTAT, .SETTOP, .FETCH .GLOBL FETCH FETCH: TST (R5)+ ;Bump parameter pointer SUB #10,SP ;Make room for area MOV SP,R1 ;Location of status space .DSTAT R1,(R5) ;Get the device status BIC R0,R0 MOV (SP)+,R1 MOV (SP)+,R1 MOV (SP)+,(SP)+ BCS 4$ ;Device name not found BNE 1$ ;Handler in memory ADD @#50,R2 ;Add current top to handler size .SETTOP R2 CMP R2,R0 BGT 3$ ;No room for handler .FETCH R2, (R5) BIC R0,R0 ;Clear return flag, keeping C bit unchanged BCS 2$ ;Handler not found 1$: RTS PC 2$: INC R0 3$: INC R0 4$: INC R0 RTS PC .END R LINK FIND,FIND=DK:FIND,TSTFIL,NAMCAT,GETFIL/C FETCH,IOASC,DATEI,SAVER ^C FIND File Search Utility Version V01.02 Operating System: RT-11 V4.0, V5.x, TSX+ Author: D. N. Tanner Livermore, Ca 94550 FIND is a device and sub-device file search utility. The program will search devices and .DSK files for a specified file or files. The information displayed is the device name, file name, file size and date. If the file is in a sub-device file that file name is also included. Wild cards are allowed in the file name and file type. The program operates on RT-11 Version 4 and 5 and TSX-Plus. It may work on V3 but has not been tested. It will not work on HT-11 or RT-11 V2C. Page 2 FIND - File Search Utilty FIND searches each physical device on the system for the specified file. Files found are listed on the terminal in the order found. The same devices are searched for files with a DSK file type. This is the Rt-11 Version 5 type for sub-device files. For each sub-device file, that directory is also searched for the file. It is not necessary to have the sub-device files mounted to a LD device. It is also not necessary to search the LD devices unless there are nested subdevices. Wild card, the *, is acceptable as part of the file name to be found. Command Syntax (RT-11 V5) Assuming that FIND.SAV is on the system disk (SY:) then the FIND command syntax is: .FIND filespec [dev:] Where: filespec is the file or files to be located. This should NOT have a device name included. dev: is an optional extra device to be included in the the search. The physical devices to be searched are included in the program, but it can be patched to add or delete devices. Up to 20 physical devices can be searched. The physical devices are searched first and then any sub-device files are searched. The files are listed on the terminal in the order found. An example of a FIND is: The command is: .FIND PROG.RNO The result is: Search for: PROG.RNO Dev. Directory File File Name Size Date DL0: B .DSK PROG .RNO 4 25-SEP-84 The program clears the screen (VT100 assumed) and types the first group of 22 files. If the number of files is greater than 22 then the listing pauses and the program waits for a return to be typed before continuing. See the patches at the end if you do not use a VT100. Page 3 File Specification The file specification can include the * as a wild card. The following forms are allowed. File name File type A B A* B* *A *B A*B C*D *A* *B* Where the letters represent 1 to 6 letters for file names and 1 to 3 letters for the file type. Any file name form can be used with any file type form. Additional Device The optional device specification is to include an additional device in the FIND search. The most likely example is the DY or DX devices which may not have a diskette installed most of the time. If the DY is included in the permanent device tables in FIND then the disk drive will by cycled several times before the system decides that it cannot read a directory. Logical devices or sub-devices can be included in the search, but FIND will look at those directories twice. The first search will be using the physical device name and the second will be using the sub-device file name. If some logical devices have logical device files in them FIND will not search them unless they are mounted and you search that LD. (A nested search version of FIND is planned) FIND Errors The current version has very brief error messages. A device error will result in a "Fetch Error" or a "Lookup Error", no further explaination. In some cases there is no message. Is all cases, errors are ignored and the search continues. File name testing is minimal. Long names are accepted and you just get no matches. Page 4 Command Syntax (RT-11 V4 or V5) If the program is run, as is required in version 4 of RT-11, the program prompts for the file. The input is the same as described above. An example is: .R FIND FIND V01.01> filespec [dev:] Customizing Patches The program has several options which can be changed using SIPP or PATCH. Sub-device file type. The sub-device file type defaults to DSK, the version 5 standard. If some other type is desired such as DEV, location 1000 needs to be changed. The new file type must be entered in octal RAD50 representation of the 3 letter file type. Page Size The page size for the file display is set to 22 lines. Location 1002 contains the page size. If no page pause is desired, enter zero into location 1002. Terminal Type The program assumes a VT100 terminal is being used. If some other terminal is being used, location 1004 can be patched. A zero represents no special terminal, and no screen clear is used. A one indicates a VT100 (default) and a 2 indicates a VT52. Physical Device Names The devices which FIND searches for files and sub-device files start at location 1006. Up to 20 device names can be included in the list. Each device name must be in RAD50 and the list must be ended with a zero. The program is distributed with one device, SY: RAD50 Values For Various Device Names Name RAD50 Name RAD50 Name RAD50 SY 75250 RK0 71126 DX0 16336 DY0 16406 RK1 71127 DX1 16337 DY1 16407 DM0 15446 DW0 16266 DL0 15376 DM1 15447 LD0 45676 DL1 15377 DU0 16146 LD7 45705 DL2 15400 DU1 16267 VM 105610 .MCALL .MODULE .MODULE FIND,RELEASE=V01,VERSION=02,COMMENT=,AUDIT=YES .ENABLE LC ; FIND will locate a file or files on any device on the ; system. It also looks at any sub device file for ; the file. ; The subdevices which are searched must have a file ; type of DSK, but it can be changed. ; ; A single additional physical device can be searched by ; including it in the command string as though it were an ; output device. ; FIND filespec [dev:] ; filespec can be any combination of filename and ; wild card (*) input. ; dev: is optional and specifies an optional ; physical device to be searched after the built in ; devices are searched. ; Author: ; D. N. Tanner ; Livermore, Ca 94550 ; Revision History: ; 15-Dec-84 Initial release ; 21-Sep-86 Changed TSTFIL.MAC to correct character match ; error. .MCALL .PRINT, .EXIT, .LOOKUP, .CLOSE, .SERR, .GTLIN, .TTYIN .GLOBL FIND, IOASC, NAMCAT, TSTFIL, INDEX .GLOBL FETCH, DATEI, GETFIL, R50ASC, IRAD50 DEVTYP:: .RAD50 /DSK/ ;Default subdevice file type PAGSIZ:: .WORD 22. TERTYP:: .WORD 1. ;0 none, 1=VT100, 2=VT52 PHYDEV:: .RAD50 /DL0/ .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 ;Up to 20 devices are allowed. DSKNAM: .BLKW 1200. ;Space for 300 subdevice file names. FIND:: MOV #DSKNAM,R1 MOV #1200.,R2 1$: CLR (R1)+ ;Clear the disk name area. SOB R2,1$ .SERR ;Allow all errors MOV #100.,LINE ;Line count, force a new page .GTLIN #FILNAM,#GREET ;Get the file name line. TSTB FILNAM ;Was a line typed? BEQ EXIT ;no, quit. ; look for an additional physical device. ; it could be in the form dev:=filespec or filspec dev: MOV #ARG9,R5 ;Look for filspec dev: first JSR PC,INDEX ;look for the space. TST R0 BEQ 4$ ;Not found, try dev:=filespec DEC R0 BEQ EXIT ;exit on leading space. ADD #FILNAM,R0 ;add location of input array CLRB (R0)+ ;terminate the file with a null MOV #ALTDEV,R2 ;pointer to alternate device name MOVB (R0)+,(R2)+ ;Copy 3 characters to altdev BEQ 2$ MOVB (R0)+,(R2)+ BEQ 2$ MOVB (R0)+,(R2)+ 2$: MOV #FILNAM,R1 ;reset pointer BR 8$ ;Finish copying the file name part 4$: MOV #ARG7,R5 ;dev:=filespec JSR PC,INDEX ;search for the = TST R0 BEQ 5$ ;= not found MOV #ALTDEV,R2 ;must be dev:=filespec MOV #FILNAM,R1 6$: MOVB (R1)+,R0 BEQ EXIT CMPB #':,R0 BEQ 7$ ;End of the device CMPB #'=,R0 BEQ 8$ ;also allow device without the : MOVB R0,(R2)+ BR 6$ 7$: TSTB (R1)+ ;Skip over the "=" 8$: CLRB (R2)+ ;Terminate with a null CLRB (R2)+ MOV #FILNAM,R2 9$: MOVB (R1)+,R0 BEQ 10$ MOVB R0,(R2)+ ;copy the filespec to the start of ; FILNAM BR 9$ 10$: CLRB (R2)+ MOV #ARG8,R5 JSR PC,IRAD50 ;Convert the device name to RAD50 MOV #PHYDEV,R1 11$: TST (R1) BEQ 12$ TST (R1)+ BR 11$ 12$: MOV ALTRAD,(R1)+ 5$: MOV #ARG2,R5 JSR PC,NAMCAT ;Characterized the file name. ;Info is put into /INFIL/ common area MOV R0,NAMSTA ;Save the status MOV #PHYDEV,DEVPTR CLR CHAN MOV #DSKNAM,FILPTR CLR SUBPTR ;Used to flag device vs subdevice files ;And as a pointer to DSKNAM for output. NXTDEV: MOV DEVPTR,R1 MOV (R1)+,DEVNAM BEQ SUBDEV ;End of physical device search MOV R1,DEVPTR CLR BLKEY ;Tells GETFIL that there is no block in memory MOV #ARG3,R5 JSR PC,FETCH ;Fetch the handler, if required. TST R0 ;Did it work? BEQ L1 ;YES JMP EFETCH EXIT: .EXIT L1: 1$: CLR R1 .LOOKUP #AREA, R1, #DEVNAM ;Do an absolute lookup of the dev. BCC 2$ JMP ELOOK 2$: MOV #ARG4,R5 JSR PC,GETFIL ;Get the next file from the current device TST IFLG BGT 10$ ;End of this directory BLT NXTDEV ; Don't ABORT for now CMP TYPE,DEVTYP ;Is this a subdevice file. BNE 3$ ;No, test the name MOV FILPTR,R1 ;Yes, store the name for later MOV DEVNAM,(R1)+ MOV NAME,(R1)+ MOV NAME+2,(R1)+ MOV TYPE,(R1)+ MOV R1,FILPTR 3$: MOV #ARG5,R5 JSR PC,R50ASC ;Convert the name to ASCII MOV #FTYP+3,R1 ;Shift the file type over one MOV R1,R2 ; and put a . in front INC R2 MOVB -(R1),-(R2) MOVB -(R1),-(R2) MOVB -(R1),-(R2) MOVB #'.,FTYP MOV #FNAME,R1 MOV R1,R2 4$: MOVB (R1)+,R0 ;Remove spaces from the name BEQ 5$ ;Done CMPB R0,#40 ;A space? BEQ 4$ MOVB R0,(R2)+ BR 4$ 5$: CLRB (R2)+ ;Terminate with a null MOV #ARG6,R5 JSR PC,TSTFIL ;Test the name TST R0 BLT 2$ ;No match, next file JSR PC, PFILE ;print the file information BR 2$ ;Next file 10$: .CLOSE CHAN BR NXTDEV ;Next physical device SUBDEV: MOV #DSKNAM,SUBPTR NXTSUB: 1$: CLR BLKEY ;no dir block in memory MOV SUBPTR,R1 TST @R1 BEQ DONE ;No more subdevice files MOV (R1)+,SNAME MOV (R1)+,SNAME+2 MOV (R1)+,SNAME+4 MOV (R1)+,SNAME+6 MOV R1,SUBPTR .LOOKUP #AREA, CHAN, #SNAME BCC 2$ JMP ELOOKS 2$: MOV #ARG4,R5 JSR PC,GETFIL ;Get the next file from the current device TST IFLG BGT 10$ ;End of this directory BLT ABORTS ; This section is not implemented, No nested subdevice files ; CMP TYPE,DEVTYP ;Is this a subdevice file. ; BNE 3$ ;No, test the name ; ; MOV FILPTR,R1 ;Yes, store the name for later ; MOV DEVNAM,(R1)+ ; MOV NAME,(R1)+ ; MOV NAME+2,(R1)+ ; MOV TYPE,(R1)+ ; MOV R1,FILPTR 3$: MOV #ARG5,R5 JSR PC,R50ASC ;Convert the name to ASCII MOV #FTYP+3,R1 ;Shift the file type over one MOV R1,R2 ; and put a . in front INC R2 MOVB -(R1),-(R2) MOVB -(R1),-(R2) MOVB -(R1),-(R2) MOVB #'.,FTYP MOV #FNAME,R1 MOV R1,R2 4$: MOVB (R1)+,R0 ;Remove spaces from the name BEQ 5$ ;Done CMPB R0,#40 ;A space? BEQ 4$ MOVB R0,(R2)+ BR 4$ 5$: CLRB (R2)+ ;Terminate with a null MOV #ARG6,R5 JSR PC,TSTFIL ;Test the name TST R0 BLT 2$ ;No match, next file JSR PC, PFILE ;print the file information BR 2$ ;Next file 10$: .CLOSE CHAN BR 1$ ;Next physical device EFETCH: .PRINT #MSG1 BR NXT ELOOK: .PRINT #MSG2 BR NXT ABORT: .PRINT #MSG3 NXT: .CLOSE CHAN JMP NXTDEV ;Ignore errors ELOOKS: ABORTS: .CLOSE CHAN JMP NXTSUB ;Ignore errors DONE: CMP LINE,#100. ;Did we find any files? BNE 1$ ;YES .PRINT #NOFIL ;Tell user no files found 1$: .EXIT .PAGE ; PFILE ; Prints current file name on the terminal. PFILE: MOV #P1,R5 ;File Date JSR PC,DATEI MOV #P2,R5 ;File size JSR PC,IOASC TST SUBPTR ;Doing a subdirectory BNE 1$ ;Yes MOV #P3,R5 ;Physical Disk JSR PC,R50ASC ;Device name MOV #P3B,R5 JSR PC,R50ASC MOV #P4,R5 JSR PC,R50ASC MOVB #40,DOT BR 2$ 1$: MOV #P3A,R5 ;Subdevice file name JSR PC,R50ASC MOV #P3C,R5 JSR PC,R50ASC MOV #P4A,R5 JSR PC,R50ASC MOVB #'.,DOT 2$: TST PAGSIZ ;Skip the heading and the page if ;Pagsiz is set to zero BEQ 3$ CMP LINE,PAGSIZ BLT 3$ CMP LINE,#100. ;Is this the first time thru. BEQ 6$ ;Prompt for continue message .PRINT #CONT ; Wait for a return 7$: .TTYIN CMPB R0,#12 ;Look for a line feed BNE 7$ ;continue waiting 6$: CMP TERTYP,#1 BLT 4$ BGT 5$ .PRINT #VT100 BR 4$ 5$: .PRINT #VT52 4$: .PRINT #H1 .PRINT #FILNAM .PRINT #H2 MOV #3,LINE 3$: INC LINE MOV #P5,R5 ;File name JSR PC,R50ASC MOV #P6,R5 JSR PC,R50ASC .PRINT #DSK RTS PC .NLIST BIN P1: .WORD 2, FDAT, DATE P2: .WORD 3, SIZE, N4, FSIZ P3: .WORD 3, N3, DEVNAM, DSK P3B: .WORD 3, N6, DEVNAM+2, FN P4: .WORD 3, N3, DEVNAM+6, FT P3A: .WORD 3, N3, SNAME, DSK P3C: .WORD 3, N6, SNAME+2, FN P4A: .WORD 3, N3, SNAME+6, FT P5: .WORD 3, N6, NAME, FN1 P6: .WORD 3, N3, TYPE, FT1 ESC=33 VT100: .ASCII /[2J//[H/<200> VT52: .ASCII /E//H/<200> H1: .ASCII / Search for: /<200> H2: .ASCIZ /Dev. Directory File File Name Size Date/ CONT: .ASCII /Continue .../<200> .EVEN NOFIL: .ASCII /No Files Found/<15><12><0> DSK: .ASCII / : / FN: .ASCII / / DOT: .ASCII / / FT: .ASCII / / .ASCII / / FN1: .ASCii / ./ FT1: .ASCII / / .ASCII / / FSIZ: .ASCII / / FDAT: .ASCII / - - / .BYTE 0,0 .EVEN .PAGE .NLIST BIN ;DATA AREA LINE: .WORD 0 IS: .BLKW 20. FILPTR: .WORD 0 SUBPTR: .WORD 0 SNAME: .WORD 0,0,0,0 FNAME: .WORD 0,0,0 FTYP: .WORD 0,0 ZERO: .WORD 0 DEVPTR: .WORD 0 DEVNAM: .WORD 0, 0, 0, 0, 0 IFLG: .WORD 0 N9: .WORD 9. N3: .WORD 3. N4: .WORD 4. N6: .WORD 6. ARG2: .WORD 2, FILNAM, N1 ARG3: .WORD 1, DEVNAM ARG4: .WORD 1, IFLG ARG5: .WORD 3, N9, NAME, FNAME ARG6: .WORD 2, FNAME, IFLG ARG7: .WORD 2, FILNAM, EQUAL ARG8: .WORD 3, N3, ALTDEV, ALTRAD ARG9: .WORD 2, FILNAM, SPACE AREA: .WORD 0,0,0,0,0 GREET: .ASCII /FIND V01.02> /<200> .EVEN EQUAL: .ASCIZ /=/ SPACE: .ASCIZ / / ALTDEV: .WORD 0,0,0 ALTRAD: .WORD 0 MSG1: .ASCIZ /Fetch error/ MSG2: .ASCIZ /Lookup error/ MSG3: .ASCIZ /FIND-F Directory error, not a valid directory/ .EVEN .PSECT INFIL,GBL,OVR,D INFIL: .WORD FILNAM NAMSTA: .WORD 0 N0: .WORD 0 N1: .WORD 0,0,0 N2: .WORD 0,0,0 T1: .WORD 0,0 T2: .WORD 0,0 FILNAM: .BLKW 40. .WORD 0 ; COMMON /FILE/ .PSECT FILE,GBL,OVR,D NAME: .BLKW 2 TYPE: .BLKW 1 DATE: .BLKW 1 SIZE: .BLKW 1 CHAN: .BLKW 1 ; BLKEY - Directory block in memory, 0 means no block. BLKEY: .BLKW 1 TUSED: .WORD 0 ;Total number of blocks used TFREE: .WORD 0 ;Total Number of free blocks MFREE: .WORD 0 ;Largest free area .END FIND RT-11 LINK V08.04 Load Map Saturday 11-Oct-86 03:03 Page 1 FIND .SAV Title: FIND Ident: V01.02 Section Addr Size Global Value Global Value Global Value . ABS. 000000 001000 = 256. words (RW,I,GBL,ABS,OVR) .INDEX 000001 .IRAD5 000001 .R50AS 000001 .SCOMP 000001 .SYSLB 000001 .FIND 000002 $SYSV$ 000013 .AUDIT 107117 001000 014044 = 3090. words (RW,I,LCL,REL,CON) DEVTYP 001000 PAGSIZ 001002 TERTYP 001004 PHYDEV 001006 FIND 005620 TSTFIL 010234 NAMCAT 011030 GETFIL 011352 FETCH 014142 IOASC 014234 DATEI 014412 SAVER 014764 RESTOR 015012 INFIL 015044 000154 = 54. words (RW,D,GBL,REL,OVR) FILE 015220 000024 = 10. words (RW,D,GBL,REL,OVR) SYS$I 015244 000544 = 178. words (RW,I,LCL,REL,CON) INDEX 015244 IRAD50 015364 RAD50 015422 R50ASC 015600 ISCOMP 015720 SCOMP 015720 SYS$S 016010 000004 = 2. words (RW,D,LCL,REL,CON) $SYSLB 016010 $LOCK 016012 $CRASH 016013 Transfer address = 005620, High limit = 016012 = 3589. words .PS 58,75 .LM 5 .RM 75 .NOJUSTIFY .NOFILL .C FIND .skip .c File Search Utility .C Version V01.02 .skip .c Operating System: RT-11 V4.0, V5.x, TSX+ .skip 3 .c Author: D. N. Tanner .c Livermore, Ca 94550 .skip 3 .fill .p 0 FIND is a device and sub-device file search utility. The program will search devices and .DSK files for a specified file or files. The information displayed is the device name, file name, file size and date. If the file is in a sub-device file that file name is also included. Wild cards are allowed in the file name and file type. The program operates on RT-11 Version 4 and 5 and TSX-Plus. It may work on V3 but has not been tested. It will not work on HT-11 or RT-11 V2C. .pg .c FIND - File Search Utilty .p 0 FIND searches each physical device on the system for the specified file. Files found are listed on the terminal in the order found. The same devices are searched for files with a DSK file type. This is the Rt-11 Version 5 type for sub-device files. For each sub-device file, that directory is also searched for the file. It is not necessary to have the sub-device files mounted to a LD device. It is also not necessary to search the LD devices unless there are nested subdevices. Wild card, the *, is acceptable as part of the file name to be found. .p 0 Command Syntax (RT-11 V5) .p 0 Assuming that FIND.SAV is on the system disk (SY:) then the FIND command syntax is: .skip .nofill .FIND filespec [dev:] .skip Where: .skip filespec is the file or files to be located. This should NOT have a device name included. .skip dev: is an optional extra device to be included in the the search. .fill .p 0 The physical devices to be searched are included in the program, but it can be patched to add or delete devices. Up to 20 physical devices can be searched. .p The physical devices are searched first and then any sub-device files are searched. The files are listed on the terminal in the order found. An example of a FIND is: .skip .nofill The command is: .skip .FIND PROG.RNO .SKIP The result is: .skip Search for: PROG.RNO Dev. Directory File File Name Size Date DL0: B .DSK PROG .RNO 4 25-SEP-84 .skip .fill The program clears the screen (VT100 assumed) and types the first group of 22 files. If the number of files is greater than 22 then the listing pauses and the program waits for a return to be typed before continuing. See the patches at the end if you do not use a VT100. .PG .p 0 File Specification .p The file specification can include the * as a wild card. The following forms are allowed. .skip .nofill File name File type A B A* B* *A *B A*B C*D *A* *B* .skip Where the letters represent 1 to 6 letters for file names and 1 to 3 letters for the file type. .skip Any file name form can be used with any file type form. .fill .p 0 Additional Device .p 0 The optional device specification is to include an additional device in the FIND search. The most likely example is the DY or DX devices which may not have a diskette installed most of the time. If the DY is included in the permanent device tables in FIND then the disk drive will by cycled several times before the system decides that it cannot read a directory. .skip .p 0 Logical devices or sub-devices can be included in the search, but FIND will look at those directories twice. The first search will be using the physical device name and the second will be using the sub-device file name. If some logical devices have logical device files in them FIND will not search them unless they are mounted and you search that LD. (A nested search version of FIND is planned) .skip .p 0 FIND Errors .p 0 The current version has very brief error messages. A device error will result in a "Fetch Error" or a "Lookup Error", no further explaination. In some cases there is no message. Is all cases, errors are ignored and the search continues. .p 0 File name testing is minimal. Long names are accepted and you just get no matches. .PAGE .P 0 Command Syntax (RT-11 V4 or V5) .p 0 If the program is run, as is required in version 4 of RT-11, the program prompts for the file. The input is the same as described above. An example is: .nofill .R FIND FIND V01.01> filespec [dev:] .fill .SKIP .p 0 Customizing Patches .p The program has several options which can be changed using SIPP or PATCH. .P Sub-device file type. .p The sub-device file type defaults to DSK, the version 5 standard. If some other type is desired such as DEV, location 1000 needs to be changed. The new file type must be entered in octal RAD50 representation of the 3 letter file type. .p Page Size .p The page size for the file display is set to 22 lines. Location 1002 contains the page size. If no page pause is desired, enter zero into location 1002. .p Terminal Type .p The program assumes a VT100 terminal is being used. If some other terminal is being used, location 1004 can be patched. A zero represents no special terminal, and no screen clear is used. A one indicates a VT100 (default) and a 2 indicates a VT52. .p Physical Device Names .p The devices which FIND searches for files and sub-device files start at location 1006. Up to 20 device names can be included in the list. Each device name must be in RAD50 and the list must be ended with a zero. The program is distributed with one device, SY: .p 0 RAD50 Values For Various Device Names .skip .lm +5 .nofill Name RAD50 Name RAD50 Name RAD50 .skip SY 75250 RK0 71126 DX0 16336 DY0 16406 RK1 71127 DX1 16337 DY1 16407 DM0 15446 DW0 16266 DL0 15376 DM1 15447 LD0 45676 DL1 15377 DU0 16146 LD7 45705 DL2 15400 DU1 16267 VM 105610  O0 ~d>:& `*   Xe>L>  $L>@?:=ы>@"    7 7 H0z7 xwZw7 . w< 0Hw(  H P3- P 2   w B bbb.B@    ݄ 07 x  `wwwww0ȝN w   #: B bbb.^B@    P T`m w~ݴ w4-dd    f  ^  V P F  >  6 .0 (-N$-FdW ->,   u鈇uzuzEH Search for: Dev. Directory File File Name Size DateContinue ...No Files Found : . - - >*>HLR>JFIND V01.02> = Fetch errorLookup errorFIND-F Directory error, not a valid directory wNwF jt EV% % %)4%8 2 H *@ ?* w46J@w l E+% % %T3%7 h 2 6@ ?\w4>J@w  ? *06: w@7e7e7e7  7 @@*.45UU55|5tU lUfh5Z5RU@JUDJU8<.5U 7 b KXȝb0 w&-(DEhXȝZXb0 w t-p m-ilmw5+5BK ewXȝb0 wvlx 5-~1 wwwwwbwmJF-@8 07mv7m"m"-d\ @f@ g(숀 @@ @CbB`-    D E A@D D e0bb -ҕ*  7 W% D ԝC~ @  EeH& EE7fv (НlНiЕ- eePPPЕ-F& Н2Н/ DJanFebMarAprMayJunJulAugSepOctNovDec *N&f&  >fABΥ D%# ы Cʋ ɋR  ֥% @DB  "R  D f  jՀ e  C b @` ` Z@9/ $#.- ADE % b %e ee e  (@CAB ɋ ʋR åʋҥ  W MACRO FIND MACRO DATEI MACRO FETCH MACRO GETFIL MACRO IOASC MACRO NAMCAT MACRO SAVER MACRO SDIR MACRO TSTFIL .TITLE GETFIL V03.00 11-Oct-86 ; Gets the next entry in the file directory ; for the device opened on channel CHAN ; Call GETFIL(IFLG) ; IFLG - Indicates the results: ; 0 - OK, file returned to common block /file/ ; 1 - End of directory, no more files ; -1 - Error of some kind. ; Common area, .PSECT FILE ; FILE Stores the name date, size of the ; file returned. ; The channel number in use and the ; current device block in memory. ; ; A total of the number of blocks used, ; the number of free blocks and the ; largest free block is maintained. ; The total is available when the ; end of the directory is reached. ; TUSED, TFREE and MFREE should be ; cleared by the calling program before ; the first call to GETFIL. ; BLKEY must be set to 0 by the calling ; program to ensure the start of the ; directory is read. ; File status masks PERM = 2000 EOFSEG = 4000 ; Author: ; D. N. Tanner ; Livermore, CA .GLOBL GETFIL .MCALL .READW GETFIL: TST (R5)+ CLR LCLMAX ;Clear local max free block total TST BLKEY ;Is a block in memory BGT GFIL ;Yes MOV #1,BLKEY ;Set up to read home block .READW #AREA, CHAN, #BUF, #1000, BLKEY BCC 1$ JMP ERROR 1$: CMP SYSID,#"DE ;Is this a RT directory? BNE 11$ MOV SEG1,BLKEY ;Now read the first segment .READW #AREA, CHAN, #BUF, #1000, BLKEY BCC 2$ 11$: JMP ERROR 2$: TST NSEG ;Test the number of segments, In range? BLT ERROR CMP NSEG,#31. BGT ERROR TST NXTSEG BLT ERROR CMP NXTSEG,#31. BGT ERROR MOV #FSTAT,FILPTR ;Pointer to next file MOV #16,R1 ADD XBYTE,R1 ;Number of bytes per file MOV R1,ENTSIZ ;Entry size GFIL: MOV FILPTR,R1 BIT #PERM,@R1 ;Is this a permanent file? BNE 2$ ;YES BIT #EOFSEG,@R1 ;Is this the end of the segment? BEQ IGNORE ;No, it must be an empty or tentative file. MOV NXTSEG,R1 ;Get the next segment number BEQ DONE ;No next segment, we are done. ASL R1 ;Times 2 ADD #4,R1 ;add offset to get the next block MOV R1,BLKEY ;Save it .READW #AREA, CHAN, #BUF, #1000, BLKEY BCC 1$ JMP ERROR 1$: MOV #FSTAT,FILPTR ;Pointer to next file TST NXTSEG BLT ERROR CMP NXTSEG,#31. BGT ERROR BR GFIL ;Get the file 2$: TST (R1)+ MOV (R1)+,NAME MOV (R1)+,NAME+2 MOV (R1)+,TYPE MOV (R1),SIZE ADD (R1),TUSED ;Update the block total MOV 4(R1),DATE ADD ENTSIZ,FILPTR CMP LCLMAX, MFREE ;Did we find a new free max. BLE 3$ ;No MOV LCLMAX, MFREE ;Store the new max free block count 3$: CLR @(R5)+ ;IFLG=0, GOOD RETURN RTS PC IGNORE: MOV FILPTR, R4 ;Save the file pointer ADD 10(R4), TFREE ;Add the free section to the total ADD 10(R4), LCLMAX ;Add the size to the max area. ADD ENTSIZ,FILPTR ;NEXT FILE BR GFIL DONE: CMP LCLMAX, MFREE ;Did we find a new max free area BLE 1$ ;No MOV LCLMAX, MFREE ;Save the new maximum 1$: MOV #1,@(R5)+ ;IFLG=1, no more files. RTS PC ;RETURN ERROR: MOV #-1,@(R5)+ ;IFLG=-1, ERROR RTS PC LCLMAX: .WORD 0 FILPTR: .WORD 0 ENTSIZ: .WORD 0 AREA: .BLKW 5 ; BUF - Space for 2 disk blocks for directory segment BUF: NSEG: .BLKW ;Number of segments NXTSEG: .BLKW ;NEXT SEGMENT MAXSEG: .BLKW ;HIGHEST SEGMENT USED. XBYTE: .BLKW ;NUMBER OF EXTRA BYTES IN DIRECTORY SBLOCK: .BLKW ;STARTING BLOCK FOR THE FILES FSTAT: .BLKW 229. ;file directory area SEG1: .BLKW 1. ;First segment (in home block) .BLKW 13. SYSID: .BLKW 1. ;Used to check home block .BLKW 263. ;Rest of directory segments ; COMMON /FILE/ .PSECT FILE,GBL,OVR,D NAME: .BLKW 2 TYPE: .BLKW 1 DATE: .BLKW 1 SIZE: .BLKW 1 CHAN: .BLKW 1 ; BLKEY - Directory block in memory, 0 means no block. BLKEY: .BLKW 1 TUSED: .BLKW 1 ;Total number of blocks used. TFREE: .BLKW 1 ;Total free blocks in the directory MFREE: .BLKW 1 ;Largest free area in the directory .END .TITLE IOASC V 1.0 .ENABLE LC ; Converts a 16 bit signed integer to ascii. ;Call: ; CALL IOASC(N,NC,ISTR) ; N - The integer to be converted. ; NC - The number of decimal places in the output. ; This is also the number of bytes available in ; ISTR. ; ISTR - The string array for the converted number. ; ISTR must be NC bytes long. ;Macro Calling Sequence: ; MOV #LIST,R5 ;Set up argument list pointer ; JSR PC,IOASC ;Call the routine. ; ; ..... ; ; LIST: .WORD 3,N,NC,ISTR ;Argument list for ASC10 ; N: .WORD 0 ;Number ; NC: .WORD 6. ;Number of characters ; ISTR: .BLKB 6. ;Room for 6 characters ;Author: ; Unknown ;System: ; RT-11 or HT-11 .GLOBL IOASC .MCALL .REGDEF ;For compatability with HT-11 .REGDEF IOASC: TST (R5)+ MOV @(R5)+,R0 ;N MOV @(R5)+,R3 ;NC MOV R3,NC MOV (R5)+,R2 ;ISTR pointer ADD R3,R2 MOV R0,R5 MOV #"- ,R1 ;negative sign if needed MOV #12,R0 TST R5 ;Is N negative? BGE 1$ NEG R5 ;Make N positive SWAB R1 ;Save the minus sign in the upper byte. 1$: CLRB R1 CLR R4 COM R4 2$: ROL R5 BCC 2$ BEQ 5$ 4$: ROLB R1 CMPB R1,R0 BLO 3$ SUB R0,R1 3$: ROL R4 ASL R5 BNE 4$ 5$: COM R4 DEC R3 BMI ERR ADD #'0,R1 ;Convert digit to ASCII MOVB R1,-(R2) ;Store it in ISTR MOV R4,R5 BNE 1$ ;More to convert BR 7$ ;Must be done 6$: MOVB R1,-(R2) MOV #" ,R1 7$: SWAB R1 ;Restore the - (or blank) first time thru. DEC R3 ;Assume there is space BGE 6$ ;Must be! CMPB #'-,R1 ;Out of room, is N negative? BEQ ERR ;Yes, no room for minus sign RTS PC A1: MOVB #'*,(R2)+ ERR: DEC NC BGE A1 RTS PC NC: .WORD 0 .END .TITLE NAMCAT V01 .enabl lc ; Breaks up a file name into parts and determines what ; characteristics it has. ; ; Call: ; NAMSTA = NAMCAT(FN, FN1) ; NAMSTA is set to indicate the status and is returned ; in register R0 ; FN1 is returned with the broken up file name. ; fn1(1, ... 6) - Name before the * ; FN1(7, ... 12)- Name after the * ; FN1(13, ...15)- Type before the * ; FN1(16, .. 18)- Type after the * ; Any parts not used are set to zero ; FN Contains the file name terminated with a null ; NAMSTA Bit values NAMFLG = 1 ;An * occurred in file name DOT = 2 ;A . occurred in the file name TYPFLG = 4 ;An * occurred in the file type NAMCHR = 8. ;There were characters in the file name TYPCHR = 16. ;There were characters in the file type NAMANY = 32. ;There were char surrounded by *'s in the name TYPANY = 64. ;There were char surrounded by *'s in the type ; Author: D. N. Tanner ; Livermore, Ca 94550 .GLOBL NAMCAT NAMSTA: .WORD 0 ;Status word NLOC: .WORD 0 ;Location of FN N1: .WORD 0 ;location of FN1 N2: .WORD 0 ;Location of FN1(7) T1: .WORD 0 ;Location of FN1(13) T2: .WORD 0 ;Location of FN1(16) NAMCAT: TST (R5)+ ;Bump argument pointer MOV (R5)+,NLOC ;Location of FN, the file name MOV (R5)+,R0 ;Location of FN1, the broken up file name MOV R0,N1 ;Store for later ADD #6,R0 ;Adjust the pointer, and store the rest of MOV R0,N2 ; the pointer values. ADD #6,R0 MOV R0,T1 ADD #4,R0 MOV R0,T2 MOV N1,R2 MOV #10.,R1 20$: CLR (R2)+ ;Clear FN1 array DEC R1 BGT 20$ MOV N1,R2 ;set output pointer to first part of FN1 MOV NLOC,R1 ;File name pointer CLR NAMSTA ;File name status 1$: MOVB (R1)+,R0 ;Get a character from the file name BEQ 10$ ;End on a null CMPB R0,#'* ;Is this a * BEQ 5$ ;Yes, record it CMPB R0,#'. ;A name, type separator BEQ 7$ ;Yes, record it BIT #DOT,NAMSTA ;Dot found yet? BNE 2$ ;Yes, doing file type part BIS #NAMCHR,NAMSTA ;Indicate that the name has letters MOVB R0,(R2)+ ;Store the letter in the correct place BR 1$ ;Next! 2$: BIS #TYPCHR,NAMSTA ;Flag a character in the file type. MOVB R0,(R2)+ ;Store the character BR 1$ ;Next character 5$: BIT #DOT,NAMSTA ;Has a dot been found? BNE 6$ ;Yes, must be doing file type part BIT #NAMFLG,NAMSTA ;Is this the second * with a letter BEQ 4$ ;No BIT #NAMCHR,NAMSTA BEQ 4$ BIS #NAMANY,NAMSTA ;Yes , set the any bit 4$: BIS #NAMFLG,NAMSTA ;Set wild name bit MOV N2,R2 ;Reset the pointer to 2nd name part BR 1$ ;Next character 6$: BIT #TYPFLG,NAMSTA ;Is this the second * with a letter BEQ 16$ ;NO BIT #TYPCHR,NAMSTA BEQ 16$ BIS #TYPANY,NAMSTA ;Yes set the any bit 16$: BIS #TYPFLG,NAMSTA ;Set wild type bit MOV T2,R2 ;Reset the output pointer to 2nd part of type BR 1$ ;Next character 7$: BIS #DOT,NAMSTA ;Flag a dot found MOV T1,R2 ;Set the output pointer to 1st part of type BR 1$ ;Next character 10$: MOV NAMSTA,R0 ;Return status BIT #DOT,R0 ;Was a . included? BNE 11$ ;Yes BIS #DOT!TYPFLG,R0 ;No, assume the .* was entered 11$: RTS PC ;bye bye .end .TITLE SAVER V01 ; SAVER ; Saves registers R0 thru R5 on the stack. ; Returns with stack pointer pointing at ; the contents of R0 ; SP--> R0 ; R1 ; R2 ; R3 ; R4 ; R5 ; MAIN PROG ; Call: JSR PC, SAVER ; RESTOR ; Restores registers R0 thru R5 previously saved by SAVER and ; returns to the main program; not the calling routine. ; The carry bit in the status register is preserved. ;Author: D. N. Tanner ; Livermore, Ca 94550 ;Example: ; MAIN Calls SUB1 ; SUB1 Calls SAVER ; SAVER saves registers ; Returns to SUB1 ; SUB1 does its thing ; SUB1 Calls RESTOR ; RESTOR restores registers ; RESTOR returns to MAIN not to SUB1 ; MAIN CONTINUES .MCALL .REGDEF .REGDEF .GLOBL SAVER,RESTOR SAVER: MOV (SP),TMP ;Save return address MOV R5,(SP) ;Put R5 in the place of the return MOV R4,-(SP) ;Now continue to save the rest MOV R3,-(SP) MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) MOV TMP,-(SP) ;Now put the return address back RTS PC ;Return RESTOR: BCS 1$ ;Determine the C bit state and preserve it TST (SP)+ ;Bump the stack past the calling routine BR 2$ 1$: TST (SP)+ ;Bump the stack, and reset the C bit SEC 2$: MOV (SP)+,R0 ;Restore the registers MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 MOV (SP)+,R5 RTS PC TMP: .WORD 0 ;Temporary storage for return address .END R LINK SDIR,SDIR=DK:SDIR,GETFIL/C IOASC,DATEI,SAVER ^C SDIR - Sub-device file Directory Version V02.00 D. N Tanner Livermore, Ca 94550 SDIR will display the directory of the files in a specified subdevice file. The program runs on RT-11 Version 5 and version 4. It will not operate on RT-11 V2C or HT-11. Operation on RT-11 V5 If SDIR.SAV is on SY: the syntax is: .SDIR filespec Where: "filspec" is a normal RT-11 file name. The default device name is SY: and the default file type is .DSK The files are displayed a screen full at a time (22 lines) and then there is a pause for a return to continue. At the end the number of files, total number of blocks, number of free blocks, and the size of the largest free area is listed. (V2.0) Operation on RT-11 V4 If you are running RT-11 Version 4.0 you must run the program. SDIR will prompt for a file name, just enter it as described above. CUSTOMIZING PATCHES The default device and file type for SDIR can can be changed by specifying them as part of the filespec or they can be patched permanently. The default file type is set to DSK. It can be changed by patching location 1000. The new file type must be the RAD50 equivalent. The default device name can be changed by patching locations starting at 1016. The device name is in ASCII and must be terminated with a colon (:) followed by a null (0). The distributed version has a default device of SY: The length of the directory page can be changed by patching location 1010. If the page length is set to zero, no paging will be done. The terminal type is set to a VT100. Each page of the directory will be on a new screen. Location 1012 can be patched to change the terminal. 0 - no screen clear. 1 - VT100, 2 - VT52 .MCALL .MODULE .MODULE SDIR,RELEASE=V02,VERSION=00,COMMENT=,AUDIT=YES .ENABLE LC ; SDIR will display the directory of any subdevice file. ; The assumed subdevice file type is .DSK. ; A default device is stored at DFTDEV:: and it will be ; used unless the user provides a device name. ; The normal default is SY: ; ; SDIR filespec ; filespec is the name of the subdevice file ; Author: ; D. N. Tanner ; Livermore, Ca 94550 .MCALL .PRINT, .EXIT, .CLOSE, .SERR, .GTLIN, .TTYIN, .CSIGEN .GLOBL SDIR, IOASC, INDEX .GLOBL DATEI, GETFIL, R50ASC, IRAD50 DEVTYP:: .RAD50 /DSK/ ;Default subdevice file type .WORD 0,0,0 PAGSIZ:: .WORD 21. TERTYP:: .WORD 1. ;0 none, 1=VT100, 2=VT52 .BYTE 0 FILN: .ASCII /=/ DFTDEV:: .ASCII /SY: / .WORD 0,0,0,0,0,0,0,0,0,0 ;File name space HNDLR: .BLKW 1200. ;Space for device handlers SDIR:: MOV #100.,LINE ;Line count, force a new page .GTLIN #FILNAM,#GREET ;Get the file name line. TSTB FILNAM ;Was a line typed? BEQ EXIT ;no, quit. MOV #ARG9,R5 JSR PC,INDEX ;Look for a : (Device input) MOV #DFTDEV,R2 ;Pointer for file name TST R0 BNE 4$ ;found, use it 1$: CMPB (R2)+,#': ;use default, look for the colon BNE 1$ ; and skip past it 4$: MOV #FILNAM,R1 ;Input file name pointer 5$: MOVB (R1)+,(R2)+ ;Copy name to output BNE 5$ .CSIGEN #HNDLR, #DEVTYP, #FILN BCS ERR MOV #3.,CHAN CLR BLKEY ;no dir block in memory 2$: MOV #ARG4,R5 JSR PC,GETFIL ;Get the next file from the current device TST IFLG BGT 10$ ;End of this directory BLT ABORT INC FILCNT ;Count the file JSR PC, PFILE ;print the file information BR 2$ ;Next file 10$: .CLOSE CHAN TST FILCNT ;Did we find any files? BEQ 20$ ;No, the count is zero MOV #ARG5,R5 JSR PC, IOASC ;Convert file count to ASCII MOV #ARG6, R5 JSR PC, IOASC ;Convert block count to ASCII .PRINT #TOTMSG ;Print the total line MOV #ARG7, R5 JSR PC, IOASC MOV #ARG8, R5 JSR PC, IOASC .PRINT #USEDMG ;# free blocks .EXIT 20$: .PRINT #NOFIL ;Tell user no files found EXIT: .EXIT ERR: MOVB @#52,R0 ;get the error byte BEQ ERR0 CMPB R0,#1 BEQ ERR1 .PRINT #MSG2 BR NXT ERR0: .PRINT #MSG0 ;bad file name BR NXT ERR1: .PRINT MSG1 ;device not found BR NXT ABORT: .PRINT #MSG3 ;abort error NXT: .CLOSE CHAN .EXIT .PAGE ; PFILE ; Prints current file name on the terminal. PFILE: MOV #P1,R5 ;File Date JSR PC,DATEI MOV #P2,R5 ;File size JSR PC,IOASC 2$: TST PAGSIZ ;Skip the heading and the page if ;Pagsiz is set to zero BEQ 3$ CMP LINE,PAGSIZ BLT 3$ CMP LINE,#100. ;Is this the first time thru. BEQ 6$ ;Prompt for continue message .PRINT #CONT ; Wait for a return 7$: .TTYIN CMPB R0,#12 ;Look for a line feed BNE 7$ ;continue waiting 6$: CMP TERTYP,#1 BLT 4$ BGT 5$ .PRINT #VT100 BR 4$ 5$: .PRINT #VT52 4$: .PRINT #H1 .PRINT #FILNAM .PRINT #H2 MOV #3,LINE 3$: INC LINE MOV #P5,R5 ;File name JSR PC,R50ASC MOV #P6,R5 JSR PC,R50ASC .PRINT #FN1 RTS PC .NLIST BIN P1: .WORD 2, FDAT, DATE P2: .WORD 3, SIZE, N4, FSIZ P5: .WORD 3, N6, NAME, FN1 P6: .WORD 3, N3, TYPE, FT1 ESC=33 VT100: .ASCII /[2J//[H/<200> VT52: .ASCII /E//H/<200> H1: .ASCII /Directory for: /<200> H2: .ASCIZ /File Name Size Date/ CONT: .ASCII /Continue .../<200> .EVEN NOFIL: .ASCII /No Files Found in the sub-directory file/<15><12><0> ; abcdef.typ 123456 10-Oct-86 FN1: .ASCii / ./ FT1: .ASCII / / .ASCII / / FSIZ: .ASCII / / FDAT: .ASCII / - - / .BYTE 0,0 .EVEN .PAGE .NLIST BIN ;DATA AREA LINE: .WORD 0 ;Screen line counter ZERO: .WORD 0 ;constant IFLG: .WORD 0 ;flag N3: .WORD 3. ;Constant N4: .WORD 4. ;Constant N5: .WORD 5. ;Constant N6: .WORD 6. ;Constant FILCNT: .WORD 0 ;Number of files ARG4: .WORD 1, IFLG ARG9: .WORD 2, FILNAM, COLON ;File total and block count message area ARG5: .WORD 3, FILCNT, N4, MSGCNT ARG6: .WORD 3, TUSED, N5, MSGSIZ ARG7: .WORD 3, TFREE, N5, USEDMG ARG8: .WORD 3, MFREE, N5, MAXMSG TOTMSG: .ASCII <15><12> ; 1234 Files 12345 Blocks MSGCNT: .ASCII / / .ASCII / Files / MSGSIZ: .ASCIZ / Blocks/ ; 12345 Free blocks, Largest free area is 12345 Blocks USEDMG: .ASCII / Free blocks, Largest free area is / MAXMSG: .ASCII / Blocks/ .BYTE 200,0 .EVEN GREET: .ASCII /SDIR V02.00> /<200> .EVEN COLON: .ASCIZ /:/ MSG0: .ASCIZ /SDIR-F- Bad File name/ MSG1: .ASCIZ /SDIR-F- Device not found/ MSG2: .ASCIZ /SDIR-F- File Not Found/ MSG3: .ASCIZ /SDIR-F- File is not a sub-device/ .EVEN FILNAM: .BLKB 80. .WORD 0 ; COMMON /FILE/ Used by GETFIL routine .PSECT FILE,GBL,OVR,D NAME: .BLKW 2 TYPE: .BLKW 1 DATE: .BLKW 1 SIZE: .BLKW 1 CHAN: .BLKW 1 ; BLKEY - Directory block in memory, 0 means no block. BLKEY: .BLKW 1 TUSED: .WORD 0 ;Total number of blocks used TFREE: .WORD 0 ;Total number of free blocks MFREE: .WORD 0 ;Largest free area .END SDIR RT-11 LINK V08.04 Load Map Saturday 11-Oct-86 04:57 Page 1 SDIR .SAV Title: SDIR Ident: V02.00 Section Addr Size Global Value Global Value Global Value . ABS. 000000 001000 = 256. words (RW,I,GBL,ABS,OVR) .SDIR 000000 .INDEX 000001 .IRAD5 000001 .R50AS 000001 .SYSLB 000001 $SYSV$ 000013 .AUDIT 107120 001000 011760 = 2552. words (RW,I,LCL,REL,CON) DEVTYP 001000 PAGSIZ 001010 TERTYP 001012 DFTDEV 001016 SDIR 005606 GETFIL 007360 IOASC 012150 DATEI 012326 SAVER 012700 RESTOR 012726 FILE 012760 000024 = 10. words (RW,D,GBL,REL,OVR) SYS$I 013004 000454 = 150. words (RW,I,LCL,REL,CON) INDEX 013004 IRAD50 013124 RAD50 013162 R50ASC 013340 SYS$S 013460 000004 = 2. words (RW,D,LCL,REL,CON) $SYSLB 013460 $LOCK 013462 $CRASH 013463 Transfer address = 005606, High limit = 013462 = 2969. words .PS 60,80 .LM 5 .RM 75 .NOJUSTIFY .C SDIR - Sub-device file Directory .SKIP .C Version V02.00 .SKIP .C D. N Tanner .C Livermore, Ca 94550 .SKIP .P 0 SDIR will display the directory of the files in a specified subdevice file. The program runs on RT-11 Version 5 and version 4. It will not operate on RT-11 V2C or HT-11. .P 0 Operation on RT-11 V5 .P 0 If SDIR.SAV is on SY: the syntax is: .NOFILL .skip .SDIR filespec .SKIP Where: "filspec" is a normal RT-11 file name. The default device name is SY: and the default file type is .DSK .FILL .P 0 The files are displayed a screen full at a time (22 lines) and then there is a pause for a return to continue. .P 0 At the end the number of files, total number of blocks, number of free blocks, and the size of the largest free area is listed. (V2.0) .SKIP .P 0 Operation on RT-11 V4 .P 0 If you are running RT-11 Version 4.0 you must run the program. SDIR will prompt for a file name, just enter it as described above. .SKIP .P 0 CUSTOMIZING PATCHES .P 0 The default device and file type for SDIR can can be changed by specifying them as part of the filespec or they can be patched permanently. .P 0 The default file type is set to DSK. It can be changed by patching location 1000. The new file type must be the RAD50 equivalent. .P 0 The default device name can be changed by patching locations starting at 1016. The device name is in ASCII and must be terminated with a colon (:) followed by a null (0). The distributed version has a default device of SY: .P 0 The length of the directory page can be changed by patching location 1010. If the page length is set to zero, no paging will be done. .P 0 The terminal type is set to a VT100. Each page of the directory will be on a new screen. Location 1012 can be patched to change the terminal. 0 - no screen clear. 1 - VT100, 2 - VT52 2Pǰ=SY: d&& K Z  :R& 5$ 7 "   :  ~  \ T  F > R *e 6|ݎ  ^  (-|$- dD  -`   -    } 鈇   }   EHDirectory for: File Name Size DateContinue ...No Files Found in the sub-directory file . - -  4     Files Blocks Free blocks, Largest free area is BlocksSDIR V02.00> :SDIR-F- Bad File nameSDIR-F- Device not foundSDIR-F- File Not FoundSDIR-F- File is not a sub-device 7 b K^ȝh0 w&-(DE^ȝh0 w t-p m-irmw5+5BK ewJ^ȝ<:h0 wvrx 5-~1 wwwwwbwmJF-@8 07m7m"m"- @CbB`-    D E A@D D e0bb -ҕ*  7 W% D ԝC~ @  EeH& EE7fB (НlНiЕ- eePPPЕ-F&| Н2Н/ DJanFebMarAprMayJunJulAugSepOctNovDec *N&f&  fABΥ D%# ы Cʋ ɋR  ֥% @DB  "R  D f  Հ e  C b @` ` Z@9/ $#.- ADE0 % b %e ee e  (@.TITLE TSTFIL V1.1 .ENABLE LC ; This routines does a comparison between an ASCII file ; from the current directory with the input file stored ; in the .psect INFIL. ; The return is in R0 and is 0 if a match is found and ; is -1 if no match is found. ; The input file name can be of the form: ; Code Name Type ; 0 A B ; 1 A* B* ; 2 *A *B ; 3 *A* *B* ; 4 * * ; - A*B A*B This is a combination of ; Types 1 and 2 ; A is converted to A.* ; A. is left as is. ; A* is converted to A*.* ; Where 'A' and 'B' can be 1 or more characters. The * indicates ; Wild card, where any character or characters will match. ; If the file type is omitted and no period (.) is included in ; the name the file type of * is assumed. If a period is ; included then a blank file type is assumed. ; Call from fortran or equal. ; CALL TSTFIL(FILDIR, IFLG) ; FILDIR is file from the current directory to be tested ; IFLG is returned indicating a match. ; 0 a match ; -1 no match ; Author: D. N. Tanner ; Livermore, Ca 94550 ; NAMSTA Bit values NAMFLG = 1 ;An * occurred in file name DOT = 2 ;A . occurred in the file name TYPFLG = 4 ;An * occurred in the file type NAMCHR = 8. ;There were characters in the file name TYPCHR = 16. ;There were characters in the file type NAMANY = 32. ;There were char surrounded by *'s in the name TYPANY = 64. ;There were char surrounded by *'s in the type TYPCLR = DOT!TYPFLG!TYPCHR!TYPANY ;All file type bits NAMCLR = NAMFLG!DOT!NAMCHR!NAMANY ;All file name bits NAM0 = NAMCHR NAM1 = NAMCHR!NAMFLG NAM2 = NAM1 NAM3 = NAMCHR!NAMFLG!NAMANY NAM4 = NAMFLG TYP0 = TYPCHR TYP1 = TYPCHR!TYPFLG TYP2 = TYP1 TYP3 = TYPCHR!TYPFLG!TYPANY TYP4 = TYPFLG .GLOBL TSTFIL, NAMCAT, ISCOMP, INDEX TSTFIL: TST (R5)+ MOV (R5)+,FILDIR ;File from the directory MOV (R5)+,IFLG MOV #ARG1,R5 JSR PC, NAMCAT ;Categorize the directory file ;puts name in D1 and type in DT1 MOV NAMSTA,R0 ;Get status of input file BIC #TYPCLR,R0 CMP #NAM0,R0 ;Is it a type 0 file name "A" BEQ 1$ CMP #NAM1,R0 ;Is it a type 1 BEQ 2$ CMP #NAM3,R0 ;Type 3 BEQ 3$ CMP #NAM4,R0 ;TYPE 4 BEQ 4$ ; ; IF WE GET HERE SOMETHING IS WRONG BR 22$ 1$: MOV #ARG3,R5 ;Type 0, "A" JSR PC, ISCOMP ;Compare N1 with D1 TST R0 ;Did they match BEQ TYPE ;Yes, now test the file type BR 22$ ;Exit, no match 2$: TSTB N1 ;Type 1 or 2 BEQ 25$ ;Type 2 "*A" MOV #N1,R1 ;Type 1 "A*" MOV #D1,R2 21$: MOVB (R1)+,R0 BEQ 23$ MOVB (R2)+,R3 BEQ 22$ CMPB R0,R3 BEQ 21$ ; No Match 22$: MOV #-1,R0 MOV R0,@IFLG RTS PC 23$: TSTB N2 ;Is this also a type 2? (actually A*B) BNE 25$ ;Yes, test the *B part JMP TYPE ;Match, test file type 25$: MOV #T1,R1 ;Type 2 "*A" MOV #D2,R2 26$: TSTB -(R1) ;START AT END AND BACKUP BEQ 26$ 27$: TSTB -(R2) ;Backup in the directory name BEQ 27$ CMPB @R1,@R2 ;Do the characters match? BNE 22$ 28$: MOVB -(R1),R0 BEQ TYPE ;End, means a match MOVB -(R2),R3 BEQ 22$ CMPB R0,R3 BEQ 28$ 29$: JMP 22$ 3$: MOV #ARG4,R5 ;Type 3 "*A*" Search for N2 in D1 JSR PC, INDEX TST R0 BGT TYPE BR 22$ ;No match 4$: BR TYPE ;Type 4 "*" always match TYPE: MOV NAMSTA,R0 BIC #NAMCLR,R0 CMP #TYP0,R0 ;Is it a type 0 file TYPe "A" BEQ 1$ CMP #TYP1,R0 ;Is it a type 1 BEQ 2$ CMP #TYP3,R0 ;Type 3 BEQ 3$ CMP #TYP4,R0 ;TYPE 4 BEQ 4$ 1$: MOV #ARG5,R5 ;Type 0, "A" JSR PC, ISCOMP ;Compare T1 with DT1 TST R0 ;Did they match BEQ DONE ;Yes, they match BR 22$ ;Exit, no match 2$: TSTB T1 ;Type 1 or 2 BEQ 25$ ;Type 2 "*A" MOV #T1,R1 ;Type 1 "A*" MOV #DT1,R2 21$: MOVB (R1)+,R0 BEQ 23$ MOVB (R2)+,R3 BEQ 22$ CMPB R0,R3 BEQ 21$ ; No Match 22$: MOV #-1,R0 MOV R0,@IFLG RTS PC 23$: TSTB T2 ;Is this a type 1 and 2 (B*B) BNE 25$ ;Yes JMP DONE ;Type 1 only, match is done 25$: MOV #FILNAM,R1 ;Type 2 "*A" MOV #DT2,R2 26$: TSTB -(R1) ;START AT END AND BACKUP BEQ 26$ 27$: TSTB -(R2) ;Backup in the directory name BEQ 27$ CMPB @R1,@R2 ;Do the characters match? BNE 22$ 28$: MOVB -(R1),R0 BEQ DONE ;End, means a match MOVB -(R2),R3 BEQ 22$ CMPB R0,R3 BEQ 28$ 29$: JMP 22$ 3$: MOV #ARG6,R5 ;Type 3 "*A*" Search for T2 in DT1 JSR PC, INDEX TST R0 BGT DONE BR 22$ ;No match 4$: BR DONE ;Type 4 "*" always match DONE: CLR @IFLG ;A match RTS PC D0: .WORD 0 D1: .WORD 0,0,0 D2: .WORD 0,0,0 DT1: .WORD 0,0 DT2: .WORD 0,0 IFLG: .WORD 0 ARG1: .WORD 2 FILDIR: .WORD 0, D1 ARG3: .WORD 2, N1, D1 ARG4: .WORD 2, D1, N2 ARG5: .WORD 2, T1, DT1 ARG6: .WORD 2, DT1, T2 .PSECT INFIL,GBL,OVR,D INFIL: .WORD FILNAM NAMSTA: .WORD 0 N0: .WORD 0 N1: .WORD 0,0,0 N2: .WORD 0,0,0 T1: .WORD 0,0 T2: .WORD 0,0 FILNAM: .BLKW 40. .WORD 0 .END FIND and SDIR change record. FIND: V01.00 Initial release 15-Dec-84 V01.01 Revised wild card handling to fix a bug for the *AB* search case. 21-Sep-86 V01.02 Revised FILE psect in FIND.MAC to be consistant with the new version of GETFIL. No functional change. 11-Oct-86 SDIR: V01.00 Initial Release 15-Dec-84 V02.00 Added file count, block total, free block total and size of largest free area to end of the directory list. Changed SDIR.MAC, GETFIL.MAC 11-Oct-86 Distribution Record: CompuServe PDP-11 SIG September 1984 SAV and DOC files only FIND Y01.00 Test version w/ odd address bug. SDIR V01.00 Spring 85 DECUS RT-11 SIG Tape FIND V01.00, SDIR V01.00 CompuServe PDP-11 SIG September 1986 FIND V01.01, SAV and DOC files only CompuServe PDP-11 SIG October 1986 SDIR V02.00, SAV and DOC files only Fall 86 DECUS RT-11 SIG Tape FIND V01.02, SDIR V02.00 FIND and SDIR Subdevice file utility programs Submitted to Fall 1986 DECUS RT-11 SIG Tape By: D. N. Tanner Livermore, Ca 94550 FIND V01.01 is a device and sub-device file search utility. The program will search devices and .DSK files for a file or files. The the device name, file name, file size and date are displayed. If the file is in a sub-device file that name is also included. Wild cards are allowed in the file name and file type. Operates on RT-11 Version 4 and 5 and TSX+ Possibly on V3 but has not been tested. It will not work on HT-11 or RT-11 verion 2C. FIND currently does not readed nested sub-device files. SDIR V02.00 will will display the directory of any subdevice file. There is no need to MOUNT the file to a logical device. SDIR operates with RT-11 V5 or V4 and TSX+. It will not operate with RT-11 V2C or HT-11. At the end of the file listing, the total number of files, blocks used, free blocks and the largest free area is displayed. These are revised versions replacing versions on the Spring 1985 DECUS RT-11 SIG Tape. File Directory FIND .COM 1 22-Sep-84 -- Links FIND FINDA .COM 1 15-Dec-84 -- Assembles FIND and SDIR SDIR .COM 1 28-Sep-84 -- Links SDIR FIND .DOC 14 11-Oct-86 -- Documentation for FIND SDIR .DOC 5 11-Oct-86 -- Documentation for SDIR DATEI .MAC 7 15-Dec-84 -- Subroutine, Date to ASCII FETCH .MAC 2 15-Dec-84 -- Subroutine, Fetch a handler FIND .MAC 19 11-Oct-86 -- FIND main program GETFIL.MAC 8 11-Oct-86 -- Gets a directory file entry IOASC .MAC 4 28-Nov-81 -- Integer to ASCII conversion NAMCAT.MAC 7 15-Dec-84 -- File name category SAVER .MAC 4 15-Feb-75 -- Saves and restores registers SDIR .MAC 11 11-Oct-86 -- SDIR main program TSTFIL.MAC 10 15-Dec-84 -- Does a wild card file name test FIND .MAP 3 11-Oct-86 -- FIND program link map SDIR .MAP 2 11-Oct-86 -- SDIR program link map FIND .RNO 13 11-Oct-86 -- Runoff source for FIND.DOC SDIR .RNO 4 11-Oct-86 -- Runoff source for SDIR.DOC FIND .SAV 15 11-Oct-86 -- FIND program SDIR .SAV 12 11-Oct-86 -- SDIR program README.1ST 5 11-Oct-86 -- This file CHG .REC 2 11-Oct-86 -- Change record t JSR PC,40$ JSR PC,40$ ; MOV (SP)+,R1 ;Restore MOV (SP)+,R3 ; MOV (SP)+,R2 ; RTS PC ;Exit ; ; 10$: DEC R2 ;Dec X DEC R3 ;Dec Y, bottom left BR 50$ ;Go plot ; 20$: INC R2 ;Inc X INC R3 ;Inc Y, top right BR 50$ ;Go plot ; 30$: DEC R2 ;Dec X INC R3 ;Inc Y, top left BR 50$ ;Go plot ; 40$: INC R2 ;Inc X DEC R3 ;Dec Y, bottom right BR 50$ ;Go plot ; 50$: MOV R2,-(SP) ;Preserve X location MOV R3,-(SP) ;Preserve Y location ; COMB R3 ;Make Y0 = Bottom SWAB R3 ;Align Y location CLRB R3 BIS #VIDENB,R3 ;Enable video MOV R3,CSR0 ;Write CSR0 ; BIC #177000,R2 ;Isolate X location BIS #READ,R2 ;Set Read MOV R2,CSR1 ;Write CSR1 BIC #READ,R2 ;Clear Read ; MOV CSR0,R1 ;Read Color COMB R1 ;Compliment it BIC #177770,R1 ;Isolate it SWAB R1 ASL R1 ;Align it ASL R1 ADD R1,R2 ;Add it to X location MOV R2,CSR1 ;Plot dot in complimented color ; MOV (SP)+,R3 ;Restore Y location MOV (SP)+,R2 ;Restore X location RTS PC ;Exit .END START V.@eD yshy:}hTh.hlhvoxh( N @@ U$  U  D  L  R fE wh5f;flr|CU E E`w&f  & C  @  $&f   ` & @  x` fC L H DC > : 6C qt 0 , (C "      CU EU@E@AE B`Vbj|W $######D##@##<##8###~#(#############"#"#@~#8z#8#4# 70#$# P7 # fm" #" 7"" 7 n# fmn" w|$xvr wj v"fm:"Vm6"R 7 "-#-##7 #l"7 " !! % w#w!t"]w!p"Z-6- "-" :"--=6("--36 +̹ʹ"" ȹ  !x@ ff& e? w0#-!  7r! m!N 7r! 7r!B m!*!x# ( WB!wpZ!C rB rDpE>!DpmAC!!: 6 6t?ĸ    6 v" m v"sv@ fit '3? RJC~ v` - N I`  v" B   3ܷ? ַ?з a v"    3? C ?e w $w  e e\ lL-8-0-)0l ---ɼ8 ɠewt jm` 7 nd ^X %`@@m6 7 F@w :4 ~| @  xj d~w  -F/ 5L  | % t- 5  X ȦȢ .%tp  \wtr ,7|hf 7nh dv70^( P 7 X 7w:255f m-5 m5 mzew w|ǷzA 27NJwlǷjA\ j 7TR r 7JH R 7@> Z 762 .$ . 7 6 7  7 7 7 7 ,jRlR7wƮƪ-(  <  7Ɩ%lRjjRfb^w\7Z`VXR   EvUpEh R.Fwx& J62"$ T   q o l- e  EUŌ--   n p 6 ^``Ŗ 5JH  m8mmm f eK~w--  5?    ~ 7ķāw 7  = 6:   dm\RmZVmTNmF<r  o  2 m*m"mm B Q* t T = mmmmîì-  -7  5?  : C  fm,m ( f ~nK  67 &  nnK    b w -»+ (  785  ~H^\ ں B~-  ~~\ |  7r7zH   7rl7f% ^V TLP~H H  e~b e"fpl 7 T"&   7r7   7r7d   7  7~-7f  P wĹW  7   @   @ 7t t7v\p .  7r^ X  7rH 77 zw x$ 7 6tEtWtE@`WtE@` 5ָ t 5ȸ Wt@`WtEWt@`6WtE 5 tBPtPDwd)& ά  D     a`W  E=J @B1 1 ## 5 7    ?e @- 7 57  n b f  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ f 7vv U~7vf6p6rf  6p`@  6r @ fX   7 6 67R67| x7rpe  7 Z6 67678 47.,e dm  m 6 66766e 6 667r66eX m` F mN  X>    B>%> ef$  7\ 7ƴ 7e m7 7m7xm7 m|7z vN~7{ D 7 \X7 VR NUTnK0.,* ~ ew~wԳ г7 ij³nKpK r7 7 wwnK  PH efx t7 dDbf^b7`X\ JnKZXVT nK   rn nKJB , 7 7 fز Բ7 IJ²7  7 7 .  v څw^ 7 tr7lw~|dx7><7`8w6w4mJ.\ 7 F 7: 7 (  7  7   7  z 7  h  7  -   7t m -  hmh n 7J X t -n H d \ 7( 4m4 L -H B m 2 7 f   aa  7 67 6 6 67 7 67 67 667 67x 7 67z 6 6 67V 7X 67D 67< 6 67* 67" 67 67 7 67    m 7    m 7 7 7 7 7 e    6   6 6  6 `  r6N n ^66$$a e(w nK     <nK   ڮ V7 F > w 7 w )W nW kW [  b l,  -  9  2  ? ? %:7 64-21-.(-& 7~  7t  7:  70 "  w<  ܭ-ح-ԭέ7 Pf @ B7 %w  "   7 x 47 n 6d 6 @ BBa0B Ba D  7   r wB h r 7. wp" N 7 %7  0 wp N& 7 %7 %- E U %5zb Z d \   l67 FEx x Uf f( $ ,7  47~ w  N< 8<"$-H H !0  J"    w7 ƟŸȟ5n  h l>> *  CDaaaB  `\ &----  ~a@`>a whl@ BZ  w w!7 z n lf   ~w VvJErw!@ ^  ?P T @!g ?6 & ( , @!Sw!D? EU    w 0Ν Ɲ ʝ%w!D?7 vEU  E~5^o X  mxBmh- s7!p-l i b- v -!D -/   ڜ?؜Eܜ  Ĝ-V3-PRH? EU ? E  f l?^ C!w 6 B- 6` !m,  $?"E& [!_ 6 M!Q  Ctޛ 4v %5?  o ~ x  ? ?`z w! l ?h -Z -r HD JB($,e} uh0WDDW0hu }*HrT`X`&`a&`&`&`&`>ЃȓY.aT:v[0aq(qHf,XWrBYfVt&`tu.upuuuzT&`Bb&`&`&`cs:q&`2a&`&`&`&`&`&`Pu&`&`&``&`ja&`zsV`ބ&\]J]^ ^&`\b~l&`??&D&&D&*6NZfrn8n^ ^^ ^ "<r !!!!%%$$&#"'&'&'&&''"#"#0J B\ww(w\wB8 """"P ""Tpp >@@@@>" "" ||P p8Hp8r rDpp  p @pT*T@@@pp ( DDH HP    8pp$">" 8          8 "B   """"B"    P     8pp ! 8   @8 @8 8 8    ""B"    .MCALL .MODULE .MODULE VTMAC,VERSION=02,COMMENT= ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ; VTMAC IS A LIBRARY OF MACRO CALLS AND MNEMONIC DEFINITIONS WHICH ; PROVIDE SUPPORT OF THE VT11 DISPLAY PROCESSOR. THE MACROS PRODUCE ; CALLS TO THE VT11 DEVICE SUPPORT PACKAGE, USING GLOBAL REFERENCES. ; MACRO TO GENERATE A MACRO WITH ZERO ARGUMENTS. .MACRO MAC0 NAME,CALL .MACRO NAME .GLOBL CALL JSR PC,CALL .ENDM .ENDM ; MACRO TO GENERATE A MACRO WITH ONE ARGUMENT .MACRO MAC1 NAME,CALL .MACRO NAME ARG .IF NB,ARG MOV ARG,%^O0 .ENDC .GLOBL CALL JSR PC,CALL .ENDM .ENDM ; MACRO TO GENERATE A MACRO WITH TWO OPTIONAL ARGUMENTS .MACRO MAC2 NAME,CALL .MACRO NAME ARG1,ARG2 .GLOBL CALL .IF NB,ARG1 MOV ARG1,%^O0 .ENDC .IF NB,ARG2 MOV ARG2,-(SP) .IFF CLR -(SP) .NARG T .IF EQ,T CLR %^O0 .ENDC .ENDC JSR PC,CALL .ENDM .ENDM ; MACRO LIBRARY FOR VT11: MAC0 <.CLEAR>,<$VINIT> MAC0 <.STOP>,<$VSTOP> MAC0 <.START>,<$VSTRT> MAC1 <.INSRT>,<$VNSRT> MAC1 <.REMOV>,<$VRMOV> MAC1 <.BLANK>,<$VBLNK> MAC1 <.RESTR>,<$VRSTR> MAC1 <.STAT>,<$VSTPM> MAC1 <.LPEN>,<$VLPEN> MAC1 <.SCROL>,<$VSCRL> MAC2 <.TRACK>,<$VTRAK> MAC0 <.LNKRT>,<$VRTLK> MAC0 <.UNLNK>,<$VUNLK> ; MNEMONIC DEFINITIONS FOR THE VT11 DISPLAY PROCESSOR DJMP=160000 ;DISPLAY JUMP DNOP=164000 ;DISPLAY NOP DJSR=173400 ;DISPLAY SUBROUTINE CALL DRET=173400 ;DISPLAY SUBROUTINE RETURN DNAME=173520 ;SET NAME REGISTER DSTAT=173420 ;RETURN STATUS DATA DHALT=173500 ;STOP DISPLAY AND RETURN STATUS DATA CHAR=100000 ;CHARACTER MODE SHORTV=104000 ;SHORT VECTOR MODE LONGV=110000 ;LONG VECTOR MODE POINT=114000 ;POINT MODE GRAPHX=120000 ;GRAPH X MODE GRAPHY=124000 ;GRAPH Y MODE RELATV=130000 ;RELATIVE VECTOR MODE INT0=2000 ;INTENSITY 0 INT1=2200 INT2=2400 INT3=2600 INT4=3000 INT5=3200 INT6=3400 INT7=3600 LPOFF=100 ;LIGHT PEN OFF LPON=140 ;LIGHT PEN ON BLKOFF=20 ;BLINK OFF BLKON=30 ;BLINK ON LINE0=4 ;SOLID LINE LINE1=5 ;LONG DASH LINE2=6 ;SHORT DASH LINE3=7 ;DOT DASH STATSA=170000 ;LOAD STATUS REG A LPLITE=200 ;INTENSIFY ON LPEN HIT LPDARK=300 ;DON'T INTENSIFY ITAL0=40 ;ITALICS OFF ITAL1=60 ;ITALICS ON SYNC=4 ;POWER LINE SYNC STATSB=174000 ;LOAD STATUS REG B INCR=100 ;GRAPH PLOT INCREMENT INTX=40000 ;INTENSIFY VECTOR OR POINT MAXX=1777 ;MAXIMUM X INCR. - LONGV MAXY=1377 ;MAXIMUM Y INCR. - LONGV MINUSX=20000 ;NEGATIVE X INCREMENT MINUSY=20000 ;NEGATIVE Y INCREMENT MAXSX=17600 ;MAXIMUM X INCR. - SHORTV MAXSY=77 ;MAXIMUM Y INCR. - SHORTV MISVX=20000 ;NEGATIVE X INCR. - SHORTV MISVY=100 ;NEGATIVE Y INCR. - SHORTV "@O$) ChC>y69XBSBy%2;M%Cq%R+C+z+ѫW+Y:CMwFs:E|̫F`<}LV}DXjjf%:LpsK{Zp{);d~?SгDCv~@@HC@Mw@@L@V}@@Lp@@);d@^Cq@=|HS  Chh>Ch~>yhJ6h29XhBShnf  $%7 7 7 7 7 +  f & f  lC MwLLp $(V},0>LDCHLJ);dRCq\L`CqvCqI| wC Lp);dCv~A~@SгDCv~@HC@Mw@L@=|HS  BByh2;MhCqh*Jf $  wf 1 e% CCv~0Mw>L~ASгDH@V}@@j@j@Lp@@@@p@=|HSN @ XRhPCh8zh@ѫWhHV}HpPpV~BSгDp@ǫ:@8Y@>Y@:@HC@s:@E|@DX@f%:@@vsK@{@Z@yBx@Jwkf@{@=|HS 쩀 EkYhYsKDX"E|$DX(0DX8Fs:N\:hvǫ:n:| weww<f%:p>Y8Y8Y${(Z.yBxf,5f   * $V 7 7 ? E ,we5 5  5OVsKC>Y$>Y68Y>Z@{DDXHpL>YPsK^sKl>Y!j. UEA f   eww*">Y2Z6{P{ZJwkf^~= SгD HyBxH JwkfHƩH=|HS 쩀 NCv~h᫈h6}h᫆hVphg~ǫ:hh,8Yh>Yh:hFChMwhFhs:hE|h6̫F`h <}hhhLhV}h~hDXh0jhjhf%:hhLphhsKh{hhZhh^ph{h );dhh'쩀 ,^ ` 7 I% 2%@,?r9 %\.D?Twww"% %ww?z:BHZhn<|$   f #TTA T@_?@@?_`__k(ththT(T(t,^ `De& "2 48:RT%  Z j.5 DE 7a$DEv 7anj    b  l ՐU  0J   6,^ `,} =6<Bf6( LC.MODULE PUTSTR,VERSION=03,COMMENT=,LIB=YES C C THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED C OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. C C COPYRIGHT (c) 1986 BY DIGITAL EQUIPMENT CORPORATION. C ALL RIGHTS RESERVED. C SUBROUTINE PUTSTR ( LUN, AREA, CC, ERR ) LOGICAL*1 AREA(1), CC, ERR ERR = .FALSE. !INITIALIZE ERROR FLAG IF (CC.NE.0) GOTO 1 !BRANCH IF CC NON-0 WRITE (LUN,9,END=2,ERR=3) (AREA(I),I=1,LEN(AREA)) GOTO 4 1 WRITE (LUN,9,END=2,ERR=3) CC,(AREA(I),I=1,LEN(AREA)) GOTO 4 2 ERR = -1 !END-OF-FILE GOTO 4 3 ERR = -2 !HARDWARE ERROR 4 RETURN 9 FORMAT (250(250A1)) END C.MODULE GETSTR,VERSION=02,COMMENT=,LIB=YES C C THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED C OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. C C COPYRIGHT (c) 1986 BY DIGITAL EQUIPMENT CORPORATION. C ALL RIGHTS RESERVED. C SUBROUTINE GETSTR( LUN, AREA, MAXLEN, ERR ) LOGICAL*1 AREA (1),ERR ERR = .FALSE. !INITIALIZE ERROR FLAG READ(LUN,9,END=1,ERR=2) ITMP,(AREA(I),I=1,MAXLEN) AREA(MAXLEN+1)=0 !TERMINATE STRING CALL TRIM(AREA) !GET RID OF TRAILING BLANKS IF (ITMP.GT.MAXLEN) ERR=-3 !LOOK FOR RECORD LENGTH ERROR GOTO 3 1 ERR = -1 !END-OF-FILE GOTO 3 2 ERR = -2 !HARDWARE ERROR 3 RETURN 9 FORMAT(Q,250(250A1)) END .TITLE DEMOBG .IDENT /V05.00/ ; DEMONSTRATION PROGRAM TO PRINT DEMONSTRATION MESSAGE, THEN ; RING BELL IF FG JOB SENDS A MESSAGE. .MCALL .RCVDC,.PRINT START:: .RCVDC #AREA,#BUFFER,#400,#MSGIN ;POST REQUEST FOR MESSAGE .PRINT #MSG ;PRINT DEMONSTRATION MESSAGE BR . ;AND LOOP ; COMPLETION ROUTINE ENTERED WHEN FG SENDS MESSAGE MSGIN: .PRINT #BELL ;RING BELL IN RESPONSE TO MESSAGE .RCVDC #AREA,#BUFFER,#400,#MSGIN ;POST ANOTHER MESSAGE REQUEST RETURN ;AND RETURN FROM COMPLETION ROUTINE ; ASCII MESSAGES .NLIST BEX BELL: .BYTE 7,200 ;MESSAGE THAT RINGS BELL MSG: .ASCII /RT-11 DEMONSTRATION PROGRAM/<15><12> .ASCII /IF INCORRECTLY EDITED,THIS IS THE LAST LINE./<15><12> ; .ASCII /WELL DONE./ .BYTE 0 AREA: .BLKW 6 ;EMT ARGUMENT AREA BUFFER: ;RCVDC MESSAGE AREA .END START .TITLE DEMOFG .IDENT /V05.00/ ; FOREGROUND DEMONSTRATION PROGRAM TO PRINT MESSAGE TO BACKGROUND, THEN ; QUEUE A MESSAGE EVERY 2 SECONDS FOR THE BACKGROUND TO RING THE BELL. .MCALL .SDATC,.PRINT,.MRKT,.QSET,.SPND START:: .PRINT #MSG ;PRINT INTRODUCTORY MESSAGE .QSET #QUEUE,#100. ;SET ASIDE 100 Q ELEMENTS FOR MESSAGES .MRKT #AREA,#TIME,#MKTC,#1 ;SET UP MKTIM FOR 2 SECONDS FROM NOW .SPND ;SUSPEND THE FG TILL MKTIM SATISFIED ; MKTIM COMPLETION ROUTINE MKTC: CMP MSGCNT,#90. ;90 MESSAGES QUEUED YET? BGT MKTC1 ;YES-NO SENSE QUEUEING ANOTHER .SDATC #AREA,#BUFFER,#1,#SDATC ;SEND MESSAGE TO BG INC MSGCNT ;BUMP MESSAGE COUNTER MKTC1: .MRKT #AREA,#TIME,#MKTC,#1 ;SET UP ANOTHER MKTIM FOR 2 SECONDS RETURN ;RETURN FROM COMPLETION ROUTINE ; SDAT COMPLETION ROUTINE SDATC: DEC MSGCNT ;ONE OF THE MESSAGES HAS BEEN RECIEVED RETURN ;RETURN(RTS PC) ; ASCII MESSAGES .NLIST BEX MSG: .ASCII /FOREGROUND DEMONSTRATION PROGRAM/<15><12> .ASCII /SENDS A MESSAGE TO THE BACKGROUND PROGRAM "DEMOBG"/<15><12> .ASCIZ /EVERY 2 SECONDS, TELLING IT TO RING THE BELL./ .EVEN MSGCNT: .WORD 0 ;MESSAGE COUNTER ;TIME CONSTANT TIME: .WORD 0 ;HIGH ORDER .WORD 60.*2 ;60 TICKS A SECOND,2 SECONDS AREA: .BLKW 6 ;EMT ARGUMENT AREA BUFFER: .BLKW 400 ;BUFFER FOR MESSAGES ;QUEUE AREA QUEUE: .BLKW 100.*10. ;10. WORDS PER QUEUE ELEMENT FOR THE XM MONITOR .END START .TITLE EXAMP.MAC (VERSION PROVIDED) .MCALL .TTYOUT, .EXIT, .PRINT N = 70. ;NO. OF DIGITS OF 'E' TO CALCULATE ; 'E' = THE SUM OF THE RECIPROCALS OF THE FACTORIALS ; 1/0! + 1/1! + 1/2! + 1/3! + 1/4! + 1/5! + ... EXP: .PRINT #MESSAG ;PRINT INTRODUCTORY TEXT MOV #N,R5 ;NO. OF CHARS OF 'E' TO PRINT FIRST: MOV #N+1,R0 ;NO. OF DIGITS OF ACCURACY MOV #A,R1 ;ADDRESS OF DIGIT VECTOR SECOND: ASL @R1 ;DO MULTIPLY BY 10 (DECIMAL) MOV @R1,-(SP) ;SAVE *2 ASL @R1 ;*4 ASL @R1 ;*8 ADD (SP)+,(R1)+ ;NOW *10, POINT TO NEXT DIGIT DEC R0 ;AT END OF DIGITS? BNE SECOND ;BRANCH IF NOT MOV #N,R0 ;GO THRU ALL PLACES, DIVIDING THIRD: MOV -(R1),R3 ;BY THE PLACES INDEX MOV #-1,R2 ;INIT QUOTIENT REGISTER FOURTH: INC R2 ;BUMP QUOTIENT SUB R0,R3 ;SUBTRACT LOOP ISN'T BAD BCC FOURTH ;NUMERATOR IS ALWAYS < 10*N ADD R0,R3 ;FIX REMAINDER MOV R3,@R1 ;SAVE REMAINDER AS BASIS ;FOR NEXT DIGIT ADD R2-2(R1) ;GREATEST INTEGER CARRIES ;TO GIVE DIGIT DEC R0 ;AT END OF DIGIT VECTOR? BNE THIRD ;BRANCH IF NOT MOV -(R1),R0 ;GET DIGIT TO OUTPUT FIFTH: SUB #10.,R0 ;FIX THE 2.7 TO .7 SO ;THAT IT IS ONLY 1 DIGIT BCC FIFTH ;(REALLY DIVIDE BY 10) ADD #10+'0,R0 ;MAKE DIGIT ASCII .TTYON ;OUTPUT THE DIGIT CLR @R1 ;CLEAR NEXT DIGIT LOCATION DEC R5 ;MORE DIGITS TO PRINT? BNE FIRST ;BRANCH IF YES .EXIT ;WE ARE DONE EXP: .REPT N+1 .WORD 1 ;INIT VECTOR TO ALL ONES .ENDR MESSAG: .ASCII /THE VALUE OF E IS:/ <15><12> /2./ <200> .EVEN .END EXP C EXAMP.FOR (VERSION PROVIDED) C THIS PROGRAM PRODUCES A PLOT ON THE TERMINAL C OF AN EXTERNAL FUNCTION, FUN(X,Y) C THE LIMITS OF THE PLOT ARE DETERMINED BY THE DATA STATEMENTS C "STAB" IS FILLED WITH A TABLE OF HEIGHT FLAGS C "STRING" IS USED TO BUILD A LINE OF GRAPH FOR PRINTING SCAL(ZMIN,ZMAX,MAXZ,K)=ZMIN+FLOAT(K-1)*(ZMAX-ZMIN)/FLOAT(MAXZ-1) LOGICAL*1 STRING(13,3),STAB(100) DATA XMIN,XMAX,MAXX/-5,5,45/ DATA YMIN,YMAX,MAXY/-5,5,72/ DATA FMIN,FMAX/0.0,1.0/ CALL SCOPY('- 1 2 3 4 5 6 7 8 9 +',STAB) MAXF=LEN(STAB) DO 20 IX=1,MAXX X=SCAL(XMIN,XMAX,MAXX,IX) CALL REPEAT('*',STRING,MAXY) IF(IX.EQ.1 .OR. IX.EQ.MAXX) GOTO 20 DO 10 IY=2,MAXY-1 Y=SCAL(YMIN,YMAX,MAXY,IY) IFUN=2+INT(FLOAT(MAXF-3)*(FUN(X,Y)-FMIN)/(FMAX-FMIN)) 10 STRING(IY)=STAB(MIN0(MAXF,MAX0(1,IFUN))) 30 CALL PUTSTR(7,STRING,' ') CALL EXIT END FUNCTION FUN(X,Y) R=SQRT(X**2+Y**2) FUN=X*Y*R*EXP(-R))**2 RETURN END WE HOLD THESE TRUTS TO BEE SELF-EVIDENT, THAT ALL MEN ARE CREATED EQUAL, THAT THEY HAVE UNRELIABLE TENDENCIES OF WHICH THEY AR ENDOWED BY THEIR CREATOR, THAT AMONG THESE ARE LIFE, LIBERTY AND HAPLENESS. Sample Keypad Editing Session - //DATE// This file has been designed especially for the sample editing session that is described in Chapter 1 of the PDP-11 Keypad Editor User's Guide. After you have completed the sample session described in Chapter 1, you may use this file to practice other keypad editor functions and commands, if you like. ABOUT THE SAMPLE SESSION Your general task for the sample session is to insert the date you begin working with the keypad editor into your own copy of this file. The date is //DATE// . Sample Keypad Editing Session, "section" 2 lakdjhfuierbhnv a678237yfg^90(4#!! The PDP-11 Keypad Editor is distributed in two versions. KED is for use with VT100 terminals that have keypads, and K52 is for use with VT52 terminals. As you work through a file with the keypad editor, the editor displays 24 lines of the file on your screen. One of the lines always shows the keypad editor cursor, the flashing symbol that is always somewhere on your screen. The cursor identifies the character that will be erased if you use one of the erasing functions. It also marks the location in your file where the editor will insert what you type on the keyboard. //DATE// is the date you started to learn to use the keypad editor. If KED is the first video-oriented editor you have used, welcome to a new world of fast, clear responses to editing functions. If you already have used a video-oriented editor, welcome to DIGITAL's contribution for users of the RT-11, RSX-11M, and RSX-11M-PLUS operating systems. If the experience of other users is valid for you also, you will be confident about using the keypad editor with a day or two after //DATE// . .MCALL .MODULE .MODULE EL,VERSION=06,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, ; MASSACHUSETTS. ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL. .SBTTL ABSTRACT .ENABL LC .SBTTL COMDITIONAL ASSEMBLY SUMMARY .SBTTL DEFINITIONS .MCALL .DATE, .DRDEF, .GTIM .MCALL .PRINT, .DSTAT, .Assume .MCALL .ADDR ERL$G = 1 .IIF NDF ERL$U ERL$U = 10. .IIF NDF ERL$S ERL$S = 1 .Assume ERL$U LE 34.,MESSAGE=<;EL: Too Many Loggable Units> .DRDEF EL,2,RONLY$,ERL$S+1,0,0 .DRPTR UNLOAD=UNLOAD .DREST CLASS=DVC.PS .MACRO BCS. LABEL,?ALT BCC ALT JMP LABEL ALT: .ENDM SYSPTR = 54 CONFIG = 300 FBMON$ = 1 CONFG2 = 370 CACHE$ = 1 SYSGEN = 372 PNPTR = 404 UNITMK = 7 GOODIO = -1 PARERR = -2 CCHERR = -3 PCHERR = -4 O.UNIT = 0 O.ID = 1 O.ERL = 2 O.ERR = 4 O.READ = 6 O.WRIT = 12 STALEN = 7. D.SIZE = 0 D.RNUM = 1 D.DVUN = 2 D.DVID = 3 D.RTRY = 4 D.OCUR = 5 D.DATE = 6 D.HOT = 10 D.LOT = 12 D.BLKN = 14 D.BUFF = 16 D.WCNT = 20 D.REGN = 22 D.MTRY = 23 D.REG = 24 DEVFIX = 10. M.SIZE = 0 M.RNUM = 1 M.TYPE = 2 M.MREG = 3 M.OCUR = 4 M.DATE = 6 M.HOT = 10 M.LOT = 12 M.PC = 14 M.PS = 16 M.REG = 20 PARMAX = 16. PARFIX = 8. MSYSER = 177744 MCONRG = 177746 MHITMS = 177752 .SBTTL INSTALLATION CODE .ASECT . = 200 BR 10$ BR 20$ 10$: MOV @#SYSPTR,R0 BIT #FBMON$,CONFIG(R0) BNE 20$ TST (PC)+ 20$: SEC RETURN UNLOAD: MOV @R5,R5 MOV $ELPTR-ELLQE(R5),R0 TST (R0)+ CLR @R0 RETURN .Assume . LE 400,MESSAGE=<;Installation area overflow> .SBTTL SET OPTIONS .DRSET LOG, NOP, O.LOG, NO .DRSET PURGE, NOP, O.PURG .ENABL LSB O.LOG: BR 5$ NOP BR O.NLOG 5$: CALL FINDRV BCS O.BAD MOV @#SYSPTR,R2 MOV R1,R0 ADD #CNFGW1-ELLQE,R0 TST (R0) BNE 10$ MOV CONFIG(R2),(R0)+ MOV SYSGEN(R2),(R0)+ MOV R1,-(SP) ADD #GETDAT-ELLQE,(SP) CALL @(SP)+ 10$: MOV R1,R2 ADD #$ELCPY-ELLQE,R2 BR 20$ O.NLOG: CALL FINDRV BCS O.GOOD CLR R2 20$: MOV $ELPTR-ELLQE(R1),R0 TST (R0)+ MOV R2,(R0) BR O.GOOD .DSABL LSB O.PURG: CALL FINDRV BCS O.BAD MOV #1,PNXREC-ELLQE(R1) MOV #1,PNXBLK-ELLQE(R1) CLR PNXWRD-ELLQE(R1) CLR $ELFLG-ELLQE(R1) RETURN FINDRV: .ADDR #DEVNAM,R0 .ADDR #DAREA,-(SP) EMT 342 BCS O.BAD MOV DAREA+4,R1 BEQ O.BAD O.GOOD: TST (PC)+ O.BAD: SEC RETURN DAREA: .BLKW 4 DEVNAM: .RAD50 /EL / .Assume . LE 1000,MESSAGE=<;Set area overflow> .SBTTL DRIVER REQUEST ENTRY POINT .DRBEG EL MOV ELCQE,R4 MOV Q$WCNT(R4),R2 BEQ ELDONE BLT ELERR MOV Q$BUFF(R4),R1 .ADDR #$ELHDR,R0 MOV (R4),R3 BGT 10$ CMP R2,#$HDLEN BLE 30$ MOV #$HDLEN,R2 BR 20$ 10$: ADD #$ELBFR-$ELHDR,R0 CMP (R4),#ERL$S BGT ELEOF DEC R3 SWAB R3 ASL R3 ADD R3,R0 ADD R2,R3 ADD R2,R3 SUB #ERL$S*256.*2,R3 BLE 30$ ASR R3 SUB R3,R2 20$:; MOV R2,Q$WCNT(R5) 30$: MOV (R0)+,(R1)+ DEC R2 BGT 20$ BR ELDONE ELEOF: BIS #EOF$,@-(R4) BR ELDONE ELERR: BIS #HDERR$,@-(R4) ELINT: ELDONE: .DRFIN EL .SBTTL $ELCPY - START OF COPY CODE $ELCPY: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) CLR -(SP) INC CERECR CMPB R4,#GOODIO BGT DEVERR BLT MEMERR DEC CERECR CALL GESTAT BCS 20$ ADD #O.READ,R0 TST Q$WCNT(R5) BEQ 20$ BPL 10$ ADD #O.WRIT-O.READ,R0 10$: ADD #1,(R0)+ ADC (R0) 20$: JMP $ELXIT .SBTTL DEVERR - DEVICE ERROR RECORD LOGGER DEVERR: CALL GESTAT BCS 10$ INC O.ERR(R0) MOV R0,(SP) 10$: TST PNXWRD BEQ 40$ CLR R1 CALL CHKSIZ ADD (R0),R0 MOV R4,R1 CLRB R1 BISB Q$UNIT(R5),R1 BICB #<^CUNITMK>,R1 CMP R1,D.DVUN(R0) BNE 40$ CMPB R4,D.RTRY(R0) BGE 40$ MOV R0,-(SP) MOV R2,-(SP) ADD #D.REG,R0 MOVB R3,R1 20$: CMP (R0)+,(R2)+ BNE 30$ DEC R1 BGT 20$ 30$: MOV (SP)+,R2 MOV (SP)+,R0 TST R1 BNE 40$ INCB D.OCUR(R0) MOVB R4,D.RTRY(R0) TST (SP) BEQ 80$ ADD #O.ERL,(SP) INC @(SP) BR 80$ 40$: MOVB R3,R1 ADD #DEVFIX,R1 CALL CHKSIZ BCS. $ELERR 50$: TST (SP) BEQ 60$ ADD #O.ERL,(SP) INC @(SP) 60$: MOVB R1,(R0)+ MOVB PNXREC,(R0)+ INC PNXREC MOVB Q$UNIT(R5),(R0) BICB #<^CUNITMK>,(R0)+ SWAB R4 MOVB R4,(R0)+ SWAB R4 MOVB R4,(R0)+ MOVB #1,(R0)+ CALL GETDAT MOV (R5)+,(R0)+ TST (R5)+ MOV (R5)+,(R0)+ MOV (R5)+,(R0)+ MOV R3,(R0)+ MOVB R3,R3 70$: MOV (R2)+,(R0)+ DEC R3 BGT 70$ ASL R1 ADD R1,PNXWRD NEG R1 MOV R1,(R0) 80$: BR $ELXIT .SBTTL MEMERR - MEMORY ERROR RECORD LOGGER STKDPC = 36 STKDPS = 40 MEMERR: CMPB R4,#PARERR BNE 20$ 10$: INC CMPARE BR 30$ 20$: INC CCPARE CMPB R4,#PCHERR BEQ 10$ 30$: TST PNXWRD BEQ 40$ CLR R1 CALL CHKSIZ ADD (R0),R0 CMPB M.TYPE(R0),#PARERR BGT 40$ CMP STKDPC(SP),M.PC(R0) BNE 40$ INC M.OCUR(R0) BR 100$ 40$: MOV R5,-(SP) MOV #PARMAX,R1 50$: TST (R5)+ BEQ 60$ DEC R1 BGT 50$ 60$: MOV (SP)+,R5 NEG R1 ADD #PARMAX,R1 MOV R1,R3 ASL R1 ADD #PARFIX,R1 MOV @#SYSPTR,R0 BIT #CACHE$,CONFG2(R0) BEQ 70$ ADD #3,R1 70$: CALL CHKSIZ BCS $ELERR MOVB R1,(R0)+ MOVB PNXREC,(R0)+ INC PNXREC MOVB R4,(R0)+ MOVB R3,(R0)+ MOV #1,(R0)+ CALL GETDAT MOV STKDPC(SP),(R0)+ MOV STKDPS(SP),(R0)+ 80$: MOV @(R5),(R0)+ MOV (R5)+,(R0)+ DEC R3 BGT 80$ MOV @#SYSPTR,R3 BIT #CACHE$,CONFG2(R3) BEQ 90$ MOV @#MSYSER,(R0)+ MOV @#MCONRG,(R0)+ MOV @#MHITMS,(R0)+ 90$: ASL R1 ADD R1,PNXWRD NEG R1 MOV R1,(R0) 100$: BR $ELXIT .SBTTL $ELXIT - EXIT ROUTINES $ELERR: TST (PC)+ $ELFLG: .WORD 0 BNE 10$ MOV SP,$ELFLG .ADDR #E.FULL,R0 .PRINT 10$: INC CMENTB $ELXIT: TST (SP)+ MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN .SBTTL GESTAT - GET POINTER TO DEVICE STATISTICS ENTRY GESTAT: MOVB Q$UNIT(R5),-(SP) BIC #<^CUNITMK>,(SP) MOV R4,R0 CLRB R0 BIS R0,(SP) .ADDR #DEVSTS,R0 MOV #ERL$U,R1 10$: CMP (R0),#-1 BEQ 40$ CMP (R0),(SP) BEQ 60$ ADD #STALEN*2,R0 DEC R1 BGT 10$ TST (PC)+ 20$: .WORD 0 BNE 30$ .ADDR #E.STAT,R0 .PRINT MOV SP,20$ 30$: TST (SP)+ BR 70$ 40$: MOV #STALEN,R1 50$: CLR (R0)+ DEC R1 BGT 50$ MOV #-1,(R0) SUB #STALEN*2,R0 MOV (SP),(R0) 60$: TST (SP)+ TST (PC)+ 70$: SEC RETURN .SBTTL CHKSIZ - CHECK FOR ROOM IN LOGGING BUFFER CHKSIZ: MOV PNXWRD,R0 ADD R1,R0 ADD R1,R0 CMP R0,#255.*2 BLT 10$ CMP PNXBLK,SMAXSZ BGE 20$ CALL 10$ MOV #-1,(R0) INC PNXBLK CLR PNXWRD 10$: MOV PNXBLK,R0 DEC R0 SWAB R0 ASL R0 ADD PNXWRD,R0 .ADDR #$ELBFR,R0,ADD TST (PC)+ 20$: SEC RETURN .SBTTL GETDAT - PLACE DATE/TIME IN RECORD GETDAT: MOV R0,-(SP) .ADDR #ELAREA,R0 MOV #21*400,(R0) MOV (SP),2(R0) ADD #2,2(R0) .GTIM .DATE MOV R0,@(SP) MOV (SP)+,R0 ADD #6,R0 RETURN .SBTTL TEXT .NLIST BEX E.FULL: .NLCSI TYPE=I,PART=PREFIX .ASCIZ /W-Buffer is full, logging suspended/ E.STAT: .NLCSI TYPE=I,PART=PREFIX .ASCIZ /W-Device statistics table is full/ .EVEN .LIST BEX .SBTTL IMPURE DATA AREA ELAREA: .BLKW 2 $ELHDR: OFIXED: .WORD <<7*ERL$U+2>*2> DEVSTS: .WORD -1 .BLKW <7*ERL$U> CERECR: .WORD 0 CMENTB: .WORD 0 CMENTF: .WORD 0 CMENTR: .WORD 0 CMPARE: .WORD 0 CCPARE: .WORD 0 PNXREC: .WORD 1 PNXBLK: .WORD 1 PNXWRD: .WORD 0 SMAXSZ: .WORD ERL$S CNFGW1: .WORD 0 CNFGW2: .WORD 0 INIDAT: .WORD 0 INTIM1: .WORD 0 INTIM2: .WORD 0 $HDLEN = <.-$ELHDR>/2 .Assume $HDLEN LE 256.,MESSAGE=<;Header too long> $ELBFR: .BLKW .DREND EL .END 4#" " & & A CA6 2S t+nd %F[Uw G,T8 2w h#w 8wj | -x>[-r8W-l2S>,5 !   e9,5@|ߋ*'|  0 w B5 G +w , 5׭# $ߋ*> 0 ߋ*0ק*wHw$ w >w >ߋ*r&f> lre0 0 e^e7 \ X5 T5JeV np 7n Hɝ  @       w tw Hw Vw b w sw zw r & >& 7}7|7t7u7r7o7lPL7 J7 H7 7 T7 v7 v7 tjjf'  wV?ERROUT-W-?ERROUT-F-Invalid commandChannel errorDevice fullDevice not foundFile not found Insufficient memoryInput errorOutput errorInternal errorProtected file already existsOutput file full Nz""_M<>""XqԀSERRLOG-+"+@鈅Bt (a,A  && &w bw  . ,  '"$   !  H" TTD  $ YL^w AAQzQJ&> ERROR LOG REPORT RT-11 V05.06 - COMPILED PAGE ************************************************************************DEVICE STATISTICSLOGGED SINCE UNIT IDENTIFICATIONPHYSICAL UNIT NUMBERTYPEDEVICE STATISTICS FOR THIS UNIT:NUMBER OF ERRORS LOGGEDNUMBER OF ERRORS RECEIVEDNUMBER OF READ SUCCESSESNUMBER OF WRITE SUCCESSESDISKTAPE DEVICE ERRORLOGGED SOFTWARE STATUS INFORMATION:MAXIMUM RETRIES REMAINING RETRIES OCCURRANCES OF THIS ERROR WITH IDENTICAL REGISTERS DEVICE INFORMATIONREGISTERS:ACTIVE FUNCTION READWRITEBLOCKPHYSICAL BUFFER ADDRESS STARTTRANSFER SIZE IN BYTESMEMORY PARITY ERRORSYSTEM REGISTERS:PC PSW OCCURRANCES OF THIS ERROR WITH IDENTICAL PC MEMORY ADDRESS CONTENTSMEMORY SYSTEM ERROR REGISTER:CACHE CONTROL REGISTER:HIT/MISS REGISTER:ERROR TYPE IS CACHE AND REPORT FILE ENVIRONMENT:INPUT FILEOUTPUT FILEOPTIONS DATE INITIALIZEDDATE OF LAST ENTRYTOTAL ERRORS LOGGEDMISSED REPORTS (BUFFER FULL)MISSED REPORTS (FILE FULL)MISSED REPORTS (TASK NOT READY)UNKNOWN DEVICE STATISTICS ENTRIESUNKNOWN ERROR RECORD ENTRIESMEMORY STATISTICSSTATISTICS:NUMBER OF MEMORY PARITY ERRORSNUMBER OF CACHE ERRORS @  .w@< @e R@ p@ @Ee 4 e w w ~( w w | 6 w v w p w j j w X~ w B@ `w N w < H Ew  *w & w w  X e pw u @d@ &w Lw @ w 4w @ w w w w w NNE  fe Efee` Z w @ \ w J ew 8 w & w f   w w  fw w p'@ w Jw  w T'@ 6B >f  `Hw w 0 w ' w w w  @ & NE c w N G @e< w : 6 w 4 w . w ( X w  [ w  rw  m @  w  \w s @ w  Fw y @ w w  w  $w w w  w w  NE fDe w  w x %w h  %' w H w ) R w @ w . w ) 8 w & ~w  w )  w w  ^w @ w  w  w w $w w w  w  N#% >w 8 w J w  w  @ (    teW#m L w H) w 6 Bw #>  w , w  Mw #   w  hw Yw r-ѕ/RѕSѕA w  >w bw H'@ tw  "w sw ,( = w w  w w +@ w  w v w +@ w l w Z w +@ ~ w P w > w +@ b w 4 w " w +v F w  |w  w z+\ * w   w j Bw ~ w LB@ w  &w  H Ew " w w  w  w  w .B@ w z w h w .B@ w \ w J w (B@A w : w ( w (B@ A w w  w   w 1w J w  w  w C <w Ow F0@ w  w nw *0@ w w  7w  @ ы ѝ  e&&  ѕ &5#&E &E E Z  ev  eH 8! ѕ  -BAD-JAN-FEB-MAR-APR-MAY-JUN-JUL-AUG-SEP-OCT-NOV-DEC-BAD-BAD-BAD-&ѝ 4 : 4ѕ:eËe:/ѐѐ 2<  @ C    7 7 ~5<&E E? U w7-ymtt-p,1fE eW-" L@0 ק*w w H we w \ Z" %&7 8<0w . $ Pw  w  w  C7 M#ѝW ST pT0 D J<    -*pє  l!^ \W SP LT pT0  T"wߋ*w Vw NT @ዅ   ɕ@ Qɕ I f& &B pҕ.   ҝ  & .ҕ.   ҝ  & &V` e0   A D ! % ѕ:  ѕ.  & % b %e ee e (@ RK11/RK05RKDSERCSWCBADADB TC11/TU56TCSTCMWCBADTRL11/RL01/RL02RLCS BA DA MP STATADDRBAE RX211/RX02RX2CS2DB2ES RF11/RS11RFCSWCMADAAEBRMAAS RJS03/RJS04RSCS1WC BA DA CS2DS ER AS LA DB MR DT RP11C/RP02/RP03RP DS ER CS WC BA CA DA M1 M2 M3 -SUCA-SILO RX11/RX01RX CSDBES RK06/RK07RKCS1 WC BA DA CS2 DS ER ASOFDC ECPSECPTMR2 MR3 TU58** LCHAR BYTES/FLAG S-CODE/OPCODEUNIT SEQ# BYTES STATUS BYTES/FLAG MOD/OPCODE UNIT DU/MSCPDU 1 2 3 4 5 6 7 8 9 1011121314151617181920RX/PRORX5CS05CS15CS25CS35CS45CS55DEBRD/PRORDSTATCYL HEADSEC ERR ST2  0 J j   !L!(!*"+6"w D   ѕ:   ѕ.   D (@w F" % b % e%e ee e &f .MCALL .MODULE .MODULE ELCOPY,VERSION=05,COMMENT= ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, ; MASSACHUSETTS. ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL. .SBTTL DEFINITIONS .ENABL LC .MCALL .QELDF, .DATE, .GTIM, .Assume .MCALL .PRINT, .MFPS, .MTPS .MACRO BCS. LABEL,?ALT BCC 'ALT' JMP LABEL 'ALT': .ENDM .MACRO BLT. LABEL,?ALT BGE 'ALT' JMP LABEL 'ALT': .ENDM SYSPTR = 54 $DATE = 262 CONFIG = 300 FBMON$ = 1 KT11$ = 10000 CONFG2 = 370 CACHE$ = 1 PNPTR = 404 $GTIME = 422 ERL$G = 1 .IIF NDF ERL$U ERL$U = 10. .Assume ERL$U LE 34.,MESSAGE=<;ELCOPY: Too Many Loggable Units> UNITMK = 7 .QELDF GOODIO = -1 PARERR = -2 CCHERR = -3 PCHERR = -4 O.UNIT = 0 O.ID = 1 O.ERL = 2 O.ERR = 4 O.READ = 6 O.WRIT = 12 STALEN = 7. D.SIZE = 0 D.RNUM = 1 D.DVUN = 2 D.DVID = 3 D.RTRY = 4 D.OCUR = 5 D.DATE = 6 D.HOT = 10 D.LOT = 12 D.BLKN = 14 D.BUFF = 16 D.WCNT = 20 D.PAR1 = 22 D.REGN = 22 D.MTRY = 23 D.REG = 24 DEVFIX = 10. M.SIZE = 0 M.RNUM = 1 M.TYPE = 2 M.MREG = 3 M.OCUR = 4 M.DATE = 6 M.HOT = 10 M.LOT = 12 M.PC = 14 M.PS = 16 M.REG = 20 PARMAX = 16. PARFIX = 8. MSYSER = 177744 MCONRG = 177746 MHITMS = 177752 .SBTTL $ELCPY - START OF COPY CODE .GLOBL OPINIT, FREADY .WORD $ELCPY ERRLOG::JMP OPINIT $ELCPY: TST (PC)+ FREADY: .WORD 1 BEQ CONTIN BMI 10$ INC NOTRDY 10$: CLC RTS PC CONTIN: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) CLR -(SP) INC CERECR CMPB R4,#GOODIO BGT DEVERR BLT. MEMERR DEC CERECR JSR PC,GESTAT BCS 20$ ADD #O.READ,R0 TST Q$WCNT(R5) BEQ 20$ BPL 10$ ADD #O.WRIT-O.READ,R0 10$: ADD #1,(R0)+ ADC (R0) 20$: JMP $ELXIT .SBTTL DEVERR - DEVICE ERROR RECORD LOGGER DEVERR: JSR PC,GESTAT BCS 10$ INC O.ERR(R0) MOV R0,(SP) 10$: TST PNXWRD BEQ 50$ CLR R1 JSR PC,CHKSIZ ADD (R0),R0 MOV R4,R1 CLRB R1 BISB Q$UNIT(R5),R1 BICB #<^CUNITMK>,R1 CMP R1,D.DVUN(R0) BNE 50$ CMPB R4,D.RTRY(R0) BGE 50$ MOV R0,-(SP) MOV R2,-(SP) ADD #D.REG,R0 MOV @#SYSPTR,R1 BIT #KT11$,CONFIG(R1) BEQ 15$ ADD #2,R0 15$: MOVB R3,R1 20$: CMP (R0)+,(R2)+ BNE 30$ DEC R1 BGT 20$ 30$: MOV (SP)+,R2 MOV (SP)+,R0 TST R1 BNE 50$ INCB D.OCUR(R0) MOVB R4,D.RTRY(R0) TST (SP) BEQ 40$ ADD #O.ERL,(SP) INC @(SP) 40$: BR 90$ 50$: MOVB R3,R1 ADD #DEVFIX,R1 MOV @#SYSPTR,R0 BIT #KT11$,CONFIG(R0) BEQ 55$ INC R1 55$: JSR PC,CHKSIZ BCS. $ELERR 60$: TST (SP) BEQ 70$ ADD #O.ERL,(SP) INC @(SP) 70$: MOVB R1,(R0)+ MOVB PNXREC,(R0)+ INC PNXREC MOVB Q$UNIT(R5),(R0) BICB #<^CUNITMK>,(R0)+ SWAB R4 MOVB R4,(R0)+ SWAB R4 MOVB R4,(R0)+ MOVB #1,(R0)+ JSR PC,GETDAT MOV (R5)+,(R0)+ TST (R5)+ MOV (R5)+,(R0)+ MOV (R5)+,(R0)+ MOV @#SYSPTR,-(SP) ADD #CONFIG,(SP) BIT #KT11$,@(SP)+ BEQ 75$ TST (R5)+ MOV (R5)+,(R0)+ 75$: MOV R3,(R0)+ MOVB R3,R3 80$: MOV (R2)+,(R0)+ DEC R3 BGT 80$ ASL R1 ADD R1,PNXWRD NEG R1 MOV R1,(R0) 90$: BR $ELXIT .SBTTL MEMERR - MEMORY ERROR RECORD LOGGER STKDPC = 30 STKDPS = 32 MEMERR: CMPB R4,#PARERR BNE 20$ 10$: INC CMPARE BR 30$ 20$: INC CCPARE CMPB R4,#PCHERR BEQ 10$ 30$: TST PNXWRD BEQ 40$ CLR R1 JSR PC,CHKSIZ ADD (R0),R0 CMPB M.TYPE(R0),#PARERR BGT 40$ CMP STKDPC(SP),M.PC(R0) BNE 40$ INC M.OCUR(R0) BR 100$ 40$: MOV R5,-(SP) MOV #PARMAX,R1 50$: TST (R5)+ BEQ 60$ DEC R1 BGT 50$ 60$: MOV (SP)+,R5 NEG R1 ADD #PARMAX,R1 MOV R1,R3 ASL R1 ADD #PARFIX,R1 MOV @#SYSPTR,R0 BIT #CACHE$,CONFG2(R0) BEQ 70$ ADD #3,R1 70$: JSR PC,CHKSIZ BCS $ELERR MOVB R1,(R0)+ MOVB PNXREC,(R0)+ INC PNXREC MOVB R4,(R0)+ MOVB R3,(R0)+ MOV #1,(R0)+ JSR PC,GETDAT MOV STKDPC(SP),(R0)+ MOV STKDPS(SP),(R0)+ 80$: MOV @(R5),(R0)+ MOV (R5)+,(R0)+ DEC R3 BGT 80$ MOV @#SYSPTR,R3 BIT #CACHE$,CONFG2(R3) BEQ 90$ MOV @#MSYSER,(R0)+ MOV @#MCONRG,(R0)+ MOV @#MHITMS,(R0)+ 90$: ASL R1 ADD R1,PNXWRD NEG R1 MOV R1,(R0) 100$: BR $ELXIT .SBTTL $ELXIT - EXIT ROUTINES $ELERR: TST (PC)+ $ELFLG: .WORD 0 BNE 10$ MOV SP,$ELFLG MOV PC,R0 ADD #E.FULL-.,R0 .PRINT 10$: INC CMENTB $ELXIT: TST (SP)+ MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 DEC $ELRSM BEQ 10$ CLR $ELRSM TST (PC)+ 10$: SEC RTS PC .SBTTL GESTAT - GET POINTER TO DEVICE STATISTICS ENTRY GESTAT: MOVB Q$UNIT(R5),-(SP) BIC #<^CUNITMK>,(SP) MOV R4,R0 CLRB R0 BIS R0,(SP) MOV PC,R0 ADD #DEVSTS-.,R0 MOV #ERL$U,R1 10$: CMP (R0),#-1 BEQ 40$ CMP (R0),(SP) BEQ 60$ ADD #STALEN*2,R0 DEC R1 BGT 10$ TST (PC)+ 20$: .WORD 0 BNE 30$ MOV PC,R0 ADD #E.STAT-.,R0 .PRINT MOV SP,20$ 30$: TST (SP)+ BR 70$ 40$: MOV #STALEN,R1 50$: CLR (R0)+ DEC R1 BGT 50$ MOV #-1,(R0) SUB #STALEN*2,R0 MOV (SP),(R0) 60$: TST (SP)+ TST (PC)+ 70$: SEC RTS PC .SBTTL CHKSIZ - CHECK FOR ROOM IN LOGGING BUFFER CHKSIZ: MOV PNXWRD,R0 ADD R1,R0 ADD R1,R0 CMP R0,#255.*2 BLT 10$ JSR PC,10$ MOV #-1,(R0) MOV $BFNUM,R0 INC $BFLAG(R0) INC $ELRSM CMP PNXBLK,SMAXSZ BGE 30$ NEG R0 ADD #2,R0 MOV R0,$BFNUM CLR PNXWRD BR 20$ 10$: MOV $BFNUM,R0 20$: MOV $BFTAB(R0),R0 ADD PNXWRD,R0 TST (PC)+ 30$: SEC RTS PC .SBTTL GETDAT - PLACE DATE/TIME IN RECORD GETDAT: MOV R1,-(SP) MOV @#SYSPTR,R1 .MFPS .MTPS #340 MOV R1,-(SP) ADD $GTIME(R1),(SP) ADD #2,R0 JSR PC,@(SP)+ .MTPS MOV @#SYSPTR,R1 MOV $DATE(R1),-4(R0) MOV (SP)+,R1 TST (R0)+ RTS PC .SBTTL TEXT .NLIST BEX E.FULL: .ASCIZ /?ERRLOG-W-Log file is full, logging suspended/ E.STAT: .ASCIZ /?ERRLOG-W-Device statistics table is full/ .EVEN .LIST BEX .SBTTL IMPURE DATA AREA .GLOBL NOTRDY, RECHED, $ELHDR .GLOBL CMENTR, PNXBLK, $HDLEN .GLOBL $BFNUM, $BFTAB, $BFLAG .GLOBL $ELBF1, SMAXSZ NOTRDY: .WORD 0 ELAREA: .BLKW 2 RECHED: .WORD 0 $ELHDR: OFIXED: .WORD <<7*ERL$U+2>*2> DEVSTS: .WORD -1 .BLKW <7*ERL$U> CERECR: .WORD 0 CMENTB: .WORD 0 CMENTF: .WORD 0 CMENTR: .WORD 0 CMPARE: .WORD 0 CCPARE: .WORD 0 PNXREC: .WORD 1 PNXBLK: .WORD 1 PNXWRD: .WORD 0 SMAXSZ: .WORD 100. CNFGW1: .WORD 0 CNFGW2: .WORD 0 INIDAT: .WORD 0 INTIM1: .WORD 0 INTIM2: .WORD 0 $HDLEN = <.-$ELHDR>/2 .IIF GT <$HDLEN-256.> .ERROR $ELRSM: .WORD 0 $BFNUM: .WORD 0 $BFTAB: .WORD $ELBF1 .WORD $ELBF2 $BFLAG: .WORD 0 .WORD 0 $ELBF1: .BLKW 256. $ELBF2: .BLKW 256. .END ERRLOG .MCALL .MODULE .MODULE ELINIT,VERSION=07,COMMENT= ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL DEFINITIONS .MCALL .CLOSE, .CSISP, .DATE .MCALL .DSTAT, .ENTER, .EXIT .MCALL .GTIM, .GTLIN, .LOOKU .MCALL .PRINT, .PURGE, .READW .MCALL .RENAM, .SDAT, .WRITE .MCALL .WRITW, .Assume ERRBYT = 52 USERRB = 53 SYSPTR = 54 CONFIG = 300 SYSGEN = 372 STASK$ = 040000 ELR$G = 1 .IIF NDF ERL$U, ERL$U=10. .Assume ERL$U LE 34.,MESSAGE=<;ELINIT:Too Many Loggable Units> MSKCF1 = ^C014001 N0CHAR = '0 RADDEC = 10. BLKSIZ = 256. ELIOCH = 0 ETIOCH = 1 MSGCHN = 2 FATAL$ = 10 OMPARE = <*2> OCPARE = <*2> ONXREC = <*2> ONXBLK = <*2> OSIZEB = <*2> OCONFG = <*2> .SBTTL ERROR LOGGING SUBSYSTEM INITIALIZATION ELINIT::.GTLIN #LINBUF,#MESDEV TSTB LINBUF BEQ DEVCHK .CSISPC #FILSPC,#DEFEXT,#LINBUF MOV (SP)+,R1 ASL R1 ADD R1,SP MOV ISPEC,ELFILE MOV ISPEC,ELTEMP DEVCHK: .DSTAT #INSTAT,#ELFILE BCC 1$ JMP FCHERR 1$: TST INSTAT+4 BNE 2$ JMP FCHERR 2$: .LOOKUP #INSTAT,#ELIOCH,#ELFILE BCC LOOKOK TSTB @#ERRBYT BNE LOOKNO JMP CHNERR LOOKNO: .PRINT #MESW MOV R1,-(SP) MOV #ELFILE,R0 MOV #NFTEMP,R1 CALL $FNASC .PRINT #MESNFD .PRINT #NFTEMP MOV (SP)+,R1 MOV SMAXSZ,BUFBLK+OSIZEB BR CREATE LOOKOK: .READW #INSTAT,#ELIOCH,#BUFBLK,#BLKSIZ,#0 BCC 1$ JMP IORERR 1$: CMP BUFBLK,OFIXED BNE INVALD TST BUFBLK+ONXREC BMI INVALD TST BUFBLK+ONXBLK BLE INVALD MOV @#SYSPTR,R1 MOV CONFIG(R1),R2 BIC #MSKCF1,R2 MOV BUFBLK+OCONFG,R3 BIC #MSKCF1,R3 CMP R3,R2 BNE INVALD MOV SYSGEN(R1),R2 MOV BUFBLK+OCONFG+2,R3 CMP R3,R2 BNE INVALD TST BUFBLK+OMPARE BMI INVALD TST BUFBLK+OCPARE BMI INVALD MOV BUFBLK+ONXBLK,R0 JSR PC,NUMBER .PRINT #MESUS1 MOV BUFBLK+OSIZEB,R0 JSR PC,NUMBER .PRINT #MESUS2 .GTLIN #LINBUF,#MESINI TSTB LINBUF BEQ CHANGE CMPB LINBUF,#'Y BEQ INITF BR CHANGE INVALD: .PRINT #MESIV1 .PRINT #MESIV2 .PURGE #ELIOCH .RENAME #INSTAT,#ELIOCH,#ELFILE MOV #100.,BUFBLK+OSIZEB BCC CREATE CMPB @#ERRBYT,#3 BNE 1$ JMP PRTERR 1$: JMP BADERR CREATE: INCB FCREAT INITF: INCB FINIT CHANGE: .PRINT #MESSZ1 MOV BUFBLK+OSIZEB,R0 MOV R0,SMAXSZ JSR PC,NUMBER .GTLIN #LINBUF,#MESSZ2 TSTB LINBUF BEQ DOIT MOV #LINBUF,R0 JSR PC,ABCVRT CMP R0,#1 BLE 1$ TSTB FINIT BNE 2$ CMP R0,PNXBLK BHI 2$ 1$: .PRINT #MESF .PRINT #MESILL BISB #,@#USERRB BR CHANGE 2$: MOV R0,BUFBLK+OSIZEB MOV R0,SMAXSZ INCB FCHGSZ DOIT: TSTB FCREAT BNE 1$ TSTB FCHGSZ BEQ 6$ 1$: TSTB FINIT BNE 2$ .PURGE #ELIOCH .RENAME #INSTAT,#ELIOCH,#ELFILE BCC 2$ CMPB @#ERRBYT,#3 BNE 13$ 14$: JMP PRTERR 13$: JMP BADERR 2$: .PURGE #ELIOCH .ENTER #INSTAT,#ELIOCH,#ELFILE,SMAXSZ BCC 4$ TSTB @#ERRBYT BEQ 3$ CMPB @#ERRBYT,#3 BEQ 14$ JMP FULERR 3$: JMP BADERR 4$: MOV SMAXSZ,R1 DEC R1 .WRITW #INSTAT,#ELIOCH,#BUFBLK,#BLKSIZ,R1 BCC 5$ JMP IORERR 5$: .CLOSE #ELIOCH BCS 14$ .LOOKUP #INSTAT,#ELIOCH,#ELFILE BCC 6$ JMP BADERR 6$: TSTB FINIT BEQ 8$ .GTIM #INSTAT,#INTIM1 .DATE MOV R0,INIDAT MOV @#SYSPTR,R1 MOV CONFIG(R1),CNFGW1 MOV SYSGEN(R1),CNFGW2 .WRITW #INSTAT,#ELIOCH,#HEADER,#HEDRWD,#0 BCC 7$ JMP IORERR 7$: .PRINT #MESGEN BR DONE 8$: MOV #HEDRWD,R2 MOV #HEADER,R3 MOV #BUFBLK,R4 9$: MOV (R4)+,(R3)+ DEC R2 BNE 9$ .WRITW #INSTAT,#ELIOCH,#HEADER,#HEDRWD,#0 BCC 10$ JMP IORERR 10$: TSTB FCHGSZ BEQ DONE .LOOKUP #INSTAT,#ETIOCH,#ELTEMP BCC 11$ TSTB @#ERRBYT BNE BADERR JMP CHNERR 11$: MOV PNXBLK,R2 12$: .READW #INSTAT,#ETIOCH,#BUFBLK,#BLKSIZ,R2 BCS IORERR .WRITW #INSTAT,#ELIOCH,#BUFBLK,#BLKSIZ,R2 BCS IORERR DEC R2 BNE 12$ .PURGE #ETIOCH DONE: MOV @#SYSPTR,R1 BIT #STASK$,SYSGEN(R1) BEQ 2$ .LOOKUP #INSTAT,#MSGCHN,#JBDES BCC 1$ TSTB @#ERRBYT BNE 3$ JMP CHNERR 1$: .WRITE #INSTAT,#MSGCHN,#HEADER,#HEDRWD BCC 4$ JMP BADERR 2$: .SDAT #INSTAT,#HEADER,#HEDRWD BCC 4$ 3$: .PRINT #MESF .PRINT #MESNFG BR FTLEXT 4$: .PRINT #MESDON BR ALLEXT BADERR: .PRINT #MESF .PRINT #MESBAD BR FTLEXT IORERR: .PRINT #MESF .PRINT #MESIOR BR FTLEXT FCHERR: .PRINT #MESF .PRINT #MESFCH BR FTLEXT FULERR: .PRINT #MESF .PRINT #MESFUL BR FTLEXT CHNERR: .PRINT #MESF .PRINT #MESCHN BR FTLEXT PRTERR: .PRINT #MESF .PRINT #MESPRT FTLEXT: BISB #,@#USERRB ALLEXT: .PURGE #ETIOCH .PURGE #ELIOCH CLR R0 .EXIT .SBTTL MESSAGES .ENABL LC .NLIST BIN MESW: .NLCSI TYPE=I,PART=PREFIX .ASCII /W-/<200> MESF: .NLCSI TYPE=I,PART=PREFIX .ASCII /F-/<200> MESDEV: .ASCII /What is the name of the device for the ERRLOG.DAT file/ .ASCII / ? /<200> MESNFD: .ASCII /File not found /<200> NFTEMP: .WORD 0,0,0,0,0,0,0,0 MESSZ1: .ASCII /How many blocks for the ERRLOG.DAT file MESSZ2: .ASCII />? /<200> MESUS1: .ASCIZ / blocks currently in use of/ MESUS2: .ASCIZ / possible total in ERRLOG.DAT file/ MESINI: .ASCII /Do you want to zero the ERRLOG.DAT file and re-initialize/ .ASCII \ (YES/NO) ? \<200> MESGEN: .ASCIZ /New ERRLOG.DAT file generated/ MESIV1: .ASCIZ /The current ERRLOG.DAT file is invalid/ MESIV2: .ASCIZ /The invalid file is renamed ERRLOG.TMP/ MESDON: .ASCIZ /RT-11 ERROR LOGGING INITIATED/ MESILL: .ASCIZ /Invalid command/ MESFCH: .ASCIZ /Device not available/ MESCHN: .ASCIZ /Channel error/ MESIOR: .ASCIZ /ERRLOG.DAT file IO error/ MESBAD: .ASCIZ /Internal error/ MESFUL: .ASCIZ /Device full/ MESNFG: .ASCIZ /ERRLOG task not active/ MESPRT: .ASCIZ /Protected file already exists ERRLOG.DAT/ .LIST BIN .DSABL LC .SBTTL DATA AREA FCREAT: .BYTE 0 FINIT: .BYTE 0 FCHGSZ: .BYTE 0 .EVEN INSTAT: .BLKW 5 JBDES: .RAD50 /MQ/ .ASCII /ERRLOG/ ELFILE: .RAD50 /SY/ .RAD50 /ERR/ .RAD50 /LOG/ .RAD50 /DAT/ ELTEMP: .RAD50 /SY/ .RAD50 /ERR/ .RAD50 /LOG/ .RAD50 /TMP/ LINBUF: .BLKB 82. FILSPC: OSPEC: .BLKW 3*5. ISPEC: .BLKW 6*4. DEFEXT: .WORD 0,0 .WORD 0,0 BUFBLK: .BLKW HEADER: OFIXED: .WORD <<7*ERL$U+2>*2> DEVSTS: .WORD -1 .BLKW <7*ERL$U> CERECR: .WORD 0 CMENTB: .WORD 0 CMENTF: .WORD 0 CMENTR: .WORD 0 CMPARE: .WORD 0 CCPARE: .WORD 0 PNXREC: .WORD 1 PNXBLK: .WORD 1 PNXWRD: .WORD 0 SMAXSZ: .WORD 100. CNFGW1: .WORD 0 CNFGW2: .WORD 0 INIDAT: .WORD 0 INTIM1: .WORD 0 INTIM2: .WORD 0 HEDRSZ = HEDRWD = .SBTTL NUMBER - BINARY TO DECIMAL ASCII NUMBER: CLR R2 1$: MOV #10.,R1 JSR PC,DIV ADD #60,R1 MOV R1,-(SP) INC R2 TST R0 BNE 1$ MOV #LINBUF,R3 2$: MOVB (SP)+,(R3)+ DEC R2 BNE 2$ MOVB #200,(R3) .PRINT #LINBUF RTS PC .SBTTL DIV - DIVISION ROUTINE DIV: MOV #20,-(SP) MOV R1,-(SP) CLR R1 30$: ASL R0 ROL R1 CMP R1,(SP) BLO 40$ SUB (SP),R1 INC R0 40$: DEC 2(SP) BGT 30$ 50$: CMP (SP)+,(SP)+ RTS PC .SBTTL ABCVRT - DECIMAL ASCII TO BINARY ABCVRT: MOV R3,-(SP) MOV R4,-(SP) CLR R4 1$: MOVB (R0)+,R3 SUB #N0CHAR,R3 CMPB R3,#RADDEC BHIS 2$ ASL R4 ADD R4,R3 ASL R4 ASL R4 ADD R3,R4 BR 1$ 2$: MOV R4,R0 MOV (SP)+,R4 MOV (SP)+,R3 RTS PC .END ELINIT .MCALL .MODULE .MODULE ELTASK,VERSION=05,COMMENT= ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL DEFINITIONS .ENABL LC .MCALL .QSET, .PRINT, .MRKT .MCALL .RCVDW, .LOOKU, .READW .MCALL .CMKT, .CHCOP, .READC .MCALL .RCVDC, .SPND, .WRITW .MCALL .RSUM, .READC, .EXIT SYSPTR = 54 CONFIG = 300 FBMON$ = 1 KT11$ = 10000 SYSGEN = 372 STASK$ = 40000 RCVKEY = 101010 ELIOCH = 0 ETIOCH = 1 MSGCHN = 2 .SBTTL START OF CUSP .GLOBL RECHED, FREADY, NOTRDY .GLOBL CMENTR, PNXBLK .GLOBL $ELHDR, $HDLEN .GLOBL $BFNUM, $BFTAB, $BFLAG .GLOBL $ELBF1 OPINIT::.QSET #XTRAQE,#2 MOV @#SYSPTR,R1 BIT #KT11$,CONFIG(R1) BEQ 10$ INCB FXM 10$: BIT #STASK$,SYSGEN(R1) BEQ 20$ INCB FST 20$: .PRINT #E.INFO .PRINT #M.INI 30$: .MRKT #AREAT,#WAITIM,#REMIND,#0 BCS 30$ TSTB FST BNE 40$ .RCVDW #AREA,#RECHED,#$HDLEN BCC 60$ JMP ILLERR 40$: .LOOKUP #AREA,#MSGCHN,#ZEROAD BCC 50$ JMP CHNERR 50$: .READW #AREA,#MSGCHN,#RECHED,#$HDLEN BCC 60$ JMP ILLERR 60$: CMP RECHED,#$HDLEN BEQ 70$ JMP IMRERR 70$: .CMKT #AREAT,#0 TSTB FST BNE 80$ .CHCOPY #AREA,#ETIOCH,#ELIOCH BR 90$ 80$: .CHCOPY #AREA,#ETIOCH,#ELIOCH,#BJBDES 90$: BCC 100$ JMP ILLERR 100$: MOV PNXBLK,R4 .READW #AREA,#ETIOCH,#$ELBF1,#256.,R4 BCC REALTM JMP LIOERR REALTM::CLR FREADY ADD NOTRDY,CMENTR TSTB FST BEQ 10$ .READC #AREA,#MSGCHN,#RCVMSG,#1,#CRTN BCC SUSPND JMP CHNERR 10$: .RCVDC #AREA,#RCVMSG,#1,#CRTN BCC SUSPND JMP ILLERR .SBTTL REMIND - STARTUP REMINDER REMIND: .PRINT #E.INFO .PRINT #M.REM 10$: .MRKT #AREAT,#WAITIM,#REMIND,#0 BCS 10$ RTS PC .SBTTL SUSPND - WAITING FOR ACTIVATION SUSPND: .SPND ELTASK: TST IFATAL BEQ 20$ 10$: JMP FATALE 20$: JSR PC,IOCODE TST IFATAL BNE 10$ BR SUSPND .SBTTL IOCODE - WRITE BUFFER TO LOGGING FILE .GLOBL SMAXSZ IOCODE: MOV R2,-(SP) MOV PNXBLK,R1 INC PNXBLK .WRITW #AREA,#ETIOCH,#$ELHDR,#$HDLEN,#0 BCC 10$ MOV #1,IFATAL 10$: MOV $BFNUM,R2 NEG R2 ADD #2,R2 .WRITW #AREA,#ETIOCH,$BFTAB(R2),#256.,R1 BCC 20$ MOV #1,IFATAL 20$: CLR $BFLAG(R2) INC R1 CMP R1,SMAXSZ BHIS 30$ MOV $BFNUM,R2 .WRITW #AREA,#ETIOCH,$BFTAB(R2),#256.,R1 BCC 30$ MOV #1,IFATAL 30$: MOV (SP)+,R2 RTS PC .SBTTL CRTN - UPDATE DUE TO ERROUT REQUEST CRTN: CMP RCVMSG+2,#RCVKEY BEQ 10$ .PRINT #E.WARN .PRINT #E.IMR BR 50$ 10$: .WRITW #AREA,#ETIOCH,#$ELHDR,#$HDLEN,#0 BCC 20$ MOV #1,IFATAL 20$: MOV $BFNUM,R1 .WRITW #AREA,#ETIOCH,$BFTAB(R1),#256.,PNXBLK BCC 30$ MOV #1,IFATAL 30$: TST IFATAL BEQ 50$ 40$: .RSUM BR 70$ 50$: TSTB FST BNE 60$ .RCVDC #AREA,#RCVMSG,#1,#CRTN BR 70$ 60$: .READC #AREA,#MSGCHN,#RCVMSG,#1,#CRTN 70$: RTS PC .SBTTL FATALE - REPORT FATAL ERRORS FATALE: DEC IFATAL BEQ LIOERR IMRERR: .PRINT #E.FATL .PRINT #E.IMR BR SHUTUP LIOERR: .PRINT #E.FATL .PRINT #E.LIO BR SHUTUP ILLERR: .PRINT #E.FATL .PRINT #E.ILL BR SHUTUP CHNERR: .PRINT #E.FATL .PRINT #E.CER BR SHUTUP SHUTUP: MOV #-1,FREADY .EXIT .SBTTL IMPURE DATA AREA AREA: .BLKW 5 AREAT: .BLKW 4 ZEROAD: .RAD50 /MQ/ .WORD 0,0,0 BJBDES: .ASCII /B/ .BYTE 0,0,0,0,0 WAITIM: .WORD 0,3777 XTRAQE: .BLKW 20. RCVMSG: .BLKW 2 FXM: .BYTE 0 FST: .BYTE 0 .EVEN IFATAL: .WORD 0 .SBTTL MESSAGES .NLIST BEX E.FATL: .ASCII /?ERRLOG-F-/<200> E.WARN: .ASCII /?ERRLOG-W-/<200> E.INFO: .ASCII /?ERRLOG-I-/<200> E.IMR: .ASCIZ /Invalid message received/ E.ILL: .ASCIZ /Internal error/ E.LIO: .ASCIZ /Log file IO error/ E.CER: .ASCIZ /Channel error/ M.REM: .ASCII /REMINDER: / M.INI: .ASCIZ /To initiate error logging, RUN ELINIT/ .LIST BIN .END .MCALL .MODULE .MODULE ERRTXT,VERSION=07,COMMENT= ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ELERRT == 0 .SBTTL DEVICE DEPENDENT TEXT BUILDER .MACRO ELBLDR DVCODE,DTYPE,WHICH1,FIRST2,RGSTR .IIF B DVCODE, .ERROR .IIF LT DVCODE, .ERROR .IIF GT , .ERROR .PSECT PART1 DV'DVCODE: .IF IDN , .BYTE 0 .IFF .IF IDN , .BYTE 5 .IFF .ERROR WHICH1 .ENDC .ENDC .NCHR SYMTYP, .IIF GT , .ERROR .BYTE SYMTYP .ASCII %DTYPE% .NCHR SYMFIR, .IF NE .ERROR FIRST2 .ENDC .ASCII %FIRST2% .BYTE COUNT COUNT = -1 .BYTE TMP'DVCODE .IRP NAME, COUNT = COUNT + 1 .NCHR SYMREG, .IIF NDF CHR'DVCODE,CHR'DVCODE=SYMREG .IF LT CHR'DVCODE-SYMREG CHR'DVCODE = SYMREG .ENDC .ENDR .IF GT .ERROR .ENDC TMP'DVCODE = CHR'DVCODE .IRP NAME, .NCHR SYMREG, .ASCII %NAME% .REPT CHR'DVCODE-SYMREG .BYTE 40 .ENDR .ENDR .EVEN .PSECT PART2 .IF NDF POINTL POINTL:: .ENDC .IF EQ .-POINTL POINTL:: .IFF . = .-4 .ENDC .WORD DVCODE .WORD DV'DVCODE .WORD -1,-1 .ENDM ELBLDR .SBTTL SUPPORTED DEVICES ELBLDR 0,,DISK,RK, ELBLDR 1,,TAPE,TC, ELBLDR 5,,DISK,RL, ELBLDR 6,,DISK,RX,<2CS,2DB,2ES> ELBLDR 12,,DISK,RF, ELBLDR 16,,DISK,RS, ELBLDR 21,,DISK,RP, ELBLDR 22,,DISK,RX, ELBLDR 23,,DISK,RK, ELBLDR 34,,TAPE,**, ELBLDR 50,,DISK,DU,<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20> ELBLDR 52,,DISK,RX,<5CS0,5CS1,5CS2,5CS3,5CS4,5CS5,5DEB> ELBLDR 53,,DISK,RD, HSPACE == . .END f""aSԳDگrH; @5@afZ@=|HS [-r8W-l2S>,5 (@8hl> !   e9,5@|ߋ*'|  0 w B5 "*2|DL bpx tG +w , 5׭# $ߋ*> 0 ߋ*0ק*wHw$  " *2 DL pt  w >w >ߋ*r&f> re0 0 e^e7 \ X5 , >>0>48; FRp;lT5JeV np 7n Hɝ  @     aV &.p@nD  w tw Hw Vw b w sw zw r & >& 7}7|7t7u7r7o7l&H"V*b2s:BT \>sdPL7 J7 H7 7 T7 v7 v7 tjjf'  wV TH  j ?ERROUT-W-?ERROUT-F-Invalid commandChannel errorDevice fullDevice not foundFile not found  SsInsufficient memoryInput errorOutput errorInternal errorProtected file already existsOutput file fullG   Nz""_M<>""XqԀ nvn{ |h|SERRLOGe L*-+"+@鈅8-"Bt (a,A && &w bw . ,  '"$ ! t.FbN`n4  !  H" TTD  $ YL^w AAQzQJ&>  ERROR LOG REPORT RT-11 V05.06 - COMPILED PAGE *********************************************_ ***************************DEVICE STATISTICSLOGGED SINCE UNIT IDENTIFICATIONPHYSICAL UNIT NUMBERTYPE DEVICE STATISTICS FOR THIS UNIT:NUMBER OF ERRORS LOGGEDNUMBER OF ERRORS RECEIVEDNUMBER OF READ SUCCESSESNUMBER OF WRITE  SUCCESSESDISKTAPE DEVICE ERRORLOGGED SOFTWARE STATUS INFORMATION:MAXIMUM RETRIES REMAINI NG RETRIES OCCURRANCES OF THIS ERROR WITH IDENTICAL REGISTERS DEVICE INFORMATIONREGISTERS:ACTIVE FUNCTION READWRITE BLOCKPHYSICAL BUFFER ADDRESS STARTTRANSFER SIZE IN BYTESMEMORY PARITY ERRORSYSTEM REGISTERS:PC PSW OCCURRANCES OF  THIS ERROR WITH IDENTICAL PC MEMORY ADDRESS CONTENTSMEMORY SYSTEM ERROR REGISTER:CACHE CONTROL REGISTER:HIT/MISS  REGISTER:ERROR TYPE IS CACHE AND REPORT FILE ENVIRONMENT:INPUT FILEOUTPUT FILEOPTIONS DATE INITIALIZEDDATE OF LAST  ENTRYTOTAL ERRORS LOGGEDMISSED REPORTS (BUFFER FULL)MISSED REPORTS (FILE FULL)MISSED REPORTS (TASK NOT READY)UNKNOWN DEF VICE STATISTICS ENTRIESUNKNOWN ERROR RECORD ENTRIESMEMORY STATISTICSSTATISTICS:NUMBER OF MEMORY PARITY ERRORSNUMBER OF x CACHE ERRORS  V @  .w@< @e R@ p@ @Ee 4 e w w ~( w w | 6 w v w p w j j $&< T Xb( l6 rx~j  w X~ w B@ `w N w < H Ew  *w & w w  X e pw u @d@ &w Lw + ~ ( LRX ^u ~ @ w 4w @ w w w w w NNE  fe Efe"  28 B \e` Z w @ \ w J ew 8  w & w f   w w  fw w p'@ W<F V \ p `vw Jw  w T'@ 6B >f  `Hw w 0 w ' w w w   B H0 `f@ & NE c w N G @e< w : 6 w 4 w . w ( X w  [ w  rw  m @  w  \w &.G 8< B6 HNTX ^[ lm n s @ w  Fw y @ w w w  $w w w  w w  NE fDe w  "s y .4 > D R  w x %w h  %' w H w ) R w @ w . w ) 8 w & ~w  w )  w w o4 N h ~>f ^w  @ w  w  w w $ w  w w w N#% >w 8 w J w w  ::   * 2 8$ > HNXj8 pJ v|@ (    teW#m L w H) w 6 B w #>  w , w  M w #   w  .D) NB X>jM t ^hw Y w r-ѕ/RѕSѕA w  >w b w H'@ tw  "w s w ,( = w w  w w +@_ Y 4b Ps ^= lv 3 w  w v w +@ w l w Z w +@ ~ w P w > w +@ b w 4 w " w +v F w   2 N j V|w   w z+\ * w   w j Bw ~ w LB@ w  &w  H Ew " w w w   .j 8~ T z< w  w .B@ w z w h w .B@ w \ w J w (B@A w : w ( w (B@ A   , J l Nw w w  w 1 w J w w w C <w O w F0@ w  w n w *0@ w w 7.$1 *J 06HL w \ %&7 8<0w .$ Pw w w  C7 M#ѝ$ afZ:BLRXW ST pT0 D J<    -*pє  l!^ \W SSTTJr^zS^P LT pT0  T"wߋ*w Vw NTY& TT.T6HPTT^ ^ ` bkb@ዅ   ɕ@ Qɕ I f& &B pҕ.   ҝ  ]& .ҕ.   ҝ  & &V` e0   A D ! %vZ ѕ:  ѕ.  & % b %e ee e (@4 &.MCALL .MODULE .MODULE CONSOL,VERSION=03,COMMENT= ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL. .ENABL LC .NLIST BEX .ENABL GBL ;+ ; PROGRAM TO CHANGE CONSOLE TO ONE OTHER THAN BOOT CONSOLE ;- .MCALL .MTPS,.PRINT,.EXIT CSRAD =: 176500 ;*** NEW CONSOLE INPUT CSR *** VEC =: 300 ;*** NEW CONSOLE VECTOR *** SYSPTR =: 54 ;SYSCOM POINTER TO RMON TTKS =: 304 ;CONSOLE KEYBOARD CSR TTKB =: 306 ;CONSOLE KEYBOARD BUFFER TTPS =: 310 ;CONSOLE PRINTER CSR TTPB =: 312 ;CONSOLE PRINTER BUFFER SYSGEN =: 372 ;OFFSET TO SYSGEN WORD MTTY$ =: 20000 ;MULTI-TERMINAL BIT IN SYSGEN WORD OLDVEC =: 60 ;STANDARD CONSOLE VECTOR IENABL =: 100 ;INTERRUPT ENABLE PR7 =: 340 ;PRIORITY SEVEN PR0 =: 0 ;PRIORITY ZERO BMASK =: 360/<<15.*>>/8.>+1> BITMAP =: 326+ CONSOL: MOV @#SYSPTR,R0 ;R0 => RMON BIT #MTTY$,SYSGEN(R0) ;MULTI-TERMINAL SYSTEM? BNE 2$ ;YES - CAN'T USE THIS TECHNIQUE! .MTPS #PR7 ;GO TO PRIORITY 7 !!! BISB #BMASK,BITMAP(R0) ;PROTECT NEW CONSOLE VECTORS ADD #TTKS,R0 ;R0 => CONSOLE REGISTER LIST IN RMON MOV #CSR,R1 ;R1 => NEW CSR/DATA REG LIST BIC #IENABL,@(R0) ;DISABLE OLD INPUT CSR INTERRUPTS MOV (R1)+,(R0)+ ;MOVE IN NEW CSR ADDR MOV (R1)+,(R0)+ ;MOVE IN NEW BUFFER ADDRESS BIC #IENABL,@(R0) ;DISABLE OLD OUTPUT CSR INTERRUPTS MOV (R1)+,(R0)+ ;MOVE IN NEW CSR ADDR MOV (R1)+,(R0)+ ;MOVE IN NEW BUFFER ADDR MOV #OLDVEC,R0 ;R0 = PRESENT CONSOLE VECTOR MOV @R1,R1 ;R1 = NEW VECTOR .REPT 4 MOV (R0)+,(R1)+ ;LOAD NEW CONSOLE VECTORS .ENDR .MTPS #PR0 ;BACK TO PRIORITY 0 .EXIT ;TERMINATE PROGRAM 2$: .PRINT #NOMT ;PRINT ERROR MESSAGE .EXIT ; AND LEAVE .NLIST BEX NOMT: .ASCIZ /?CONSOL-F-Multi-terminal system ... use SET TT CONSOL command/ .EVEN CSR: .WORD CSRAD ;CSR/DATA BUFFER/VECTOR LIST .WORD CSRAD+2 .WORD CSRAD+4 .WORD CSRAD+6 .WORD VEC .END CONSOL .MCALL .MODULE .MODULE NITEST,VERSION=07,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL Abstract ;+ ; ; NITEST ; NITEST is a program which may be used to verify that communication ; is possible between two stations on the Ethernet. ; ; When running, it responds to loopback datagrams (protocol 90-00) ; sent to the station's physical address, broadcast address, or ; the 'loopback assist' multicast address. ; ; In addition, it may be used to send a loopback datagram to ; another station and verify that it returns. ; ; Edit History: ; ; X01 (001) 13-Feb-85 Added HEX macro to make it easy to specify ethernet ; MBG addresses and protocol types. ; ; X01 (002) 04-Mar-85 Changes to buffer layout for transmit and receive ; MBG required changes here. ; ; V05 (006) 16-Jan-86 Errors to completion mode SPFUNS will not be seen ; MBG until the next request on that channel. Retry the ; request. Also, coding change to protect against ; response packets received late. ; ; V05 (007) 13-Mar-86 Added code to discard loopback packets which are ; MBG obviously bad based on skip count information. ; ;- .SBTTL Definitions ; RT-11 Macros we'll be using .MCALL .QSET, .GVAL, .GTJB .MCALL .FETCH, .PRINT, .LOOKU .MCALL .SPFUN, .GTLIN, .MRKT .MCALL .SPND, .CMKT, .RSUM .MCALL .TTYOU, .EXIT ; Define our own macro for HEX strings .MACRO HEX TEXT .TOGL. = 0 .IRPC ..CHR., .IF DIF ..CHR.,- .HXCT. = 0 .FIND. = 0 .IRPC ..HEX.,<0123456789ABCDEF> .IF IDN ..CHR.,..HEX. .FIND. = 200!.HXCT. .ENDC ;IDN ..CHR.,..HEX. .HXCT. = .HXCT. + 1 .ENDR ;..HEX. .IF EQ .FIND. .ERROR ;Invalid character ''..CHR.'' in hex string ''TEXT'' .MEXIT .ENDC ;EQ .FIND. .IF EQ .TOGL. .FRST. = <.FIND.&17>*20 .IFF .BYTE .FRST.!<.FIND.&17> .ENDC ;EQ .TOGL. .TOGL. = <-.TOGL.> + 1 .IFF .IF NE .TOGL. .BYTE .FRST./20 .TOGL. = 0 .ENDC ;NE .TOGL. .ENDC ;DIF ..CHR.,- .ENDR ;.IRPC ..CHR. .IF NE .TOGL. .BYTE .FRST./20 .TOGL. = 0 .ENDC ;NE .TOGL. .ENDM ;MACRO ; RMON Fixed offsets CONFG2 = 370 ;Configuration word 2 PRO$ = 020000 ;Running on PRO BUS$ = 000100 ;Qbus/Unibus ; Ethernet class handler functions SP.POR = 200 ;Allocate/Deallocate unit SP.PT = 202 ;Enable/Disable protocol type SP.MA = 203 ;Enable/Disable multicast address SP.XMT = 204 ;Transmit ethernet frame SP.RCV = 205 ;Read ethernet frame .SBTTL NITEST .PSECT .CODE. .ENABL LSB NITEST: .QSET #QELEM,#4. ;We'll need extra queue elements .GVAL #AREA,#CONFG2 ;Get contents of config word 2 MOV #<^RNC >,DBLK ;Assume PRO BIT #PRO$,R0 ;Correct assumption? BNE 10$ ;Yep... MOV #<^RNQ >,DBLK ;No, so assume Qbus BIT #BUS$,R0 ;Correct assumption? BNE 10$ ;Yep... MOV #<^RNU >,DBLK ;Nope, must be unibus after all 10$: .GTJB #AREA,#JOBDAT ;Get info on this job MOV JOBNUM,R0 ;R0 = Job number (*2) ASR R0 ;Convert to job number 0-7 ADD #36,R0 ;Make it final RAD50 digit ADD R0,DBLK ;And add it to the device name .FETCH #FREE,#DBLK ;Fetch the handler we need BCC 20$ MOV #M.IVD,R0 ;R0 -> 'Invalid device' FATAL: .PRINT ;Print the error message .EXIT ;And go away 20$: .LOOKU #AREA,#0,#DBLK ;Open a channel to the ethernet BCC 21$ MOV #M.LERR,R0 ;R0 -> 'Lookup error' BR FATAL 21$: .SPFUN #AREA,#0,#SP.POR,#ALBUFF,#0,#1 ;Allocate the unit for our use BCC 22$ MOV #M.UAER,R0 ;R0 -> 'Unit allocation error' BR FATAL 22$: MOV ALBUFF+2,XADDR ;Save the station's address MOV ALBUFF+4,XADDR+2 MOV ALBUFF+6,XADDR+4 .SPFUN #AREA,#0,#SP.PT,#PTBUFF,#0,#1 ;Enable loopback protocol BCC 23$ MOV #M.EPER,R0 ;R0 -> 'Protocol enable error' BR FATAL 23$: .SPFUN #AREA,#0,#SP.MA,#MABUFF,#0,#1 ;Loopback assist multicast BCC 24$ MOV #M.EMER,R0 ;R0 -> 'Multicast enable error' BR FATAL 24$: .PRINT #M.STAT ;Announce station's address MOV #ALBUFF+2,R1 CALL EAOUT .PRINT #M.CRLF 30$: CALL XMTCMP ;Prime the loopback assist pump .PRINT #M.LOOP ;Announce loopback is enabled .PRINT #M.CRLF .DSABL LSB .SBTTL LOOPFW - Initiates a loopback datagram .ENABL LSB LOOPFW: .GTLIN #CMDBUF,#M.PROM ;Prompt for the test station 10$: .MRKT #TAREA,#TIMBLK,#TIMCMP,#1 ;Start a timer BCC 15$ MOV #M.QELM,R0 ;R0 -> 'No queue element' JMP FATAL 15$: .SPFUN #XAREA,#0,#SP.XMT,#XBUFF,#759.,#0,#1 ;Transmit the datagram ; (Can't use 'wait' mode because ; of outstanding calls using ; completion mode) CLR RECVFG ;Reset the receive flag .SPND ;Suspend until the packet returns ; or we timeout waiting for it TST (PC)+ ;Did we get a response? RECVFG: .WORD 0 ; : Receive flag BNE 30$ ;Yes... .PRINT #M.NORE ;Nope, 'No response' .PRINT #M.CRLF BR LOOPFW 30$: .PRINT #M.RECV ;'Response received from' MOV #RBUFF+EF.SRC,R1 ;R1 -> Datagram source field CALL EAOUT ;Print the station address MOV #XDATA,R0 ;R0 -> Data transmitted MOV #RBUFF+,R1 ;R1 -> Data received MOV #DATASZ,R2 ;R2 = Count of data words 40$: CMP (R0)+,(R1)+ ;Is the received data correct? BNE 50$ ;Nope... DEC R2 ;Yes, more to check? BGT 40$ ;Yep... .PRINT #M.OK ;'data correct' 45$: .PRINT #M.CRLF .SPND ;Wait for timer to expire CALL XMTCMP ;Reprime the loopback assist pump BR LOOPFW 50$: .PRINT #M.NOK ;'data corrupt' BR 45$ .DSABL LSB .SBTTL Completion routines ;+ ; ; RCVCMP ; Entered on completion of posted read due to reception of ; a packet destined for this physical station, the loopback ; assist multicast address, or the broadcast address with ; a protocol type of 90-00. ; ; The received packet is processed, and if it is to be ; forwarded, a transmit is posted with completion at XMTCMP. ; If the datagram indicates that it has arrived at its ; destination, a flag is set to indicate a received packet and ; the mainline code is resumed so that the data may be verified. ; ; XMTCMP ; Entered on the following: ; ; 1) From top level code. Used to prime the loopback ; assist receive pump (completion driven). ; 2) Completion of the write posted in RCVCMP to forward ; a loopback packet. ; 3) From RCVCMP when a packet is not to be forwarded ; because it has reached its destination or is to ; be forwarded to a multicast address (a no-no). ; ; Posts another read with completion at RCVCMP. ; ; TIMCMP ; Entered when timer expires, indicating no response from ; remote station. ; ;- .ENABL LSB RCVCMP: MOV #RBUFF+EF.SKP,R0 ;R0 -> Skip count field BIT #7,(R0) ;Is skip count a multiple of 8.? BNE XMTCMP ;Nope, so ignore this packet CMP (R0),#<8.*186.> ;Is it a within range? BGT XMTCMP ;Nope, so ignore the packet MOV (R0),-(SP) ;Get the skip count ADD #8.,(R0)+ ;Update field ADD (SP)+,R0 ;Point to encapsulated data BIT #1,R0 ;Skip count getting us to odd address? BNE XMTCMP ;Yes, drop the packet... CMP (R0),#1 ;Reply packet? BNE 10$ ;Nope... TST RECVFG ;Did we already receive one? BNE XMTCMP ;Yes, so post the read again MOV SP,RECVFG ;Nope, so set the receive flag TIMCMP: .RSUM ;Resume the mainline RETURN 10$: CMP (R0)+,#2 ;Forward packet? BNE XMTCMP ;Nope, ignore it BIT #1,(R0) ;Is destination a multicast address? BNE XMTCMP ;Yes, then ignore it MOV #RBUFF+EF.DST,R1 ;R1 -> Destination field MOV (R0)+,(R1)+ ;Set next destination MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ CLR (R1)+ ;Force the station's physical address CLR (R1)+ ; to be used CLR (R1)+ MOV RBUFF+2,R1 ;Get actual frame size INC R1 ;Bump size in case of odd-sized frame ASR R1 ;Convert byte to word count 20$: .SPFUN #RAREA,#0,#SP.XMT,#RBUFF,R1,#0,#XMTCMP ;Pass the packet BCS 20$ ;Try again, in case of previous error RETURN XMTCMP: .SPFUN #RAREA,#0,#SP.RCV,#RBUFF,#759.,#0,#RCVCMP ;Post a read BCS XMTCMP ;Try again, in case of previous error RETURN .DSABL LSB .SBTTL HEX OUTPUT ROUTINES .ENABL LSB TYPOUT: MOV #2,R2 ;Protocol is two octets BR 10$ EAOUT: MOV #6,R2 ;Addresses are six octets BR 10$ 5$: .TTYOU #'- ;Delimiter 10$: MOVB (R1)+,-(SP) ;Save a byte of the address MOVB (SP),R0 ;Get the byte ASR R0 ;Shift high nybble to where we want it ASR R0 ASR R0 ASR R0 BIC #^C<17>,R0 ;Isolate it .TTYOU HEX(R0) ;Print the hex character MOVB (SP)+,R0 ;Get the address byte again BIC #^C<17>,R0 ;Isolate the low nybble .TTYOU HEX(R0) ;Print the hex character DEC R2 ;More to do? BGT 5$ ;Yep... RETURN .DSABL LSB .SBTTL Messages .PSECT .TEXT. .NLIST BEX M.PROM: .ASCII /Type to test: /<200> M.IVD: .ASCIZ /?NITEST-U-Invalid device/ M.LERR: .ASCIZ /?NITEST-U-Lookup error/ M.UAER: .ASCIZ /?NITEST-U-Unit allocation error/ M.EPER: .ASCIZ /?NITEST-U-Enable protocol error/ M.EMER: .ASCIZ /?NITEST-U-Enable multicast address error/ M.QELM: .ASCIZ /?NITEST-U-No queue element/ M.NORE: .ASCIZ /?NITEST-W-No response/ M.RECV: .ASCII /?NITEST-I-Response received from /<200> M.OK: .ASCIZ /, data correct/ M.NOK: .ASCIZ /, data corrupt/ M.STAT: .ASCII /Station address = /<200> M.LOOP: .ASCII /Loopback assist is enabled/ M.CRLF: .BYTE 0 HEX: .ASCII /0123456789ABCDEF/ .EVEN .LIST BEX .SBTTL Impure data area .PSECT .DATA. AREA: .BLKW 10. ;General purpose EMT area RAREA: .BLKW 6. ;EMT area for receive .SPFUN XAREA: .BLKW 6. ;EMT area for transmit .SPFUN TAREA: .BLKW 4 ;EMT area for timer CMDBUF: .BLKB 82. ;Response buffer QELEM: .BLKW 4*10. ;Extra queue elements TIMBLK: .WORD 0,1*60. ;Timer block JOBDAT: ;Job data area JOBNUM: .BLKW 12. DBLK: .WORD 0,0,0,0 ;Device block ALBUFF: .BLKW 4 ;Unit allocation buffer MABUFF: .BLKW ;Enable multicast address buffer HEX ;Loopback assist multicast address PTBUFF: .BLKW ;Enable protocol type buffer HEX <90-00> ;Protocol type = Loopback RBUFF: .BLKW 759. ;Receive buffer EF.DST = 4 EF.SRC = EF.DST+6 EF.PT = EF.SRC+6 EF.SKP = EF.PT+2 XBUFF: .BLKW ;Status word .BLKW ;reserved HEX ;Destination = loopback assist ; (Change this if you wish to send ; to a specific station) .WORD 0,0,0 ;Source = station physical address HEX <90-00> ;Protocol type = Loopback .WORD 0 ;Skip count .WORD 2 ;Forward XADDR: .WORD 0,0,0 ;Ultimate destination .WORD 1 ;Reply .WORD 1 ;Receipt number XDATA: .ASCIZ /Loopback datagram data area/ .EVEN DATASZ = <.-XDATA>/2 .BLKW 759.-<<.-XBUFF>/2> FREE == . .END NITEST CK.R5 MOV R4,-(SP) S.TOP2=CK.R4 MOV #<!377>,R4 CALL @$ELPTR MOV (SP)+,R4 CK.R4=S.TOP2 MOV (SP)+,R5 CK.R5=S.TOP .ENDC 10$: MOV FNFLAG,R0 .Assume WREQ!RDAWRT!RREQ NE 0 BEQ INTRQS .Assume RDAWRT GT 0 BPL 30$ TST DWWCHK BEQ 40$ .Assume RREQ EQ 1 ASR R0 BCC 20$ CALL DUMP BR 40$ .Assume RREQ EQ 1 20$: INC FNFLAG BR 110$ 30$: BMI 40$ JSR R0,MTFILL MOV @R4,(R2)+ MOV @R4,R5 CK.R5 Q$BLKN 40$: MOV WCNT,Q$WCNT(R5) BEQ INTRQS .IF NE MMG$T CK.R5 Q$BLKN MOV PARVAL,Q$PAR(R5) .IFF CK.R5 Q$BLKN MOV BUFF,Q$BUFF(R5) .ENDC TST FNFLAG .Assume WREQ EQ 100000 BPL 50$ ASL (PC)+ .WORD 100000 BCS 60$ 50$: CK.R5 Q$BLKN INC @R5 60$: CK.R5 Q$BLKN MOV @R5,R3 MOV DRETRY,RETRY JMP RWNEXT 70$: TST INREST DWFD1: BNE DWFDE CK.R4 DWID BIT #,DWERR(R4) BNE DWFDE .IF NE ERL$G MOV R5,-(SP) S.TOP=CK.R5 MOV R4,-(SP) S.TOP2=CK.R4 CALL ERLSET BISB RETRY,R4 CALL @$ELPTR MOV (SP)+,R4 CK.R4=S.TOP2 MOV (SP)+,R5 CK.R5=S.TOP .ENDC CK.R4 DWID TSTB DWSTAT(R4) BPL 80$ CALL DUMP 80$: CK.R4 DWID BIT #ERIDNF,DWERR(R4) BEQ 90$ CK.R4 DWID MOV DWST2(R4),R3 BIT #S2WRF,R3 BNE DWFDE BIC #^C,R3 CMP #,R3 BNE DWFDE MOV SP,INREST MOV CLRIRR,@#ICOPND CK.R4 DWID MOV #CMREST,DWCMD(R4) CLRPND: MOV CLRIMR,@#ICOPND RETURN 90$: DEC RETRY BEQ DWFDE CLR INREST TST FNFLAG .Assume RREQ!WREQ NE 0 BEQ 120$ .Assume WREQ EQ 100000 BPL 100$ BIT #RDAWRT,FNFLAG BNE 110$ 100$: JMP RWRTRY 110$: CALL DSKADR CALLR DOREAD 120$: JMP XRETRY .DSABLE LSB .SBTTL I/O COMPLETION SECTION .ENABL LSB DWFDE: .IF NE ERL$G MOV R5,-(SP) S.TOP=CK.R5 CALL ERLSET CALL @$ELPTR MOV (SP)+,R5 CK.R5=S.TOP .ENDC DWFUE: CK.R5 Q$BLKN BIS #HDERR$,@Q$CSW(R5) DWRQS: .DRFIN DW .DSABLE LSB .SBTTL EMPTY/FILL THE CONTROLLER'S SECTOR BUFFER SUBROUTINE .ENABL LSB MTFILL: S.TOP=CK.R5 MOV R5,-(SP) S.TOP2=CK.R4 MOV R4,-(SP) MOV (R0)+,60$ MOV (R0)+,100$ CK.R4 DWID MOV R4,R3 CK.R3=CK.R4 ADD #DWSTAT,R3 CK.R3 DWID,+DWSTAT ADD #DWBUF,R4 CK.R4 DWID,+DWBUF CK.R5 Q$BLKN MOV Q$BUFF(R5),R2 CK.R5 Q$BLKN MOV Q$WCNT(R5),R1 BEQ 90$ MOV R1,WCNT CMP R1,#256. BLOS 10$ MOV #256.,R1 10$: TST FNFLAG .Assume WREQ EQ 100000 BPL 20$ ASL (PC)+ .WORD 100000 BCS 30$ 20$: SUB R1,WCNT 30$: .IF NE MMG$T CK.R5 Q$BLKN MOV Q$PAR(R5),PARVAL JSR R0,@#.-. $P1EXT =:.-2 .WORD PARVAL-. .IFF MOV R2,BUFF TST FNFLAG .Assume WREQ EQ 100000 BPL 40$ ASL (PC)+ .WORD 100000 BCS 60$ 40$: ADD #512.,BUFF .ENDC 60$: .WORD 0 SOB R1,60$ .IF NE MMG$T PARVAL: .WORD 0 TST FNFLAG .Assume WREQ EQ 100000 BPL 70$ ASL (PC)+ .WORD 100000 BCS 80$ 70$: ADD #<256./32.>,PARVAL 80$: .ENDC 90$: CK.R3 DWSTAT MOV @R3,R5 .Assume STBUSY EQ 100000 BMI 110$ .Assume STOPND EQ 1 ASR R5 BCS 110$ .Assume STDRQ EQ 200 ASLB R5 BPL 90$ 100$: .WORD 0 BR 90$ 110$: MOV (SP)+,R4 CK.R4=S.TOP2 MOV (SP)+,R5 CK.R5=S.TOP RTS R0 .DSABL LSB .SBTTL DUMP THE CONTROLLER'S SECTOR BUFFER SUBROUTINE .ENABLE LSB DUMP: CK.R4 DWID CK.R2=CK.R4 MOV R4,R2 ADD #DWSTAT,R2 CK.R2 DWID,+DWSTAT MOV R4,R3 CK.R3=CK.R4 ADD #DWBUF,R3 CK.R3 DWID,+DWBUF 10$: CK.R2 DWSTAT MOV @R2,R1 ASR R1 .Assume STOPND EQ 1 BCS 20$ ASLB R1 .Assume STDRQ EQ 200 BPL 10$ CK.R3 DWBUF MOV @R3,R1 BR 10$ 20$: RETURN .DSABL LSB DSKADR: MOV #.-.,R0 CRNT2 =:.-2 CK.R0=CRNTCYL CK.R0 CRNTCYL,+2 CK.R4 DWID MOV (R0)+,DWCYL(R4) CK.R0 CRNTHD,+2 CK.R4 DWID MOV (R0)+,DWHEAD(R4) CK.R0 CRNTSEC,+2 CK.R4 DWID MOV (R0)+,DWSEC(R4) RETURN .IF NE ERL$G .SBTTL ERROR LOGGING SETUP SUBROUTINE .ENABLE LSB ERLSET: .ADDR #ERLIST,R2 MOV R2,R3 CK.R4 DWID MOV DWSTAT(R4),(R3)+ .Assume STBUSY EQ 100000 BMI 10$ CK.R4 DWID MOV DWCYL(R4),(R3)+ CK.R4 DWID MOV DWHEAD(R4),(R3)+ CK.R4 DWID MOV DWSEC(R4),(R3)+ CK.R4 DWID MOV DWERR(R4),(R3)+ CK.R4 DWID MOV DWST2(R4),@R3 BR 20$ 10$: MOV #-1,@R3 MOV (R3)+,@R3 MOV (R3)+,@R3 MOV (R3)+,@R3 MOV (R3)+,@R3 20$: MOV DRETRY,R3 SWAB R3 BISB #ERLRGS,R3 MOV #,R4 RETURN .DSABL LSB .ENDC .SBTTL BOOTSTRAP READ ROUTINE .DRBOT DW,BOOT1,READ,CONTROL= .ENABL LSB .=DWBOOT+14 DSKTYP: MOV #7,R3 CK.R4=DWID CLR DWSEC(R4) 10$: CK.R5=CK.R4 MOV R4,R5 BR 20$ .=DWBOOT+40 BOOT1: JMP @# 20$: CK.R5 DWID,+DWCYL ADD #DWCYL,R5 CK.R5 DWCYL,+2 CLR (R5)+ CK.R5 DWHEAD,+2 MOV R3,(R5)+ CK.R5 DWCMD,+2 MOV #CMREAD,(R5)+ BR 25$ .Assume . LE DWBOOT+120,MESSAGE=<;Bootstrap overlap> .=DWBOOT+120 25$: 30$: CK.R5 DWSTAT TST @R5 .Assume STBUSY EQ 100000 BMI 30$ CK.R4 DWID BIT #S2ERR,DWST2(R4) BEQ 40$ CK.R4 DWID BIT #ERIDNF!ERABO,DWERR(R4) BEQ 40$ SOB R3,10$ BR 60$ 40$: CK.R5 DWSTAT BIT #STOPND,@R5 BNE 50$ CK.R5 DWSTAT TSTB @R5 .Assume STDRQ EQ 200 BPL 40$ CK.R4 DWID TST DWBUF(R4) BR 40$ 50$: INC R3 TST (PC)+ 60$: SEC RETURN HITYP: .DSABL LSB .ENABL LSB READ: ASRB (PC)+ .WORD 1 BCC READX CLR R5 BISB @#173050,R5 SWAB R5 ASL R5 SUB #200,R5 MOV R5,@#KISAR1 MOV #AP$ACF,R5 MOV R5,@#KISDR1 CLR @#KISAR0 MOV R5,@#KISDR0 MOV #177600,@#KISAR7 MOV R5,@#KISDR7 BIS #20,@#MMUSR3 INC @#MMUSR0 MOV #CTI+PROCFG,R3 .ASSUME SLOT0 EQ CTI-4 MOV @R3,R4 MOV R4,R5 10$: TST -(R3) CMP -(R3),#DW$ID BEQ 20$ SOB R5,10$ CLR @#MMUSR0 BR ERRX 20$: CLR @#MMUSR0 SUB R5,R4 ASH #7.,R4 ADD R4,DWCSR1 MOV DWCSR1,R4 CK.R4=DWID CK.R4 DWID BIT #STDCAP,DWSTAT(R4) BNE READX MOV #-1,DW$CY1 CALL DSKTYP BCS ERRX MOV R3,DW$HD .DSABL LSB .ENABL LSB READX: MOV (PC)+,R4 DWCSR1: .WORD PC$CSR CK.R4=DWID CK.R4 DWID TST DWSTAT(R4) .Assume STBUSY EQ 100000 BMI ERRX 10$: MOV R0,-(SP) MOV R1,-(SP) BOTNXT: MOV @SP,R3 CMP R3,#256. BLOS 20$ MOV #256.,R3 20$: SUB R3,@SP MOV 2(SP),R1 INC R1 INC 2(SP) MOV R1,R5 BIC #SECMSK,R5 CK.R4 DWID MOV R5,DWSEC(R4) ASH #-SECBIT,R1 .Assume SECBIT EQ 4 BIC #170000,R1 CLR R0 DIV #4,R0 DW$HD =:.-2 CMP R0,(PC)+ DW$CY1: .WORD 153. BLO 30$ ERRX: JMP @# 30$: CK.R4 DWID MOV R4,R5 CK.R5=CK.R4 CK.R5 DWID,+DWCYL ADD #DWCYL,R5 CK.R5 DWCYL,+2 MOV R0,(R5)+ CK.R5 DWHEAD,+2 MOV R1,(R5)+ CK.R5 DWCMD,+2 MOV #CMREAD,(R5)+ .DSABL LSB .ENABL LSB 10$: CK.R5 DWSTAT TST @R5 .Assume STBUSY EQ 100000 BMI 10$ CK.R4 DWID BIT #S2ERR,DWST2(R4) BNE ERRX 20$: 30$: CK.R5 DWSTAT TSTB @R5 .Assume STDRQ EQ 200 BPL 30$ MOV DWBUF(R4),(R2)+ SOB R3,20$ 40$: CK.R5 DWSTAT BIT #STOPND,@R5 BNE 50$ TSTB @R5 .Assume STDRQ EQ 200 BPL 40$ CK.R4 DWID TST DWBUF(R4) BR 40$ 50$: TST @SP BNE BOTNXT CMP (SP)+,(SP)+ CLC RETURN .Assume . LE DWBOOT+612,MESSAGE=<;Bootstrap overlap> .DSABL LSB .=DWBOOT+612 BOOT: MOV #10000,SP MOV #2,R0 MOV #<4*256.>,R1 MOV #1000,R2 CALL READ MOV #,@#B$READ MOV #B$DNAM,@#B$DEVN CLR @#B$DEVU JMP @#B$BOOT .DREND DW .SBTTL FETCH/LOAD code .PSECT SETOVR SETOVR: FETCH: JMP FETCH1 DWREAD: MOV R0,-(SP) MOV R4,-(SP) MOV #2,DWSEC(R0) ADD #DWCYL,R0 MOV (R5)+,(R0)+ CLR (R0)+ MOV #CMREAD,(R0)+ MOV (R5)+,R3 MOV (R5)+,R4 10$: TST (R0) BMI 10$ 20$: TSTB (R0) BPL 20$ MOV DWBUF-DWSTAT(R0),(R4)+ SOB R3,20$ 30$: TSTB (R0) BPL 40$ TST DWBUF-DWSTAT(R0); YES - Drop a word from the controller 40$: BIT #STOPND,(R0) BEQ 30$ BIT #S2ERR,DWST2-DWSTAT(R0) BEQ 50$ SEC 50$: MOV (SP)+,R4 MOV (SP)+,R0 RTS R5 .ENABL LSB FNGEOM: TST DWTYPS BNE 95$ CMP 2(R1),TSIZE+2(R1) BNE 95$ MOV R2,-(SP) .ADDR #BUFHOM,R2 MOV R2,10$ JSR R5,DWREAD .WORD 0 .WORD 256. 10$: .WORD 0 BCS 90$ MOV R4,-(SP) MOV #-1,35$ 15$: MOV 4(R1),20$ INC 20$ .ADDR #BUFWRP,R2 MOV R2,25$ JSR R5,DWREAD 20$: .WORD 0 .WORD SIZWRP 25$: .WORD 0 BCS 85$ MOV #SIZWRP,R2 .ADDR #BUFHOM,R3 .ADDR #BUFWRP,R4 30$: CMP (R3)+,(R4)+ BNE 80$ SOB R2,30$ INC (PC)+ 35$: .WORD -1 BNE 75$ MOV #SIZWRP,R2 .ADDR #HOMPAT+,R4 40$: CMP -(R3),-(R4) BNE 45$ SOB R2,40$ CMP (R3)+,(R4)+ TST (R4)+ MOV (R4),(R3)+ MOV -(R4),(R3) CMP -(R3),-(R3) BR 60$ 45$: MOV (R4),(R3) BR 55$ 50$: MOV -(R4),-(R3) 55$: SOB R2,50$ 60$: MOV #2,DWSEC(R0) CLR DWCYL(R0) CLR DWHEAD(R0) MOV #CMWRIT,DWCMD(R0) 65$: TSTB DWSTAT(R0) BPL 70$ MOV (R3)+,DWBUF(R0) 70$: BIT #STOPND,DWSTAT(R0) BEQ 65$ BR 15$ 75$: SEC BR 85$ 80$: ADD #TSIZE,R1 CLC 85$: MOV (SP)+,R4 90$: MOV (SP)+,R2 BCC FNGEOM 95$: MOV (R1),R3 CK.R5=DWBASE CK.R2=SYSPTR MOV #TSIZE/2,R0 CK.R5 DWBASE ADD #RDTYP-DWBASE,R5 100$: MOV (R1)+,(R5)+ SOB R0,100$ 105$: CK.R2 SYSPTR MOVB R3,DWTYPE(R2) DWTYPX=:.-2 FETXIT: TST (PC)+ FETERR: SEC BIC R0,R0 RETURN .DSABL LSB DWTAB: .BYTE TYP51,TYP52C,TYP32,TYP52A,TYP52Q .EVEN DEVCHR: $TYPE$ TYP50 4. 153. 9792. 9727. 0. 9792. 9727. $TYPE$ TYP51 4. 306. 19584. 19519. 0. 19584. 19519. $TYPE$ TYP31 4. 615. 39360. 39295. 0. 39360. 39295. $TYPE$ TYP52C 5. 697. 55760. 55679. 0. 55760. 55679. $TYPE$ TYP32 6. 820. 78720. 78623. 13088. 65535. 65535. $TYPE$ TYP52A 7. 645. 72240. 72127. 6705. 65535. 65535. $TYPE$ TYP52Q 8. 512. 65536. 65407. 1. 65535. 65407. $TYPE$ TYP53 8. 1024. 131072. 130943. 65535. 65535. 65535. $TYPE$ 0 -1 0. 0. 0. 0. 0. 0. SIZWRP =: 3. BLKHOM =: 1. HOMPAT: .WORD 0,170000,7777 DWTYPS: .WORD 0 BUFWRP: .BLKW SIZWRP BUFHOM: .=BUFWRP .ENABL LSB FETCH1: NOP MOV @R5,R5 CK.R5=DWBASE MOV @#SYSPTR,R2 CK.R2=SYSPTR .IF NE MMG$T CK.R2 SYSPTR CK.R5 DWBASE MOV P1EXT(R2),$P1EXT-DWBASE(R5) .ENDC CK.R5 DWBASE MOV DWCSR-DWBASE(R5),R0 CK.R0=DWID BNE 15$ MOV #DW$ID,-(SP) CK.R1=$GTVEC CK.R1 ,+2 TST (R1)+ CK.R1 $GTCSR CALL @R1 MOV (SP)+,R0 CK.R0=DWID BCS FETERR CK.R0 DWID CK.R5 DWBASE MOV R0,DWCSR-DWBASE(R5) MOV #DW$ID,-(SP) CK.R1 $GTCSR,+2 TST (R1)+ CK.R1 $GTSLT CALL @R1 CK.R5 DWBASE BIS @SP,CLRIMR-DWBASE(R5) CK.R5 DWBASE BIS @SP,SETIMR-DWBASE(R5) CK.R5 DWBASE BIS (SP)+,CLRIRR-DWBASE(R5) BR 17$ 15$: INC DWTYPX 17$: MOV R5,R1 CK.R1=CK.R5 ADD #DRETRY-DWBASE,R1 CK.R1 ,+DRETRY-DWBASE CK.R1 DRETRY CK.R5 DWBASE MOV R1,DRETR1-DWBASE(R5) CK.R1 DRETRY ADD #CRNTCYL-DRETRY,R1 CK.R1 ,+CRNTCYL-DRETRY CK.R1 CRNTCYL CK.R5 DWBASE MOV R1,CRNT1-DWBASE(R5) CK.R1 CRNTCYL CK.R5 DWBASE MOV R1,CRNT2-DWBASE(R5) CK.R1 CRNTCYL ADD #FNTBL-CRNTCYL,R1 CK.R1 ,+FNTBL-CRNTCYL CK.R1 FNTBL CK.R5 DWBASE MOV R1,FNTBL1-DWBASE(R5) CMP #DPT.BT,R3 BNE 20$ MOV @#DW$HD-DWBOOT,R3 BR HEADCK .SBTTL Use the DSKTYP routine in DRBOT CK.R2 SYSPTR 20$: MOV DWTYPE(R2),R3 BIT #1,DWTYPX BEQ 23$ SWAB R3 23$: MOVB R3,R3 BNE 31$ MOV R4,-(SP) S.TOP=CK.R4 MOV R5,-(SP) S.TOP2=CK.R5 CK.R0 DWID MOV R0,R4 CK.R4=CK.R0 CK.R4 DWID CALL DSKTYP MOV (SP)+,R5 CK.R5=S.TOP2 MOV (SP)+,R4 CK.R4=S.TOP BCS FETERR HEADCK: CMP #4,R3 BNE 30$ CK.R3=4 CK.R0 DWID BIT #STDCAP,DWSTAT(R0) BEQ 30$ MOV #TYP50,R3 31$: INC DWTYPS BR FETUPD 30$: .BR FETXLT CK.R5 DWBASE CK.R2 SYSPTR .DSABL LSB .ENABL LSB FETXLT: .ADDR #DWTAB-4,R3,ADD MOVB @R3,R3 FETUPD: .ADDR #DEVCHR,R1 10$: CMPB @R1,R3 BEQ 20$ ADD #TSIZE,R1 BR 10$ 20$: JMP FNGEOM .DSABL LSB .ASSUME BUFHOM+1000 LE SETOVR+2000,MESSAGE=<;FETCH area overflow> .ASSUME .+ LE SETOVR+2000,MESSAGE=<;DSKTYP not all in FETCH blocks> .END .MCALL .MODULE .MODULE DZ,VERSION=20,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1986, 1987 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY .ENABL LC .SBTTL General Comments .SBTTL DEFINITIONS .MCALL .DRDEF, .ASSUME, .BR, .ADDR .DRDEF DZ,52,FILST$!SPFUN$,800.,0,0 .DRPTR FETCH=DZLOAD,LOAD=DZLOAD .DREST CLASS=DVC.DK .DRSPF <377> .DRSPF <376> .SBTTL Constants and defaults .IIF NDF DZ.CMA, DZ.CMA = 173206 .IIF NDF DZ.CMB, DZ.CMB = 173212 .IIF NDF DZ.IEN, DZ.IEN = 1 DZ$CS0 = 4 SPFUNC = 100000 SYSPTR = 54 P1EXT = 432 GETVEC = 436 PC$CSR = 174000 PC$VEC = 300 PC$IC1 = 173206 PC$IC2 = 173212 MMUSR0 = 177572 MMUSR3 = 172516 .IRPC X <01234567> KISAR'X = 172340+<2*X> KISDR'X = 172300+<2*X> .ENDR AP$ACF= 077406 PROCFG = 37776 CTI = -10. SLOT0 = -14. DZ$ID = 2004 DZ.ID = -4 DZ.CS0 = 0 C0.DSK = 002 C0.DRV = 004 C0.MTO = 010 C0.FN0 = 020 C0.FN1 = 040 C0.FN2 = 100 C0.STA = 000 C0.RSD = 040 C0.RSS = 060 C0.RED = 100 C0.RER = 120 C0.RAD = 140 C0.WRT = 160 C0.DON = 10 DZ.CS1 = 2 DZ.CS2 = 4 DZ.CS3 = 6 DZ.DB = 14 DZ.CA = 16 DZ.GO = 20 DZMTRK = 79. RETRY = 8. DZNREG = 7. KISAR1 = 172342 .SBTTL Installation checks .DRINS DZ BR 1$ BR 2$ 1$: MOV @#SYSPTR,R3 MOV GETVEC(R3),R3 TST (R3)+ 2$: MOV #DZ$ID,-(SP) CALL @R3 MOV (SP)+,R3 RETURN FINDRV: .ADDR #DEVNAM,R0 MOV PC,-(SP) ADD #DAREA-.,@SP EMT 342 BCS O.BAD MOV DAREA+4,R1 BEQ O.BAD BR O.GOOD DAREA: .BLKW 4 DEVNAM: .RAD50 /DZ / BAREA: .BYTE 17,10 .BLKW 0 .BLKW 0 .WORD 256. .WORD 0 .IIF GT,<.-356> .ERROR .SBTTL SET options .DRSET RETRY, 127., O.RTRY, NUM .IF NE ERL$G .DRSET SUCCES, -1, O.SUCC, NO .ENDC .SBTTL Handler modification routines O.RTRY: CMP R0,R3 BHI O.BAD MOV R0,DRETRY BNE O.GOOD BR O.BAD .IF NE ERL$G O.SUCC: MOV #0,R3 N.SUCC: MOV R3,SCSFLG .ASSUME O.SUCC+4 EQ N.SUCC BR O.GOOD .ENDC O.GOOD: TST (PC)+ O.BAD: SEC RETURN .IIF GT,<.-1000> .ERROR .SBTTL Driver request entry point .ENABL LSB .DRBEG DZ .IF NE ERL$G BR DZENT SCSFLG: .WORD 0 .ASSUME . LE DZSTRT+1000 DZENT: .ENDC MOV #9.,DZTRY MOV #110,R0 BIS (PC)+,R0 INTENB: .WORD DZ.IEN MOV #50,R2 BIS INTENB,R2 MOV (PC)+,R1 IRRA: .WORD DZ.CMA MOV R0,@R1 MOV R2,@R1 MOV (PC)+,R1 IRRB: .WORD DZ.CMB MOV R0,@R1 NOP MOV R2,(PC)+ ENABLE: .WORD 0 MOV #70,R2 BIS INTENB,R2 MOV R2,(PC)+ DSABLE: .WORD 0 CLR (PC)+ SPFUNF: .WORD 0 MOV DZCQE,R3 MOV (R3)+,R5 MOV #C0.RED,R4 MOVB (R3)+,R1 CMPB #376,R1 BLE 45$ JMP DZABRT DRETRY: .WORD RETRY 45$: MOVB (R3)+,R0 ASRB R0 BCC 20$ BIS #C0.DSK,R4 20$: ASRB R0 BCC 30$ BIS #C0.DRV,R4 30$: ASRB R0 BCS DZERR MOV (R3)+,R0 MOV (R3)+,R2 BPL 40$ BIS #C0.WRT,R4 NEG R2 40$: ASL R1 MOV R1,SPFUNF ADD PC,R1 ADD CHGTBL-.(R1),R4 MOV R4,DZFUN2 TST SPFUNF BNE 90$ ASL R2 MOV (PC)+,R4 .BYTE -7.,-10. 50$: CMP #1280.,R5 BHI 60$ ADD #-1280.,R5 60$: ROL R5 INCB R4 BLE 50$ MOVB R5,R1 ADD R4,R5 MOV R1,R4 ASL R1 70$: SUB #10.,R1 BGT 70$ MOV R1,TRKOFF BR 100$ 90$: SWAB R5 BISB R2,R5 MOV #512.,R2 100$: MOV R0,(PC)+ BUFRAD: .WORD 0 MOV R5,(PC)+ TRACK: .BYTE 0 SECTOR: .BYTE 0 MOV R2,(PC)+ BYTCNT: .WORD 0 .IF NE MMG$T TST (R3)+ MOV @R3,PARVAL .ENDC .BR DZINIT .DSABL LSB .SBTTL Start transfer or retry .ENABL LSB DZINIT: MOV DZCSA,R4 MOV R4,R5 ADD #DZ.DB,R5 10$: MOV DZFUN2,R0 MOV R0,-(SP) BIC #^C,@SP CMP #C0.WRT,(SP)+ BNE 30$ TST DZTRY BNE 20$ MOV DRETRY,DZTRY 20$: JSR R0,SILOFE MOVB (R2)+,@R5 MOV R1,@R5 30$: MOVB SECTOR,R2 BGT 50$ SUB #-6.,R2 BGT 40$ ADD #4.,R2 SEC 40$: ROL R2 ADD (PC)+,R2 TRKOFF: .WORD 0 BGT 50$ ADD #10.,R2 50$: MOVB R0,@R4 MOV TRACK,R0 CMPB R0,#DZMTRK+1 BNE 60$ CLR R0 60$: MOVB R0,DZ.CS1(R4) MOVB R2,DZ.CS2(R4) CLRB DZ.GO(R4) RETURN DZERR: MOV DZCQE,R4 BIS #HDERR$,@-(R4) BR DZABRT .SBTTL Interrupt and abort entry points .DRAST DZ,5 .FORK DZFBLK MOV (PC)+,R0 DZFUN2: .WORD 0 MOV #512.,R3 MOV (PC)+,R4 DZCSA: .WORD DZ$CS0 MOV R4,R5 ADD #DZ.DB,R5 TSTB @R4 BMI DZRTRY MOV DRETRY,DZTRY MOV R0,-(SP) BIC #17,@SP CMP #C0.WRT,(SP)+ BEQ 70$ JSR R0,SILOFE MOVB @R5,(R2)+ MOV @R5,R2 MOV #1,DZTRY 70$: INCB SECTOR BNE 80$ ADD #-10.*256.+1,TRACK ADD #2,TRKOFF BLE 80$ SUB #10.,TRKOFF 80$: .IF EQ MMG$T ADD R3,BUFRAD .IFF ADD #8.,PARVAL .ENDC SUB R3,BYTCNT BHI 10$ 90$: .IF NE ERL$G TST SCSFLG BNE 100$ MOV #DZ$COD*400+377,R4 MOV DZCQE,R5 CALL @$ELPTR .ENDC DZABRT: CLR DZFBLK+2 100$: MOV DSABLE,@IRRA MOV DSABLE,@IRRB .DRFIN DZ .DSABL LSB .SBTTL DZRTRY - Error handling .ENABL LSB DZRTRY: .IF NE ERL$G .ADDR #DZRBUF,R3 MOV R3,R2 MOV #DZNREG,R0 10$: MOV (R4)+,(R3)+ DEC R0 BNE 10$ MOVB DRETRY,R3 SWAB R3 BISB #DZNREG,R3 MOV #,R4 BISB DZTRY,R4 DECB R4 MOV DZCQE,R5 CALL @$ELPTR MOV DZCSA,R4 .ENDC DEC (PC)+ DZTRY: .WORD 0 BGT 30$ 20$: JMP DZERR 30$: MOV DZ.CS1(R4),R0 .ADDR #DZERRT,R3 40$: TSTB @R3 BEQ 20$ CMP R0,(R3)+ BNE 40$ JMP DZINIT .DSABL LSB .SBTTL SILOFE - Fill or empty the silo .ENABL LSB SILOFE: MOV (R0)+,20$ MOV (R0)+,40$ MOV #512.,R3 CLRB DZ.CA(R4) MOV BUFRAD,R2 MOV BYTCNT,R1 BEQ 50$ .IF NE MMG$T JSR R0,@(PC)+ $P1EXT: .WORD P1EXT .WORD PARVAL-. .ENDC CMP R1,R3 BLOS 10$ MOV R3,R1 10$: SUB R1,R3 20$: HALT DEC R1 BNE 20$ .IF NE MMG$T PARVAL: .WORD 0 .ENDC 30$: TST R3 BEQ 50$ 40$: HALT DEC R3 BNE 40$ 50$: MOV #512.,R3 NOP RTS R0 .DSABL LSB .SBTTL Tables, fork block, end of driver .WORD C0.WRT-C0.RED .WORD C0.RED-C0.RED CHGTBL: .WORD 0 DZFBLK: .WORD 0,0,0,0 .NLIST BEX DZERRT: .WORD 060 .WORD 140 .WORD 200 .WORD 210 .WORD 0,0,0,0 .LIST BEX .IF NE ERL$G DZRBUF: .BLKW DZNREG .ENDC .SBTTL VECTOR TABLE DZ$VEC = PC$VEC .DRVTB DZ,0,DZINT,SLOTID=DZ$ID .SBTTL Bootstrap read routine .DRBOT DZ,BOOT1,READ1,CONTROL= . = DZBOOT+40 BOOT1: JMP @#BOOT-DZBOOT .ENABL LSB . = DZBOOT+120 READ1: MOV @#B$DEVU,-(SP) BR 10$ READ: MOV BTUNIT,-(SP) 10$: CALL FNDCSR MOV (SP)+,R4 ASL R4 BIS #C0.RED,R4 MOV R4,(PC)+ SELBIT: .WORD 0 ASL R1 MOV (PC)+,R4 .BYTE -7.,-10. 20$: CMP #1280.,R0 BHI 30$ ADD #-1280.,R0 30$: ROL R0 INCB R4 BLE 20$ MOVB R0,R5 ADD R4,R0 MOV R5,R4 ASL R5 40$: SUB #10.,R5 BGT 40$ MOV R5,TRKOF MOV R0,(PC)+ TRK: .BYTE 0 SEC: .BYTE 0 50$: MOVB SEC,R0 SUB #-6.,R0 BGT 60$ ADD #4.,R0 SEC 60$: ROL R0 ADD (PC)+,R0 TRKOF: .WORD 0 BGT 70$ ADD #10.,R0 70$: MOV (PC)+,R5 DZCSR0: .WORD PC$CSR+DZ$CS0 MOV SELBIT,@R5 MOVB TRK,DZ.CS1(R5) MOVB R0,DZ.CS2(R5) MOV R5,R4 ADD #DZ.DB,R4 CLRB DZ.GO(R5) 80$: BITB #C0.DON,@R5 BEQ 80$ CLRB DZ.CA(R5) MOV #512.,R0 90$: MOVB @R4,(R2)+ DEC R1 BEQ 100$ DEC R0 BNE 90$ 100$: INCB SEC BNE 110$ ADD #-10.*256.+1,TRK ADD #2,TRKOF BLE 110$ SUB #10.,TRKOF 110$: TST R1 BNE 50$ CLC RETURN .DSABL LSB FNDCSR: ASRB (PC)+ .WORD 1 BCC 3$ CLR R5 BISB @#173050,R5 SWAB R5 ASL R5 SUB #200,R5 MOV R5,@#KISAR1 MOV #AP$ACF,R5 MOV R5,@#KISDR1 CLR @#KISAR0 MOV R5,@#KISDR0 MOV #177600,@#KISAR7 MOV R5,@#KISDR7 BIS #20,@#MMUSR3 INC @#MMUSR0 MOV #CTI+PROCFG,R3 .ASSUME SLOT0 EQ CTI-4 MOV @R3,R4 MOV R4,R5 1$: TST -(R3) CMP -(R3),#DZ$ID BEQ 2$ SOB R5,1$ CLR @#MMUSR0 JMP @# 2$: CLR @#MMUSR0 SUB R5,R4 ASH #7.,R4 ADD R4,DZCSR0 3$: RETURN . = DZBOOT+556 BOOT: CALL FNDCSR MOV DZCSR0,R2 MOV @R2,R1 BIC #^C,R1 .ASSUME EQ 0 MOV R0,(PC)+ BTUNIT: .WORD 0 ASR R0 BIS R0,R1 MOV R1,@R2 CLRB DZ.GO(R2) 10$: BIT #,@R2 BEQ 10$ MOV #10000,SP MOV #2,R0 MOV #<4*256.>,R1 MOV #1000,R2 CALL READ MOV #READ1-DZBOOT,@#B$READ MOV BTUNIT,@#B$DEVU JMP @#B$BOOT .DREND DZ DZLOAD: MOV (R5),R5 .IF NE MMG$T MOV @#SYSPTR,R4 MOV P1EXT(R4),$P1EXT-DZLQE(R5) .ENDC MOV #DZ$ID,-(SP) TST (R1)+ CALL (R1) ADD (SP)+,DZCSA-DZLQE(R5) MOV #DZ$ID,-(SP) TST (R1)+ CALL (R1) MOV (SP)+,INTENB-DZLQE(R5) CLC RETURN .END .MCALL .MODULE .MODULE LD,VERSION=27,COMMENT= ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SbTtl Conditional assembly summary .SbTtl PSECT ordering .PSect LdDvr .PSect SetOvr .PSect LdRun .PSect .LibC. .NList BEX,CND .IIf NDF RTE$M RTE$M=0 .IIf NDF MMg$t MMg$t=0 .IIf NDF SJOnly SJOnly=0 .IIf NE SJOnly SJOnly=1 .IIf NDF LD$Own LD$Own=1 .IIf NE LD$Own LD$Own=1 .IIf NDF LD$Nam LD$Nam=^rLD .IIf NE SJOnly LD$Own=0 .IIf NDF EIS$I EIS$I=RTE$M!MMg$t .IIf NE SJOnly*MMg$t .Error .IIf NE SJOnly*RTE$M .Error .IIf NE MMg$t*RTE$M .Error .IIf NDF Def$LD Def$LD=:^rDSK .LDGen =: <2*MMg$t>!<10*RTE$M>!<400*EIS$I>!<1000*SJOnly>!<2000*LD$Own> .Audit .LD .LDGen Def$LD .SbTtl .If NE MMg$t .SbTtl *** Supports XM .SbTtl LDX is handler name .IfF .If EQ SJOnly .If EQ RTE$M .SbTtl *** Supports FB .SbTtl *** Supports SJ .SbTtl LD is handler name .IfF .SbTtl *** Supports RTEM .SbTtl LDM is handler name .EndC;EQ RTE$M .IfF .SbTtl *** Supports SJ .SbTtl LD is handler name .EndC .EndC .If EQ LD$Own .SbTtl Device ownership is NOT checked .IfF .SbTtl Device ownership IS checked .EndC .SbTtl .SbTtl Macros and Definitions .MCall .DrDef .MCall .CsiSpc .Print .Exit .Purge .MCall .LookUp .DStat .FProt .Fetch .MCall .Enter .SpFun .WritW .CStat .MCall .Release .SErr .Chain .SetTop .MCall .SReset .Assume .Br ...CmZ .MCall .Addr .CkXX .IIf EQ EIS$I .MCall SOB .CkXX .CkXX .CkXX .CkXX .CkXX .CkXX .CkXX CkUnit =: 3 CkUBuf =: 10000 CkSP =: 1000 CkFlag =: CkSP-2 CkCurr =: 3003 CkNUnit =: 5 CkFile =: 6 CkIndx =: 13 CkJunk =: 123456 .SbTtl Global References to ULBLIB .Globl $CBOMg .Globl $FnAsc .Globl $R50Asc LD.Cnt = 0 RM.Cnt = 0 .Macro $Rel Loc Value Base ...V2 = . . = Loc .If IDN Ld.Cnt = Ld.Cnt+1 .Irp ...V3 <\Ld.Cnt> LD.'...V3: .Word Value-LdBase .EndR . = ...V2 .MExit .EndC .If IDN RM.Cnt = RM.Cnt+1 .Irp ...V3 <\RM.Cnt> RM.'...V3: .Word Value .EndR . = ...V2 .MExit .EndC .Error .EndM $Rel .Macro Boff Dst Beq Dst .EndM Boff .Macro Bon Dst Bne Dst .EndM Bon .Macro ...... .EndM ...... .SbTtl Equates PR7 =: 7*40 JSP =: 42 JSW =: 44 SpXit$ =: 40 Chain$ =: 400 Ovly$ =: 1000 ChnIF$ =: 4000 RStrt$ =: 20000 JUsErB =: 53 Succs$ =: 1 Warn$ =: 2 Error$ =: 4 Fatal$ =: 10 Uncon$ =: 20 JRMon =: 54 InsCsr =: 176 InsCk =: 200 CmdLen =: 510 CmdStr =: 512 ChnTo =: 500 PPN =: 510 ChnFrm =: 512 ChnArg =: 522 ChnNon =: 377 ChnRtn =: 177 ChnErr =: 523 ChnUEB =: 524 ChnMsg =: 525 ChnEOL =: -1 Indx$M =: 76 SyUnit =: 275 SysVer =: 276 MinVer =: 5 ConFg1 =: 300 FBMon$ =: 000001 $MTPS =: 360 $MFPS =: 362 SyIndx =: 364 ConFg2 =: 370 LDRel$ =: 000020 SysGen =: 372 XMMon$ =: 000002 RTEM$ =: 000010 $PName =: 404 MaxSlt =: 31. EntEnd =: 177777 Suffix =: 412 OwnMsk =: 17 Odd =: 1 Bin2As =: '0 LC2UC =: 040 LC.a =: 'a LC.z =: 'z Bin2Rd =: ^r 0 WdsBlk =: 256. JobMsk =: 7 FilNum =: 17 Upd$Fn =: 372 H2B =: +1 B2H =: -1 Siz$Fn =: 373 Swt.$ =: '$ Swt.A =: 'A Swt.C =: 'C Swt.L =: 'L Swt.R =: 'R Swt.W =: 'W .SbTtl Define handler characteristics .DrDef LD, 46, FilSt$!SpFun$!VarSz$, 0, 0, 0 .DrPtr FETCH=INIT,LOAD=INIT .DrESt CLASS=DVC.DK,DATA=LDData,TYPE=LD .DRSpF .DRSpF .Asect .=:JSW .Word Ovly$ .SbTtl Installation check code .DrIns LD Br 10$ ........... .Assume . EQ InsSys Br InErr ............. 10$: Mov @#JRmon, R0 CK.R0=JRmon CK.R0 JRmon CmpB SysVer(R0),#MinVer Blo InErr .If NE SJOnly CK.R0 JRmon Bit #FBMon$,ConFg1(R0) Bon InErr .EndC CK.R0 JRmon Bit #RTEM$,SysGen(R0) .If NE RTE$M Boff InErr .IfF Bon InErr .EndC CK.R0 JRmon Bit #XMMon$,SysGen(R0) .If NE MMG$T Boff InErr .IfF Bon InErr .EndC Tst (PC)+ InErr: Sec Return ...... .Enable LSB DoChain: Mov @#JRMON,R0 CK.R0=JRmon CK.R0 JRmon Add SUFFIX(R0),RNAME Jsr R1,10$ .Rad50 "SY " RName: .RMODULE .Rad50 " SYS" .Word 0 .Word 0,0,0,0 .Word ChnEOL 10$: Mov #ChnTo,R0 20$: Mov @R1,(R0)+ Cmp #ChnEOL,(R1)+ Bne 20$ Tst -(R0) 30$: Mov @R3,(R0)+ Cmp #ChnEOL,(R3)+ Bne 30$ .Chain ...... .Dsabl LSB .Assume . LE 400,MESSAGE=<;Install area overflow> .SbTtl Set Code .Enable LSB .DrSet CLEAN Swt.C SetCle .DrSet EMPTY -1 SetMty .DrSet WRITE Swt.R SetWri NO .DrSet BPT NOP SetBPT SetBPT: Mov #BPT,R3 .Br SetNoB SetNoB: .Assume SetBPT+4 EQ SetNoB Cmp #BPTLen/2,R0 Blos SetErr Asl R0 CK.SP=CkSP CK.SP ,-2 Jsr R1,10$ BPTTab: .Word DBGSet-TabBas .Word DBGQue-TabBas BPTLen =: .-BPTTab 10$: Add R1,R0 Mov @R0,R0 Add PC,R0 TabBas=:. Mov R3,@R0 CK.SP ,+2 Mov (SP)+,R1 CK.SP CkSP Br SetOk ............. SetWri: Mov #Swt.W,R3 .Br SetNoW SetNoW: .Assume SetWri+4 EQ SetNoW .Br SetCle SetCle: Call DBGSet TstB -1(R5) Bne Not1Op MovB R3,Letter Bis #Bin2As,R1 MovB R1,Number Jsr R3,DoChain .............. .Assume . EQ 20$ 20$: .Ascii "/" Letter: .BlkB 1 .Ascii ":" Number: .BlkB 1 .Asciz "" .Even .Word ChnEOL SetMty: Call DBGSet TstB -1(R5) Bne Not1Op Jsr R3,DoChain .IRpC x,<01234567> .Ascii "/L:x" .EndR .Asciz "" .Even .Word ChnEOL .Enable LSB Not1Op: CK.SP=CkSP CK.SP ,-2 Jsr R0,SetMsg ................. .Ascii "?" .NLCsi TYPE=I,PART=NAME .Asciz "-F-Only 1 option per SET allowed" .Even SetMsg: 10$: TstB -(R5) TstB -1(R5) Bne 10$ .Print CK.SP ,+2 Tst (SP)+ CK.SP CkSP .Br SetOk SetOk: Tst (PC)+ SetErr: Sec Return ...... DBGSet: BPT .=:DBGSet;******************************;5 NOP Return ...... .Assume . LE 1000,MESSAGE=<;Set area overflow> LDHand =: 1000 .SbTtl Queue Manager code .Enable LSB .DrBeg LD LdBase =:LDSTRT+6 Br Cont ............ .SbTtl Data Area LdData:: Units =: 8. UntMsk =: Units-1 .Assume Units EQ 8. BufLow: .RAD50 "LD" .Word Units Handlr: .BlkW Units H.Leng =: 2 Handlz: Ld.Act =: 100000 Ld.RdO =: 040000 Ld$Unt =: 037400 Ld.UOf =: 000200 Ld.UNx =: 000100 Ld$Ndx =: 000076 .Assume . LE LDStrt+1000,MESSAGE=<;Set object not in block 1> Offset: .BlkW Units Size: .BlkW Units Name: .BlkW Units*4 BufHi: Cont: Mov LdCQE,R4 CK.R4=Q$BlkN DBGQue: BPT .=:DBGQue;******************************;3 NOP .Assume . LE LDStrt+1000,MESSAGE=<;Set object not in block 1> Mov #Handlr,R5 $Rel .-2 Handlr LD CK.R5=Handlr CK.R4 Q$BlkN MovB Q$Unit(R4),R2 Bic #^cUntMsk,R2 CK.R2=CkUnit CK.R2 CkUnit Asl R2 CK.R2=CkUnit*2 CK.R4 Q$BlkN MovB Q$Func(R4),R1 Bpl RelCk CmpB #Upd$Fn,R1 Bne 60$ CK.R5A=CK.R5 Cmp -(R5),-(R5) CK.R5A BufLow,-2-2 .If EQ MMG$T CK.R4 Q$BlkN Mov Q$Buff(R4),R2 CK.R2A=CkUBuf CK.R4 Q$BlkN Tst Q$WCnt(R4) .Assume B2H LT 0 Bmi 10$ CK.R5A BufLow Mov R5,R1 CK.R1=CK.R5A Mov R2,R5 CK.R5A=CK.R2A Mov R1,R2 CK.R2A=CK.R1 10$: Mov #BufHi-BufLow/2,R1 20$: Mov (R2)+,(R5)+ Sob R1,20$ .IfF Mov #BufHi-BufLow,R1 CK.R4 Q$BlkN Tst Q$WCnt(R4) .Assume B2H LT 0 Bmi 40$ CK.R5A BufLow 30$: CK.SP=CkSP MovB (R5)+,-(SP) CK.SP ,-2 Call @$PtByt CK.SP ,+2 CK.SP CkSP Sob R1,30$ Br LdDon1 .............. 40$: CK.R5A BufLow 50$: CK.SP=CkSP Call @$GtByt CK.SP ,-2 MovB (SP)+,(R5)+ CK.SP ,+2 CK.SP CkSP Sob R1,50$ .EndC Br LdDon1 .............. 60$: CmpB #Siz$Fn,R1 Bne LdDon1 .Assume Ld.Act EQ 100000 CK.R2 CkUnit*2 Tst Handlr(R2) $Rel .-2 Handlr LD CK.R4A=CK.R4 Bpl LdEr1 .If EQ Mmg$t CK.R2 CkUnit*2 CK.R4 Q$BlkN Mov Size(R2),@Q$Buff(R4) $Rel .-4 Size LD .IfF CK.R2 CkUnit*2 CK.SP=CkSP Mov Size(R2),-(SP) $Rel .-2 Size LD CK.SP ,-2 Call @$PtWrd CK.SP ,+2 CK.SP CkSP .EndC LdDon1: Jmp LdDone .............. .SbTtl Check the .Release/$UNLOAD bit .Enable LSB RelCk: Bit #LDRel$,@#ConFg2 $Rel .-2 ConFg2 RMON .CnFg2=:.-2 Boff 20$ Bic #LDRel$,@.CnFg2 Mov #Units,R1 CK.R1=Units Add R1,R5 CK.R5 ,+Units Add R1,R5 CK.R5 ,+Units CK.R5 Handlz 10$: Bis #Ld.Unx,-(R5) CK.R5 ,-<2*CK.R1> Sob R1,10$ CK.R5 Handlr .Br 20$ .SbTtl Check for valid info about LDn: unit n 20$: CK.R2 CkUnit*2 CK.R5 Handlr Add R2,R5 CK.R5=CkCurr CK.R5 CkCurr Tst @R5 LdEr1: .Assume Ld.Act EQ 100000 CK.R4B=CK.R4 Bpl LdErr CK.R5 CkCurr BitB #Ld.UNx!Ld.UOf,@R5 Boff LimCk .Assume Ld.UNx NE 200 .Assume Ld.UOf EQ 200 CK.R4C=CK.R4 Bmi LdErr Mov R2,R1 CK.R1=CK.R2 Asl R1 CK.R1=CK.R1*2 Asl R1 CK.R1=CK.R1*2 CK.R1 CkUnit*8. CK.SP=CkSP Mov R2,-(SP) CK.SP ,-2,CkR2 CkSP1=CK.R2 CK.R1 CkUnit*8. Mov Name(R1),-(SP) $Rel .-2 Name LD CK.SP ,-2,S.Name Beq 50$ Mov #$PName,R1 $Rel .-2 $PName RMON RM.PNm=:.-2 CK.R1=CkJunk Mov RM.Ent,R2 CK.R2=CkJunk 30$: CK.SP S.Name Cmp @SP,(R1)+ Beq 40$ Cmp R1,R2 Bne 30$ CK.R4D=CK.R4 Br 50$ ........... 40$: Sub RM.PNm,R1 Tst -(R1) Br 60$ ........... 50$: Sec 60$: Bit (SP)+,R2 CK.SP ,+2 Mov (SP)+,R2 CK.SP CkR2,+2 CK.SP CkSP CK.R2=CkSP1 CK.R4E=CK.R4 Bcs LdNoDv CK.R5 CkCurr MovB R1,@R5 .Assume <&Ld.UNx> EQ 0 .Br LimCk .SbTtl Validate request (R/O) and block limits ok .Enable LSB LimCk: CK.R4 Q$BlkN Mov Q$WCnt(R4),R1 Bpl ReadCk CK.R5 CkCurr Bit #Ld.RdO,@R5 CK.R4F=CK.R4 Bon LdErr Neg R1 ReadCk: CK.R4 Q$BlkN CK.R2 CkUnit*2 Cmp @R4,Size(R2) $Rel .-2 Size LD CK.R4G=CK.R4 Bhis LdErr Add #WdsBlk-1,R1 ClrB R1 .Assume WdsBlk EQ 400 SwaB R1 CK.R4 Q$BlkN Add @R4,R1 Bcs 10$ CK.R2 CkUnit*2 Cmp R1,Size(R2) $Rel .-2 Size LD Blos FixOft 10$: CK.R4 Q$BlkN Bis #HdErr$,@Q$CSW(R4) CK.R2 CkUnit*2 Mov Size(R2),R1 $Rel .-2 Size LD CK.R4 Q$BlkN Sub @R4,R1 ClrB R1 SwaB R1 CK.R4 Q$BlkN Mov R1,@Q$WCnt(R4) .Br FixOft FixOft: CK.R2 CkUnit*2 CK.R4 Q$BlkN Add Offset(R2),@R4 $Rel .-2 Offset LD CK.R2 CkUnit*2 MovB Handlr+1(R2),R1 $Rel .-2 Handlr+1 LD CK.R1=CkNUnit CK.R1 CkNUnit Bic #^cUntMsk,R1 CK.R1=CkNUnit&UntMsk CK.R4 Q$BlkN BicB #UntMsk,Q$Unit(R4) CK.R1 CkNUnit CK.R4 Q$BlkN BisB R1,Q$Unit(R4) .If EQ LD$Own .Br ReQue .IfF .Br OwnCk .SbTtl Process ownership validation .Enable LSB OwnCk: CK.R1 CkNUnit Asr R1 CK.R1=CkNUnit/2 ....SJ: Br ..NoCk .=:....SJ;******************************;3 CK.R5 CkCurr MovB @R5,R5 CK.R5=CkIndx Add R5,R1 CK.R1 ,+CK.R5 Add R5,R1 CK.R1 ,+CK.R5 CK.R1 CkNUnit/2+ MovB .-.(R1),R5 RM.Own=:.-2 CK.R5=CkJunk CK.R2 CkUnit*2 Bit #Odd,Handlr(R2) $Rel .-2 Handlr LD Boff 10$ .Rept 4 Asr R5 .EndR 10$: Bic #^cOwnMsk,R5 Boff ReQue Dec R5 CK.R4 Q$BlkN MovB Q$JNum(R4),R1 Asr R1 Asr R1 Asr R1 Bic #^cJobMsk*2,R1 Cmp R1,R5 CK.R4H=CK.R4 Bne LdErr .Br ReQue ..NoCk: .EndC .SbTtl Requeuing process ReQue: CK.R2 CkUnit*2 MovB Handlr(R2),R2 $Rel .-2 Handlr LD Mov .-.(R2),R2 RM.Ent=:.-2 CK.R4H=CK.R4 Beq LdNoDv Clr LdCQE Clr LdLQE Add #2,@SP Return LDInt:: ...... LdNoDv: LdErr: .IRpC x, CK.R4'x Q$BlkN .EndR Bis #HdErr$,@-(R4) LdDone: .DrFin LD .......... .DrEnd LD .SbTtl Initialization, one-time code .PSect SETOVR SetOvr: .Enable LSB Init:: Nop Mov @#JRMon,R4 CK.R4=JRmon Mov @R5,R1 CK.R1=LdBase RM.Did = 1 .Rept RM.Cnt .Irp x,<\RM.Did> CK.R4 JRmon CK.R1 LdBase Add R4,RM.'x-LdBase(R1) .EndR RM.Did = RM.Did+1 .EndR .Addr #LD.Lst,R0 10$: Mov (R0)+,R5 Bmi 20$ CK.R1 LdBase Add R1,R5 CK.R1 LdBase Add R1,@R5 Br 10$ .......... 20$: CK.R1 LdBase Mov @RM.PNm-LdBase(R1),R5 CK.R4 JRmon Add R4,R5 CK.R1 LdBase Mov R5,RM.PNm-LdBase(R1) Mov R5,R3 30$: Cmp (R5)+,#EntEnd Bne 30$ Tst -(R5) Sub R3,R5 .If NE LD$Own CK.R1 LdBase Mov R5,RM.Own-LdBase(R1) .EndC Asr R5 Mov R5,R0 Add R3,R5 CK.R1 LdBase Mov R5,RM.Ent-LdBase(R1) .If NE LD$Own Cmp (R0)+,(R0)+ Sub R0,R3 Sub R0,R3 CK.R1 LdBase Sub RM.Own-LdBase(R1),R3 CK.R1 LdBase Mov R3,RM.Own-LdBase(R1) .If EQ MMG$T CK.R1 LdBase Bit #FBMon$,ConFg1(R4) Bon 40$ CK.R1 LdBase Mov #.-.,....SJ-LdBase(R1) .....1=. .=.-4 Br ..NoCk-....SJ+. . =.....1 40$: .EndC; EQ MMG$T .EndC Clc Return ...... LD.Did = 1 LD.Lst: .Rept LD.Cnt .Irp x,<\LD.Did> .Word LD.'x-LdBase .EndR LD.Did = LD.Did+1 .EndR .Word -1 .=. .Assume . LE SetOvr+<2*1000>,MESSAGE=<;Init code overflow> .Assume LD.Cnt EQ LD.Did-1 .Assume RM.Cnt EQ RM.Did-1 .SbTtl LDRun - control LD handler .PSect LDRUN .Enable LSB LDRun:: Nop ...CmZ Fudge=.LD .SErr Mov #ClrLow,R0 Mov #ClrHi-ClrLow/2,R1 10$: Clr (R0)+ Sob R1,10$ Bit #Chain$,@#JSW Boff 20$ Mov #ChnArg,R1 CmpB #ChnNon,@R1 Bne 20$ Clr R1 20$: Mov #CmdBuf,R3 CK.R3=CmdBuf CK.R3 CmdBuf Mov R3,CmdPtr Clr CmdCnt CK.SP=CkSP CK.R3 CmdBuf .CSISpc #Out1,#DefExt,R1,R3 CK.SP ,-2,CkSNum Bcc 30$ Jsr R0,ErrMsg .Word MsgCsi Br Done2 ........... 30$: CK.R3 CmdBuf TstB @R3 Bne 40$ .Print #MsgId Br Done2 ............ 40$: Mov #In1,R0 Mov R0,R1 .Rept 3 Tst -(R0) .Rept 4 Mov -(R0),-(R1) .EndR .EndR .Br CkSys .SbTtl Insure that system channel open on LD handler on SY: .Enable LSB CkSys: Mov @#JRmon,R5 CK.R5=JRmon Mov #LD$Nam,R2 CK.R5 JRmon Add Suffix(R5),R2 Mov R2,DBlock+O.Name .CStat #CStatS,Code=NoSet Bic #^cLd$Ndx,CStat CK.R5 JRmon Cmp SyIndx(R5),CStat Bne 10$ CK.R5 JRmon CmpB SyUnit(R5),CStat+C.Unit Beq DoSwt 10$: .Purge #SysChn Mov #<^rSY >,DBlock+O.Dev Clr DBlock+O.Name+2 Mov #<^rSYS>,DBlock+O.Type .LookUp #LukUpS,Code=NoSet Bcc 20$ Jmp NoLErr .............. 20$: Bit #Chain$,@#JSW Bon 40$ Clr @#ChnFrm Mov #CmdBuf,R0 Mov #ChnArg,R1 30$: MovB (R0)+,(R1)+ Bne 30$ 40$: .Chain ...... ErrUkS: Jsr R0,ErrMsg .Word MsgUkS Br Done2 ............ ErrNoV: Jsr R0,ErrMsg .Word MsgNoV Br Done2 ............ .SbTtl Process switches .Enable LSB DoSwt: Mov #H2B,R5 Call SpFun Mov #CheckV,R5 CK.R5=CheckV CK.SP CkSNum,+2 Mov (SP)+,R1 Bne NxtSwt Done2: Br Done1 ............. NxtSwt: Mov #SwList-2,R2 CK.R2=SwSubr Mov (SP)+,R0 CmpB R0,#LC.a Blo 10$ CmpB R0,#LC.z Bhi 10$ Bic #LC2UC,R0 10$: 20$: CK.R2 SwSubr,+2 Tst (R2)+ CK.R2 SwLeng .Assume SwEOL EQ 0 CK.R2=SwEOL CK.R2 SwEOL,+1 TstB (R2)+ .Assume SwLEnd LT 0 Bmi ErrUkS CK.R2 SwLtr,+1 CmpB (R2)+,R0 CK.R2 SwSubr Bne 20$ CK.R2 SwSubr Jmp @(R2) ............ Swt$: Mov R0,Flag$ Bpl SwtXit Tst (SP)+ Br SwtXit ............. SwtA: Tst R0 Bpl ErrNoV Mov (SP)+,ValueA Br SwtNoC ............. SwtC: Mov R0,FlagC Bpl SwtXit Mov (SP)+,ValueC Br SwtXit ............. SwtL: CK.R5 CheckV Call @R5 CK.R3=CkUnit*2 CK.R3 CkUnit*2 Bis #Sw.L,Table(R3) SwaB R0 Bic #^cFilNum,R0 CK.R3 CkUnit*2 MovB R0,Table(R3) CK.R3 CkUnit*2 AsrB R3 CK.R3=CK.R3/2 CK.R3 CkUnit MovB R3,UnitA Inc CountL Br SwtNoC ............. SwtR: CK.R5 CheckV Call @R5 CK.R3=CkUnit*2 CK.R3 CkUnit*2 Bis #Sw.R,Table(R3) Br SwtNoC ............. SwtW: CK.R5 CheckV Call @R5 CK.R3=CkUnit*2 CK.R3 CkUnit*2 Bis #Sw.W,Table(R3) .Br SwtNoC SwtNoC: Inc FlgNoC SwtXit: Sob R1,NxtSwt .Br CkSwt .SbTtl CkSwt - verify correct switch selections .Enable LSB CkSwt: Tst FlagC Boff 10$ Tst FlgNoC Boff 20$ Jsr R0,ErrMsg .Word MsgSwC Br Done1 ............. 10$: Tst ValueA Boff DoFile Dec CountL Beq DoFile Jsr R0,ErrMsg .Word MsgALS Done1: Jmp Done ............ 20$: Mov #Handlr,R5 CK.R5=Handlr Mov #Name,R4 CK.R4=O.Dev Mov #In1-<3*>,R3 CK.R3=O.Dev Clr R1 Mov #Units,R2 .Br 30$ 30$: CK.R5 Handlr,+1 MovB R1,(R5)+ Inc R1 CK.R5 Handlr+1,+1 MovB (R5)+,R0 Bic #^cUntMsk,R0 CK.R4 O.Dev,+2 Add (R4)+,R0 Add #Bin2Rd,R0 CK.R3 O.Dev,+2 Mov R0,(R3)+ CK.R4 O.Name,+2 CK.R3 O.Name,+2 Mov (R4)+,(R3)+ CK.R4 O.Name+2,+2 CK.R3 O.Name+2,+2 Mov (R4)+,(R3)+ CK.R4 O.Type,+2 CK.R3 O.Type,+2 Mov (R4)+,(R3)+ CK.R4 O.Leng CK.R3 O.Leng Sob R2,30$ Mov #Handlr,R2 CK.R2A=Handlr Br DoSwtC .............. ErrNoF: Jsr R0,ErrMsg .Word MsgNoF Br FilXi1 .............. ErrDev: Jsr R0,ErrMsg .Word MsgDev Br FilXi1 .............. ErrRan: Jsr R0,ErrMsg .Word MsgRan FilXi1: Jmp FilXit .............. ErrHTB: Jsr R0,ErrMsg .Word MsgHTB Br SetTo1 .............. ErrFet: Jsr R0,ErrMsg .Word MsgFet Mov Sp,Feterr Tst FlagC Boff Done1 SetTo1: Jmp SetTop .............. ErrFNF: CK.SP=CkFlag Jsr R0,ErrMsg .Word MsgFNF CK.SP ,+2 Tst (SP)+ CK.SP CkSP Br Done1 ............. .SbTtl Process input and update handler tables .Enable LSB DoFile: Mov #Table,R2 CK.R2=Table DoSwtC: CK.R2A Handlr Mov #In1-<3*>,R1 CK.R1=O.Dev Mov #Handlr,R4 CK.R4=Handlr Clr R5 NxtFil: CK.R2 Table Tst @R2 .Assume 100000 EQ Sw.L Bpl 10$ CK.R4 Handlr Bic #Ld.Act!Ld.UOf,@R4 CK.R2 Table MovB @R2,R3 CK.R3=CkFile Bic #^cFilNum,R3 CK.R3 CkFile Asl R3 CK.R3=CK.R3*2 Asl R3 CK.R3=CK.R3*2 Asl R3 CK.R3=CK.R3*2 CK.R3 CkFile*8. Add R1,R3 CK.R3=O.Dev Tst @R3 Bon 20$ 10$: Jmp 110$ .......... 20$: CK.R3 O.Dev Tst O.Name(R3) CK.R3W=CK.R3 Boff ErrNoF CK.R4 Handlr Bis #Ld.Act!Ld.UNx,@R4 CK.SP=CkSP CK.SP ,-2,CkR1 Mov R1,-(SP) Mov #DStat,R1 Tst FlagC Boff 30$ Inc R1 30$: CK.R3 O.Dev .DStatus R1,R3 CK.SP CkR1,+2 Mov (SP)+,R1 CK.SP CkSP CK.R3Z=CK.R3 Bcs ErrDev Tst DStat+D.Stat .Assume 100000 EQ FilSt$ CK.R3X=CK.R3 Bpl ErrRan Tst DStat+D.EntP Bon 40$ Add LimHi,DStat+D.HSiz .SetTop DStat+D.HSiz Cmp R0,DStat+D.HSiz Blo ErrHTB CK.R3 O.Dev .Fetch LimHi,R3 CK.R3V=CK.R3 Bcs ErrFet 40$: CK.SP=CkSP CK.SP CkFlag,-2 Clr -(SP) .Assume Chan EQ 0 .Purge #0 CK.R3C=CK.R3 Call PhyLog CK.R3 O.Dev .LookUp #LukUpF,,R3,Code=NoSet CK.R3 O.Dev Bic #Odd,R3 Bcc 60$ .Br 50$ 50$: CK.SP CkFlag Inc @SP Tst FlagC CK.SP CkFlag CK.R3N=CK.R3 Boff ErrFNF CK.R4 Handlr Bis #Ld.UOf,@R4 CK.SP CkFlag CK.R3 O.Dev Mov O.Name(R3),@SP CK.R3 O.Dev Clr O.Name(R3) .Lookup #LukUpF,Code=NoSet CK.SP CkFlag CK.R3 O.Dev Mov @SP,O.Name(R3) 60$: .CStat #CStatF,Code=NoSet CK.R4 Handlr Mov CStat+C.Leng,Size-Handlr(R4) CK.R4 Handlr Mov CStat+C.SBlk,Offset-Handlr(R4) MovB CStat+C.Unit,R0 Bic #^cUntMsk,R0 Cmp #LD$Nam,CStat+C.DevN Bne 66$ Mov R5,-(SP) $1=1 .Rept 3 Asr @SP $1=$1+$1 .EndR .Assume O.Size EQ $1 CmpB (SP)+,R0 Bgt 66$ Beq 63$ Mov #NsWarn,WarnNS Br 66$ .......... 63$: Mov #NsErr,WarnNS 66$: CK.R4 Handlr BicB #UntMsk,1(R4) CK.R4 Handlr BisB R0,1(R4) .Assume Chan EQ 0 .Purge #0 CK.SP CkFlag,+2 Tst (SP)+ Bon 90$ Tst Flag$ Boff 80$ Tst DStat+D.EntP Bon 80$ CK.SP ,-2,CkR0 Mov R0,-(SP) CK.SP ,-2,CkR1 Mov R1,-(SP) Mov CmdPtr,R1 Mov #LCmnd,R0 .Br 70$ 70$: Inc CmdCnt MovB (R0)+,(R1)+ Bne 70$ TstB -(R1) Mov CStat+C.DevN,R0 Call $R50Asc ClrB (R1)+ Mov R1,CmdPtr Add #3,CmdCnt CK.SP CkR1,+2 Mov (SP)+,R1 CK.SP CkR0,+2 Mov (SP)+,R0 CK.SP CkSP 80$: CK.R3D=CK.R3 Call PhyLog CK.R3 O.Dev .FProt #FProt,,R3,Code=NoSet CK.R3 O.Dev Bic #Odd,R3 CK.R3M=CK.R3 Bcs ErrPro .Br 90$ 90$: Releas: CK.R3 O.Dev .Release R3 SetTop: .SetTop LimHi CK.R4 Handlr Bis #Ld.UNx,@R4 Mov R5,R0 Add #Name,R0 CK.R0=O.Dev Tst FetErr Bne 100$ CK.R0 O.Dev,+2 Mov CStat+C.DevN,(R0)+ CK.R3 O.Dev,+2 Tst (R3)+ CK.R3 O.Name,+2 CK.R0 O.Name,+2 Mov (R3)+,(R0)+ CK.R3 O.Name+2,+2 CK.R0 O.Name+2,+2 Mov (R3)+,(R0)+ CK.R3 O.Type,+2 CK.R0 O.Type,+2 Mov (R3)+,(R0)+ 100$: Clr FetErr Tst FlagC Bon 110$ CK.R4 Handlr Bic #Ld.RdO,@R4 110$: Mov #Ld.RdO,R0 Bit #Sw.W,@R2 Boff 130$ .Assume Sw.R EQ Ld.RdO CK.R2 Table Bit R0,@R2 Boff 120$ Mov SP,WarnRW 120$: CK.R4 Handlr Bic R0,@R4 130$: .Assume Sw.R EQ Ld.RdO CK.R2 Table Bit R0,@R2 Boff FilXit CK.R4 Handlr Bis R0,@R4 .Br FilXit FilXit: CK.R2 ,+2 CK.R4 ,+2 Cmp (R2)+,(R4)+ Add #O.Size,R5 Cmp #Units*O.Size,R5 Beq WrapUp CK.R2 T.Leng+Table CK.R4 H.Leng+Handlr Jmp NxtFil .............. ErrPro: Jsr R0,ErrMsg .Word MsgPro Br Releas .............. .SbTtl WrapUp .Enable LSB WrapUp: Tst WarnNs Beq 11$ .Assume NsErr LT 0 Bmi ErrFNs .Assume NsWarn GT 0 Jsr R0,ErrMsg .Word MsgWNs 11$: Clr FlagC .WritW #WritW,,,,,,Code=NoSet Bcc 20$ Tst LDMem Bon 10$ Cmp #-1,ValueC Beq 10$ Jsr R0,ErrMsg .Word MsgWri Br Done ............ 10$: Jsr R0,ErrMsg .Word MsgWWr 20$: Mov #B2H,R5 Call SpFun Done: Mov @#JSP,SP Tst WarnRW Bon 30$ Tst HadErr Bon 40$ Jsr R0,ErrMsg .Word MsgAOK Br 40$ ........... 30$: Clr WarnRW Jsr R0,ErrMsg .Word MsgWRW 40$: Tst CmdCnt Bon Kmon Tst ValueA Bon Kmon Bit #Chain$,@#JSW Bon 50$ .SReset Jmp LDRun ............. ErrFNs: Jsr R0,ErrMsg .Word MsgFNs Br 40$ 50$: Tst @#ChnFrm Boff Exit Chain: Mov #ChnTo,R2 Mov #ChnFrm,R1 .Rept 4 Mov (R1)+,(R2)+ .EndR .Assume Chan EQ 0 .Purge #0 .Chain ...... Kmon: Mov CmdPtr,R1 Mov CmdCnt,R3 Mov ValueA,R0 Boff 70$ BisB #Bin2As,UnitA Mov #ACmnd,R2 60$: Inc R3 MovB (R2)+,(R1)+ Bne 60$ TstB -(R1) Call $R50Asc ClrB (R1)+ Add #3,R3 70$: Mov #CmdBuf,R0 Mov #CmdLen,R1 Mov R3,(R1)+ .Assume CmdLen+2 EQ CmdStr 80$: MovB (R0)+,(R1)+ Sob R3,80$ Bis #SpXit$!ChnIF$,@#JSW Clr R0 Exit: .Exit ...... .SbTtl PHYLOG -- set low bit of R3 if /C specified .Enable LSB CK.R3C O.Dev CK.R3D O.Dev PhyLog: Tst FlagC Boff 10$ Inc R3 10$: Return .Dsabl LSB .SbTtl ErrMsg - process error messages .Enable LSB ErrMsg: CK.SP=CkSP CK.SP ,,CkR0E Mov SP,HadErr CK.SP ,-2,CkRet Mov R0,-(SP) CK.SP CkRet Add #2,@SP Mov @R0,R0 CK.SPE=CK.SP-2 CK.R0=M.Subr CK.R0 M.Subr,+2 Call @(R0)+ Tst ValueC Bge 10$ CK.R0 M.Num CmpB #Warn$,M.Levl-M.Num(R0) Bge 10$ CK.R0 M.Num MovB #Warn$,M.Levl-M.Num(R0) CK.R0 M.Num MovB #Sev.W,M.Sev-M.Num(R0) CK.SP ,-2,CkR1 10$: Mov R1,-(SP) Bit #Chain$,@#JSW Boff 30$ Tst @#ChnFrm Boff 30$ Mov #ChnArg,R1 MovB #ChnRtn,(R1)+ .Assume ChnErr EQ ChnArg+1 20$: MovB (R0)+,(R1)+ Bne 20$ Br 40$ ........... 30$: CK.R0 ,+2 Mov (R0)+,R1 .Assume CK.R0-1 EQ M.Levl Swab R1 BisB R1,@#JUsErB CK.R0 M.Sev TstB M.Msg-M.Sev(R0) Boff 40$ CK.SP ,-2,CkR0A Mov R0,-(SP) .Print #Prefix CK.SP CkR0A,+2 Mov (SP)+,R0 .Print 40$: CK.SP CkR1,+2 Mov (SP)+,R1 CK.SP CkRet,+2 Mov (SP)+,R0 CK.SP CkSP Rts R0 .......... .SbTtl SpFun Subroutine .Enable LSB SpFun: .DStatus #DStat!Odd,#R50LD Bcc 10$ NoLErr: Mov #R50LD,R3 CK.R3Y=O.Dev Jsr R0,ErrMsg .Word MsgDev Done3: Jmp Done ............ 10$: Mov DStat+D.EntP,LDMem Boff 30$ Cmp DStat+D.Stat,#LDSts Bne NoLErr Call 30$ .LookUp #LukUpL,Code=NoSet Bcc 20$ Jsr R0,ErrMsg .Word MsgLuk Br Done3 ............. 20$: .SpFun #SpFunL,WCnt=R5,Code=NoSet Bcc 30$ Jsr R0,ErrMsg .Word MsgSpF Br Done3 ............. 30$: .Assume Chan EQ 0 .Purge #0 Return ...... .SbTtl Check for valid switch values subroutine .Enable LSB CheckV: Tst R0 Bmi 10$ Jsr R0,ErrMsg .Word MsgNoV Br Done3 ............. 10$: Mov (SP)+,R3 Mov (SP)+,R2 Cmp #Units-1,R2 Bhis 20$ Jsr R0,ErrMsg .Word MsgBdV Br Done3 ............. 20$: Mov R3,-(SP) Mov R2,R3 Asl R3 Return ...... .SbTtl Error message formatting routines Device: CK.SP=CkSP CK.R0=M.Subr+2 CK.SP ,-2,CkR1 CK.R3Z O.Dev CK.R3Y O.Dev CK.R3X O.Dev CK.R3W O.Dev CK.R3V O.Dev Mov R1,-(SP) CK.R0 M.Out,+2 Mov (R0)+,R1 CK.SP ,-2,CkR0 Mov R0,-(SP) Mov #ErrBuf+2,R0 Clr @R0 CK.R3Z O.Dev Mov @R3,@R0 Clr 2(R0) Br CalFnA .............. File: CK.R3M O.Dev CK.R3N O.Dev CK.R0=M.Subr+2 CK.SPA=CkSP CK.SPA ,-2,CkR1 Mov R1,-(SP) CK.R0 M.Out,+2 Mov (R0)+,R1 CK.SPA ,-2,CkR0 Mov R0,-(SP) CK.R3M O.Dev Mov R3,R0 CalFnA: Call $FnAsc ClrB (R1)+ Br R01Ret .............. Switch: CK.R0=M.Subr+2 CK.R0 M.Out,+2 MovB CkR0E-CK.SPE(SP),@(R0)+ Return ...... SwiVal: CK.R0=M.Subr+2 CK.R0 M.Out,+2 MovB CkR0E-CK.SPE(SP),@(R0)+ CK.SPB=CkSP CK.SPB ,-2,CKR1B Mov R1,-(SP) CK.R0 M.Out2,+2 Mov (R0)+,R1 CK.SPB ,-2,CkR0B Mov R0,-(SP) Mov R1,R0 Mov R2,R1 CK.SPB ,-2,CkR2B Mov R2,-(SP) Clr R2 Call $CBOMg ClrB (R0)+ CK.SPB CkR2B,+2 Mov (SP)+,R2 R01Ret: CK.SPB CkR0B,+2 CK.SP CkR0,+2 Mov (SP)+,R0 CK.SPB CkR1B,+2 CK.SP CkR1,+2 Mov (SP)+,R1 CK.SPB CkSP CK.SP CkSP Nothin: RtsPC: Return ...... .SbTtl Messages MsgId: .IIf EQ MMg$T!RTE$M .NLCSI .If NE MMg$T .NLCSI TYPE=I,PART=NAME .Ascii "X " .NLCSI TYPE=Z,PART=RLSVER .EndC .If NE RTE$M .NLCSI TYPE=I,PART=NAME .Ascii "M " .NLCSI TYPE=Z,PART=RLSVER .EndC Prefix: .Ascii "?" .NLCSI TYPE=I,PART=NAME .Ascii "-"<200> M.Subr =: 0 M.Out =: 2 M.Out2 =: 4 M.Num =: 2 M.Levl =: 3 M.Sev =: 4 M.Msg =: 5 Sev.I =: 'I Sev.W =: 'W Sev.E =: 'E Sev.F =: 'F Sev.U =: 'U .Even MsgAOK: .Word Nothin .Asciz <-1>"" .Even MsgCsi: .Word Nothin .Asciz <1>"-Invalid Command" .Even MsgWRW: .Word Nothin .Asciz <2>"-/W and /R specified for same unit, /W ignored " .Even MsgDev: .Word Device,ChrDev .Ascii <3>"-Device not installed " ChrDev: .BlkB 4. .Asciz "" .Even MsgRan: .Word Device,ChrRan .Ascii <4>"-Invalid device " ChrRan: .BlkB 4. .Asciz "" .Even MsgNoV: .Word Switch,ChrNoV .Ascii <5>"-Switch without required value /" ChrNoV: .BlkB 1. .Asciz "" .Even MsgPro: .Word File,ChrPro .Ascii <6>"-Unable to protect file " ChrPro: .BlkB 14. .Asciz "" .Even MsgBdV: .Word SwiVal,ChrBdV,ValBdV .Ascii <7>"-Switch value out of range (0--7) /" ChrBdV: .BlkB 1. .Ascii ":" ValBdV: .BlkB 6. .Asciz "" .Even MsgNoF: .Word Device,ChrNoF .Ascii <8.>"-No file specified " ChrNoF: .BlkB 4. .Asciz "" .Even MsgFNF: .Word File,ChrFNF .Ascii <9.>"-File not found " ChrFNF: .BlkB 14. .Asciz "" .Even MsgUkS: .Word Switch,ChrUkS .Ascii <10.>"-Unknown switch (/C, /L, /R, or /W only) /" ChrUkS: .BlkB 1 .Asciz "" .Even MsgALS: .Word Nothin .Asciz <11.>"-/A requires exactly 1 /L" .Even MsgLuk: .Word Nothin .Asciz <12.>"-.LookUp for LD failed" .Even MsgSpF: .Word Nothin .Asciz <13.>"-.SpFun to LD failed" .Even MsgWri: .Word Nothin .Asciz <14.>"-Unable to update LD handler" .Even MsgWWr: .Word Nothin .Asciz <15.>"-Unable to update disk copy of LD handler" .Even MsgHTB: .Word Nothin .Asciz <16.>"-Insufficient memory" .Even MsgFet: .Word Device,ChrFet .Ascii <17.>"-.Fetch error " ChrFet: .BlkB 4. .Asciz "" .Even MsgSwC: .Word Nothin .Asciz <18.>"-/C not specified alone" .Even MsgFNs: .Word Nothin .Asciz <19.>"-Invalid nesting" .Even MsgWNs: .Word Nothin .Asciz <19.>"-Invalid nesting" .Even .SbTtl Data Chan =: 0 SysChn =: 17 ..LDEX:: DefExt: .Word Def$LD,Def$LD,Def$LD,Def$LD R50LD: .Word LD$Nam .Word 0 LimLow: .Limit LimHi =: LimLow+2 ACmnd: .Ascii "$ASSIGN LD" UnitA: .BlkB 1. .Asciz " " LCmnd: .Asciz "$LOAD " .Even SwList: SwEOL =: 0 SwLtr =: 1 SwSubr =: 2 SwLeng =: 4 .Byte 0,Swt.$ .Word Swt$ .Byte 0,Swt.A .Word SwtA .Byte 0,Swt.C .Word SwtC .Byte 0,Swt.L .Word SwtL .Byte 0,Swt.R .Word SwtR .Byte 0,Swt.W .Word SwtW SwLEnd =: -1 .Byte SwLEnd .SbTtl EMT argument blocks .LookUp =: 1 .Write =: 11 .CStat =: 27 .SpFun =: 32 .FProt =: 43 Protect =: 1 Physical=: RtsPC+1 .Even CStatF: .Byte Chan, .CStat .Word CStat CStatS: .Byte SysChn, .CStat .Word CStat FProt: .Byte Chan, .FProt .BlkW 1. .Word Protect LukUpF: .Byte Chan, .LookUp .BlkW 1. .Word 0 .BlkW 1 .Word Physical LukUpL: .Byte Chan, .LookUp .Word R50LD!Odd .Word 0 .BlkW 1 .Word Physical LukUpS: .Byte SysChn, .LookUp .Word DBlock!Odd .Word 0 .BlkW 1 .Word Physical SpFunL: .Byte Chan, .SpFun .Word 0 .Word BufLow .BlkW 1. .Byte 377, Upd$Fn .Word 0 WritW: .Byte SysChn, .Write .Word LDStrt/WdsBlk/2 .Word LDStrt .Word WdsBlk*2 .Word 0 .SbTtl Area to clear on startup ClrLow: ErrBuf: .BlkW 2. Flag$: .BlkW 1. FlagC: .BlkW 1. FlgNoC: .BlkW 1. ValueA: .BlkW 1 ValueC: .BlkW 1 CountL: .BlkW 1 WarnRW: .BlkW 1. WarnNs: .BlkW 1 NsWarn =: 1 NsErr =: -1 LDMem: .BlkW 1. HadErr: .BlkW 1. FetErr: .BlKW 1 CmdPtr: .BlkW 1. CmdCnt: .BlkW 1. DBlock =: ChnTo .IRpC .....1 <123> Out'.....1: .BlkW 5. .EndR .IRpC .....1 <123456> In'.....1: .BlkW 4. .EndR O.Dev =: 0 O.Name =: 2 O.Type =: 6 O.Leng =: 10 O.Size =: 10 DStat: .BlkW 4. D.Stat =: 0 D.HSiz =: 2 D.EntP =: 4 D.DSiz =: 6 CStat: .BlkW 6. C.CSW =: 0 C.SBlk =: 2 C.Leng =: 4 C.Used =: 6 C.Unit =: 10 C.DevN =: 12 Table: .BlkW Units T.Leng =: 2 Sw.L =: 100000 Sw.R =: 040000 Sw.W =: 000020 .Assume Sw.L EQ Ld.Act .Assume Sw.R EQ Ld.RdO CmdBuf: .BlkB 100. .Even ClrHi: .End LDRun .MCALL .MODULE .MODULE LP,VERSION=07,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1984,1985,1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY .SBTTL MACROS AND DEFINITIONS .MCALL .DRDEF .ASSUME .DRDEF LP,3,WONLY$!SPECL$,0,177514,200 .DRPTR .DREST CLASS=DVC.LP .IIF NDF LP.CSZ, LP.CSZ =: 132. .IIF NDF LP.PSZ, LP.PSZ =: 66. .IIF NDF OFORM, OFORM =: 1 IE =: 100 RDY =: 200 ERR =: 100000 HT =: 11 LF =: 12 FF =: 14 CR =: 15 CTRLQ =: 'Q-100 CTRLS =: 'S-100 SPACE =: 40 COLSIZ == LP.CSZ PAGSIZ == LP.PSZ CLOS.. =: 1 LOOK.. =: 3 ENTE.. =: 4 .SBTTL INSTALLATION CODE and SET CODE overflow .DRINS LP .=300 I.CSR: MOV R0,INSCSR MOV R0,LPS MOV R0,DISCSR ADD #2,R0 MOV R0,LPB BR CMPR03 .ASSUME . LE 400 .SBTTL SET OPTION PARAMETER TABLE .DRSET WIDTH,30.,O.WIDTH,NUM .DRSET CR,NOP,O.CR,NO .DRSET FORM0,NOP,O.FORM0,NO .DRSET HANG,,O.HANG,NO .DRSET LC,40,O.LC,NO .DRSET CTRL,,O.CTRL,NO .DRSET TAB,,O.TAB,NO .DRSET CSR,160000,O.CSR,OCT .DRSET VECTOR,477,O.VEC,OCT .DRSET ENDPAG,-1,O.ENDP,NUM .DRSET BIT8,<^c177>,O.BIT8,NO .IF NE OFORM .DRSET FORM,100000!LF,O.FF,NO .DRSET LENGTH,1,O.LENG,NUM .DRSET SKIP,O$LENG,O.SKIP,NUM .ENDC .SBTTL SET OPTION PROCESSING ROUTINES .ENABL LSB O.CSR: BR I.CSR O.WIDT: MOV R0,COLCNT MOV R0,O$WIDT CMPR03: CMP R0,R3 RETURN O.CR: MOV (PC)+,R3 BEQ RSTC-O$CR+. N.CR: MOV R3,O$CR .ASSUME O.CR+4 EQ N.CR RETURN O.FORM0:MOV (PC)+,R3 BEQ BLK0-O$FORM+. N.FORM0:MOV R3,O$FORM .ASSUME O.FORM0+4 EQ N.FORM0 RETURN O.HANG: MOV (PC)+,R3 BMI RET-O$HANG+. N.HANG: MOV R3,O$HANG .ASSUME O.HANG+4 EQ N.HANG RETURN O.LC: CLR R3 NOP N.LC: MOV R3,O$LC .ASSUME O.LC+4 EQ N.LC RETURN O.CTRL: MOV (PC)+,R3 BNE PRINTC-O$CTRL+. N.CTRL: MOV R3,O$CTRL .ASSUME O.CTRL+4 EQ N.CTRL RETURN O.TAB: MOV (PC)+,R3 BEQ HDWTAB-O$TAB+. N.TAB: MOV R3,O$TAB .ASSUME O.TAB+4 EQ N.TAB RETURN O.VEC: MOV R0,LPSTRT CMPR30: CMP R3,R0 RETURN O.ENDP: MOV R0,O$ENDP RETURN O.BIT8: MOV #^c377,R3 N.BIT8: MOV R3,O$BIT8 .ASSUME O.BIT8+4 EQ N.BIT8 RETURN .IF NE OFORM O.FF: MOV (PC)+,R3 .WORD FF N.FF: MOV R3,O$FF .ASSUME O.FF+4 EQ N.FF RETURN O.LENG: MOV R0,O$LENG MOV R0,LINCTR BR CMPR03 O.SKIP: TST R0 BEQ 2$ INC R0 2$: MOV R0,O$SKIP BR CMPR30 .ENDC .ASSUME . LE 1000 .DSABL LSB .SBTTL DRIVER ENTRY .DRBEG LP MOV LPCQE,R4 TSTB Q$FUNC(R4) BNE RET ASL Q$WCNT(R4) BEQ LPDONE BCC LPERR RET: BIS #IE,@LPS RETURN .SBTTL OPERATION COMPLETE LPERR: BIS #HDERR$,@-(R4) LPDONE: CLR @LPS CLR LPFBLK+2 .DRFIN LP .SBTTL INTERRUPT SERVICE .ENABL LSB .DRAST LP,4,LPDONE MOV LPCQE,R4 BIT #ERR!RDY,@(PC)+ LPS=:. .WORD LP$CSR .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> O$HANG=:. BMI RET .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> BEQ RET CLR @LPS .FORK LPFBLK MOV LPCQE,R4 MOVB Q$FUNC(R4),R5 BEQ WRITE BMI LPDONE CMPB #CLOS..,R5 BEQ 25$ CMPB #100!CLOS..,R5 BEQ DOFF CMPB #ENTE..,R5 BEQ 24$ CMPB #LOOK..,R5 BNE LPDONE 24$: CLR DIDIO BR LPDONE 25$: DIDIO=:.+2 TST #0 BEQ LPDONE O$ENDP=:.+2 MOV #0,Q$WCNT(R4) .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> BEQ LPDONE MOVB #100!CLOS..,Q$FUNC(R4) BR DOFF WRITE: MOV SP,DIDIO TST @R4 O$FORM0=:. BEQ BLK0 .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> LPNEXT: TSTB @LPS BPL RET ASLB (PC)+ TABFLG: .WORD 0 BNE TAB DOFF: .IF NE OFORM MOV (PC)+,R5 FFFLAG: .WORD 0 BMI DOFORM .ENDC CMPB #100!CLOS..,Q$FUNC(R4) BNE IGNORE DEC Q$WCNT(R4) BGE BLKZ BR LPDONE IGNORE: TST Q$WCNT(R4) BEQ LPDONE .IF EQ MMG$T MOVB @Q$BUFF(R4),R5 INC Q$BUFF(R4) .IFF CALL @$GTBYT MOV (SP)+,R5 .ENDC INC Q$WCNT(R4) O$BIT8=:.+2 BIC #^C<177>,R5 .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> BEQ IGNORE .IF NE OFORM ASRB (PC)+ SKPFLG: .WORD 0 BCC 1$ CMPB #FF,R5 BEQ IGNORE 1$: .ENDC CMPB R5,#SPACE BLO CHRTST CMPB R5,#'a!40 BLO PCHAR CMPB R5,#'z!40 BHI PCHAR SUB (PC)+,R5 O$LC=:. .WORD 40 .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> PCHAR: DEC COLCNT BLT IGNORE ASLB (PC)+ TABCNT: .WORD 1 BEQ RSTTAB PRINTC: MOVB R5,@(PC)+ LPB=:. .WORD LP$CSR+2 .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> BR LPNEXT CHRTST: CMPB #HT,R5 O$TAB=:. BEQ TABSET .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> CMPB #FF,R5 BEQ SENDFF CMPB #CR,R5 O$CR=:. NOP .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> CMPB #LF,R5 O$CTRL=:. BNE IGNORE .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> .IF NE OFORM CMP LINCTR,(PC)+ O$SKIP=:. .WORD 0 .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> BLE SKIPFF DOFORM: DEC LINCTR BGT RSTC NEWPAG: MOV (PC)+,(PC)+ O$LENG=:. .WORD LP.PSZ .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> LINCTR: .WORD LP.PSZ .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> CLR FFFLAG .ENDC RSTC: MOV (PC)+,(PC)+ O$WIDT=:. .WORD LP.CSZ .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> COLCNT: .WORD LP.CSZ .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> RSTTAB: MOV #1,TABCNT BR PRINTC TABSET: MOV TABCNT,TABFLG TAB: MOV #SPACE,R5 BR PCHAR HDWTAB: ASLB TABCNT BEQ RSTTAB DEC COLCNT BR HDWTAB .IF NE OFORM SKIPFF: INC SKPFLG BR SENDFF .ENDC BLKZ: BLK0: INC @R4 SENDFF: MOV (PC)+,R5 O$FF=:. .WORD FF .Assume . LE LPSTRT+1000,MESSAGE=<;Set code object not in block1> .IF NE OFORM MOV R5,FFFLAG BPL NEWPAG BR DOFORM .IFF BR RSTC .ENDC .DSABL LSB LPFBLK: .WORD 0,0,0,0 .DREND LP .END .MCALL .MODULE .MODULE LS,VERSION=19,COMMENT= ; COPYRIGHT (c) 1984,1985,1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL Conditional assembly summary .SBTTL ORDER and LABEL PSECTS .PSECT LSDVR .PSECT $$$PAD .PSECT SETOVR .PSECT PC$PDP PCBASE: .PSECT LSDVR .SBTTL MACROS AND DEFINITIONS .DSABL GBL .IIF NDF LS$PC LS$PC = 0 .IIF NDF LS$PDP LS$PDP = 1 .IIF EQ LS$PC!LS$PDP .ERROR LSBOTH = LS$PC&LS$PDP .IIF NDF TIM$IT TIM$IT= 0 .IIF NE TIM$IT TIM$IT= 1 .IIF NDF LS$HANG LS$HANG = TIM$IT .IIF NE LS$HANG LS$HANG = 1 .IIF NE MMG$T EIS$I = 1 .IIF NDF EIS$I EIS$I = 0 .IIF NDF LS$PRI LS$PRI = 4 .IIF NDF LS.CSZ LS.CSZ = 132. .IIF NDF LS.PSZ LS.PSZ = 66. .IIF NDF LS$VCX LS$VCX = 470 PC.CSR = 173400 PC.VEC = 220 .LSGEN = LS$PDP!!! .AUDIT .LS .AUDIT .LSGEN .MCALL .DRDEF, .INTEN, .MTPS .MCALL .ADDR, .ASSUM, .BR .MCALL .READC, .WRITE, .WRITC .IIF EQ EIS$I .MCALL SOB F.BADR = 2 .IF NE LS$PC .IF EQ LS$PDP LS$CSR = PC.CSR LS$VEC = PC.VEC .ENDC .ENDC .IF NE LS$PDP .DRDEF LS,41,,0,176500,300 .IFF .DRDEF LS,41,,0,173400,220 .ENDC .IF NE LSBOTH .DRPTR FETCH=FETCH,LOAD=FETCH .DREST CLASS=DVC.LP,MOD2=DV2.V2 .IFF .DRPTR .DREST CLASS=DVC.LP .ENDC CLOS.. =:1 LOOK.. =:3 ENTE.. =:4 .READ =:10 .WRITE =:11 SYSPTR = 54 SPUSR =:272 ILLFUN =:2 LOWMAP =:326 CONFG2 =:370 PRO$ = 020000 SYSGEN = 372 V.TRP4 =: 004 BLK =: 1000 BLOCK0 = 0 PSW = 177776 PR0 =:000000 PR7 =:000240 CARRY =:000001 SYSCHN = 17 RC.IE = 000100 XC.IE = 000100 IC0DR = 173200 IC0CR = IC0DR+2 C.CSM = 050 C.SSM = 070 C.CSI = 110 C.SSI = 130 RC.ID = 005 XC.ID = 006 LS$BUF = PC.CSR LS$STA = PC.CSR+2 LS$MOD = PC.CSR+4 LS$CMD = PC.CSR+6 ST.DSR = 200 ST.FE = 040 ST.OE = 020 ST.PE = 010 ST.RD = 002 ST.TR = 001 M1.SBM = 300 SB.1 = 100 SB.15 = 200 SB.2 = 300 M1.PT = 040 M1.PEN = 020 M1.CLM = 014 CL.5 = 000 CL.6 = 004 CL.7 = 010 CL.8 = 014 M1.REQ = 002 M2.REQ = ^B10110000 B.50 = 00 B.75 = 01 B.110 = 02 B.134 = 03 B.150 = 04 B.300 = 05 B.600 = 06 B.1200 = 07 B.1800 = 10 B.2000 = 11 B.2400 = 12 B.3600 = 13 B.4800 = 14 B.7200 = 15 B.9600 = 16 B.192K = 17 CM.OM1 = 200 CM.OM0 = 100 CM.RTS = 040 CM.RE = 020 CM.FB = 010 CM.RXE = 004 CM.DTR = 002 CM.TXE = 001 HT = 11 LF = 12 FF = 14 CR = 15 CTRLQ = 'Q-100 CTRLS = 'S-100 SPACE = 40 .SBTTL Block 0 of handler file .ASECT . = 0 REF0:: . = 120 ROMCHK: .IF EQ LS$PC CLRB @INSCSR .IFF CLRB @DISCSR .ENDC BCS 1$ .IF EQ LS$PC BITB #177,@INSCSR .IFF BITB #177,@DISCSR .ENDC BEQ 1$ SEC 1$: RETURN .ASSUME . LE ,MESSAGE=<;Code below installation code too large> .SBTTL INSTALLATION CODE .ENABL LSB .IF NE LSBOTH .DRINS -LS,PC.CSR .IFF .DRINS LS .ENDC BR 1$ BR SETER2 1$: MOV @#SYSPTR,R0 BIT #PRO$,CONFG2(R0) .IF EQ LS$PC BNE SETER2 .ENDC .IF EQ LS$PDP BEQ SETER2 .IFF BEQ ROMCHK .ENDC .IF NE LS$PC TST @#LS$CMD MOVB #,@#LS$MOD MOVB #,@#LS$MOD ISPEED=:.-4 MOVB #,LS$CMD BR 20$ I.SPEE: .IF NE LSBOTH MOV @#SYSPTR,R1 BIT #PRO$,CONFG2(R1) BEQ SETER2 .ENDC .ADDR #SPEEDT,R1 10$: TST (R1) BEQ SETER2 CMP R0,(R1)+ BNE 10$ SUB PC,R1 SUB #,R1 ASR R1 BIS #M2.REQ,R1 TST @#LS$CMD TST @#LS$MOD MOVB R1,@#LS$MOD MOV R1,ISPEED .ENDC 20$: TST (PC)+ SETER2: SEC RETURN .DSABL LSB .IF NE LS$PDP I.VEC: .IF NE LSBOTH MOV R0,LX$VTB .IFF MOV R0,LS$VTB .IFTF ADD #4,R0 .IFT MOV R0,LX$VTB+6 .IFF MOV R0,LS$VTB+6 .ENDC CMP R3,R0 RETURN .ENDC .ASSUME . LT 400 MESSAGE=<;Installation code too large> .SBTTL SET OPTION PARAMETER TABLE .DRSET BIT8 O.BIT8/2 GETOVR NO .DRSET CR O.CR/2 GETOVR NO .IF NE LS$PDP .DRSET CSR O.CSR/2 GETOVR OCT .ENDC .DRSET CTRL O.CTRL/2 GETOVR NO .DRSET ENDPAG O.ENDP/2 GETOVR NUM .DRSET FORM O.FF/2 GETOVR NO .DRSET FORM0 O.FORM0/2 GETOVR NO .DRSET GRAPH O.GRAP/2 GETOVR NO .IF NE LS$HANG .DRSET HANG O.HANG/2 GETOVR NO .ENDC .DRSET LC O.LC/2 GETOVR NO .DRSET LENGTH O.LENG/2 GETOVR NUM .DRSET SKIP O.SKIP/2 GETOVR NUM .IF NE LS$PC .DRSET SPEED -1 O.SPEE NUM .ENDC .DRSET TAB O.TAB/2 GETOVR NO .IF NE LS$PDP .DRSET VECTOR 477 O.VEC OCT .ENDC .DRSET WIDTH O.WIDTH/2 GETOVR NUM .SBTTL SET OPTION PROCESSING ROUTINES .ENABL LSB .IF NE LS$PDP O.VEC: BR I.VEC .ENDC .IF NE LS$PC O.SPEE: BR I.SPEE SPEEDT: .WORD 50., 75., 110., 134., 150., 300. .WORD 600., 1200., 1800., 2000., 2400., 3600. .WORD 4800., 7200., 9600., 19200. .WORD 0 .ENDC .SBTTL GETOVR - Get Overlay SET code routine from disk .ENABL LSB .Assume . LE 656,MESSAGE=<;Overlay read routine overlaps set code> .=656 VALWCT =: ./2 OVRSIZ =: . .SBTTL GETBK0 - Read block zero - resident routine GETBK0: MOV #SET.EX/2,R3 .BR GETOVR GETOVR:: CMPB -(R3),-(R3) NOP .Assume . EQ GETOVR+4 CMPB (R3)+,(R3)+ MOV R0,-(SP) SWAB R3 MOVB R3,REABLK BIC #377,R3 .Assume BLOCK0 EQ 0 JSR R0,10$ REAFUN: .BYTE 17,10 REABLK: .BLKW 1 REABUF: .BLKW 1 .WORD VALWCT .WORD 0 10$: .ADDR #BLOCK0,R5,PUSH MOV R5,REABUF MOV (SP)+,R5 EMT 375 MOV (SP)+,R0 BCS SET.NOR SWAB R3 ASL R3 ADD REABUF,R3 MOV (SP)+,R0 JMP @R3 .DSABL LSB SET.EX: TST R2 BEQ SET.NOR DEC R2 BEQ SET.ERR ADD #2,(SP) SET.ERR:SEC SET.NOR:RETURN .DSABL LSB .Assume . LE 1000,MESSAGE=<;Set code overflow> .SBTTL DRIVER ENTRY .ENABL LSB .DRBEG LS LSBASE =:LSSTRT+6 MOV LSCQE,R4 MOVB Q$FUNC(R4),R5 BNE FILREQ ASL Q$WCNT(R4) BEQ LSDON1 BCC LSERR MOV SP,DIDIO .IF NE LSBOTH PDPA1: .ENDC .IF NE LS$PDP BIS #RC.IE,@RCSR .ENDC .IF NE LSBOTH PDPZ1 =:.-PDPA1 .SAVE .PSECT PC$PDP PCA1: .ENDC .IF NE LS$PC MOVB #,@#IC0CR .ENDC .IF NE LSBOTH PCZ1 =:.-PCA1 .RESTORE .Assume PDPZ1 EQ PCZ1 .ENDC DOINT: .IF NE LSBOTH PDPA2: NOP NOP NOP NOP NOP NOP PDPZ2 =:.-PDPA2 .SAVE .PSECT PC$PDP PCA2: .ENDC .IF NE LS$PC MOVB #,@#IC0CR MOVB #,@#IC0CR .ENDC .IF NE LSBOTH PCZ2 =:.-PCA2 .RESTORE .Assume PDPZ2 EQ PCZ2 .ENDC TST STALLF .IF EQ LS$HANG BEQ 20$ .IFF BEQ O$HANG ENAOU1: CALLR ENAOUI .IFT ENAOU1: CALL ENAOUI 20$: RETURN .ENDC FILREQ: BMI LSDONE CLR Q$WCNT(R4) CMPB #ENTE..,R5 BEQ 24$ CMPB #CLOS..,R5 BEQ DOINT CMPB #LOOK..,R5 BNE 25$ 24$: CLR DIDIO 25$: LSDON1: BR LSDONE .DSABL LSB .SBTTL REGISTERS AND VECTOR TABLES .IF NE LS$PDP RCSR: .WORD LS$CSR RBUF: .WORD LS$CSR+2 XCSR: .WORD LS$CSR+4 XBUF: .WORD LS$CSR+6 .ENDC .IF NE LSBOTH .DRVTB LS,LS$VCX,LIINT .DRVTB ,LS$VCX+4,LSINT .DRVTB LX,LS$VEC,LIINT .IFF .DRVTB LS,LS$VEC,LIINT .ENDC .DRVTB ,LS$VEC+4,LSINT .SBTTL INPUT INTERRUPT SERVICE .ENABL LSB .DRAST LI,LS$PRI,LSABT .IF NE LSBOTH PDPA3: .ENDC .IF NE LS$PDP MOVB @RBUF,R4 .ENDC .IF NE LSBOTH PDPZ3 =:.-PDPA3 .SAVE .PSECT PC$PDP PCA3: .ENDC .IF NE LS$PC MOVB @#LS$BUF,R4 .ENDC .IF NE LSBOTH PCZ3 =:.-PCA3 .RESTORE .Assume PDPZ3 EQ PCZ3 .ENDC BIC #^C<177>,R4 CMPB R4,#CTRLQ BNE 20$ .IF NE LS$HANG CALL CTIMER .ENDC MOV SP,STALLF BR ENAOU1 20$: CMPB R4,#CTRLS BNE 30$ CALL DISOUI CLR STALLF .IF NE LS$HANG TST LSCQE BEQ 30$ O$HANG: BR EXIT .Assume .-LSSTRT LE 1000,MESSAGE=<;Code to set not in block 1> TST TCOMPL BNE 30$ MOV LSCQE,R4 MOVB Q$JNUM(R4),R4 ASR R4 ASR R4 ASR R4 BIC #^C<16>,R4 MOV R4,TJOBNM .ADDR #OFFLIN,R4 MOV R4,TCOMPL .FORK LIFBLK .TIMIO TBLOCK,0,60.*5 .ENDC EXIT: 30$: RETURN .DSABL LSB .SBTTL OPERATION COMPLETE .ENABL LSB LSABT: .IF NE LS$HANG CALL LSCLR CALL CTIMER .ENDC MOV SP,STALLF BR LSDONE LSERR: BIS #HDERR$,@-(R4) LSDONE: CALL LSCLR .DRFIN LS LSCLR: CLR LIFBLK+F.BADR CALL DISOUI .IF NE LSBOTH PDPA4: .ENDC .IF NE LS$PDP BIC #RC.IE,@RCSR .ENDC .IF NE LSBOTH PDPZ4 =:.-PDPA4 .SAVE .PSECT PC$PDP PCA4: .ENDC .IF NE LS$PC 10$: MOVB #,@#IC0CR .ENDC .IF NE LSBOTH PCZ4 =:.-PCA4 .RESTORE .Assume PDPZ4 EQ PCZ4 .ENDC RETURN .DSABL LSB .SBTTL OUTPUT INTERRUPT SERVICE .ENABL LSB .DRAST LS,LS$PRI,LSABT CALL DISOUI MOV LSCQE,R4 BEQ 20$ CMPB #CLOS..,Q$FUNC(R4) BNE 17$ DIDIO =:.+2 TST #.-. BEQ LSDONE O$ENDP=:.+2 MOV #0,Q$WCNT(R4) .Assume .-LSSTRT LE 1000,MESSAGE=<;Code to set not in block 1> BEQ LSDONE MOVB #<100!CLOS..>,Q$FUNC(R4) 17$: CMPB #<100!CLOS..>,Q$FUNC(R4) BEQ 19$ TST @R4 O$FORM: BEQ BLK0 .Assume .-LSSTRT LE 1000,MESSAGE=<;Code to set not in block 1> TST STALLF BEQ 20$ ASLB (PC)+ TABFLG: .WORD 0 BNE TAB 19$: MOV (PC)+,R5 FFFLAG: .WORD 0 BNE DOFORM CMPB #<100!CLOS..>,Q$FUNC(R4) BNE 18$ DEC Q$WCNT(R4) BGE BLKZ BR LSDONE 18$: IGNORE: TST Q$WCNT(R4) BEQ LSDONE .IF EQ MMG$T MOVB @Q$BUFF(R4),R5 INC Q$BUFF(R4) .IFF CALL @$GTBYT MOV (SP)+,R5 .ENDC INC Q$WCNT(R4) O$BIT8=:.+2 BIC #^C<177>,R5 .Assume .-LSSTRT LE 1000,MESSAGE=<;Code to set not in block 1> BEQ IGNORE ASRB (PC)+ SKPFLG: .WORD 0 BCC 10$ CMPB R5,#FF BEQ IGNORE 10$: CMPB R5,#SPACE BLO CHRTST CMPB R5,#'A!40 BLO PCHAR CMPB R5,#'Z!40 BHI PCHAR BIC (PC)+,R5 O$LC: .WORD 0 .Assume .-LSSTRT LE 1000,MESSAGE=<;Code to set not in block 1> PCHAR: DEC COLCNT O$GRAP: BLT IGNORE .Assume .-LSSTRT LE 1000,MESSAGE=<;Code to set not in block 1> ASLB (PC)+ TABCNT: .WORD 1 BEQ RSTTAB PRINTC: .IF NE LSBOTH PDPA5: .ENDC .IF NE LS$PDP MOVB R5,@XBUF .ENDC .IF NE LSBOTH PDPZ5 =:.-PDPA5 .SAVE .PSECT PC$PDP PCA5: .ENDC .IF NE LS$PC MOVB R5,@#LS$BUF .ENDC .IF NE LSBOTH PCZ5 =:.-PCA5 .RESTORE .Assume PDPZ5 EQ PCZ5 .ENDC CALL ENAOUI 20$: RETURN CHRTST: CMPB R5,#HT O$TAB: BEQ TABSET CMPB R5,#FF BEQ SENDFF CMPB R5,#CR O$CR: BEQ RSTC CMPB R5,#LF O$CTRL: BNE PRINTC CMP LINCTR,(PC)+ O$SKIP: .WORD 0 BLE SKIPFF DOFORM: DEC LINCTR BGT RSTC .IF EQ <.-LSSTRT>&777-774 NOP .ENDC NEWPAG: MOV (PC)+,(PC)+ O$LENG: .WORD LS.PSZ LINCTR: .WORD LS.PSZ CLR FFFLAG .IF EQ <.-LSSTRT>&777-774 NOP .ENDC RSTC: MOV (PC)+,(PC)+ O$WIDT: .WORD LS.CSZ COLCNT: .WORD LS.CSZ CLR TABFLG RSTTAB: MOV #1,TABCNT BR PRINTC BLKZ: BLK0: INC @R4 SENDFF: MOV #CR,R5 O$FF = .+2 MOV #FF,FFFLAG BMI RSTC CLR LINCTR BR RSTC TABSET: MOV TABCNT,TABFLG TAB: MOV #SPACE,R5 BR PCHAR HDWTAB: ASLB TABCNT BEQ RSTTAB DEC COLCNT BR HDWTAB SKIPFF: INC SKPFLG BR SENDFF .DSABL LSB .IF NE LS$HANG .SBTTL TIMER SUPPORT ROUTINES CTIMER: TST TCOMPL BEQ 10$ .FORK LIFBLK .CTIMIO TBLOCK CLR TCOMPL 10$: RETURN OFFLIN: MOV @SP,-(SP) .IF EQ MMG$T CLR 2(SP) .IFF MOV @#PSW,2(SP) .ENDC .MTPS #340 .INTEN 0,PIC CLR TCOMPL MOV LSCQE,R4 JMP LSERR .ENDC .SBTTL INTERRUPT ENABLE ROUTINES ENAOUI: .IF NE LSBOTH PDPA6: .ENDC .IF NE LS$PDP BIS #XC.IE,@XCSR .ENDC .IF NE LSBOTH PDPZ6 =:.-PDPA6 .SAVE .PSECT PC$PDP PCA6: .ENDC .IF NE LS$PC 10$: MOVB #,@#IC0CR .ENDC .IF NE LSBOTH PCZ6 =:.-PCA6 .RESTORE .Assume PDPZ6 EQ PCZ6 .ENDC RETURN DISOUI: .IF NE LSBOTH PDPA7: .ENDC .IF NE LS$PDP BIC #XC.IE,@XCSR .ENDC .IF NE LSBOTH PDPZ7 =:.-PDPA7 .SAVE .PSECT PC$PDP PCA7: .ENDC .IF NE LS$PC 10$: MOVB #,@#IC0CR .ENDC .IF NE LSBOTH PCZ7 =:.-PCA7 .RESTORE .Assume PDPZ7 EQ PCZ7 .ENDC RETURN .SBTTL IMPURE DATA AREAS STALLF: .WORD 1 .IF NE LS$HANG TBLOCK: .WORD 0,0,0 TJOBNM: .WORD 0 .WORD 177000+LS$CODE .WORD -1 TCOMPL: .WORD 0 .ENDC LIFBLK: .WORD 0,0,0,0 .DREND LS .SBTTL OVRBK0 -- overlay block number zero .PSECT SETOVR OVRBK0: BIAS == O.TAB: BR 20$ NOP MOV (PC)+,R3 BEQ TABSET-O$TAB+. BR 30$ 20$: MOV (PC)+,R3 BEQ HDWTAB-O$TAB+. 30$: MOV R3,-(SP) MOV #,R3 CALL CORWRT MOV (SP)+,R3 BCS S.IGN1 MOV R3,(R2) BR CORXI1 O.CR: BR 20$ NOP MOV (PC)+,R3 NOP BR 30$ 20$: MOV (PC)+,R3 BEQ RSTC-O$CR+. 30$: MOV R3,-(SP) MOV #,R3 CALL CORWRT MOV (SP)+,R3 S.IGN1: BCS S.IGN MOV R3,(R2) CORXI1: BR CORXIT O.SKIP: CMP #255.,R0 BLO S.ERR TST R0 BEQ 10$ INC R0 10$: MOV #,R3 MOV R0,-(SP) CALL CORWRT MOV (SP)+,R0 BCS S.IGN MOV R0,(R2) BR CORXIT O.LENG: TST R0 BLE S.ERR MOV #,R3 MOV R0,-(SP) CALL CORWRT MOV (SP)+,R0 BCS S.IGN MOV R0,(R2) MOV R0,(R2) BR CORXIT O.WIDT: CMP R0,#30. BLT S.ERR MOV #,R3 MOV R0,-(SP) CALL CORWRT MOV (SP)+,R0 BCS S.IGN MOV R0,(R2) MOV R0,(R2) BR CORXIT O.CTRL: BR 20$ NOP MOV (PC)+,R3 BNE IGNORE-O$CTRL+. BR 30$ 20$: MOV (PC)+,R3 BNE PRINTC-O$CTRL+. 30$: MOV R3,-(SP) MOV #,R3 CALL CORWRT MOV (SP)+,R3 BCS S.IGN MOV R3,(R2) BR CORXIT .IF NE LS$PDP O.CSR: CMP R0,#160000 BLO S.ERR CLR R3 MOV R0,-(SP) CALL CORWRT MOV (SP)+,R0 BCS S.IGN .IF EQ LS$PC MOV R0,(R2) MOV R0,(R2) .IFF MOV R0,(R2) .ENDC MOV R0,-(SP) CALL CORREA MOV (SP)+,R0 BCS S.IGN .ADDR #RCSR+BIAS,R1 MOV #4,R2 10$: .Assume RCSR+2 EQ RBUF .Assume RBUF+2 EQ XCSR .Assume XCSR+2 EQ XBUF MOV R0,(R1)+ ADD #2,R0 SOB R2,10$ BR S.NOR .ENDC O.FF: BR 20$ NOP MOV #<100000!LF>,R3 BR 30$ 20$: MOV #FF,R3 30$: MOV R3,-(SP) MOV #,R3 CALL CORWRT MOV (SP)+,R3 BCS S.IGN MOV R3,(R2) CORXIT: CALL CORREA BCS S.IGN .BR S.NOR .SBTTL ADIOS - Common exit point for overlayed code S.NOR: CLR R2 S.IGN: CMP (PC)+,(PC)+ S.ERR: MOV #1,R2 JMP GETBK0+BIAS .SBTTL CORE - Sub/Coroutine for core reads/writes BAREA: .BYTE 17,11 .BLKW .BLKW .WORD 256. .WORD 0 CORWRT: .ADDR #BAREA+4,R1 .ADDR #1000+BIAS,R2 MOV R2,(R1) MOV #1,-(R1) TST -(R1) MOV R1,R0 EMT 375 BCS C2.ERR MOV R1,R0 DECB 1(R0) MOV R3,2(R0) EMT 375 BCS C.ERR BR C.NOR CORREA: MOV R1,R0 INCB 1(R0) EMT 375 BCS C2.ERR MOV R1,R0 DECB 1(R0) MOV #1,2(R0) EMT 375 BCS C.ERR INCB 1(R1) BR C.NOR C2.ERR: MOV #2,R2 BR C.NOR C.ERR: MOV #1,R2 C.NOR: RETURN .ASSUME <.-OVRBK0> LE OVRSIZ,MESSAGE=<;Overlay overflow> OVRSZ0==.-OVRBK0 OVRSP0==OVRSIZ-OVRSZ0 .SBTTL OVRBK1 -- overlay block number one . = OVRBK0+1000 OVRBK1: BIAS == O.ENDP: .ADDR #O$ENDP+BIAS,R1 MOV R0,@R1 BR S.1NOR O.BIT8: BR 20$ NOP MOV #^c177,R3 BR 30$ 20$: MOV #^c377,R3 30$: .ADDR #O$BIT8+BIAS,R1 BR MOV3A1 O.FORM0:BR 20$ NOP MOV (PC)+,R3 NOP BR 30$ 20$: MOV (PC)+,R3 BEQ BLK0-O$FORM+. 30$: .ADDR #O$FORM+BIAS,R1 BR MOV3A1 O.LC: CLR R3 BR 20$ MOV #40,R3 20$: .ADDR #O$LC+BIAS,R1 BR MOV3A1 O.GRAP: BR 20$ NOP MOV (PC)+,R3 BLT IGNORE-O$GRAP+. BR 30$ 20$: MOV (PC)+,R3 NOP 30$: .ADDR #O$GRAP+BIAS,R1 .IF NE LS$HANG BR MOV3A1 O.HANG: BR 20$ NOP MOV (PC)+,R3 NOP BR 30$ 20$: MOV (PC)+,R3 BR EXIT-O$HANG+. 30$: .ADDR #O$HANG+BIAS,R1 .ENDC MOV3A1: MOV R3,@R1 BR S.1NOR .SBTTL ADIOS - Common exit point for overlayed code S.1NOR: CLR R2 S.1IGN: CMP (PC)+,(PC)+ S.1ERR: MOV #1,R2 JMP GETBK0+BIAS .ASSUME <.-OVRBK1> LE OVRSIZ,MESSAGE=<;Overlay overflow> OVRSZ1==.-OVRBK1 OVRSP1==OVRSIZ-OVRSZ1 .IF NE LSBOTH .SBTTL FETCH/LOAD CODE .ENABL LSB FETCH:: MOV @R5,R5 MOV @#SYSPTR,R0 BIT #PRO$,CONFG2(R0) BEQ 30$ PCMSK =: 360/<<15.*>>/8.>+1> PCLOC =: 326+ BISB #PCMSK,PCLOC(R0) MOV LS$VTB-LSBASE(R5),R1 MOV #PC.VEC,R2 CALL VECMOV .ADDR #PCBASE,R1 .ADDR #REPL,R4 10$: MOV (R4)+,R0 BEQ 40$ MOV R5,R2 ADD (R4)+,R2 CALL DATMOV BR 10$ 30$: MOV LX$VTB-LSBASE(R5),R2 MOV R0,-(SP) MOV R2,-(SP) ADD #LOWMAP,R0 MOV #2,R4 CALL PROTECT MOV (SP)+,R2 MOV (SP)+,R0 MOV #LS$VCX,R1 CALL VECMOV LXMSK =: 360/<<15.*>>/8.>+1> LXLOC =: 326+ BICB #LXMSK,LXLOC(R0) MOV LX$VTB-LSBASE(R5),LS$VTB-LSBASE(R5) MOV LX$VTB+6-LSBASE(R5),LS$VTB+6-LSBASE(R5) 40$: CLC RETURN VECMOV: MOV #4,R0 DATMOV: 50$: MOV (R1)+,(R2)+ SOB R0,50$ RETURN PROTECT: ASR R2 MOV R2,R1 BIC #177407,R2 BIC #177770,R1 ASR R2 ASR R2 ASR R2 ADD R0,R2 60$: CLR R0 SEC 70$: RORB R0 DEC R1 BPL 70$ 80$: BISB R0,@R2 DEC R4 BMI 90$ RORB R0 BCC 80$ INC R2 BR 60$ 90$: RETURN REPL: .IRPC x,<1234567> .WORD PDPZ'x/2,PDPA'x-LSBASE .ENDR .WORD 1,LS$VTB-LSBASE .WORD 1,LS$VTB+6-LSBASE .WORD 0 .ASSUME <.-OVRBK1> LE 2000,MESSAGE=<;FETCH/LOAD code overflow> .PSECT PC$PDP .WORD PC.VEC .WORD PC.VEC+4 .ENDC .END .MCALL .MODULE .MODULE NC,VERSION=16,COMMENT=,AUDIT=NO ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY ;+ ;COND ; LOOP (0) controls loopback code ; 0 no loopback code ; 1 yes loopback code ; ; MMG$T std conditional = 1 ; TIM$T std conditional (no code effects) ; ERL$G std conditional (no code effects) ;- NI$CNA = 1 .INCLUDE "SRC:NI.MAC" .SBTTL .SBTTL ******************************************************** .SBTTL * DECNA Ethernet Controller Device Handler * .SBTTL ******************************************************** .SBTTL General Information .SBTTL General RT-11 Definitions .AUDIT .NI .AUDIT .NC .IIF NDF MMG$T MMG$T = 1 .IIF NDF LOOP LOOP = 0 QCOMP = 270 SYSVER = 276 CONFIG = 300 FBMON$ = 000001 CONFG2 = 370 PRO$ = 020000 SYSGEN = 372 BIT00 = 1 BIT01 = 2 BIT02 = 4 BIT03 = 10 BIT04 = 20 BIT05 = 40 BIT06 = 100 BIT07 = 200 BIT08 = 400 BIT09 = 1000 BIT10 = 2000 BIT11 = 4000 BIT12 = 10000 BIT13 = 20000 BIT14 = 40000 BIT15 = 100000 .SBTTL Macros .MACRO SRTCNA CNACMD,ERRADR MOV CNACMD,SCBCMD(R1) JSR PC,CMD BCS ERRADR .ENDM SRTCNA .MACRO GETBLK ERRADR,?A CALL GTBLK BCC A JMP ERRADR A: .ENDM GETBLK .MACRO PUTBLK CALL PTBLK .ENDM PUTBLK .MACRO SAVRG A .IRP REG, MOV REG,-(SP) .ENDR .ENDM SAVRG .MACRO RESRG A .IRP REG, MOV (SP)+,REG .ENDR .ENDM RESRG .MACRO MAP PAR1VL MOV PAR1VL,@#KISAR1 .ENDM MAP .MACRO PAGDEF NUM,ADDR PG'NUM' = ADDR PHYL'NUM' = *100 PHYH'NUM' = &77 .ENDM PAGDEF .SBTTL Description of DECNA/Host Interaction .SBTTL CNA Device Register and Data Structures CR.EM = BIT00 CR.ME = BIT01 CR.IE = BIT02 CR.CA = BIT03 CR.LP = BIT04 CR.OA = BIT05 CR.ED = BIT07 TOPAR1 = 137600 SYSBUS = 017766 ISCP = 017774 ST.CX = BIT15 ST.PR = BIT14 ST.CN = BIT13 ST.RN = BIT12 ST.CU = BIT11-BIT08 CU.IDL = 0 CU.SPN = 1*BIT08 CU.RDY = 2*BIT08 ST.RU = BIT07-BIT04 RU.IDL = 0 RU.SPN = 1*BIT04 RU.NRS = 2*BIT04 RU.RDY = 4*BIT04 CM.XC = BIT15 CM.RP = BIT14 CM.NC = BIT13 CM.NR = BIT12 CLFLGS=CM.XC+CM.RP+CM.NC+CM.NR CM.CU = ST.CU CU.NOP = 0 CU.SRT = 1*BIT08 CU.RES = 2*BIT08 CU.STP = 3*BIT08 CU.ABT = 4*BIT08 CM.RE = BIT07 CM.RU = ST.RU RU.NOP = 0 RU.SRT = 1*BIT04 RU.RES = 2*BIT04 RU.STP = 3*BIT04 RU.ABT = 4*BIT04 CBLSTS = 0 CBL.C = BIT15 CBL.B = BIT14 CBL.OK = BIT13 CBL.AB = BIT12 CBLCMD = 2 CBL.EL = BIT15 CBL.S = BIT14 CBL.I = BIT13 CBL.CM = BIT03-1 CM.NOP = 0 CM.SPA = 1 CM.CFG = 2 CM.SMA = 3 CM.XMT = 4 CM.TDR = 5 CM.DMP = 6 CM.DIA = 7 CBLLNK = 4 RLSADD = 14 CFGWA = 6 CFGWB = 10 CFGWC = 12 CFGWD = 14 CFGWE = 16 CFGWF = 20 CFGDFA = CFA.LM+4 CFGDFB = CFB.PL+CFB.AL+CFB.AN CFGDFC = CFC.GP CFGDFD = CFD.RT+1000 CFGDFE = CFE.TN CFA.LM = 10*BIT08 CFA.BY = BIT04-1 CFB.XL = BIT15 CFB.IL = BIT14 CFB.PL = 2*BIT12 CFB.AL = BIT11 CFB.AN = 6*BIT08 CFB.SB = BIT07 CFB.SA = BIT06 CFC.GP = ^d96*BIT08 CFC.EB = BIT07 CFC.EP = BIT07-BIT04 CFC.LP = BIT03-1 CFD.RT = ^D15*BIT12 CFD.TM = BIT11-1 CFE.DS = BIT15 CFE.CD = BIT15-BIT12 CFE.RS = BIT11 CFE.CR = BIT11-BIT08 CFE.PD = BIT07 CFE.BS = BIT06 CFE.CC = BIT05 CFE.NI = BIT04 CFE.TN = BIT03 CFE.MD = BIT02 CFE.BD = BIT01 CFE.P = BIT00 CFF.MN = BIT08-1 MLTCNT = 6 MLTADR = 10 XMTSTS = CBLSTS XMTCMD = CBLCMD XMTLNK = CBLLNK XMTBDP = 06 XMTCCB = 10 XM.CSL = BIT10 XM.CTS = BIT09 XM.OVR = BIT08 XM.DFR = BIT07 XM.HBT = BIT06 XM.ABT = BIT05 XM.AMT = BIT04-1 TBDBGN = 0 TBDCNT = TBDBGN TBD.EP = BIT15 TBD.LN = BIT14-1 TBDLNK = TBDBGN+2 TBDBUF = TBDBGN+4 TBDEXT = TBDBGN+6 TBDCCB = TBDBGN+10 PKTSTS = 0 PK.C = BIT15 PK.B = BIT14 PK.OK = BIT13 PK.CRC = BIT11 PK.FRM = BIT10 PK.RER = BIT09 PK.OVR = BIT08 PK.SHT = BIT07 PKTCMD = 2 PKT.EL = BIT15 PKT.S = BIT14 PKT.I = BIT13 PKTLNK = 4 PKTBUF = 6 PKTCCB = 10 RBDBGN = 0 RBDCNT = RBDBGN RBD.EP = BIT15 RBD.F = BIT14 RBD.LN = BIT14-1 RBDLNK = RBDBGN+2 RBDBUF = RBDBGN+4 RBDEXT = RBDBGN+6 RBDLEN = RBDBGN+10 RBD.EL = BIT15 RBD.MX = BIT14-1 RBDCCB = RBDBGN+12 SW.BRD = BIT00 SW.LOO = BIT01 SW.XLO = BIT02 SW.ON = BIT03 SW.HBT = BIT04 SW.PRO = BIT05 PRO.MD = BIT15 .SBTTL Extended memory definitions. BEGREL = 20000 ENDREL = 37776 PGSIZ = 20000 PAGDEF 1,134000 PAGDEF 2,134200 RCV1L = 020000 + 0 RCV1H = 056 RCV2L = 020000 + MAXMSG RCV2H = 056 RCV3L = 020000 + RCV3H = 056 RCV4L = 020000 + RCV4H = 056 RC9L = 020000 + RC9H = 056 RCVPR1 = 134200 RCVBF1 = 20000 RCVPR2 = 134227 RCVBF2 = 20052 RCVPR3 = 134257 RCVBF3 = 20024 RCVPR4 = 134306 RCVBF4 = 20076 RCPR9 = 134336 RCBF9 = 20050 PAGDEF 3,134400 RCV5L = 040000 + 0 RCV5H = 056 RCV6L = 040000 + MAXMSG RCV6H = 056 RCV7L = 040000 + RCV7H = 056 RCV8L = 040000 + RCV8H = 056 RC10L = 040000 + RC10H = 056 RCVPR5 = 134400 RCVBF5 = 20000 RCVPR6 = 134427 RCVBF6 = 20052 RCVPR7 = 134457 RCVBF7 = 20024 RCVPR8 = 134506 RCVBF8 = 20076 RCPR10 = 134536 RCBF10 = 20050 PAGDEF 4,134600 XMT1L = 060000 + 0 XMT1H = 056 XMTPAR = 134600 XMTBUF = 20000 PAGDEF 5,135000 PAGDEF 16,137600 ISCBSY = 0 ISCOFF = ISCBSY + 2 ISCBSE = ISCBSY + 4 SCBSTS = ISCBSY + 10 SCBCMD = SCBSTS + 2 SCBCBL = SCBSTS + 4 SCBPRA = SCBSTS + 6 SCBCRC = SCBSTS + 10 SCBALN = SCBSTS + 12 SCBRSC = SCBSTS + 14 SCBOVR = SCBSTS + 16 FRELST = SCBOVR + 2 CMDBLK = FRELST + 1024. MULCMD = CMDBLK + 256. MULLEN = MULCMD + 6 MULLST = MULLEN + 2 .SBTTL General Definitions (Size and identities) BLKNUM = 30. BLKSIZ = 10. DISINT = 70 ENBINT = 50 CLRINT = 110 CNAID = 000042 INTCTL = 173206 DELAY = 250. MINMSG = 64.-4 MAXMSG = 1518.-4 PROOVR = 14. MULMAX = 16. NIL = -1 PKNUM = 10. RBDNUM = 10. AMOUNT = 512.*2 LSTSIZ = AMOUNT/BLKSIZ CMDSIZ = 128. .SBTTL Installation code .DRINS NI .ENABL LSB DPMSIZ = 4000 DPMBAS = 134000 BR 10$ BR 50$ 10$: MOV @#SYSPTR,R1 MOV GETVEC(R1),R0 TST (R0)+ MOV #CNAID,-(SP) CALL @R0 MOV (SP)+,R0 BCS 50$ MOV MEMPTR(R1),R0 ADD R1,R0 MOV CORPTX(R0),R5 ADD R1,R5 20$: CMP (R5)+,#-1 BNE 20$ 30$: CMP (R5),#-1 BEQ 50$ TST (R5) BEQ 40$ ADD #GR.ESZ,R5 BR 30$ 40$: MOV #DPMSIZ,(R5)+ MOV #DPMBAS,(R5)+ MOV #,(R5)+ MOV (PC)+,(R5)+ .WORD NI$HND MOV #<^R$>,(R5) TST (PC)+ 50$: SEC RTS PC .DSABL LSB .Assume . LE 400,<;INSTALL area overflow> .SBTTL SET option parameter table .DRSET SHOW,CNAID,O.SHOW .SBTTL SET option routines .MCALL .TTYOU,.PRINT,.ADDR .ASSUME CTLMSK = 000040 .ENABL LSB O.SHOW: CALL GETINF BCS 30$ .ADDR #MSG,R0 .PRINT CLRB @RMA MOVB #CTLMSK,@CTL MOV RMD,R1 MOV #6.,R2 BR 20$ 10$: .TTYOU #'- 20$: MOV (R1),-(SP) MOVB (SP),R0 .REPT 4. ASR R0 .ENDR BIC #^C<017>,R0 .ADDR #HEX,R0,ADD MOVB (R0),R0 .TTYOU MOVB (SP)+,R0 BIC #^C<017>,R0 .ADDR #HEX,R0,ADD MOVB @R0,R0 .TTYOU DEC R2 BNE 10$ .ADDR #CRLF,R0 .PRINT 30$: RTS PC .DSABL LSB GETVEC = 436 GETINF: MOV R5,-(SP) MOV @#SYSPTR,R5 MOV R3,-(SP) MOV GETVEC(R5),R5 TST (R5)+ CALL @R5 BCS 40$ MOV (SP),RMD ADD #2,(SP) MOV (SP),RMA ADD #2,(SP) MOV (SP),CTL ADD #2,(SP) 40$: MOV (SP)+,MEM MOV (SP)+,R5 RTS PC .NLIST BEX RMD: .WORD 0 RMA: .WORD 0 CTL: .WORD 0 MEM: .WORD 0 MSG: .ASCII /Ethernet address = /<200> HEX: .ASCII /0123456789ABCDEF/ CRLF: .BYTE 0 .EVEN .LIST BEX .Assume . LE 1000,<;SET area overflow> .SBTTL I/O Initiation Section .SBTTL Some startup routines .PSECT NIDVR .MCALL .TTYOU,.PRINT .SBTTL INIT - Initialize during first entry to handler. .ENABL LSB DPMMSK = 027 INIT: MOV @#SYSPTR,R5 MOV #CNAID,-(SP) MOV GETVEC(R5),R5 CALL @R5 MOV (SP)+,CNAVEC BCS 2$ MOV #CNAID,-(SP) TST (R5)+ CALL @R5 MOV (SP)+,R0 BCS 2$ MOV R0,CN$RMD ADD R0,CN$RMA ADD R0,CN$CTL ADD R0,CN$MEM MOV #CNAID,-(SP) TST (R5)+ CALL @R5 MOV (SP)+,CNASLT BCS 2$ 1$: CLR TMPCTL CLR @CN$CTL CLR @CN$RMA BISB #CTLMSK,TMPCTL MOVB TMPCTL,@CN$CTL MOV CN$RMD,R1 .ADDR #NIPHAD,R2 .REPT 6 MOVB (R1),(R2)+ .ENDR MOVB #DPMMSK,@CN$MEM BISB #,TMPCTL MOVB TMPCTL,@CN$CTL TST (PC)+ 2$: SEC RTS PC .DSABL LSB .SBTTL ENABLE - Initialize during first open portal. .ENABL LSB ENABLE: JSR PC,SAVPAR JSR PC,CNAINI JSR PC,CNCONF BCS 32$ MOV #CMDBLK,R2 ADD R1,R2 CLR (R2)+ MOV #CBL.EL+CM.SPA,(R2)+ CLR (R2)+ .ADDR #NIPHAD,R0 MOV (R0)+,(R2)+ MOV (R0)+,(R2)+ MOV (R0)+,(R2)+ CALL SETIT 32$: BCS E.BAD 35$: JSR PC,LSTINI GETBLK E.BAD MOV R0,R5 MOV R0,BEGFD SUB #BEGREL,R0 MOV #PKNUM,R3 MOV R0,R4 MOV R0,SCBPRA(R1) 40$: CLR (R5)+ CLR (R5)+ DEC R3 BLE 50$ GETBLK E.BAD SUB #BEGREL,R0 MOV R0,(R5)+ MOV #NIL,(R5)+ CLR (R5) ADD #BEGREL,R0 MOV R0,R5 BR 40$ 50$: MOV R4,(R5)+ MOV #NIL,(R5)+ MOV #PKT.EL,PKTCMD(R0) MOV R0,ENDFD MOV #RBDNUM,R3 GETBLK E.BAD MOV R0,R4 BR 70$ 60$: GETBLK E.BAD 70$: CLR RBDCNT(R0) CLR RBDLNK(R0) JSR PC,GETPHY MOV #MAXMSG,RBDLEN(R0) MOV SCBPRA(R1),R5 ADD #BEGREL,R5 MOV PKTBUF(R5),RBDLNK(R0) MOV R0,PKTBUF(R5) SUB #BEGREL,PKTBUF(R5) SOB R3,60$ MOV R0,BEGRBD MOV R4,ENDRBD BIS #RBD.EL,RBDLEN(R4) MOV BEGRBD,RBDLNK(R4) SUB #BEGREL,RBDLNK(R4) SRTCNA #,E.BAD MOV #-1,XBUSY MOV #-1,RBUSY MOV CNASLT,R0 BIS #CLRINT,R0 MOV R0,@#INTCTL MOV CNASLT,R0 BIS #ENBINT,R0 MOV R0,@#INTCTL CLR SCBCBL(R1) TST (PC)+ E.BAD: SEC RTS PC .DSABL LSB .SBTTL LSTINI - Initialize list .ENABL LSB LSTINI: MOV R1,-(SP) MOV #FRELST,R2 ADD R1,R2 MOV R2,LSTHD MOV R2,R3 MOV #LSTSIZ,R1 10$: ADD #BLKSIZ,R2 MOV R2,(R3) MOV R2,R3 SOB R1,10$ CLR R3 MOV (SP)+,R1 RTS PC .DSABL LSB .SBTTL GETBLK - Get block from free list .ENABL LSB GTBLK: SAVRG MOV LSTHD,R2 TST @R2 BEQ 10$ MOV R2,R0 MOV (R2),LSTHD TST (PC)+ 10$: SEC RESRG RTS PC .DSABL LSB .SBTTL PUTBLK - Put block back on frelist PUTBLK: MOV LSTHD,(R0) MOV R0,LSTHD RTS PC .SBTTL GETPHY - Get physical address of buffer for RBD .ENABL LSB GETPHY: MOV R3,-(SP) NEG R3 ADD #10.,R3 ASL R3 ASL R3 .ADDR #BUFADR,R3,ADD MOV (R3)+,RBDBUF(R0) MOV (R3),RBDEXT(R0) MOV (SP)+,R3 RETURN .DSABL LSB .SBTTL DISABL - Cleanup after last close portal. DISABL: MOV CNASLT,R1 BIS #DISINT,R1 MOV R1,@#INTCTL MOV CNASLT,R1 BIS #CLRINT,R1 MOV R1,@#INTCTL BICB #CR.ED+CR.IE,TMPCTL BISB #CR.EM+CR.ME+CR.LP,TMPCTL MOVB TMPCTL,@CN$CTL RTS PC .SBTTL SETUP - Set hearing characteristics of controller .ENABL LSB SETUP: JSR PC,SAVPAR MAP #PG1 MOV #BEGREL,R1 MOV #CMDBLK,R2 ADD R1,R2 CLR (R2)+ MOV #CBL.EL+CM.CFG,(R2)+ CLR (R2)+ MOV #CFGDFA+6,(R2)+ MOV #CFGDFB,(R2)+ MOV #CFGDFC,(R2)+ MOV #CFGDFD,(R2)+ MOV #CFGDFE,(R2) BIC #CFE.TN,(R2) TST NIPMFG BNE 10$ BIC #CFE.P,(R2) BR 20$ 10$: BIS #CFE.P,(R2) 20$: CALL SETIT .ADDR #NIUAT,R0 MOV #MULLST,R2 MOV #MULLEN,R3 ADD R1,R2 ADD R1,R3 CLR (R3) MOV #8.,R4 30$: MOV (R0)+,-(SP) BIS (R0)+,(SP) BIS (R0)+,(SP)+ BEQ 40$ SUB #UA.ESZ,R0 .REPT 3 MOV (R0)+,(R2)+ .ENDR ADD #6.,(R3) 40$: DEC R4 BGT 30$ CALL SETMLT RTS PC .DSABL LSB .SBTTL SETMLT - Set/Reset multicast address .ENABL LSB SETMLT: MOV #MULCMD,R2 ADD R1,R2 CLR (R2)+ MOV #,(R2)+ CLR (R2)+ BISB #CR.EM+CR.ED+CR.ME+CR.IE,TMPCTL BICB #CR.LP,TMPCTL MOVB TMPCTL,@CN$CTL 5$: TST SCBCMD(R1) BNE 5$ 7$: MOV #MULCMD,SCBCBL(R1) MOV #CLFLGS+CU.SRT,SCBCMD(R1) BISB #CR.EM+CR.ED+CR.CA+CR.ME+CR.IE,TMPCTL MOVB TMPCTL,@CN$CTL BICB #CR.CA,TMPCTL MOVB TMPCTL,@CN$CTL MOV #DELAY*4,R0 10$: BIT #,SCBSTS(R1) BNE 20$ SOB R0,10$ 15$: 20$: BISB #CR.LP,TMPCTL MOVB TMPCTL,@CN$CTL RTS PC .DSABL LSB .SBTTL CNAINI - Initialize the DECNA controller .ENABL LSB CNAINI: MAP #PG16 MOV #BEGREL,R1 CLR SYSBUS(R1) MOV #PHYL1,ISCP(R1) MOVB #PHYH1,ISCP+2(R1) MAP #PG1 MOV #1,ISCBSY(R1) MOV #PHYL1,ISCBSE(R1) MOV #PHYH1,ISCBSE+2(R1) MOV #SCBSTS,ISCOFF(R1) MOV R1,R2 ADD #SCBSTS,R2 MOV #8.,R3 10$: CLR (R2)+ SOB R3,10$ BISB #CR.LP+CR.EM+CR.ED+CR.CA+CR.ME,TMPCTL MOVB TMPCTL,@CN$CTL BICB #CR.CA,TMPCTL MOVB TMPCTL,@CN$CTL RTS PC .DSABL LSB .SBTTL CNCONF - Configure the DECNA .ENABL LSB CNCONF: MOV #CMDBLK,R2 ADD R1,R2 CLR (R2)+ MOV #CBL.EL+CM.CFG,(R2)+ CLR (R2)+ MOV #CFGDFA+6,(R2)+ .if ne loop MOV #CFGDFB+CFB.XL,(R2)+ .iff MOV #CFGDFB,(R2)+ .endc MOV #CFGDFC,(R2)+ MOV #CFGDFD,(R2)+ MOV #CFGDFE,(R2) BIC #CFE.TN,(R2) SETIT: BISB #CR.EM+CR.ED+CR.ME+CR.IE,TMPCTL BICB #CR.LP,TMPCTL MOVB TMPCTL,@CN$CTL 5$: TST SCBCMD(R1) BNE 5$ 7$: MOV #CMDBLK,SCBCBL(R1) MOV #CLFLGS+CU.SRT,SCBCMD(R1) BISB #CR.EM+CR.ED+CR.CA+CR.ME+CR.IE,TMPCTL MOVB TMPCTL,@CN$CTL BICB #CR.CA,TMPCTL MOVB TMPCTL,@CN$CTL MOV #DELAY*4,R0 10$: BIT #,SCBSTS(R1) BNE 20$ SOB R0,10$ 20$: BISB #CR.LP,TMPCTL MOVB TMPCTL,@CN$CTL RTS PC .DSABL LSB .SBTTL Xmit/Recv - Transmit and Receive initiation. .ENABL LSB XMIT: TST XBUSY BPL 10$ MOV NIOCQE,R4 BEQ 10$ INC XBUSY JSR PC,SAVPAR MAP #PG1 MOV #BEGREL,R1 BEQ 10$ JSR PC,SRCCHK JSR PC,BLKMV GETBLK 20$ MOV R0,R3 MOV R0,R2 CLR (R3)+ MOV #CBL.EL+CBL.I+CM.XMT,(R3)+ CLR (R3)+ GETBLK 20$ MOV R0,(R3) SUB #BEGREL,(R3) MOV R0,R3 MOV Q$WCNT(R4),R0 DEC R0 DEC R0 ASL R0 MOV R0,(R3) BIS #TBD.EP,(R3)+ CLR (R3)+ MOV #XMT1L,(R3)+ MOV #XMT1H,(R3)+ MOV R2,SCBCBL(R1) SUB #BEGREL,SCBCBL(R1) SRTCNA #CU.SRT,20$ 10$: TST (PC)+ 20$: SEC RTS PC .DSABL LSB .ENABL LSB RECV: JSR PC,SAVPAR MAP #PG1 MOV #BEGREL,R1 CALL RCVINT RTS PC .DSABL LSB .SBTTL BLKMV - Move data between extended and user .ENABL LSB BLKMV: SAVRG MOV R4,R3 MOV @#SYSPTR,R4 MOV P1EXT(R4),(PC)+ $MVBLK: .WORD 0 SUB #2,$MVBLK MOV Q$WCNT(R3),R5 DEC R5 DEC R5 MOV Q$PAR(R3),R1 MOV Q$BUFF(R3),R2 add #4,r2 MOV #XMTPAR,R3 MOV #XMTBUF,R4 CALL @$MVBLK RESRG RTS PC .DSABL LSB .SBTTL SRCCHK - Source address check .ENABL LSB SRCCHK: JSR PC,SAVPAR SAVRG MAP Q$PAR(R4) MOV Q$BUFF(R4),R2 add #4,r2 ADD #EF.SRC,R2 MOV @R2,-(SP) BIS 2(R2),(SP) BIS 4(R2),(SP)+ BNE 10$ .ADDR #NIPHAD,R1 MOV (R1)+,(R2)+ MOV (R1)+,(R2)+ MOV (R1)+,(R2)+ 10$: RESRG RTS PC .DSABL LSB .SBTTL Interrupt entry .DRAST NI,5,NCABOR .ENABL LSB JSR PC,SAVPAR SAVRG MAP #PG1 MOV #BEGREL,R1 MOV SCBSTS(R1),-(SP) BIC #^C,(SP) SRTCNA (SP),10$ 10$: ASL (SP) BCC 20$ JSR PC,CNACXS 20$: ASL (SP) BCC 30$ JSR PC,CNAPRS 30$: ASL (SP) BCC 40$ JSR PC,CNACNS 40$: ASL (SP)+ BCC 50$ JSR PC,CNARNS 50$: RESRG RTS PC .DSABL LSB .SBTTL Abort entry point NCABOR: CALLR NIABRT .SBTTL CNACXS - Command done interrupt service routine .ENABL LSB CNACXS: TST NOQCHG BNE 40$ MOV SCBCBL(R1),R2 ADD #BEGREL,R2 TST (R2) BNE 20$ 10$: RTS PC 20$: MOV R2,R0 TST (R2)+ BPL 10$ MOV (R2)+,R3 BIC #^C,R3 TST (R2)+ CMP R3,#CM.XMT BNE 10$ CNAXMT: MOV #-1,XBUSY MOV NIOCQE,R4 MOV (R2),R2 ADD #BEGREL,R2 MOV (R0),-(SP) CALL PUTBLK MOV R2,R0 CALL PUTBLK MOV (SP)+,R2 BIT #CBL.OK,R2 BNE 30$ BIS #HDERR$,@-2(R4) MOV #RC.XMT+SC.WEC,-(SP) JSR PC,@$PTWRD 30$: MOV Q$LINK(R4),NIOCQE CALL NIFIN JMP XMIT 40$: RTS PC .DSABL LSB .SBTTL CNAPRS - Packet received interrupt service routine .ENABL LSB CNAPRS: TST NIQCHG BNE F.END RCVINT: INC RBUSY BNE F.END NEXT: MOV SCBPRA(R1),R3 BEQ F1.END ADD #BEGREL,R3 MOV R3,BEGFD TST (R3)+ BPL F1.END TST (R3)+ MOV (R3)+,SCBPRA(R1) MOV (R3)+,R2 ADD #BEGREL,R2 MOV BEGFD,R3 MOV R2,R5 CLR R0 10$: MOV (R2),R0 BMI 20$ br .-2 20$: MOV NIICQE,R4 BEQ C.END TST NIPMFG BNE 22$ JSR PC,GETPRO JSR PC,GETQEL BCS C.END 22$: BIC #^C,R0 30$: BIT #PK.OK,(R3) BEQ C.END JSR PC,MOVBLK BCC 40$ BIS #HDERR$,@-2(R4) MOV #RC.TRU,-(SP) JSR PC,@$PTWRD 40$: JSR PC,NIIDEQ C.END: JSR PC,MANAGE JMP NEXT F1.END: MOV #-1,RBUSY F.END: RTS PC .DSABL LSB .SBTTL CNACNS - Control Unit not ready service routine CNACNS: RTS PC .SBTTL CNARNS - Receive Unit not ready service routine .ENABL LSB CNARNS: SRTCNA #,10$ TST (PC)+ 10$: SEC RTS PC .DSABL LSB .SBTTL MANAGE - Update circular rings .ENABL LSB MANAGE: SAVRG MOV BEGFD,R0 BIS #PKT.EL,PKTCMD(R0) MOV R0,R3 MOV ENDFD,R0 BIC #PKT.EL,PKTCMD(R0) MOV R3,ENDFD MOV SCBPRA(R1),BEGFD ADD #BEGREL,BEGFD MOV BEGRBD,R0 BIS #RBD.EL,RBDLEN(R0) MOV R0,R3 MOV ENDRBD,R0 BIC #RBD.EL,RBDLEN(R0) MOV R3,ENDRBD MOV RBDLNK(R2),BEGRBD ADD #BEGREL,BEGRBD RESRG RTS PC .DSABL LSB .SBTTL GETPRO - Get protocol from user buffer GETPRO: SAVRG .ADDR #FAKEQ,R4 MOV R2,R0 JSR PC,INVALS MOV R1,Q$PAR(R4) MOV R2,Q$BUFF(R4) .ADDR #NCDST,R3 MOV #UA.ESZ,R1 10$: JSR PC,@$GTBYT MOVB (SP)+,(R3)+ SOB R1,10$ ADD #EF.TYP,R2 MOV R2,Q$BUFF(R4) MOV R3,R0 JSR PC,@$GTBYT MOVB (SP)+,(R3)+ JSR PC,@$GTBYT MOVB (SP)+,(R3)+ MOV (R0),R5 RESRG RTS PC .DSABL LSB .SBTTL INVALS - Input values for Par1 and buf .ENABL LSB INVALS: SAVRG MOV RBDBUF(R0),R3 CMP #RC9L,R3 BLO CHKG3 BNE 9$ MOV #RCPR9,R1 MOV #RCBF9,R2 BR 70$ 9$: CMP #RCV4L,R3 BNE 10$ MOV #RCVPR4,R1 MOV #RCVBF4,R2 BR 70$ 10$: CMP #RCV3L,R3 BNE 20$ MOV #RCVPR3,R1 MOV #RCVBF3,R2 BR 70$ 20$: CMP #RCV2L,R3 BNE 30$ MOV #RCVPR2,R1 MOV #RCVBF2,R2 BR 70$ 30$: CMP #RCV1L,R3 BNE CHKG3 MOV #RCVPR1,R1 MOV #RCVBF1,R2 BR 70$ CHKG3: CMP #RC10L,R3 BNE 39$ MOV #RCPR10,R1 MOV #RCBF10,R2 BR 70$ 39$: CMP #RCV8L,R3 BNE 40$ MOV #RCVPR8,R1 MOV #RCVBF8,R2 BR 70$ 40$: CMP #RCV7L,R3 BNE 50$ MOV #RCVPR7,R1 MOV #RCVBF7,R2 BR 70$ 50$: CMP #RCV6L,R3 BNE 60$ MOV #RCVPR6,R1 MOV #RCVBF6,R2 BR 70$ 60$: CMP #RCV5L,R3 BNE 70$ MOV #RCVPR5,R1 MOV #RCVBF5,R2 70$: RESRG RTS PC .DSABL LSB .SBTTL GETQEL - Get q-element matching protocol if any .ENABL LSB GETQEL: SAVRG CLR R3 .ADDR #NIUPT,R1 10$: CMP (R1)+,R5 BEQ 20$ INC R3 CMP #8.,R3 BGT 10$ BR 50$ 20$: CALL MATADR BCS 50$ .ADDR #NIUOT,R1 ASL R3 ADD R3,R1 MOVB @R3,R0 MOV NIICQE,R1 30$: CMPB Q$UNIT(R1),R0 BEQ 40$ MOV Q$LINK(R1),R1 BEQ 50$ BR 30$ 40$: MOV R1,R4 TST (PC)+ 50$: SEC RESRG RTS PC .DSABL LSB .SBTTL MATADR - Match Address .ENABL LSB MATADR: SAVRG .ADDR #NIPHAD,R0 .ADDR #NCDST,R1 MOV R1,R2 CMP (R0)+,(R1)+ BNE 10$ CMP (R0)+,(R1)+ BNE 10$ CMP (R0)+,(R1)+ BEQ 30$ 10$: MOV R2,R1 .ADDR #NIUAT,R0 MUL #UA.ESZ,R3 ADD R3,R0 CMP (R0)+,(R1)+ BNE 20$ CMP (R0)+,(R1)+ BNE 20$ CMP (R0)+,(R1)+ BNE 20$ 30$: TST (PC)+ 20$: SEC RESRG RTS PC .DSABL LSB .SBTTL MOVBLK - Move data between user and extended memory .ENABL LSB MOVBLK: SAVRG MOV @#SYSPTR,R3 MOV P1EXT(R3),(PC)+ $BLKMV: .WORD 0 SUB #2,$BLKMV MOV R0,R5 MOV Q$WCNT(R4),R0 DEC R0 DEC R0 ASL R0 CMP R5,R0 BLE 10$ MOV #-1,RCVFLG MOV R0,R5 10$: MOV Q$BUFF(R4),R0 TST (R0)+ MOV R0,Q$BUFF(R4) MOV R5,-(SP) JSR PC,@$PTWRD MOV R2,R0 MOV Q$PAR(R4),R3 MOV Q$BUFF(R4),R4 ASR R5 JSR PC,INVALS CALL @$BLKMV RESRG TST RCVFLG BPL 20$ CLR RCVFLG SEC 20$: RTS PC .DSABL LSB .SBTTL Support routines .SBTTL CMD - Start the controller to process commands .ENABL LSB CMD: BISB #CR.LP+CR.EM+CR.ED+CR.CA+CR.ME+CR.IE,TMPCTL MOVB TMPCTL,@CN$CTL .if ne loop BICB #CR.LP,TMPCTL .endc BICB #CR.CA,TMPCTL MOVB TMPCTL,@CN$CTL 10$: TST SCBCMD(R1) BNE 10$ TST (PC)+ 20$: SEC RTS PC .DSABL LSB .SBTTL Impure data area .PSECT NIDAT .DRVTB NI,0,NIINT,SLOTID=CNAID CN$RMD: .WORD 0 CN$RMA: .WORD 2 CN$CTL: .WORD 4 CN$MEM: .WORD 6 NINAME: .WORD NI$HND .WORD 0 NCDST: .BLKW 3 NCPROT: .BLKW 1 FREEND: .BLKW 1 BEGRBD: .BLKW 1 ENDRBD: .BLKW 1 ENDFD: .BLKW 1 BEGFD: .BLKW 1 CNAVEC: .BLKW 1 CNASLT: .BLKW 1 LSTHD: .BLKW 1 FAKEQ: .WORD 0 .WORD 0 F.BUF: .WORD 0 .WORD 0 .WORD 0 F.PAR: .WORD 0 RCVFLG: .WORD 0 TMPCTL: .WORD 0 XBUSY: .WORD -1 RBUSY: .WORD -1 BUFADR: .WORD RCV1L, RCV1H .WORD RCV2L, RCV2H .WORD RCV3L, RCV3H .WORD RCV4L, RCV4H .WORD RC9L, RC9H .WORD RCV5L, RCV5H .WORD RCV6L, RCV6H .WORD RCV7L, RCV7H .WORD RCV8L, RCV8H .WORD RC10L, RC10H CNALEN: .END .MCALL .MODULE .MODULE NI,VERSION=22,COMMENT=,AUDIT=NO ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY .SBTTL Class Handler Edit History .ENABL LC .SBTTL Class Handler Functional Description .SBTTL Class Handler Definitions .MCALL .DRDEF, .ADDR, .ASSUME .MCALL .INTEN, .BR .IIF NDF NI$CNA NI$CNA = 0 .IIF NE NI$CNA NI$CNA = 1 .IIF NDF NI$QNA NI$QNA = 0 .IIF NE NI$QNA NI$QNA = 1 .IIF NDF NI$UNA NI$UNA = 0 .IIF NE NI$UNA NI$UNA = 1 .ASSUME MMG$T NE 0,<;XM only> NI$$NI = .ASSUME NI$$NI NE 0,<;No hardware type specified> .ASSUME NI$$NI EQ 1,<;More than 1 hardware type specified> NI$PRI =: 5 .IF NE NI$CNA .DRDEF NI,61,,0,0,0 NI$HND = <^RNC > .ENDC .IF NE NI$QNA .IIF DF NQ$CSR NI$CSR = NQ$CSR .IIF DF NQ$VEC NI$VEC = NQ$VEC .DRDEF NI,61,,0,174440,120 NI$HND = <^RNQ > .ENDC .IF NE NI$UNA .IIF DF NU$CSR NI$CSR = NU$CSR .IIF DF NU$VEC NI$VEC = NU$VEC .DRDEF NI,61,,0,174510,120 NI$HND = <^RNU > .ENDC .DRPTR FETCH=*NO* .DREST CLASS=DVC.NI .DRSPF <200> .DRSPF <201> .DRSPF <202> .DRSPF <203> .DRSPF <204> .DRSPF <205> SYSPTR =: 54 QCOMP =: 270 SPUSR =: 272 CONFG2 =: 370 PROS$ = 020000 QBUS$ = 000100 MEMPTR =: 430 CORPTX =: 4 P1EXT =: 432 XDEALC =: -18. FINDGR =: -10. XALLOC =: -6 BLKMOV =: -2 SP.POR =: 200 SP.PM =: 201 SP.PT =: 202 SP.MA =: 203 SP.XMT =: 204 SP.RCV =: 205 RC.SUC =: 0 RC.UNK =: 1 RC.CHN =: 2 RC.RES =: 3 RC.TRU =: 4 RC.NON =: 5 RC.EXC =: 6 RC.IMP =: 7 RC.PRO =: 10 RC.ACT =: 11 RC.INC =: 12 RC.XMT =: 13 SC.WFL =: 1 SC.WEC =: 2 SC.WCC =: 3 SC.WSC =: 4 SC.WOC =: 5 SC.WRF =: 6 RC.RLN =: 14 RC.INV =: 15 RC.ABO =: 16 SC.RFL =: 1 SC.RBC =: 2 SC.RFE =: 3 JOBMK =: 370 UNITMK =: 007 KTGRAN =: 32. KISAR1 =: 172342 PSW =: 177776 .SBTTL Class Handler Data Structure Definitions GR.SIZ =: 0 GR.ADR =: 2 GR.STA =: 4 GR.PVT = 100000 GR.NRF = 000040 GR.NAM =: 6 GR.ESZ =: 10. UO.JOB =: 0 UO.OFG =: 1 UO.ESZ =: 2 UA.ADD =: 0 UA.ESZ =: 6 UP.TYP =: 0 UP.ESZ =: 2 EF.DST =: 0 EF.SRC =: 6 EF.TYP =: 14 EF.DAT =: 16 NIMFSZ =: 1514. P.RTBS = 003140 .SBTTL Psect Ordering .PSECT NIDVR .PSECT NIDAT .PSECT NIEND .PSECT SETOVR .DREND NI,PSECT=NIEND .SBTTL Handler Entry Point .DRBEG NI .IF NE NI$QNA!NI$UNA BR NIBEG NICSR: .WORD NI$CSR NIVEC: .WORD NI$VEC .Assume . LE NISTRT+1000,<;SET object not in block 1> .ENDC NIBEG: ASR (PC)+ .WORD 1 BCC 10$ MOV @#SYSPTR,R4 MOV P1EXT(R4),R4 .ADDR #NINAME,R5 CALL FINDGR(R4) MOV GR.ADR(R1),NIXADR CALL INIT BCS 10$ MOV SP,NICHFG 10$: MOV NICQE,R4 MOVB Q$FUNC(R4),R5 MOVB Q$UNIT(R4),R3 BIC #^C,R3 .ASSUME UO.ESZ EQ 2,<;change the ASL> ASL R3 .ADDR #NIUOT,R3,ADD CMPB R5,#SP.POR BNE 20$ .ASSUME Q$BLKN EQ 0 TST (R4) BNE 40$ 20$: .ASSUME UO.JOB EQ 0 .ASSUME UO.OFG EQ 1 TST (R3) BNE 30$ MOV #RC.UNK,-(SP) BR SPERR 30$: .ASSUME UO.JOB EQ 0 CMPB Q$UNIT(R4),(R3) BEQ 40$ MOV #RC.RES,-(SP) BR SPERR 40$: TSTB R5 BNE SPFUN BR NIERR .SBTTL SPFUN - Special Function Dispatcher .ENABL LSB SPFUN: TST NICHFG BEQ 30$ CLR -(SP) CALL @$PTWRD SUB #2,Q$BUFF(R4) .ADDR #SPFTAB,R2 10$: TST (R2) BEQ NIDONE CMPB R5,(R2) BEQ 20$ ADD #4,R2 BR 10$ 20$: MOV 2(R2),R2 ADD PC,R2 SPFDSP: MOVB Q$UNIT(R4),R5 BIC #^C,R5 JMP @R2 30$: MOV #RC.CHN,-(SP) SPERR: CALL @$PTWRD NIERR: BIS #HDERR$,@-(R4) NIDONE: .DRFIN NI SPFTAB: .WORD SP.POR, .SPPOR-SPFDSP .WORD SP.PM, .SPPM-SPFDSP .WORD SP.PT, .SPPT-SPFDSP .WORD SP.MA, .SPMA-SPFDSP .WORD SP.XMT, .SPXMT-SPFDSP .WORD SP.RCV, .SPRCV-SPFDSP .WORD 0 .DSABL LSB .SBTTL .SPPOR - Open/Close Portal .ENABL LSB .SPPOR: .ASSUME Q$BLKN EQ 0 TST (R4) BEQ SPCLO. SPOPP.: .ASSUME UO.JOB EQ 0 .ASSUME UO.OFG EQ 1 TST NIPMFG BNE 30$ TST (R3) BNE 20$ .ASSUME UO.JOB EQ 0 .ASSUME UO.OFG EQ 1 MOV #-1,(R3) .ASSUME UO.JOB EQ 0 MOVB Q$UNIT(R4),(R3) INC PORTCT BNE 10$ CALL ENABLE BCS 35$ 10$: MOV NICQE,R4 MOV @#KISAR1,-(SP) MOV Q$PAR(R4),@#KISAR1 MOV Q$BUFF(R4),R0 ADD #2,R0 MOV NIPHAD,(R0)+ MOV NIPHAD+2,(R0)+ MOV NIPHAD+4,(R0)+ MOV (SP)+,@#KISAR1 BR NIDONE 20$: MOV #RC.RES,-(SP) BR SPERR 30$: MOV #RC.EXC,-(SP) BR SPERR 35$: CLR NICHFG MOV #RC.CHN,-(SP) BR SPERR SPCLO.: MOVB Q$UNIT(R4),R0 MOV NIOCQE,R1 BEQ 50$ 40$: CMPB R0,Q$UNIT(R1) BEQ 100$ MOV Q$LINK(R1),R1 BNE 40$ 50$: MOV NIICQE,R1 BEQ 70$ 60$: CMPB R0,Q$UNIT(R1) BEQ 100$ MOV Q$LINK(R1),R1 BNE 60$ 70$: CLR NIPMFG 80$: .ASSUME UO.JOB EQ 0 .ASSUME UO.OFG EQ 1 CLR (R3) .ASSUME UP.ESZ EQ UO.ESZ CLR NIUPT-NIUOT(R3) MOV R5,R3 MUL #UA.ESZ,R3 .ADDR #NIUAT,R3,ADD CLR (R3)+ CLR (R3)+ CLR (R3)+ CALL SETUP DEC PORTCT BPL 90$ CALL DISABL 90$: BR NIDONE 100$: MOV #RC.ACT,-(SP) BR SPERR .DSABL LSB .SBTTL .SPPM - Enable/Disable Promiscuous Mode .ENABL LSB .SPPM: .ASSUME Q$BLKN EQ 0 TST (R4) BEQ SPDPM. SPEPM.: TST PORTCT BGT 10$ MOV #-1,NIPMFG MOVB Q$UNIT(R4),NIPMFG CALL SETUP BR NIDONE 10$: MOV #RC.EXC,-(SP) JMP SPERR SPDPM.: CLR NIPMFG CALL SETUP .ASSUME Q$BLKN EQ 0 MOV #1,(R4) .BR .SPPT .DSABL LSB .SBTTL .SPPT - Enable/Disable Protocol Type .ENABL LSB .SPPT: .ASSUME UP.ESZ EQ 2,<;Change the ASL> ASL R5 .ADDR #NIUPT,R5,ADD MOV @#KISAR1,-(SP) MOV Q$PAR(R4),@#KISAR1 MOV Q$BUFF(R4),R0 MOV 2(R0),PROTMP MOV (SP)+,@#KISAR1 .ASSUME Q$BLKN EQ 0 TST (R4) BEQ SPDPT. SPEPT.: TST (R5) BEQ 10$ MOV #RC.RES,-(SP) JMP SPERR 10$: .ADDR #NIUPT,R0 MOV #UP.TSZ,R1 20$: CMP PROTMP,(R0)+ BEQ 30$ DEC R1 BGT 20$ MOV PROTMP,(R5) JMP NIDONE 30$: MOV #RC.PRO,-(SP) JMP SPERR SPDPT.: CMP PROTMP,(R5) BNE 40$ CLR (R5) 40$: JMP NIDONE .DSABL LSB .SBTTL .SPMA - Enable/Disable Multicast Address .ENABL LSB .SPMA: MUL #UA.ESZ,R5 .ADDR #NIUAT,R5,ADD MOV @#KISAR1,-(SP) MOV Q$PAR(R4),@#KISAR1 MOV Q$BUFF(R4),R0 TST (R0)+ .ADDR #ADDTMP,R1 MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (SP)+,@#KISAR1 .ASSUME Q$BLKN EQ 0 TST (R4) BEQ SPDMA. SPEMA.: MOV (R5)+,-(SP) BIS (R5)+,(SP) BIS (R5)+,(SP)+ BEQ 20$ 15$: MOV #RC.RES,-(SP) JMP SPERR 20$: .ADDR #ADDTMP+UA.ESZ,R0 MOV -(R0),-(R5) MOV -(R0),-(R5) MOV -(R0),-(R5) BR 50$ SPDMA.: MOV R5,-(SP) .ADDR #ADDTMP,R0 MOV #3,R1 30$: CMP (R0)+,(R5)+ BNE 40$ DEC R1 BGT 30$ MOV (SP),R5 CLR (R5)+ CLR (R5)+ CLR (R5)+ 40$: TST (SP)+ 50$: CALL SETUP JMP NIDONE .DSABL LSB .SBTTL .SPXMT - Transmit Ethernet Frame MNBFSZ == 32. MXBFSZ == 759. .SPXMT: CMP Q$WCNT(R4),#MNBFSZ BGE 20$ 10$: MOV #,-(SP) JMP SPERR 20$: CMP Q$WCNT(R4),#MXBFSZ BGT 10$ MOV SP,NOQCHG JSR R5,ENQ NIOCQE: .WORD 0 NIOLQE: .WORD 0 CLR NOQCHG CALLR XMIT .SBTTL .SPRCV - Receive Ethernet Frame .SPRCV: MOV SP,NIQCHG JSR R5,ENQ NIICQE: .WORD 0 NIILQE: .WORD 0 CLR NIQCHG CALLR RECV .SBTTL SAV30 - Save Registers R0 to R3 SAV30: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV 10(SP),-(SP) CALL @(SP)+ MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 TST (SP)+ RETURN .SBTTL SAVPAR - Save PAR1 Mapping Context SAVPAR: MOV (SP),-(SP) MOV @#KISAR1,2(SP) CALL @(SP)+ MOV (SP)+,@#KISAR1 RETURN .SBTTL FIXPAR - Normalize Address/Par Information in Queue Element FIXPAR: CMP Q$BUFF(R4),#20000 BGE 10$ ADD #20000,Q$BUFF(R4) SUB #200,Q$PAR(R4) BR FIXPAR 10$: CMP Q$BUFF(R4),#20000+ BLO 20$ SUB #,Q$BUFF(R4) INC Q$PAR(R4) BR 10$ 20$: RETURN .SBTTL ENQ - Place Queue Element on Internal Queue ENQ: MOV Q$LINK(R4),NICQE BNE 5$ CLR NILQE 5$: CLR Q$LINK(R4) TST (R5) BNE 10$ MOV R4,(R5)+ MOV R4,(R5)+ BR 20$ 10$: TST (R5)+ MOV R4,-(SP) MOV (R5),R4 MOV (SP),Q$LINK(R4) MOV (SP)+,(R5)+ 20$: RTS R5 .SBTTL NIIDEQ - Remove Queue Element from Internal Receive Queue NIIDEQ: MOV R0,-(SP) MOV SP,NIQCHG .ADDR #NIICQE-Q$LINK,R0 10$: CMP Q$LINK(R0),R4 BEQ 20$ MOV Q$LINK(R0),R0 BNE 10$ HALT BR .-2 20$: MOV Q$LINK(R4),Q$LINK(R0) BNE 30$ MOV R0,NIILQE 30$: CLR Q$LINK(R4) CLR NIQCHG MOV (SP)+,R0 .BR NIFIN .SBTTL NIFIN - Internal Queue Element Completion NIFIN: BIS #340,@#PSW TST NICQE-4 BPL 10$ MOV (SP),-(SP) MOV @#PSW,2(SP) BIC #340,2(SP) .INTEN NI$PRI,PIC .FORK NIFBLK BIS #340,@#PSW 10$: MOV NICQE,-(SP) MOV NILQE,-(SP) MOV R4,NICQE MOV R4,NILQE CLR Q$LINK(R4) .ADDR #NICQE,R4 MOV @#SYSPTR,R5 CALL @QCOMP(R5) MOV (SP)+,NILQE MOV (SP)+,NICQE RETURN .SBTTL NIABRT - Class Handler Abort Code NIABRT: CALL SAV30 MOV SP,NIQCHG JSR R4,60$ .WORD NIICQE-70$-Q$LINK CLR NIQCHG MOV SP,NOQCHG JSR R4,60$ .WORD NIOCQE-70$-Q$LINK CLR NOQCHG .ADDR #NIUOT,R0 MOV #UO.TSZ,R1 10$: MOV (R0),R2 BEQ 15$ MOV R2,-(SP) BIC #^C,(SP) BIC #^C,R2 ASR R2 ASR R2 ASR R2 CMPB R2,R4 BNE 14$ CLR (R0) .ASSUME UP.ESZ EQ UO.ESZ CLR NIUPT-NIUOT(R0) MOV (SP),R3 MUL #UA.ESZ,R3 .ADDR #NIUAT,R3,ADD CLR (R3)+ CLR (R3)+ CLR (R3)+ 14$: TST (SP)+ 15$: TST (R0)+ DEC R1 BGT 10$ MOV PORTCT,-(SP) MOV #-1,PORTCT .ADDR #NIUOT,R0 MOV #UO.TSZ,R1 20$: TST (R0)+ BEQ 30$ INC PORTCT 30$: DEC R1 BGT 20$ MOV NIPMFG,R0 BEQ 40$ BIC #^C,R0 ASR R0 ASR R0 ASR R0 CMPB R0,R4 BNE 40$ CLR NIPMFG 40$: CMP PORTCT,(SP)+ BEQ 50$ TST PORTCT BPL 45$ CLR NIPMFG CALL DISABL BR 50$ 45$: CALL SETUP 50$: TST NICQE BNE 55$ RETURN 55$: .DRFIN NI SP.CCB = 4 SP.JOB = 6 60$: MOV R5,-(SP) MOV (R4)+,R5 MOV R4,-(SP) ADD PC,R5 70$: MOV R5,-(SP) 80$: MOV Q$LINK(R5),R4 BEQ 110$ TST SP.CCB(SP) BEQ 82$ CMP Q$CSW(R4),SP.CCB(SP) BNE 100$ BR 84$ 82$: MOVB Q$JNUM(R4),R0 BIC #^C,R0 ASR R0 ASR R0 ASR R0 CMP R0,SP.JOB(SP) BNE 100$ 84$: MOV Q$LINK(R4),Q$LINK(R5) CLR Q$LINK(R4) CLR Q$COMP(R4) TST NICQE BNE 90$ MOV R4,NICQE MOV R4,NILQE BR 80$ 90$: MOV NILQE,R0 MOV R4,Q$LINK(R0) MOV R4,NILQE BR 80$ 100$: MOV R4,R5 BR 80$ 110$: MOV (SP)+,R4 MOV R5,Q$LINK+2(R4) MOV (SP)+,R4 MOV (SP)+,R5 RTS R4 .SBTTL Class Handler Impure Data Area .PSECT NIDAT NIXADR: .BLKW NICHFG: .WORD 0 PORTCT: .WORD -1 NIPMFG: .WORD 0 NIAMFG: .WORD 0 NOQCHG: .WORD 0 NIQCHG: .WORD 0 PROTMP: .BLKW ADDTMP: .BLKW 3 NIUOT: .REPT 8. .WORD 0 .ENDR UO.TSZ = <.-NIUOT>/UO.ESZ NIUPT: .REPT 8. .WORD 0 .ENDR UP.TSZ = <.-NIUPT>/UP.ESZ NIPHAD: .BLKB 6 NIBROD: .WORD 177777,177777,177777 NIUAT: .REPT 8. .WORD 0,0,0 .ENDR UA.TSZ = <.-NIUAT>/UA.ESZ NIFBLK: .WORD 0,0,0,0 .MCALL .MODULE .MODULE NL,VERSION=05,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY .MCALL .DRDEF .ASSUME .DRDEF NL,25,0,0,0,0 .DRPTR .DREST CLASS=DVC.NL .DRBEG NL MOV NLCQE,R5 TST Q$WCNT(R5) BMI NLEXIT BIS #EOF$,@-(R5) BR NLEXIT RETURN: RTS PC NLINT:: .Assume .-2 EQ RETURN,MESSAGE=<;INT entry must be just after a RETURN> NLEXIT::.DRFIN NL .DREND NL .END .MCALL .MODULE .MODULE NQ,VERSION=15,COMMENT=,AUDIT=NO ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. NI$QNA = 1 .INCLUDE "SRC:NI.MAC" .SBTTL DEQNA Port Handler Edit History .ENABL LC .SBTTL DEQNA Port Handler Definitions .AUDIT .NI .AUDIT .NQ .MCALL .ADDR, .BR .MCALL .INTEN, .FORK .MCALL .TIMIO, .CTIMI RBCNT = 6. BUFSZ =: 1600. IATSZ =: <14.*UA.ESZ> SETSZ =: 200 EMEMSZ = <<+IATSZ+SETSZ>/2+>/KTGRAN .IIF LT RBCNT-2 .ERROR .IIF NDF NQ$WDT NQ$WDT = 0 C.JNUM =: 6 C.COMP =: 14 .MACRO BEQ. DST,?LOC BNE LOC JMP DST LOC: .ENDM .MACRO BNE. DST,?LOC BEQ LOC JMP DST LOC: .ENDM .SBTTL DEQNA Port Handler Device Definitions QN$SAR =: 0 QN$RAL =: 4 QN$RAH =: 6 QN$TAL =: 10 QN$TAH =: 12 QN$VEC =: 14 QN$CSR =: 16 CS.RI =: 100000 CS.CA =: 020000 CS.OK =: 010000 CS.SE =: 002000 CS.EL =: 001000 CS.ILD =: 000400 CS.XI =: 000200 CS.IE =: 000100 CS.RLI =: 000040 CS.XLI =: 000020 CS.BD =: 000010 CS.NXM =: 000004 CS.SR =: 000002 CS.REN =: 000001 MAXMLT =: 14. .SBTTL DEQNA Port Handler Data Structure Definitions BD.FLG =: 0 BD.ADH =: 2 BD.ADL =: 4 BD.LEN =: 6 BD.SW1 =: 10 BD.SW2 =: 12 BD.ESZ =: 14 FL.INI =: 100000 FL.USE =: 040000 AH.VLD =: 100000 AH.CHN =: 040000 AH.EOM =: 020000 AH.SET =: 010000 AH.TER =: 000200 AH.STA =: 000100 AH.HOM =: 000077 S1.LN =: 100000 S1.ERU =: 040000 S1.LOC =: 010000 S1.NOC =: 004000 S1.STE =: 002000 S1.ABO =: 001000 S1.FAI =: 000400 S1.CCM =: 000360 S1.ESE =: 020000 S1.DIS =: 010000 S1.RNT =: 004000 S1.RBL =: 003400 S1.FE =: 000004 S1.CRC =: 000002 S1.OV =: 000001 .SBTTL DEQNA Port Handler Installation Code .ENABL LSB .DRINS NI BR 10$ BR O.BAD 10$: MOV @#SYSPTR,R0 BIT #PROS$,CONFG2(R0) BNE O.BAD MOV INSCSR,R0 BIC #CS.SE,QN$CSR(R0) BIT #CS.OK,QN$CSR(R0) BEQ O.BAD MOV @#SYSPTR,R1 MOV MEMPTR(R1),R0 ADD R1,R0 MOV CORPTX(R0),R5 ADD R1,R5 20$: CMP (R5)+,#-1 BNE 20$ 30$: CMP (R5),#-1 BEQ O.BAD TST (R5) BEQ 40$ ADD #GR.ESZ,R5 BR 30$ 40$: MOV P1EXT(R1),R0 MOV (PC)+,R2 NIXSIZ: .WORD EMEMSZ CALL XALLOC(R0) BCS O.BAD MOV R2,(R5)+ MOV R1,(R5)+ MOV #GR.PVT,(R5)+ MOV (PC)+,(R5)+ .WORD NI$HND MOV #<^R$ >,(R5) BR O.GOOD .DSABL LSB .IIF GT .-400 .ERROR .SBTTL DEQNA Port Handler Set Code .DRSET CSR, 160000, O.CSR, OCT .DRSET VECTOR, 500, O.VEC, OCT .DRSET SHOW, NOP, O.SHOW O.CSR: CMP R0,R3 BLO O.BAD MOV R0,INSCSR MOV R0,DISCSR MOV R0,NICSR O.GOOD: TST (PC)+ O.BAD: SEC RETURN O.VEC: CMP R0,R3 BHIS O.BAD MOV R0,NISTRT MOV R0,NIVEC BR O.GOOD .MCALL .ADDR, .PRINT, .TTYOU .MCALL .TRPSE O.SHOW: .ADDR #TSAREA,R0 .ADDR #NQNXM,R1 .TRPSE R0,R1 TST @INSCSR NOP BCS O.BAD .ADDR #M.PADD,R0 .PRINT MOV INSCSR,R1 MOV #6.,R2 BR 20$ 10$: .TTYOU #'- 20$: MOV (R1)+,-(SP) MOVB (SP),R0 ASR R0 ASR R0 ASR R0 ASR R0 BIC #^C<17>,R0 .ADDR #HEX,R0,ADD .TTYOU (R0) MOVB (SP)+,R0 BIC #^C<17>,R0 .ADDR #HEX,R0,ADD .TTYOU (R0) DEC R2 BGT 10$ .ADDR #M.CRLF,R0 .PRINT RETURN TSAREA: .BLKW 2 NQNXM: BIS #1,2(SP) RTI M.PADD: .ASCII /Station address = /<200> M.CRLF: .BYTE 0 HEX: .ASCII /0123456789ABCDEF/ .IIF GT .-1000 .ERROR .SBTTL INIT - OnceOnly Initialization Code .PSECT NIDVR INIT: MOV NICSR,R0 BIS #CS.SR,QN$CSR(R0) BIC #CS.SR,QN$CSR(R0) MOV NIVEC,QN$VEC(R0) .ADDR #NIPHAD,R1 MOV #6.,R2 10$: MOV (R0)+,-(SP) MOVB (SP)+,(R1)+ DEC R2 BGT 10$ CLC RETURN .SBTTL RESRNG - Reset Receive Ring Structure .PSECT NIDVR RESRNG: CALL SAV30 .ADDR #RCVBDL,R1 .ADDR #BUFADR,R2 CLR RCVIDX MOV #RBCNT,R3 .ADDR #FQELEM,R4 MOV #20000,Q$BUFF(R4) MOV NIXADR,Q$PAR(R4) MOV R1,-(SP) BR 20$ 10$: ADD #BD.ESZ,R1 20$: MOV Q$BUFF(R4),(R2)+ MOV Q$PAR(R4),(R2)+ .ASSUME BD.FLG EQ 0 MOV #FL.INI,(R1) MOV R4,R5 ADD #Q$BUFF-Q$BLKN,R5 CALL @$MPPTR MOV (SP)+,BD.ADL(R1) MOV (SP)+,R0 ASH #-4,R0 BIC #^C,R0 BIS #AH.VLD,R0 MOV R0,BD.ADH(R1) MOV #-,BD.LEN(R1) MOV #S1.LN,BD.SW1(R1) MOV #S1.LN,BD.SW2(R1) ADD #BUFSZ,Q$BUFF(R4) CALL FIXPAR DEC R3 BGT 10$ MOV Q$BUFF(R4),(R2)+ MOV Q$PAR(R4),(R2)+ MOV R1,RCVINV BIC #AH.VLD,BD.ADH(R1) ADD #BD.ESZ,R1 MOV (SP)+,BD.ADL(R1) CLR BD.ADH(R1) .ASSUME BD.FLG EQ 0 MOV #FL.INI,(R1)+ .ASSUME BD.ADH EQ 2 BIS #,(R1) MOV NICSR,R0 CALL GETADR MOV R1,QN$RAL(R0) CLR QN$RAH(R0) BIS #,QN$CSR(R0) RETURN .SBTTL ENABLE - Enable Interrupts .PSECT NIDVR ENABLE: CALL RESRNG MOV #-1,XMITFG MOV #-1,RECVFG CALL SETUP CLC RETURN .SBTTL SETUP - Update Address Filtering Table .PSECT NIDVR SETUP: CALL SAV30 CALL SAVPAR MOV SETADR+2,@#KISAR1 MOV SETADR,R1 MOV #MAXMLT,R2 10$: .ADDR #NIPHAD,R0 MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ DEC R2 BGT 10$ ADD #,R1 MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV #UA.TSZ,R2 CLR R3 20$: MOV (R0)+,-(SP) BIS (R0)+,(SP) BIS (R0)+,(SP)+ BEQ 30$ SUB #UA.ESZ,R0 MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ INC R3 CMP R3,#MAXMLT BLE 30$ SEC RETURN 30$: DEC R2 BGT 20$ MOV SETADR,R0 MOV R0,R1 ADD #IATSZ,R1 MOV #2.,R3 40$: MOV #7.,R2 50$: INC R1 MOVB (R0)+,(R1) MOVB (R0)+,10(R1) MOVB (R0)+,20(R1) MOVB (R0)+,30(R1) MOVB (R0)+,40(R1) MOVB (R0)+,50(R1) DEC R2 BGT 50$ ADD #71,R1 DEC R3 BGT 40$ .BR SNDSET .SBTTL SNDSET - Build and Send SETUP Packet SNDSET: MOV SP,SETUFG INC XMITFG BNE 20$ .ADDR #FQELEM,R4 MOV SETADR,Q$BUFF(R4) ADD #IATSZ,Q$BUFF(R4) MOV SETADR+2,Q$PAR(R4) CALL FIXPAR MOV #SETSZ,R5 TST NIPMFG BEQ 10$ BIS #2,R5 10$: ASR R5 MOV R5,Q$WCNT(R4) CALLR XMTCOM 20$: RETURN .SBTTL DISABL - Disable Interrupts .PSECT NIDVR DISABL: CALL SAV30 MOV NICSR,R0 BIC #,QN$CSR(R0) .IF NE TIM$IT .IF NE NQ$WDT CALL CTIMER .ENDC .ENDC RETURN .SBTTL NQABRT - Port Handler Abort Code .PSECT NIDVR NQABRT: .IF NE TIM$IT .IF NE NQ$WDT MOV R5,-(SP) MOV NIOCQE,R5 BEQ 10$ MOVB Q$JNUM(R5),-(SP) BIC #^C,(SP) ASR (SP) ASR (SP) ASR (SP) CMPB R4,(SP)+ BNE 10$ CALL CTIMER 10$: MOV (SP)+,R5 .ENDC .ENDC CALLR NIABRT .SBTTL NIINT - Interrupt Entry Point .PSECT NIDVR .DRAST NI,NI$PRI,NQABRT MOV NICSR,R5 MOV QN$CSR(R5),R4 MOV R4,QN$CSR(R5) BIT #CS.RI,R4 BEQ 10$ CALL NQIINT 10$: BIT #CS.XI,R4 BEQ 20$ CALL NQOINT 20$: RETURN .SBTTL NQIINT - Routine to Process Receive Interrupts .PSECT NIDVR .ENABL LSB NQIINT: TST NIQCHG BNE. 190$ RECV: INC RECVFG BNE. 190$ CALL SAV30 CALL SAVPAR MOV R4,-(SP) MOV R5,-(SP) 10$: CALL GETADR .ASSUME BD.FLG EQ 0 BIT #FL.USE,(R1) BEQ. 170$ BIT #S1.LN,BD.SW1(R1) BEQ 30$ BIT #S1.ERU,BD.SW1(R1) BEQ. 170$ 20$: CMPB BD.SW2(R1),BD.SW2+1(R1) BNE. 170$ 30$: BIT #,BD.SW1(R1) BNE. 140$ MOV NIICQE,R4 BEQ. 140$ TST NIPMFG BNE 120$ MOV RCVIDX,R2 ASL R2 ASL R2 .ADDR #BUFADR,R2,ADD MOV (R2)+,R0 MOV (R2)+,@#KISAR1 .ADDR #NIUPT,R3 MOV R3,-(SP) MOV #UP.TSZ,R2 40$: .ASSUME UO.ESZ EQ UP.ESZ TST NIUOT-NIUPT(R3) BEQ 45$ CMP EF.TYP(R0),(R3) BEQ 50$ 45$: TST (R3)+ DEC R2 BGT 40$ TST (SP)+ BR 140$ 50$: MOV R3,R2 SUB (SP)+,R3 .ASSUME UP.ESZ EQ 2 ASR R3 .ASSUME UO.ESZ EQ UP.ESZ ADD #NIUOT-NIUPT,R2 .ASSUME UO.JOB EQ 0 .ASSUME UO.OFG EQ 1 TST (R2) BEQ 140$ .ADDR #NQADDR,R4 MOV R4,-(SP) MOV R3,-(SP) .ADDR #NIPHAD,R3 MOV #*2,R5 60$: MOV (R3)+,(R4)+ DEC R5 BGT 60$ MOV (SP)+,R3 MUL #UA.ESZ,R3 .ADDR #NIUAT,R3,ADD MOV #,R5 70$: MOV (R3)+,(R4)+ DEC R5 BGT 70$ MOV (SP)+,R3 MOV #3,R4 80$: CMP EF.DST+4(R0),4(R3) BNE 90$ CMP EF.DST+2(R0),2(R3) BNE 90$ .ASSUME EF.DST EQ 0 CMP (R0),(R3) BEQ 100$ 90$: ADD #UA.ESZ,R3 DEC R4 BGT 80$ BR 140$ 100$: .ADDR #NIICQE-Q$LINK,R4 110$: MOV Q$LINK(R4),R4 BEQ 140$ CMPB (R2),Q$UNIT(R4) BNE 110$ 120$: MOV BD.SW1(R1),-(SP) BIC #^C<3400>,(SP) CLR R5 BISB BD.SW2(R1),R5 BIS (SP)+,R5 ADD #60.,R5 MOV R5,-(SP) ADD #2,Q$BUFF(R4) CALL @$PTWRD SUB #4,Q$BUFF(R4) INC R5 ASR R5 MOV Q$WCNT(R4),R2 SUB #2,R2 CMP R5,R2 BLE 130$ MOV #RC.TRU,-(SP) CALL @$PTWRD SUB #2,Q$BUFF(R4) BIS #HDERR$,@Q$CSW-Q$BLKN(R4) MOV R2,R5 130$: MOV RCVIDX,R2 ASL R2 ASL R2 .ADDR #BUFADR,R2,ADD MOV 2(R2),R1 MOV (R2),R2 MOV Q$PAR(R4),R3 MOV R4,-(SP) MOV Q$BUFF(R4),R4 ADD #4,R4 MOV @#SYSPTR,R0 MOV P1EXT(R0),R0 CALL BLKMOV(R0) MOV (SP)+,R4 CALL NIIDEQ 140$: CALL GETADR .ASSUME BD.FLG EQ 0 MOV #FL.INI,(R1) BIC #AH.VLD,BD.ADH(R1) MOV #S1.LN,BD.SW1(R1) MOV #S1.LN,BD.SW2(R1) MOV RCVINV,R3 BIS #AH.VLD,BD.ADH(R3) 150$: MOV R1,RCVINV MOV RCVIDX,R1 INC R1 CMP R1,#RBCNT BLT 160$ SUB #RBCNT,R1 160$: MOV R1,RCVIDX JMP 10$ 170$: MOV NICSR,R0 BIT #CS.RLI,QN$CSR(R0) BEQ 180$ CALL GETADR MOV R1,QN$RAL(R0) CLR QN$RAH(R0) 180$: MOV (SP)+,R5 MOV (SP)+,R4 MOV #-1,RECVFG 190$: RETURN .DSABL LSB .SBTTL GETADR - Get Buffer Descriptor Address GETADR: MOV RCVIDX,R1 MUL #BD.ESZ,R1 .ADDR #RCVBDL,R1,ADD RETURN .SBTTL NQOINT - Routine to Process Transmit Interrupts .PSECT NIDVR .ENABL LSB NQOINT: CALL SAV30 .ADDR #XMTBDL,R5 .IF NE TIM$IT .IF NE NQ$WDT CALL CTIMER .ENDC .ENDC MOV #-1,XMITFG BIT #AH.SET,BD.ADH(R5) BNE 70$ BIT #S1.ABO,BD.SW1(R5) BEQ 20$ 20$: MOV NIOCQE,R4 BEQ 70$ MOV Q$LINK(R4),NIOCQE CLR Q$LINK(R4) BIT #S1.ERU,BD.SW1(R5) BEQ 65$ 30$: BIT #S1.ABO,BD.SW1(R5) BEQ 40$ MOV #,-(SP) BR 60$ 40$: BIT #S1.NOC,BD.SW1(R5) BEQ 65$ MOV #,-(SP) BR 60$ 60$: BIS #HDERR$,@Q$CSW-Q$BLKN(R4) CALL @$PTWRD 65$: CALL NIFIN XMIT: 70$: CALL SAV30 CALL SAVPAR TST SETUFG BEQ 80$ CALLR SNDSET 80$: TST NOQCHG BNE 130$ MOV NIOCQE,R4 BEQ 130$ INC XMITFG BNE 130$ TST (PC)+ XMTCOM: SEC ROL (PC)+ LSETFG: .WORD 0 .ADDR #XMTBDL,R0 MOV R0,-(SP) .ASSUME BD.FLG EQ 0 MOV #FL.INI,(R0)+ TST LSETFG BNE 90$ ADD #4,Q$BUFF(R4) CALL FIXPAR MOV Q$PAR(R4),@#KISAR1 MOV Q$BUFF(R4),R2 ADD #EF.SRC,R2 MOV (R2),-(SP) BIS 2(R2),(SP) BIS 4(R2),(SP)+ BNE 90$ .ADDR #NIPHAD,R1 MOV (R1)+,(R2)+ MOV (R1)+,(R2)+ MOV (R1)+,(R2)+ 90$: MOV R4,R5 ADD #Q$BUFF-Q$BLKN,R5 CALL @$MPPTR SUB #4,Q$BUFF(R4) CALL FIXPAR MOV (SP)+,R2 MOV (SP)+,R1 ASH #-4,R1 BIC #^C,R1 BIS #,R1 TST LSETFG BEQ 100$ BIS #AH.SET,R1 100$: .ASSUME BD.ADH EQ 2 MOV R1,(R0)+ .ASSUME BD.ADL EQ 4 MOV R2,(R0)+ MOV Q$WCNT(R4),R1 TST LSETFG BNE 110$ SUB #2,R1 110$: NEG R1 .ASSUME BD.LEN EQ 6 MOV R1,(R0)+ .ASSUME BD.SW1 EQ 10 MOV #S1.LN,(R0)+ .ASSUME BD.SW2 EQ 12 CLR (R0)+ .ASSUME BD.FLG EQ 0 MOV #FL.INI,(R0)+ .ASSUME BD.ADH EQ 2 CLR (R0) TST LSETFG BEQ 120$ CLR SETUFG CLR LSETFG 120$: MOV (SP)+,R0 MOV NICSR,R1 .IF NE TIM$IT .IF NE NQ$WDT CALL TIMER .ENDC .ENDC MOV R0,QN$TAL(R1) CLR QN$TAH(R1) BIS #CS.REN,QN$CSR(R1) 130$: CLC RETURN .DSABL LSB .IF NE TIM$IT .IF NE NQ$WDT .SBTTL DEQNA Port Handler Watchdog routines TIMER: TST XMTWBK+C.COMP BNE 10$ MOV NIOCQE,R4 MOVB Q$JNUM(R4),R4 BIC #^C,R4 ASR R4 ASR R4 ASR R4 MOV R4,XMTWBK+C.JNUM .ADDR #XMTTMO,R4 MOV R4,XMTWBK+C.COMP MOV (SP),-(SP) MOV @#PSW,2(SP) BIC #340,2(SP) .INTEN NI$PRI,PIC .FORK NQFBLK .TIMIO XMTWBK,0,2*60. 10$: RETURN CTIMER: TST XMTWBK+C.COMP BEQ 10$ MOV (SP),-(SP) MOV @#PSW,2(SP) BIC #340,2(SP) .INTEN NI$PRI,PIC .FORK NQFBLK .CTIMI XMTWBK CLR XMTWBK+C.COMP 10$: RETURN XMTTMO: CALL SAV30 MOV R4,-(SP) MOV R5,-(SP) CALL INIT CALL ENABLE CALL XMIT MOV (SP)+,R5 MOV (SP)+,R4 RETURN .ENDC .ENDC .SBTTL Port Handler Impure Data Area .PSECT NIDAT NINAME: .WORD NI$HND .RAD50 /$ / RCVIDX: .BLKW RCVINV: .BLKW RCVBDL: .BLKB *BD.ESZ BUFADR: .BLKW SETADR: .BLKW 2 SETUFG: .WORD 0 RECVFG: .WORD -1 XMITFG: .WORD -1 NQECFG: .WORD 0 XMTBDL: .BLKB BD.ESZ*2 FQELEM: .BLKW 6 NQADDR: .BLKW 3*UA.ESZ .IF NE TIM$IT .IF NE NQ$WDT NQFBLK: .WORD 0,0,0,0 XMTWBK: .WORD 0,0,0 .WORD 0 .WORD 177000+NI$COD .WORD -1 .WORD 0 .ENDC .ENDC .END .MCALL .MODULE .MODULE NU,VERSION=05,COMMENT=,AUDIT=NO ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY NI$UNA = 1 .INCLUDE "SRC:NI.MAC" .SBTTL DEUNA Port Handler Edit History .SBTTL DEUNA Port Handler Definitions .AUDIT .NI .AUDIT .NU .MCALL .ADDR, .ASSUME, .BR .MCALL .WAIT, .READC .IIF NDF RBUFCT RBUFCT = 6. RBUFSZ =: 1600. XBUFCT =: 1 XBUFSZ =: 1600. UDBBSZ =: <32.*2> EMEMSZ = <++UDBBSZ>/2 EMEMSZ = >/KTGRAN .ASSUME RBUFCT GE 1 .ASSUME XBUFCT EQ 1 .MACRO BEQ. DST,?LOC BNE LOC JMP DST LOC: .ENDM .MACRO BNE. DST,?LOC BEQ LOC JMP DST LOC: .ENDM BLOCK0 =: 0 BLOCK1 =: 1000 .SBTTL DEUNA Port Handler Device Definitions UN$CS0 =: 0 UN$CS1 =: 2 UN$CS2 =: 4 UN$CS3 =: 6 C0.SEI =: 100000 C0.CEI =: 040000 C0.RXI =: 020000 C0.TXI =: 010000 C0.DNI =: 004000 C0.BUI =: 002000 C0.FEI =: 001000 C0.SCI =: 000400 C0.IS =: 000200 C0.IE =: 000100 C0.RSE =: 000040 C0.CMK =: 000017 PC.NOP =: 00 PC.GP =: 01 PC.GC =: 02 PC.ST =: 03 PC.STA =: 04 PC.BOO =: 05 PC.PD =: 10 PC.HLT =: 16 PC.STO =: 17 C1.XOK =: 100000 C1.COK =: 040000 C1.EMK =: 037400 C1.TMO =: 000200 C1.DID =: 000160 C1.SMK =: 000017 PS.RES =: 00 PS.PL =: 01 PS.RDY =: 02 PS.RUN =: 03 PS.UH =: 05 PS.NH =: 06 PS.NUH =: 07 PS.PH =: 10 PS.SL =: 17 .SBTTL DEUNA Port Handler Data Structure Definitions PCB.F0 =: 0 PCB.F1 =: 1 PCB.F2 =: 2 PCB.F4 =: 4 PCB.F6 =: 6 PCB.SZ =: 10 PF.NOP =: 00 PF.LSM =: 01 PF.RDA =: 02 PF.RPA =: 04 PF.WPA =: 05 PF.RMA =: 06 PF.WMA =: 07 PF.RRF =: 10 PF.WRF =: 11 PF.RC =: 12 PF.RCC =: 13 PF.RM =: 14 PF.WM =: 15 PF.RS =: 16 PF.RSC =: 17 PF.DIM =: 20 PF.LIM =: 21 PF.RID =: 22 PF.WID =: 23 PF.RLA =: 24 PF.WLA =: 25 F2.PM =: 100000 F2.AM =: 040000 F2.DDC =: 020000 F2.TPE =: 010000 F2.ECT =: 004000 F2.DMM =: 001000 F2.ILM =: 000100 F2.DTC =: 000010 F2.LOP =: 000004 F2.HDM =: 000001 F2.ES =: 100000 F2.ME =: 040000 F2.BBL =: 020000 F2.CTE =: 010000 F2.TE =: 004000 F2.RRE =: 001000 F2.TRE =: 000400 F2.PAT =: 000200 F2.RMO =: 000100 F2.RMK =: 000077 TD.LEN =: 0 TD.ADL =: 2 TD.ADH =: 4 TD.STA =: 6 TD.ESZ =: 10 AH.OWN =: 100000 AH.ERS =: 040000 AH.MAT =: 020000 AH.MRT =: 010000 AH.ONE =: 004000 AH.DEF =: 002000 AH.STP =: 001000 AH.ENP =: 000400 AH.HOM =: 000003 ST.BLE =: 100000 ST.UTO =: 040000 ST.UF =: 020000 ST.LCO =: 010000 ST.LCA =: 004000 ST.RTY =: 002000 ST.TDR =: 001777 RD.LEN =: 0 RD.ADL =: 2 RD.ADH =: 4 RD.STA =: 6 RD.ESZ =: 10 AH.FE =: 020000 AH.OVF =: 010000 AH.CRC =: 004000 ST.NCH =: 020000 ST.OE =: 010000 ST.LMK =: 007777 .SBTTL DEUNA Port Handler Installation Code .ENABL LSB .DRINS NI BR 10$ 5$: SEC RETURN 10$: MOV R0,-(SP) .WAIT #0 MOV (SP)+,R0 BCC 5$ 20$: MOV #INSOVR/2,R3 JMP GETOVR .DSABL LSB .ASSUME . LE 400,<;INSTALL area overflow> .SBTTL DEUNA Port Handler Set Options .DRSET CSR, 160000, O.CSR, OCT .DRSET VECTOR, 500, O.VEC, OCT .DRSET SHOW, O.SHOW/2, GETOVR .SBTTL DEUNA Port Handler Set Code O.CSR: CMP R0,R3 BLO O.ERR MOV R0,INSCSR MOV R0,DISCSR MOV R0,NICSR BR O.NORM O.VEC: CMP R0,R3 BHIS O.ERR MOV R0,NISTRT MOV R0,NIVEC BR O.NORM .SBTTL DEUNA Port Handler Set/Install Code Overlay Handler .ENABL LSB GETBK1: MOV #O.EXIT/2,R3 SWAB R3 MOV #1,SEMTBK BR 5$ GETOVR: CMPB -(R3),-(R3) NOP .ASSUME . EQ GETOVR+4,<;NO entry out of place> CMPB (R3)+,(R3)+ SWAB R3 MOVB R3,SEMTBK 5$: HNDBLK =: .+2 ADD #.-.,SEMTBK .ADDR #BLOCK1,R5,PUSH MOV R5,SEMTBF MOV (SP)+,R5 JSR R0,10$ SEMTCH: .BYTE 17 SEMTFN: .BYTE 10 SEMTBK: .BLKW SEMTBF: .BLKW .WORD 256. .WORD 0 10$: .READC CODE=NOSET MOV (SP)+,R0 BCS O.ERR CLRB R3 SWAB R3 ASL R3 ADD SEMTBF,R3 CMP SEMTBK,#1 BNE 20$ ADD #,R3 20$: JMP @R3 .DSABL LSB O.NORM: TST (PC)+ O.ERR: SEC RETURN O.EXIT: ROR R2 RETURN .ASSUME . LE 1000,<;SET area overflow> .SBTTL INIT - OnceOnly Initialization code .PSECT NIDVR INIT: MOV NICSR,R0 .ADDR #PCB,R1 MOV R1,UN$CS2(R0) CLR UN$CS3(R0) .ASSUME UN$CS0 EQ 0 MOVB #PC.GP,@R0 CALL ISWAIT MOV #PF.RDA,PCB+PCB.F0 .ASSUME UN$CS0 EQ 0 MOVB #PC.GC,@R0 CALL ISWAIT MOV #PF.WPA,PCB+PCB.F0 .ASSUME UN$CS0 EQ 0 MOVB #PC.GC,@R0 CALL ISWAIT .ADDR #PCB+PCB.F2,R0 .ADDR #NIPHAD,R1 MOV #6.,R2 10$: MOVB (R0)+,(R1)+ SOB R2,10$ MOV NICSR,R0 MOV #PF.RS,PCB+PCB.F0 .ASSUME UN$CS0 EQ 0 MOVB #PC.GC,@R0 CALL ISWAIT CLR MAXMLT MOVB PCB+PCB.F4,MAXMLT TST (PC)+ 20$: SEC RETURN .SBTTL ENABLE - Enables Interrupts .PSECT NIDVR ENABLE: CALL RESRNG MOV #-1,XMITFG MOV #-1,RECVFG MOV NICSR,R0 .ASSUME UN$CS0 EQ 0 MOVB #PC.STA,@R0 CALL ISWAIT MOV UN$CS1(R0),-(SP) BIC #^C,(SP) CMP (SP)+,#PS.RUN BNE 10$ .ASSUME UN$CS0 EQ 0 MOVB #,@R0 TST (PC)+ 10$: SEC RETURN .SBTTL DISABL - Disable Interrupts .PSECT NIDVR DISABL: MOV NICSR,R0 .ASSUME UN$CS0 EQ 0 MOVB #PC.NOP,@R0 .ASSUME UN$CS0 EQ 0 MOVB #PC.STO,@R0 CALL ISWAIT RETURN .SBTTL RESRNG - Reset Ring Structures .ENABL LSB RESRNG: CALL SAV30 CALL SAVPAR MOV R4,-(SP) .ADDR #RCVBDL,R1 .ADDR #RBUFAD,R2 CLR RCVIDX MOV #RBUFCT,R3 .ADDR #FQELEM,R4 MOV #20000,Q$BUFF(R4) MOV NIXADR,Q$PAR(R4) 10$: MOV Q$BUFF(R4),(R2)+ MOV Q$PAR(R4),(R2)+ .ASSUME RD.LEN EQ 0 MOV #RBUFSZ,(R1) MOV R4,R5 ADD #Q$BUFF-Q$BLKN,R5 CALL @$MPPTR MOV (SP)+,RD.ADL(R1) MOV (SP)+,R0 ASH #-4,R0 BIC #^C,R0 BIS #AH.OWN,R0 MOV R0,RD.ADH(R1) CLR RD.STA(R1) ADD #RD.ESZ,R1 ADD #RBUFSZ,Q$BUFF(R4) CALL FIXPAR DEC R3 BGT 10$ MOV Q$BUFF(R4),(R2)+ MOV Q$PAR(R4),(R2)+ MOV R4,R5 ADD #Q$BUFF-Q$BLKN,R5 CALL @$MPPTR MOV (SP)+,TD.ADL(R1) MOV (SP)+,R0 ASH #-4,R0 BIC #^C,R0 MOV R0,TD.ADH(R1) ADD #XBUFSZ,Q$BUFF(R4) CALL FIXPAR MOV Q$BUFF(R4),(R2)+ MOV Q$PAR(R4),(R2)+ MOV R4,R5 ADD #Q$BUFF-Q$BLKN,R5 CALL @$MPPTR MOV (SP)+,(R2)+ MOV (SP)+,R0 ASH #-4,R0 BIC #<^C3>,R0 MOV R0,(R2)+ MOV UDBBAD+2,@#KISAR1 MOV UDBBAD,R0 .ADDR #XMTBDL,R1 MOV R1,(R0)+ MOV #*400,(R0)+ MOV #XBUFCT,(R0)+ .ADDR #RCVBDL,R1 MOV R1,(R0)+ MOV #*400,(R0)+ MOV #RBUFCT,(R0)+ MOV UDBADR,PCB+PCB.F2 MOV UDBADR+2,PCB+PCB.F4 MOV #PF.WRF,PCB+PCB.F0 MOV NICSR,R0 .ASSUME UN$CS0 EQ 0 MOVB #PC.GC,@R0 CALL ISWAIT MOV (SP)+,R4 RETURN .DSABL LSB .SBTTL SETUP - Update Address Filtering .PSECT NIDVR .ENABL LSB SETUP: CALL SAV30 CALL SAVPAR MOV UDBBAD+2,@#KISAR1 MOV UDBBAD,R1 .ADDR #NIBROD,R0 MOV #UA.TSZ+1,R2 CLR R3 10$: MOV (R0)+,-(SP) BIS (R0)+,(SP) BIS (R0)+,(SP)+ BEQ 20$ SUB #UA.ESZ,R0 MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ INC R3 CMPB R3,MAXMLT BGT 50$ 20$: DEC R2 BGT 10$ MOV UDBADR,PCB+PCB.F2 MOVB UDBADR+2,R5 SWAB R3 BIS R3,R5 MOV R5,PCB+PCB.F4 MOV #PF.WMA,PCB+PCB.F0 MOV NICSR,R0 .ASSUME UN$CS0 EQ 0 MOVB #PC.NOP,@R0 .ASSUME UN$CS0 EQ 0 MOVB #PC.GC,@R0 CALL ISWAIT CLR R5 TST NIPMFG BEQ 30$ BIS #F2.PM,R5 30$: TST NIAMFG BEQ 40$ BIS #F2.AM,R5 40$: BIS #,R5 MOV R5,PCB+PCB.F2 MOV #PF.WM,PCB+PCB.F0 .ASSUME UN$CS0 EQ 0 MOVB #PC.GC,@R0 CALL ISWAIT .ASSUME UN$CS0 EQ 0 MOVB #,@R0 .ASSUME UN$CS0 EQ 0 MOVB #,@R0 TST (PC)+ 50$: SEC RETURN .DSABL LSB .SBTTL ISWAIT - Wait for Command Completion ISWAIT: .ASSUME UN$CS0 EQ 0 .ASSUME C0.IS EQ 200 TSTB @R0 BPL ISWAIT MOVB UN$CS0+1(R0),UN$CS0+1(R0) RETURN .SBTTL NUABRT - Port Handler Abort Code .PSECT NIDVR NUABRT: CALLR NIABRT .SBTTL NIINT - Interrupt Entry Point .PSECT NIDVR .ENABL LSB .DRAST NI,NI$PRI,NUABRT MOV NICSR,R5 .ASSUME UN$CS0 EQ 0 MOV (R5),R4 MOVB UN$CS0+1(R5),UN$CS0+1(R5) BIT #C0.RXI,R4 BEQ 20$ CALL NUIINT 20$: BIT #C0.TXI,R4 BEQ 30$ CALL NUOINT 30$: BIT #C0.BUI,R4 BEQ 40$ .ASSUME UN$CS0 EQ 0 MOVB #,(R5) 40$: RETURN .DSABL LSB .SBTTL NUIINT - Routine to Process Receive Interrupts .PSECT NIDVR .ENABL LSB NUIINT: TST NIQCHG BNE. 160$ RECV: INC RECVFG BNE. 160$ CALL SAV30 CALL SAVPAR MOV R4,-(SP) MOV R5,-(SP) 10$: CALL GETADR BIT #AH.OWN,RD.ADH(R1) BNE. 150$ BIT #AH.ERS,RD.ADH(R1) BNE. 130$ MOV NIICQE,R4 BEQ. 130$ TST NIPMFG BNE 110$ MOV RCVIDX,R2 ASL R2 ASL R2 .ADDR #RBUFAD,R2,ADD MOV (R2)+,R0 MOV (R2)+,@#KISAR1 .ADDR #NIUPT,R3 MOV R3,-(SP) MOV #UP.TSZ,R2 20$: .ASSUME UO.ESZ EQ UP.ESZ TST NIUOT-NIUPT(R3) BEQ 30$ CMP EF.TYP(R0),(R3) BEQ 40$ 30$: TST (R3)+ DEC R2 BGT 20$ TST (SP)+ BR 130$ 40$: MOV R3,R2 SUB (SP)+,R3 .ASSUME UP.ESZ EQ 2 ASR R3 .ASSUME UO.ESZ EQ UP.ESZ ADD #NIUOT-NIUPT,R2 .ASSUME UO.JOB EQ 0 .ASSUME UO.OFG EQ 1 TST (R2) BEQ 130$ .ADDR #NUADDR,R4 MOV R4,-(SP) MOV R3,-(SP) .ADDR #NIPHAD,R3 MOV #*2,R5 50$: MOV (R3)+,(R4)+ DEC R5 BGT 50$ MOV (SP)+,R3 MUL #UA.ESZ,R3 .ADDR #NIUAT,R3,ADD MOV #,R5 60$: MOV (R3)+,(R4)+ DEC R5 BGT 60$ MOV (SP)+,R3 MOV #3,R4 70$: CMP EF.DST+4(R0),4(R3) BNE 80$ CMP EF.DST+2(R0),2(R3) BNE 80$ .ASSUME EF.DST EQ 0 CMP (R0),(R3) BEQ 90$ 80$: ADD #UA.ESZ,R3 DEC R4 BGT 70$ BR 130$ 90$: .ADDR #NIICQE-Q$LINK,R4 100$: MOV Q$LINK(R4),R4 BEQ 130$ CMPB (R2),Q$UNIT(R4) BNE 100$ 110$: MOV RD.STA(R1),R5 BIC #^C,R5 SUB #4,R5 MOV R5,-(SP) ADD #2,Q$BUFF(R4) CALL @$PTWRD SUB #4,Q$BUFF(R4) INC R5 ASR R5 MOV Q$WCNT(R4),R2 SUB #2,R2 CMP R5,R2 BLE 120$ MOV #RC.TRU,-(SP) CALL @$PTWRD SUB #2,Q$BUFF(R4) BIS #HDERR$,@Q$CSW(R4) MOV R2,R5 120$: MOV RCVIDX,R2 ASL R2 ASL R2 .ADDR #RBUFAD,R2,ADD MOV 2(R2),R1 MOV (R2),R2 MOV Q$PAR(R4),R3 MOV R4,-(SP) MOV Q$BUFF(R4),R4 ADD #4,R4 MOV @#SYSPTR,R0 MOV P1EXT(R0),R0 CALL BLKMOV(R0) MOV (SP)+,R4 CALL NIIDEQ 130$: CALL GETADR CLR RD.STA(R1) MOVB #,RD.ADH+1(R1) MOV RCVIDX,R1 INC R1 CMP R1,#RBUFCT BLT 140$ SUB #RBUFCT,R1 140$: MOV R1,RCVIDX JMP 10$ 150$: MOV (SP)+,R5 MOV (SP)+,R4 MOV #-1,RECVFG 160$: RETURN .DSABL LSB .SBTTL GETADR - Get Buffer Descriptor Address GETADR: MOV RCVIDX,R1 MUL #RD.ESZ,R1 .ADDR #RCVBDL,R1,ADD RETURN .SBTTL NUOINT - Routine to Process Transmit Interrupts .PSECT NIDVR .ENABL LSB NUOINT: CALL SAV30 CALL SAVPAR MOV R4,-(SP) MOV R5,-(SP) .ADDR #XMTBDL,R5 MOV #-1,XMITFG MOV NIOCQE,R4 BEQ 70$ MOV Q$LINK(R4),NIOCQE CLR Q$LINK(R4) BIT #AH.ERS,TD.ADH(R5) BEQ 40$ BIT #ST.LCA,TD.STA(R5) BEQ 10$ MOV #,-(SP) BR 30$ 10$: BIT #ST.RTY,TD.STA(R5) BEQ 20$ MOV #,-(SP) BR 30$ 20$: MOV #,-(SP) .BR 30$ 30$: BIS #HDERR$,@Q$CSW(R4) CALL @$PTWRD 40$: CALL NIFIN BR 50$ XMIT: CALL SAV30 CALL SAVPAR MOV R4,-(SP) MOV R5,-(SP) 50$: TST NOQCHG BNE 70$ MOV NIOCQE,R4 BEQ 70$ INC XMITFG BNE 70$ MOV Q$PAR(R4),@#KISAR1 MOV Q$BUFF(R4),R2 ADD #<4+EF.SRC>,R2 MOV (R2),-(SP) BIS 2(R2),(SP) BIS 4(R2),(SP)+ BNE 60$ .ADDR #NIPHAD,R1 MOV (R1)+,(R2)+ MOV (R1)+,(R2)+ MOV (R1)+,(R2)+ 60$: MOV Q$PAR(R4),R1 MOV Q$BUFF(R4),R2 ADD #4,R2 MOV Q$WCNT(R4),R5 SUB #2,R5 MOV R5,-(SP) MOV XBUFAD+2,R3 MOV XBUFAD,R4 MOV @#SYSPTR,R0 MOV P1EXT(R0),R0 CALL BLKMOV(R0) .ADDR #XMTBDL,R0 ASL (SP) .ASSUME TD.LEN EQ 0 MOV (SP)+,@R0 CLR TD.STA(R0) MOVB #</400>,TD.ADH+1(R0) MOVB #,@NICSR 70$: MOV (SP)+,R5 MOV (SP)+,R4 RETURN .DSABL LSB .SBTTL Port Handler Inpure Data Area .PSECT NIDAT NINAME: .WORD NI$HND .RAD50 /$ / PCB: .WORD PF.RDA .WORD 0,0,0 RBUFAD: .BLKW XBUFAD: .BLKW 2 UDBBAD: .BLKW 2 UDBADR: .BLKW 2 RCVBDL: .BLKB XMTBDL: .BLKB TD.ESZ RCVIDX: .BLKW RECVFG: .WORD -1 XMITFG: .WORD -1 FQELEM: .BLKW 6 NUADDR: .BLKW 3*UA.ESZ NUFBLK: .WORD 0,0,0,0 MAXMLT: .WORD 0 .SBTTL Installation code overlay .PSECT SETOVR OVRBK0 =: . .ENABL LSB INSOVR: MOV @#SYSPTR,R1 BIT #,CONFG2(R1) BNE I.ERR MOV +INSCSR,R0 .ASSUME UN$CS0 EQ 0 MOV #C0.RSE,@R0 .ASSUME UN$CS0 EQ 0 5$: BIT #C0.DNI,@R0 BEQ 5$ MOVB UN$CS0+1(R0),UN$CS0+1(R0) MOVB UN$CS1(R0),-(SP) BIC #^C,(SP) CMPB (SP)+,#PS.RDY BNE I.ERR ASL #100000 BCC 6$ .ASSUME UN$CS0 EQ 0 MOVB #PC.ST,@R0 BR 5$ 6$: MOV MEMPTR(R1),R0 ADD R1,R0 MOV CORPTX(R0),R0 ADD R1,R0 CLR -(SP) MOV #-1,-(SP) 10$: CMP (R0),#-1 BEQ 30$ TST (R0) BEQ 20$ CMP (R0),#EMEMSZ BLO 20$ MOV 2(R0),-(SP) ADD #EMEMSZ,(SP) CMP (SP)+,#10000 BHI 20$ CMP (R0),(SP) BHIS 20$ MOV R0,2(SP) MOV (R0),(SP) 20$: ADD #4,R0 BR 10$ 30$: TST (R0)+ MOV R0,R2 TST (SP)+ MOV (SP)+,R0 BEQ I.ERR 50$: CMP (R2),#-1 BEQ I.ERR TST (R2) BEQ 60$ ADD #GR.ESZ,R2 BR 50$ 60$: MOV #EMEMSZ,(R2)+ SUB #EMEMSZ,(R0)+ MOV (R0),(R2)+ ADD #EMEMSZ,(R0) MOV #GR.PVT,(R2)+ MOV #NI$HND,(R2)+ MOV #<^R$ >,(R2)+ I.NORM: TST (PC)+ I.ERR: SEC RETURN .DSABL LSB .ASSUME <.-OVRBK0> LE 1000,<;INSTALL overlay overflow> .SBTTL Set Code Overlay .PSECT SETOVR . = OVRBK0 + 1000 OVRBK1 =: . .MCALL .DSTAT, .LOOKU, .SPFUN .MCALL .TRPSE, .PRINT, .TTYOU .MCALL .CLOSE, .PURGE ..DSTA =: 342 ..LKUP =: 375 ..SPFN =: 375 .ENABL LSB O.SHOW: .ADDR #OVRBK1,R0 ADD R0,LKAREA+2 ADD R0,SPAREA+4 .ADDR #DBLK,R0 .ADDR #DSAREA+1,-(SP) EMT ..DSTA BCS 10$ TST DSAREA+4 BEQ 10$ CALL DEVTYP .PURGE #0 .ADDR #LKAREA,R0 EMT ..LKUP BCS S.ERR .ADDR #SPAREA,R0 EMT ..SPFN ROL -(SP) .ADDR #SPAREA,R0 CLR SPAREA+2 EMT ..SPFN .PURGE #0 ROR (SP)+ BCS S.ERR BR 20$ 10$: .ADDR #TSAREA,R0 .ADDR #NUNXM,R1 .TRPSE R0,R1 MOV +INSCSR,R0 TST @R0 NOP BCS S.ERR CALL DEVTYP .ADDR #SPCB,R1 MOV R1,UN$CS2(R0) CLR UN$CS3(R0) .ASSUME UN$CS0 EQ 0 MOVB #PC.GP,@R0 CALL SWAIT MOV #PF.RDA,SPCB+PCB.F0 .ASSUME UN$CS0 EQ 0 MOVB #PC.GC,@R0 CALL SWAIT 20$: .ADDR #M.PADD,R0 .PRINT .ADDR #SPCB+PCB.F2,R1 MOV #6.,R2 BR 40$ 30$: .TTYOU #'- 40$: MOVB (R1)+,-(SP) MOVB (SP),R0 ASR R0 ASR R0 ASR R0 ASR R0 BIC #^C<17>,R0 .ADDR #HEX,R0,ADD .TTYOU @R0 MOVB (SP)+,R0 BIC #^C<17>,R0 .ADDR #HEX,R0,ADD .TTYOU @R0 DEC R2 BGT 30$ .ADDR #M.CRLF,R0 .PRINT S.NORM: TST (PC)+ S.ERR: SEC ROL R2 JMP +GETBK1 .DSABL LSB DEVTYP: MOV R0,-(SP) MOV +INSCSR,R0 MOV UN$CS1(R0),R0 BIC #^C,R0 BNE 10$ .ADDR #M.DEUN,R0 BR 20$ 10$: .ADDR #M.DELU,R0 20$: .PRINT MOV (SP)+,R0 RETURN NUNXM: BIS #1,2(SP) RTI SWAIT: .ASSUME UN$CS0 EQ 0 .ASSUME C0.IS EQ 200 TSTB @R0 BPL SWAIT MOVB UN$CS0+1(R0),UN$CS0+1(R0) RETURN DBLK: .WORD NI$HND .WORD 0,0,0 DSAREA: .BLKW 4 LKAREA: .BYTE 0 .BYTE 1 .WORD DBLK-OVRBK1 .WORD 0 SPAREA: .BYTE 0 .BYTE 32 .WORD 1 .WORD SPCB-OVRBK1 .WORD 0 .BYTE 377,SP.POR .WORD 0 SPCB: .WORD PF.RDA .WORD 0,0,0 TSAREA: .BLKW 2 M.DEUN: .ASCII /DEUNA, /<200> M.DELU: .ASCII /DELUA, /<200> M.PADD: .ASCII /Station address = /<200> M.CRLF: .BYTE 0 HEX: .ASCII /0123456789ABCDEF/ .EVEN .ASSUME <.-OVRBK1> LE 1000,<;SET overlay overflow> .END .MCALL .MODULE .MODULE PC,VERSION=05,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY .SBTTL EDIT HISTORY .SBTTL MACROS AND DEFINITIONS .MCALL .DRDEF .IIF NDF PR11$X, PR11$X=0 .IIF NE PR11$X, PR11$X=1 .DRDEF PC,7,,0,177550,70 .DRPTR .DREST CLASS=DVC.UK PCB == PC$CSR+2 .IIF NDF PP$VEC, PP$VEC == PC$VEC+4 .IIF NDF PP$CSR, PP$CSR == PC$CSR+4 PPB = PP$CSR+2 PRGO = 1 PINT = 101 .SBTTL DRIVER ENTRY .DRBEG PC MOV PCCQE,R4 ASL Q$WCNT(R4) BCS PP BEQ PCDONE MOV #PC$CSR,R5 TST (R5)+ BPL PCGORD BIS #EOF$,@-(R4) BR PCFIN PP: .IF EQ PR11$X BIS #100,@#PP$CSR RTS PC .DRVTB PC,PC$VEC,PCINT .DRVTB ,PP$VEC,PPINT .DRAST PP,4,PCDONE MOV PCCQE,R4 MOV #PP$CSR,R5 TST (R5)+ BMI PPERR .IF EQ MMG$T ADD #Q$WCNT,R4 TST @R4 BEQ PCDONE INC @R4 MOVB @-(R4),@R5 INC @R4 .IFF TST Q$WCNT(R4) BEQ PCDONE INC Q$WCNT(R4) JSR PC,@$GTBYT MOVB (SP)+,@R5 .ENDC RTS PC .ENDC PPERR: BIS #HDERR$,@-(R4) BR PCFIN .DRAST PC,4,PCDONE MOV PCCQE,R4 .IF EQ MMG$T ADD #Q$WCNT,R4 .ENDC MOV #PC$CSR,R5 TST (R5)+ BMI PREOF .IF EQ MMG$T MOVB @R5,@-(R4) INC (R4)+ DEC @R4 .IFF MOVB @R5,-(SP) JSR PC,@$PTBYT DEC Q$WCNT(R4) .ENDC BEQ PCDONE PCGORD: BIS #PINT,-(R5) RTS PC PREOF: CLR -(R5) .FORK PCFBLK 1$: .IF EQ MMG$T CLRB @-(R4) INC (R4)+ DEC @R4 .IFF CLR -(SP) JSR PC,@$PTBYT DEC Q$WCNT(R4) .ENDC BNE 1$ PCDONE: CLR @#PC$CSR .IF EQ PR11$X CLR @#PP$CSR .ENDC CLR PCFBLK+2 PCFIN: .DRFIN PC PCFBLK: .WORD 0,0,0,0 .DREND PC .END .MCALL .MODULE .MODULE PD,VERSION=08,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY .SBTTL BOOTSTRAP ROUTINE DEFINITIONS .LIST MEB .MCALL .DRDEF .ADDR .ASSUME .DRDEF PD,36,FILST$,512.,0,0 .DRPTR .DREST CLASS=DVC.DK,MOD=DVM.DX .DSTATUS=:342 ROMS$T =:173000 ROM$ID =:ROMS$T+6 ROM$TP =:ROM$ID+2 ROM$DT =:ROM$TP+2 RD$NDP =:0 RD$NT =:RD$NDP+2 RD$ASC =:RD$NT+2 RD$IMP =:RD$ASC+2 RD$BST =:RD$IMP+2 RD$BSR =:RD$BST+2 RD$DID =:RD$BSR+2 RD$SIO =:RD$DID+2 RD$ABT =:RD$SIO+2 RD$PUP =:RD$ABT+2 RD$ISR =:RD$PUP+2 BT$IMP =:10000 DX$COD =:22 DD$COD =:34 P3$COD =:36 P5$COD =:37 .SBTTL INSTALLATION ROUTINE .ASECT . = 200 .ENABL LSB PDINST: BR O.BAD JSR R4,1$ DEVTBL: .WORD DEVEND-DEVTBL/2 DV$UNT: .BLKW DV$ASC: .BLKW DV$R50: .BLKW DV$IMS: .BLKW DV$DST: .BLKW DV$LOS: .BLKW DV$HIS: .BLKW DV$PAG: .BLKW DV$VEC: .BLKW DV$ISR: .BLKW DV$PS: .BLKW DV$PRI: .BLKW DEVEND: 1$: MOV @#B$DEVU,R0 MOV @#ROM$DT,R1 ADD #RD$ISR,R1 MOV @R1,.INTRP TST -(R1) MOV -(R1),.ABORT MOV -(R1),.STARI CALL @-(R1) MOV (SP)+,R4 BCS O.BAD .ADDR #DV$PRI,R2 SWAB @R2 ASR @R2 ASR @R2 ASR @R2 BIC @R2,PDPRMS CMP -(R2),-(R2) MOV -(R2),R1 TST -(R2) TST -(R2) BNE O.BAD MOV -(R2),54 BR INCONT .DSABL LSB .ASSUME . LE 400,<;INSTALL area overflow> .SBTTL SET OPTIONS .DRSET WRITE, 1, O.WP, NO O.WP: NOP CLR R3 N.WP: .ASSUME O.WP+4 EQ N.WP,<;NO option out of place> MOV R3,O.WPF CMP R1,#1 BHI O.BAD .ADDR #PDWPRO,R0 ADD R1,R0 MOVB (PC)+,(R0) O.WPF: .BLKW 1 .ADDR #DEVNAM,R0 .ADDR #DAREA+1,@SP EMT .DSTATUS BCS O.BAD MOV DAREA+4,R0 BEQ O.GOOD ADD #PDW1-PDLQE,R0 MOV #100000,@R0 ADD R1,R0 MOVB O.WPF,PDWPRO-PDW1(R0) O.GOOD: TST (PC)+ O.BAD: SEC RETURN DAREA: .BLKW 4 DEVNAM: .RAD50 /PD / .SBTTL INSTALLATION CODE (CONT.) .ENABL LSB INCONT: 2$: MOV -(R2),R0 .IF NE ERL$G MOVB R0,EL$COD+1 .ENDC CMPB R0,#DX$COD BNE 3$ ADD #P5$COD-DX$COD,R0 3$: CMPB R0,#DD$COD BNE 4$ ADD #P3$COD-DD$COD,R0 4$: MOV R0,56 MOV -(R2),R0 ASL R0 ADD R0,$INOFF ADD R0,$FKOFF .IF NE ERL$G ADD R0,$ELOFF .ENDC SUB R0,R4 MOV R4,10.(SP) SUB R0,6.(SP) .ADDR #RELOC,R2 SUB #<1000+RELOCE-RELOC>,R4 MOV #/2,R3 55$: MOV (R2)+,(R4)+ DEC R3 BNE 55$ MOV 52,R3 ADD #1000,R3 CLC ROR R3 MOV R4,R5 ADD R0,R5 CALL RELOC-RELOCE(R4) .ADDR #.DDL,R5 ADD R4,@R5 CLR @(R5)+ CLR (R5)+ MOV #.DDLEN-.DDLCP/2,R3 5$: ADD R4,(R5)+ DEC R3 BNE 5$ MOV R1,R2 BIC #^C<3>,R2 BIC R2,R1 6$: MOV R1,(R5)+ CMP (R5)+,(R5)+ CMP (R1)+,(R1)+ DEC R2 BPL 6$ BR O.GOOD RELOC: MOV (R5)+,(R4)+ DEC R3 BNE RELOC SUB R0,@SP RETURN RELOCE: .ASSUME . LE 1000,<;SET area overflow> .DSABL LSB .SBTTL START I/O ENTRY .ENABL LSB .DRBEG PD BR 5$ PDWPRO: .BYTE 0,0 .ASSUME . LE PDSTRT+1000,<;SET object not in block 1> 5$: MOV PDCQE,R4 TST Q$WCNT(R4) BPL 10$ ASL (PC)+ PDW1: .WORD .-. .ASSUME . LE PDSTRT+1000,<;SET object not in block 1> BCS 10$ MOVB Q$UNIT(R4),R4 BIC #<^C7>,R4 .ADDR #PDWPRO,R4,ADD TSTB (R4) BNE ERROR 10$: .ADDR #.DDL,R5 MOV PDCQE,.DDLQ CALL @(PC)+ .STARI: .WORD 0 .ASSUME . LE PDSTRT+1000,<;SET object not in block 1> ERROR: MOV PDCQE,R4 BIS #HDERR$,@-(R4) BR PDEXIT .SBTTL INTERRUPT ENTRY .ENABL LSB BR PDABRT PDINT:: BCS 1$ $INOFF = .+2 JSR R5,@$INPTR PDPRMS: .WORD 340 .ASSUME . LE PDSTRT+1000,<;SET object not in block 1> CLR FKFLG .ADDR #.DDL,R5 JMP @(PC)+ .INTRP: .WORD 0 1$: MOV R4,-(SP) MOV R5,-(SP) .ADDR #.DDL,R5 CALL @.INTRP MOV (SP)+,R5 MOV (SP)+,R4 RTI .DSABL LSB .SBTTL COMPLETION EXIT COMPLT: BCS ERROR .IF NE ERL$G CALL FORK MOV (PC)+,R4 EL$COD: .BYTE -1,0 .ASSUME . LE PDSTRT+1000,<;SET object not in block 1> CALL ERLOG .ENDC PDEXIT: .DRFIN PD PDABRT: .ADDR #.DDL,R5 CALL @(PC)+ .ABORT: .WORD 0 .ASSUME . LE PDSTRT+1000,<;SET object not in block 1> CLR PDFBLK+2 BR PDEXIT .SBTTL FORK ROUTINE FORK: TST (PC)+ FKFLG: .WORD 0 BNE 1$ MOV (SP)+,FKFLG $FKOFF = .+2 JSR R5,@$FKPTR .WORD PDFBLK-. MOV FKFLG,-(SP) 1$: RETURN PDFBLK: .BLKW 4 .SBTTL ERROR LOGGER ERLOG: .IF NE ERL$G MOV R5,-(SP) MOV PDCQE,R5 $ELOFF = .+2 CALL @$ELPTR MOV (SP)+,R5 .ENDC SYNCH: TIMOUT: XPGLNK: ERRPT: RETURN .SBTTL DEVICE DRIVER LIST .DDL: .WORD ENDCOD-IMPUR .DDLQ: .WORD 0 .DDLCP: .WORD COMPLT-IMPUR .DDLFR: .WORD FORK-IMPUR .DDLSY: .WORD SYNCH-IMPUR .DDLEL: .WORD ERLOG-IMPUR .DDLTM: .WORD TIMOUT-IMPUR .DDLXP: .WORD XPGLNK-IMPUR .DDLER: .WORD ERRPT-IMPUR .DDLOP: .WORD OPTLST-IMPUR .DDLEN: .ASSUME . LE PDSTRT+1000,<;SET object not in block 1> .DRVTB PD,0,PDINT .DRVTB ,0,PDINT .DRVTB ,0,PDINT .DRVTB ,0,PDINT OPTLST: .WORD 0 ENDCOD: .SBTTL BOOTSTRAP DRIVER .DRBOT PD,BOOT1,READ IMPUR == PDEND . = PDBOOT+40 BOOT1: JMP @#BOOT-PDBOOT . = PDBOOT+550 READ: MOV @#ROM$DT,R4 MOV #BT$IMP+2,R5 MOV @#B$DEVU,R3 CALL @RD$BSR(R4) BCS BIOERR RETURN BOOT: MOV #10000,SP MOV R0,-(SP) BIC #^C<7>,@SP MOV @SP,@#B$DEVU MOV #2,R0 MOV #<4*400>,R1 MOV #1000,R2 CALL READ MOV #READ-PDBOOT,@#B$READ MOV #B$DNAM,@#B$DEVN MOV (SP)+,@#B$DEVU JMP @#B$BOOT .DREND PD .END .MCALL .MODULE .MODULE RF,VERSION=06,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY .MCALL .DRDEF .ASSUME .GLOBL $RFNUM .IIF NDF $RFNUM, $RFNUM=1 .DRDEF RF,12,100012,2000*$RFNUM,177460,204 .DRPTR .DREST CLASS=DVC.DK RFCS = RF$CSR RFWC = RFCS+2 RFMA = RFCS+4 RFDA = RFCS+6 RFAE = RFCS+10 CMAINH = 400 RD = 105 WR = 103 RFIDEN = 5000 RFIDS = 5377 RFRCNT = 3400 RFNREG = 10 RFREGA = 177460 .SBTTL INSTALLATION CHECK .DRINS RF NOP MOV INSCSR,R0 TSTB -20(R0) BCS 1$ BPL 1$ MOV #-2,-6(R0) BCS 1$ CMP #-2,-6(R0) BNE 2$ 1$: TST (PC)+ 2$: SEC RTS PC .ASSUME . LE 400,<;INSTALL area overflow> .SBTTL DRIVER ENTRY POINT .DRBEG RF ENTRY: MOV #7,(PC)+ RFTRY: .WORD 0 AGAIN: JSR R0,RFCOMN ZERO: .WORD 0 .IF EQ MMG$T MOV (R5)+,-(R4) .IFF JSR PC,@$MPPTR MOV (SP)+,-(R4) MOV (SP)+,R3 BIT #1700,R3 BNE RFHER .ENDC MOV (R5)+,-(R4) MOV #WR,R5 TST @R4 BEQ RFEXIT BMI 1$ MOV #RD,R5 NEG @R4 1$: .IF NE MMG$T BIS R3,R5 .ENDC MOV R5,-(R4) RTS PC .DRAST RF,5,RFABORT MOV RFCQE,R5 TST @#RFCS BPL RFFILL .FORK RFFBLK .IF NE ERL$G BIT #6000,@#RFCS BNE RFHER BIT #2000,@#RFAE BNE RFHER MOV PC,R1 ADD #RFRBUF-.,R1 MOV R1,R2 MOV #RFNREG,R4 MOV #RFREGA,R3 RFRREG: MOV (R3)+,(R1)+ DEC R4 BNE RFRREG MOV #RFNREG,R3 ADD #RFRCNT,R3 MOVB RFTRY,R4 DEC R4 ADD #RFIDEN,R4 JSR PC,@$ELPTR .ENDC RFRETY: DEC RFTRY BGT AGAIN RFHER: MOV RFCQE,R5 BIS #HDERR$,@-(R5) .IF NE ERL$G BR RFEXIT RFHOME: .FORK RFFBLK MOV #RFIDS,R4 MOV RFCQE,R5 JSR PC,@$ELPTR .IFF RFHOME: .ENDC RFEXIT: .DRFIN RF RFABORT:MOV #400,@#RFCS CLR RFFBLK+2 BR RFEXIT RFFILL: JSR R0,RFCOMN .WORD CMAINH MOV 2(R5),R5 BPL RFHOME TSTB R5 BEQ RFHOME NEG R5 ADD R5,@R4 ADC 2(R4) BIS #177400,R5 MOV PC,-(R4) ADD #ZERO-.,@R4 MOV R5,-(R4) MOV #WR,-(R4) RTS PC POPHOM: MOV (SP)+,R0 BR RFHOME RFCOMN: MOV #RFAE,R4 BIT @R0,@R4 BNE POPHOM MOV #400,@#RFCS MOV RFCQE,R5 MOV (R5)+,-(SP) SWAB @SP MOV @SP,@R4 BIC #177740,@R4 BIS (R0)+,@R4 CLRB @SP MOV (SP)+,-(R4) TST (R5)+ RTS R0 RFFBLK: .WORD 0,0,0,0 .IF NE ERL$G RFRBUF: .BLKW RFNREG .ENDC .SBTTL BOOTSTRAP DRIVER .DRBOT RF,BOOT1,READ . = RFBOOT+40 BOOT1: JMP BOOT . = RFBOOT+120 READ: MOV #RFDA,R3 MOV R0,R5 SWAB R5 MOV R5,R4 CLRB R5 MOV R5,(R3)+ BIC #177740,R4 MOV R4,@R3 TST -(R3) MOV R2,-(R3) MOV R1,-(R3) NEG @R3 MOV #5,-(R3) 3$: TSTB @R3 BPL 3$ TST @R3 BMI 4$ CLC RETURN 4$: JMP BIOERR . = RFBOOT+614 BOOT: MOV #10000,SP MOV #2,R0 MOV #<4*400>,R1 MOV #1000,R2 MOV #READ-RFBOOT,@#B$READ MOV #B$DNAM,@#B$DEVN JSR PC,READ CLR @#B$DEVU JMP @#B$BOOT .DREND RF .END .MCALL .MODULE .MODULE RK,VERSION=10,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY .SBTTL MACROS AND DEFINITIONS .MCALL .DRDEF .ASSUME .DRDEF RK,0,FILST$,4800.,177400,220 .DRPTR .DREST CLASS=DVC.DK RKDS = RK$CSR RKER = RKDS+2 RKCS = RKDS+4 RKWC = RKDS+6 RKBA = RKDS+10 RKDA = RKDS+12 RKCNT = 8. RKNREG = 7 DSID = 160000 DSDPL = 10000 DSRK05 = 4000 DSDRU = 2000 DSSIN = 1000 DSSOK = 400 DSDRY = 200 DSREDY = 100 DSWPS = 40 DSSCOK = 20 DSSC = 17 ERDRE = 100000 EROVR = 40000 ERWLO = 20000 ERSKE = 10000 ERPGE = 4000 ERNXM = 2000 ERDLT = 1000 ERTE = 400 ERNXD = 200 ERNXC = 100 ERNXS = 40 ERCSE = 2 ERWCK = 1 CSERR = 100000 CSHE = 40000 CSSCP = 20000 CSINHB = 4000 CSFMT = 2000 CSSSE = 400 CSRDY = 200 CSIE = 100 CSBA67 = 60 CSBA16 = 20 CSFUN = 16 CSGO = 1 FNRST = 0*2 FNWRITE = 1*2 FNREAD = 2*2 FNWCHK = 3*2 FNSEEK = 4*2 FNRCHK = 5*2 FNDRST = 6*2 FNWLK = 7*2 DAUNIT = 160000 DACYL = 17740 DASUR = 20 DASC = 17 SYSPTR =: 54 CONFG2 =: 370 QBUS$ =: 000100 .SBTTL Installation Code .DRINS RK .SBTTL SET OPTIONS .DRSET CSR, 160000, O.CSR, OCT .DRSET VECTOR, 500, O.VEC, OCT .DRSET RETRY, 127., O.RTRY, NUM .IF NE ERL$G .DRSET SUCCES, -1, O.SUCC, NO .ENDC BTCSR = ++1000 O.CSR: CMP R0,R3 BLO O.BAD MOV R0,INSCSR MOV R0,DISCSR MOV PC,R1 ADD #BAREA-.+4,R1 MOV PC,R2 ADD #1000-.,R2 MOV R2,(R1) MOV #BTCSR/1000,-(R1) TST -(R1) MOV R0,R3 ADD #RKDA-RKDS,R3 MOV R1,R0 EMT 375 BCS O.BAD MOV R3,(R2) MOV R1,R0 INCB 1(R0) EMT 375 BCS O.BAD MOV R1,R0 DECB 1(R0) MOV #1,2(R0) EMT 375 BCS O.BAD MOV R3,RKCSR O.GOOD: TST (PC)+ O.BAD: SEC RTS PC O.VEC: CMP R0,R3 BHIS O.BAD BIT #3,R0 BNE O.BAD MOV R0,RKSTRT BR O.GOOD O.RTRY: CMP R0,R3 BHI O.BAD MOV R0,DRETRY BNE O.GOOD BR O.BAD .IF NE ERL$G O.SUCC: MOV #0,R3 MOV R3,SCSFLG BR O.GOOD .ENDC BAREA: .BYTE 17,10 .BLKW .BLKW .WORD 256. .WORD 0 .ASSUME . LE 1000,<;SET area overflow> .SBTTL DRIVER ENTRY .DRBEG RK MOV (PC)+,(PC)+ DRETRY: .WORD RKCNT .ASSUME . LE RKSTRT+1000,<;SET object not in block 1> RETRY: .WORD 0 MOV RKCQE,R5 MOV @R5,R2 MOV Q$UNIT-1(R5),R4 ASR R4 ASR R4 ASR R4 SWAB R4 BIC #^C,R4 BR 2$ 1$: ADD R2,R4 ASR R2 ASR R2 ADD R3,R2 2$: MOV R2,R3 BIC #^C<17>,R3 BIC R3,R2 BNE 1$ CMP #12.,R3 BGT 3$ ADD #4,R3 3$: ADD R3,R4 MOV R4,DISKAD AGAIN: MOV RKCQE,R5 MOV #CSIE!FNWRITE!CSGO,R3 MOV (PC)+,R4 RKCSR: .WORD RKDA .ASSUME . LE RKSTRT+1000,<;SET object not in block 1> MOV (PC)+,@R4 DISKAD: .WORD 0 CMP (R5)+,(R5)+ .IF EQ MMG$T MOV (R5)+,R1 CLR R2 .IFF CALL @$MPPTR MOV (SP)+,R1 MOV (SP)+,R2 MOV R2,R0 ASH #-4,R2 .ENDC MOV R1,-(R4) MOV (R5),-(SP) BPL 46$ NEG (SP) 46$: ADD (SP),R1 ADC R2 ADD (SP)+,R1 ADC R2 MOV #<^B11>,-(SP) MOV @#SYSPTR,R1 BIT #QBUS$,CONFG2(R1) BEQ 47$ CLR (SP) 47$: BIC (SP)+,R2 BNE HERROR MOV (R5)+,-(R4) BEQ 7$ BMI 5$ NEG @R4 MOV #CSIE!FNREAD!CSGO,R3 5$: .IF NE MMG$T BIS R0,R3 .ENDC MOV R3,-(R4) 6$: RTS PC 7$: MOV #CSIE!FNSEEK!CSGO,-(R4) BR 6$ .IF NE ERL$G SCSFLG: .WORD 0 .ASSUME . LE RKSTRT+1000,<;SET object not in block 1> .ENDC .SBTTL INTERRUPT ENTRY POINT .DRAST RK,5 MOV RKCSR,R5 ADD #RKER-RKDA,R5 MOV (R5)+,R4 TST RETRY BPL NORMAL TST @R5 BMI NORMAL BIT #CSSCP,@R5 BEQ RTSPC .FORK RKFBLK RKRETR: CLRB RETRY+1 BR AGAIN NORMAL: CMP @R5,#CSRDY!CSIE!FNSEEK BEQ RTSPC TST @R5 BPL DONE .FORK RKFBLK .IF NE ERL$G BIT #EROVR!ERWLO!ERNXM!ERNXD!ERNXC!ERNXS,R4 BNE RKERR MOV PC,R5 ADD #RKRBUF-.,R5 MOV R5,R2 MOV RKCSR,R3 ADD #RKDS-RKDA,R3 MOV #RKNREG,R4 RKRREG: MOV (R3)+,(R5)+ DEC R4 BNE RKRREG MOV DRETRY,R3 SWAB R3 ADD #RKNREG,R3 MOV RKCQE,R5 MOVB RETRY,R4 DEC R4 JSR PC,@$ELPTR MOV RKCSR,R5 ADD #RKER-RKDA,R5 MOV (R5)+,R4 .ENDC RKERR: MOV #FNRST!CSGO,@R5 3$: TSTB @R5 BPL 3$ DECB RETRY BEQ HERROR BIT #ERDRE!ERSKE,R4 BEQ RKRETR MOV DISKAD,@RKCSR BIS #100000,RETRY MOV #CSIE!FNDRST!CSGO,@R5 RTSPC: RTS PC HERROR: MOV RKCQE,R5 BIS #HDERR$,@-(R5) .IF NE ERL$G BR RKEXIT DONE: .FORK RKFBLK TST SCSFLG BNE RKEXIT MOV (PC)+,R4 .BYTE 377,RK$COD MOV RKCQE,R5 JSR PC,@$ELPTR .IFF DONE: .ENDC RKEXIT: CLR RETRY .DRFIN RK RKFBLK: .WORD 0,0,0,0 .IF NE ERL$G RKRBUF: .BLKW RKNREG .ENDC .SBTTL BOOTSTRAP DRIVER .DRBOT RK,BOOT1,READ . = RKBOOT+40 BOOT1: JMP @#BOOT-RKBOOT . = RKBOOT+210 READ: MOV #12.,R3 BR 2$ 1$: ADD #20,R3 2$: SUB #12.,R0 BPL 1$ ADD R3,R0 MOV BOTCSR,R3 BIC #^C,@R3 BIS R0,@R3 MOV R2,-(R3) MOV R1,-(R3) NEG @R3 MOV #FNREAD!CSGO,-(R3) 3$: TSTB @R3 BPL 3$ TST @R3 BMI BIOERR RTS PC . = RKBOOT+574 BOOT: MOV #10000,SP MOV @(PC)+,-(SP) BOTCSR: .WORD RKDA ROL @SP ROL @SP ROL @SP ROL @SP BIC #^C<7>,@SP MOV #2,R0 MOV #<4*400>,R1 MOV #1000,R2 JSR PC,READ MOV #READ-RKBOOT,@#B$READ MOV #B$DNAM,@#B$DEVN MOV (SP)+,@#B$DEVU JMP @#B$BOOT .DREND RK .END .MCALL .MODULE .MODULE SP,VERSION=10,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1984,1985,1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY .SBTTL CREDITS .SBTTL MACROS AND DEFINITIONS .ENABLE LC .NLIST BEX .MCALL .DRDEF, .ADDR, .ASSUME .MCALL .BR .IIF NDF SP$FLG SP$FLG = 0 .IIF NE SP$FLG SP$FLG=1 .IIF NDF SP$DEC SP$DEC = 0 .IIF NE SP$DEC SP$DEC=1 .DRDEF SP,55,WONLY$!,0,0,110 .DRPTR .DREST CLASS=DVC.LP .MACRO SFR MOV (SP)+,(PC)+ .WORD 0 .ENDM .MACRO RFS ROUTINE JMP @ROUTINE+2 .ENDM .SBTTL CONSTANT AND PARAMETER DEFINITION NEXT = 000010 OFF = 000020 ON = 000040 KILL = 000100 ACTIVE = 000200 BPOVER = 003400 SHOW = 004000 PRTSCR = 010000 DATIME = 020000 INTEN = 040000 ERROR = 100000 SYSPTR = 000054 P1EXT = 000432 SPSTAT = 000414 $DATE = 000262 YEAR$ = 000037 DAY$ = 001740 MONTH = 036000 CLO$SE = 000001 DELE$TE = 000002 LOOK$UP = 000003 ENT$ER = 000004 MASK.U = 177770 BPTINS = 000003 NOPINS = 000240 WIDOFF = 000006 .SBTTL SET OPTIONS .DRSET WAIT,ON,S.WAIT, .DRSET NEXT,NEXT,S.BIT .DRSET KILL,KILL,S.BIT .IF NE SP$FLG .DRSET FLAG,4,S.FLAG, .DRSET WIDE,WIDOFF,S.WIDE, .DRSET FORM0,-1,S.FRM0, .DRSET METSCH,-1,S.JIM, .DRSET ENDPAG,4,S.ENDP, .ENDC .DRSET DEBUG,BPTINS,S.DEBUG, .SBTTL SET CODE S.DEBUG:MOV R3,R0 BR 10$ MOV #NOPINS,R0 10$: MOV R0,DBGINS RTS PC S.WAIT: MOV #OFF,R3 S.BIT: MOV @#SYSPTR,R0 BISB R1,R3 BIS R3,SPSTAT(R0) CLR R3 RTS PC .IF NE SP$FLG S.FLAG: CMP R0,R3 BHI S.ERR BIC #MASK.U,R1 .ADDR #FLGCNT,R1,ADD MOVB R0,@R1 S.OK: TST (PC)+ S.ERR: SEC RETURN S.FRM0: CLR R3 NOP COM R3 BIC #MASK.U,R1 .ADDR #FRM0ST,R1,ADD MOVB R3,@R1 BR S.OK S.WIDE: CLR R3 NOP .ADDR #WIDTAB,R3,ADD .ADDR #WIDFIL,R0 MOV (R3)+,(R0)+ MOV (R3)+,(R0)+ MOV (R3)+,(R0)+ BR S.OK WIDTAB: .WORD 10.,9.,8.,6.,6.,5. S.JIM: CLR R3 NOP COM R3 MOV R3,JIM BR S.OK S.ENDP: CMP R0,R3 BHI S.ERR BIC #MASK.U,R1 .ADDR #ENDPTB,R1,ADD MOVB R0,(R1) BR S.OK .ENDC .ASSUME . LT 1000 .SBTTL DRIVER ENTRY .DRBEG SP BR SPGO DBGINS: NOP .Assume . LE SPSTRT+1000,MESSAGE=<;Set object not in block 1> RETURN .IF NE SP$FLG FLGCNT: .REPT 8. .BYTE 2 .ENDR .Assume . LE SPSTRT+1000,MESSAGE=<;Set object not in block 1> FRM0ST: .REPT 8. .BYTE 0 .ENDR .Assume . LE SPSTRT+1000,MESSAGE=<;Set object not in block 1> ENDPTB: .REPT 8. .BYTE 0 .ENDR .Assume . LE SPSTRT+1000,MESSAGE=<;Set object not in block 1> WIDFIL: .WORD 10. WIDDAT: .WORD 9. WIDTIM: .WORD 8. .Assume . LE SPSTRT+1000,MESSAGE=<;Set object not in block 1> JIM: .WORD 1. .Assume . LE SPSTRT+1000,MESSAGE=<;Set object not in block 1> .ENDC SPGO: CALL DBGINS SETPTR: MOV @#SYSPTR,R4 .IF NE MMG$T MOV P1EXT(R4),(PC)+ $P1EXT: .WORD 0 .ENDC ADD #SPSTAT,R4 MOV R4,SPCSR DETFUN: MOV SPCQE,R4 MOV @R4,SP$BNR MOV Q$FUNC(R4),SP$JAF .IF NE SP$FLG MOVB Q$FUNC(R4),R5 BEQ IOREQ .IFF .BR IOREQ .ENDC .SBTTL PROCESS SPECIAL FUNCTION REQUESTS .IF NE SP$FLG SPFUN: CMPB R5,#ENT$ER BNE 10$ CALL GETFIL MOVB Q$UNIT(R4),R0 BIC #MASK.U,R0 MOV R0,-(SP) .ADDR #FRM0ST,R0,ADD MOVB @R0,FRM0FLG MOV (SP),R0 .ADDR #ENDPTB,R0,ADD MOVB (R0),ENDPCT MOV @SPCSR,R0 BIT #BPOVER,R0 BEQ 5$ COM R0 BIC #^C,R0 SWAB R0 MOVB R0,BANFLG TST (SP)+ BR 8$ 5$: MOV (SP)+,R0 .ADDR #FLGCNT,R0,ADD MOVB @R0,BANFLG BEQ 100$ 8$: .ADDR #BANNER,R5 MOV R5,INTVEC BIS #INTEN!DATIME,@SPCSR RTS PC 10$: CMPB R5,#LOOK$UP BNE 20$ CALL GETFIL TST SP$FNR BEQ 100$ CLR SP$FNR JMP SPERR 20$: CMPB R5,#CLO$SE BNE 100$ TST SP$FNR BEQ 100$ CLR SP$FNR .ADDR #ENDPAG,R5 MOV R5,INTVEC BIS #INTEN,@SPCSR RTS PC 100$: BR SPEXIT .ENDC .SBTTL PROCESS I/O REQUESTS IOREQ: TST Q$WCNT(R4) BEQ SPEXIT BGT SPERR .IF NE SP$FLG .ADDR #IOINT,R5 MOV R5,INTVEC .ENDC CLR (PC)+ BLKSC: .WORD 0 BIS #INTEN,@SPCSR RTS PC .SBTTL SPOOLER FIXED OFFSETS .IF NE SP$FLG SP$DAT: .BLKB 10. .ASSUME SP$DAT EQ SPINT-42 SP$TIM: .BLKB 8. .ASSUME SP$TIM EQ SPINT-30 SP$FNR: .WORD 0,0,0 .ASSUME SP$FNR EQ SPINT-20 .ENDC SP$BNR: .WORD 0 .ASSUME SP$BNR EQ SPINT-12 SP$JAF: .WORD 0 .ASSUME SP$JAF EQ SPINT-10 SP$WCR: .WORD 0 .ASSUME SP$WCR EQ SPINT-6 SP$BPR: .WORD 0 .ASSUME SP$BPR EQ SPINT-4 .SBTTL INTERRUPT SERVICE ROUTINE .DRAST SP,4,SPEXIT CALL DBGINS MOV SPCQE,R4 TST @SPCSR BMI SPERR .IF NE SP$FLG JSR R3,SAVE30 JMP @INTVEC INTVEC: .WORD 0 .IFF .BR IOINT .ENDC .SBTTL POST INTERRUPT I/O PROCESSING IOINT: CLR SP$WCR ADD BLKSC,SP$BNR .IF NE MMG$T 1$: MOV Q$PAR(R4),10$ JSR R0,@$P1EXT .WORD 10$-. MOV @Q$BUFF(R4),R5 10$: .WORD 0 MOV R5,@SP$BPR .IFF 1$: MOV @Q$BUFF(R4),@SP$BPR .ENDC ADD #2,SP$BPR ADD #2,Q$BUFF(R4) .IF NE MMG$T CMP Q$BUFF(R4),#40000 BLO 2$ SUB #20000,Q$BUFF(R4) ADD #200,Q$PAR(R4) .ENDC 2$: INC SP$WCR INC Q$WCNT(R4) BEQ SPEXIT CMP SP$WCR,#256. BNE 1$ INC BLKSC RTS PC .SBTTL ENDPAG - Handles trailing form feeds .IF NE SP$FLG ENDPAG: CLR SP$WCR MOV (PC)+,R1 ENDPCT: .WORD 0 BEQ 20$ 10$: MOV #FF,R0 CALL CHROUT DEC R1 BGT 10$ BIT #1,SP$WCR BEQ 20$ CLR R0 CALL CHROUT 20$: ASR SP$WCR BR SPEXIT .ENDC .SBTTL ERROR AND NORMAL EXITS SPERR: BIS #HDERR$,@-(R4) SPEXIT: BIC #INTEN,@SPCSR BIC #ERROR,@(PC)+ SPCSR: .WORD 0 .DRFIN SP .SBTTL GET FILENAME SUBROUTINE .IF NE SP$FLG GETFIL: MOV R4,-(SP) MOV R3,-(SP) MOV Q$BUFF(R4),R5 .ADDR #SP$FNR,R3 .IF EQ MMG$T MOV (R5)+,(R3)+ MOV (R5)+,(R3)+ MOV (R5)+,(R3)+ .IFF MOV R2,-(SP) MOV Q$PAR(R4),20$ MOV #3,R2 10$: JSR R0,@$P1EXT .WORD 20$-. MOV (R5)+,R4 20$: .WORD 0 MOV R4,(R3)+ SOB R2,10$ MOV (SP)+,R2 .ENDC MOV (SP)+,R3 MOV (SP)+,R4 RETURN .ENDC .SBTTL SAVE REGISTERS 3-0 .IF NE SP$FLG SAVE30::MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) JSR PC,@R3 MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 RTS PC .ENDC .SBTTL FLAG PAGE CHARACTER DATA .IF NE SP$FLG CR = 015 FF = 014 LF = 012 A.SPACE = 040 A.STAR = 052 A.DASH = 055 A.DOT = 056 A.0 = 060 A.COLON = 072 A.A = 101 A.Z = 132 BANFLG: .WORD 0 FRM0FLG: .WORD 0 BANNER: CLR SP$BNR CLR SP$WCR MOV #6,R1 .ADDR #SP$FNR,R4 .ADDR #ASCFIL,R5 CALL R50ASC MOV #3,R1 .ADDR #SP$FNR+4,R4 .ADDR #ASCEXT,R5 CALL R50ASC MOV @#SYSPTR,R1 MOV $DATE(R1),-(SP) MOV @SP,R5 BIC #^C,R5 .REPT 5 ASR R5 .ENDR .ADDR #SP$DAT,R4 CALL PUTNUM MOVB #'-,(R4)+ MOV @SP,R5 BIC #^C,R5 SWAB R5 SUB #4,R5 .ADDR #MOTAB,R5,ADD MOVB (R5)+,(R4)+ MOVB (R5)+,(R4)+ MOVB (R5)+,(R4)+ MOVB #'-,(R4)+ MOV (SP)+,R5 BIC #^C,R5 ADD #110,R5 CALL PUTNUM CLRB (R4)+ CALL FRM0FF TST BANFLG BEQ 50$ 10$: CALL RT.11 CALL CRLF MOV WIDFIL,R1 .ADDR #ASCFIL,R5 CALL BIGGY TST JIM BEQ 30$ MOV #30.,R1 20$: MOV #12,R0 CALL CHROUT DEC R1 BNE 20$ .ADDR #PRION,R5 CALL STROUT .ADDR #SP$DAT,R5 CLRB 9.(R5) CALL STROUT .ADDR #PRIAT,R5 CALL STROUT .ADDR #SP$TIM,R5 CLRB 8.(R5) CALL STROUT CALL CRLF CALL CRLF BR 40$ 30$: CALL CRLF MOV WIDDAT,R1 .ADDR #SP$DAT,R5 CALL BIGGY CALL CRLF MOV WIDTIM,R1 .ADDR #SP$TIM,R5 CALL BIGGY CALL CRLF 40$: CALL RT.11 MOV #FF,R0 CALL CHROUT DEC BANFLG BGT 10$ 50$: BIT #1,SP$WCR BEQ 100$ CLR R0 CALL CHROUT 100$: ASR SP$WCR JMP SPEXIT MOTAB: .ASCIZ "JAN" .ASCIZ "FEB" .ASCIZ "MAR" .ASCIZ "APR" .ASCIZ "MAY" .ASCIZ "JUN" .ASCIZ "JUL" .ASCIZ "AUG" .ASCIZ "SEP" .ASCIZ "OCT" .ASCIZ "NOV" .ASCIZ "DEC" ASCFIL: .ASCII "FILENA." ASCEXT: .ASCII "EXT" .EVEN .SBTTL SUBROUTINE TO PRINT BIG CHARACTERS BIGGY: SFR .ADDR #CHRADR,R2 MOV R1,(PC)+ NUMCHR: .WORD 0 MOV R5,(PC)+ BUFPTR: .WORD 0 10$: MOVB (R5)+,R0 .ADDR #A,R4 JSR R5,RANGE .WORD A.A, A.Z BCC 20$ .ADDR #ZERO,R4 JSR R5,RANGE .WORD A.0, A.COLON BCC 20$ .ADDR #DASH,R4 JSR R5,RANGE .WORD A.DASH, A.DOT BCC 20$ .ADDR #BLANK,R4 JSR R5,RANGE .WORD A.SPACE,A.SPACE BCC 20$ CLR (R2)+ BR 30$ 20$: SUB R3,R0 ASL R0 ASL R0 MOV R0,-(SP) ASL R0 ASL R0 ADD R0,@SP MOV R4,R0 ADD (SP)+,R0 MOV R0,(R2)+ 30$: DEC R1 BNE 10$ OUTPUT: MOV #1,R3 10$: CALL CRLF 20$: .ADDR #CHRADR,R2 MOV NUMCHR,R1 MOV BUFPTR,R5 25$: .REPT 2 MOV #A.SPACE,R0 CALL CHROUT .ENDR 28$: MOV #10.,(PC)+ 29$: .WORD 10. MOVB (R5)+,R0 CMP R0,#A.DASH BEQ 295$ CMPB R0,#A.DOT BEQ 295$ CMPB R0,#A.COLON BNE 297$ 295$: MOV #A.STAR,R0 297$: MOV (R2)+,R4 BEQ 50$ 30$: MOV R0,(PC)+ 31$: .WORD 0 BIT R3,(R4)+ BNE 40$ MOV #A.SPACE,R0 40$: CALL CHROUT MOV 31$,R0 DEC 29$ BNE 30$ 50$: DEC R1 BNE 25$ 60$: ASL R3 CMP R3,#40000 BLO 10$ CALL CRLF CALL CRLF RFS BIGGY .SBTTL RANGE - Range check a character RANGE: MOV (R5)+,R3 CMP R0,(R5)+ BHI 20$ CMP R0,R3 BLO 20$ 10$: TST (PC)+ 20$: SEC RTS R5 .SBTTL RT.11 - Print an RT banner page RT.11: SFR MOV #6412,SITEND-26. CLRB SITEND-24. .ADDR #SITE+22.,R5 CMP WIDFIL,#10. BNE 5$ MOV #"**,SITEND-26. MOVB #'*,SITEND-24. MOVB #'*,SITE+22. .ADDR #SITE,R5 5$: MOV R5,(PC)+ 55$: .WORD 0 MOVB #40,@R5 MOV #3,R4 10$: MOV 55$,R5 20$: MOVB (R5)+,R0 BEQ 30$ CALL CHROUT BR 20$ 30$: DEC R4 BNE 10$ RFS RT.11 .SBTTL FRM0FF - Print a form feed if FORM0 set FRM0FF: SFR TSTB FRM0FLG BEQ 20$ MOV #14,R0 CALL CHROUT 20$: RFS FRM0FF .SBTTL SUBROUTINE TO OUTPUT A CARRIAGE RETURN AND LINE FEED CRLF: SFR MOV #CR,R0 CALL CHROUT MOV #LF,R0 CALL CHROUT RFS CRLF .SBTTL OUTPUT A STRING. STROUT: SFR 10$: MOVB (R5)+,R0 BEQ 20$ CALL CHROUT BR 10$ 20$: RFS STROUT .SBTTL STORE A TWO DIGIT ASCII NUMBER PUTNUM: MOV #'0,R0 MOVB R0,(R4)+ MOVB R0,@R4 10$: INCB @R4 CMPB @R4,#': BNE 20$ MOVB R0,@R4 INCB -1(R4) 20$: DEC R5 BNE 10$ INC R4 RETURN .SBTTL OUTPUT A CHARACTER TO THE SPOOLER JOB CHROUT: SFR MOVB R0,@SP$BPR INC SP$BPR INC SP$WCR CMP SP$WCR,#512. BLO CHEXIT ASR SP$WCR JSR R0,REGSAV REGS: .BLKW 6 REGSAV: MOV R5,(R0)+ MOV R4,(R0)+ MOV R3,(R0)+ MOV R2,(R0)+ MOV R1,(R0)+ MOV (SP)+,(R0)+ .ADDR #CHRCON,R0 MOV R0,INTVEC BIS #INTEN,@SPCSR RTS PC CHRCON: .ADDR #REGS,R0 MOV (R0)+,R5 MOV (R0)+,R4 MOV (R0)+,R3 MOV (R0)+,R2 MOV (R0)+,R1 MOV (R0)+,R0 CLR SP$WCR INC SP$BNR CHEXIT: RFS CHROUT .SBTTL RADIX 50 TO ASCII CONVERSION R50ASC::.ADDR #DIVTAB,R3 MOV (R4)+,R2 2$: TST -(R3) BEQ R50ASC MOV #-1,R0 CMP #174777,R2 BLO 4$ 3$: INC R0 SUB @R3,R2 BCC 3$ ADD @R3,R2 TST R0 BEQ 5$ CMP #33,R0 BLO 6$ BEQ 7$ 4$: ADD #40,R0 5$: ADD #16,R0 6$: ADD #11,R0 7$: ADD #11,R0 8$: MOVB R0,(R5)+ DEC R1 BNE 2$ RTS PC .WORD 0 .WORD 1 .WORD 50 .WORD 3100 DIVTAB= . .SBTTL CHARACTER FONTS AND FACILITY IDENTIFIER PRION: .ASCIZ " PRINTED ON " PRIAT: .ASCIZ " AT " .EVEN .IF NE SP$DEC SITE:: .ASCII " ***********************" .ASCII " Digital Equiment Corporation," .ASCII " 146 Main Street, Maynard Mass.," .ASCII " U.S.A. " .ASCIZ " ***********************"<15><12> .EVEN SITEND = . .IFF SITE:: .ASCII " ************************" .ASCII " RT-11 **** RT-11 ****" .ASCII " RT-11 **** RT-11 ****" .ASCII " RT-11 " .ASCIZ " ************************"<15><12> .EVEN SITEND = . .ENDC .EVEN CHRADR: .BLKW 10. .RADIX 2 .IFTF .NLIST .IFT A: .WORD 11111111111100 .WORD 11111111111110 .WORD 00000110000011 .WORD 00000110000011 .WORD 00000110000011 .WORD 00000110000011 .WORD 00000110000011 .WORD 00000110000011 .WORD 11111111111110 .WORD 11111111111100 B: .WORD 11111111111111 .WORD 11111111111111 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11111111111111 .WORD 01111100111110 C: .WORD 01111111111110 .WORD 11111111111111 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11110000001111 .WORD 01110000001110 D: .WORD 11111111111111 .WORD 11111111111111 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11111111111111 .WORD 01111111111110 E: .WORD 11111111111111 .WORD 11111111111111 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000000000011 .WORD 11000000000011 F: .WORD 11111111111111 .WORD 11111111111111 .WORD 00000011000011 .WORD 00000011000011 .WORD 00000011000011 .WORD 00000011000011 .WORD 00000011000011 .WORD 00000011000011 .WORD 00000000000011 .WORD 00000000000011 G: .WORD 01111111111110 .WORD 11111111111111 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11111111001111 .WORD 01111110001110 H: .WORD 11111111111111 .WORD 11111111111111 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 11111111111111 .WORD 11111111111111 I: .WORD 00000000000000 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11111111111111 .WORD 11111111111111 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 00000000000000 J: .WORD 00000000000000 .WORD 00110000000000 .WORD 01110000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 01111111111111 .WORD 00111111111111 .WORD 00000000000011 .WORD 00000000000011 .WORD 00000000000000 K: .WORD 11111111111111 .WORD 11111111111111 .WORD 00000011000000 .WORD 00000111100000 .WORD 00001100110000 .WORD 00011000011000 .WORD 00110000001100 .WORD 01100000000110 .WORD 11000000000011 .WORD 10000000000001 L: .WORD 11111111111111 .WORD 11111111111111 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 M: .WORD 11111111111111 .WORD 11111111111110 .WORD 00000000111100 .WORD 00000001110000 .WORD 00000011100000 .WORD 00000011100000 .WORD 00000001110000 .WORD 00000000111100 .WORD 11111111111110 .WORD 11111111111111 N: .WORD 11111111111111 .WORD 11111111111111 .WORD 00000000001110 .WORD 00000000111100 .WORD 00000011110000 .WORD 00001111000000 .WORD 00111100000000 .WORD 01110000000000 .WORD 11111111111111 .WORD 11111111111111 O: .WORD 01111111111110 .WORD 11111111111111 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11111111111111 .WORD 01111111111110 P: .WORD 11111111111111 .WORD 11111111111111 .WORD 00000110000011 .WORD 00000110000011 .WORD 00000110000011 .WORD 00000110000011 .WORD 00000110000011 .WORD 00000110000011 .WORD 00000111111111 .WORD 00000011111110 Q: .WORD 01111111111110 .WORD 11111111111111 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11010000000011 .WORD 11110000000011 .WORD 01100000000011 .WORD 11111111111111 .WORD 11011111111110 R: .WORD 11111111111111 .WORD 11111111111111 .WORD 00000110000011 .WORD 00000110000011 .WORD 00001110000011 .WORD 00011110000011 .WORD 00110110000011 .WORD 01100110000011 .WORD 11000111111111 .WORD 10000011111110 S: .WORD 01110001111110 .WORD 11110011111111 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11111111001111 .WORD 01111110001110 T: .WORD 00000000000011 .WORD 00000000000011 .WORD 00000000000011 .WORD 00000000000011 .WORD 11111111111111 .WORD 11111111111111 .WORD 00000000000011 .WORD 00000000000011 .WORD 00000000000011 .WORD 00000000000011 U: .WORD 01111111111111 .WORD 11111111111111 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 .WORD 11111111111111 .WORD 01111111111111 V: .WORD 00000000000111 .WORD 00000000111111 .WORD 00000111111000 .WORD 00111111000000 .WORD 11111000000000 .WORD 11111000000000 .WORD 00111111000000 .WORD 00000111111000 .WORD 00000000111111 .WORD 00000000000111 W: .WORD 00111111111111 .WORD 11111111111111 .WORD 11111100000000 .WORD 00001110000000 .WORD 00000011100000 .WORD 00000011100000 .WORD 00001110000000 .WORD 11111100000000 .WORD 11111111111111 .WORD 00111111111111 X: .WORD 11000000000011 .WORD 11100000001111 .WORD 00111000011100 .WORD 00011100110000 .WORD 00000111100000 .WORD 00000111100000 .WORD 00011100110000 .WORD 00111000011100 .WORD 11100000001111 .WORD 11000000000011 Y: .WORD 00000000000011 .WORD 00000000001111 .WORD 00000000111100 .WORD 00000011110000 .WORD 11111111000000 .WORD 11111111000000 .WORD 00000011110000 .WORD 00000000111100 .WORD 00000000001111 .WORD 00000000000011 Z: .WORD 10000000000011 .WORD 11000000000011 .WORD 11110000000011 .WORD 11111100000011 .WORD 11001111000011 .WORD 11000011110011 .WORD 11000000111111 .WORD 11000000001111 .WORD 11000000000011 .WORD 11000000000001 ZERO: .WORD 01111111111110 .WORD 11111111111111 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11111111111111 .WORD 01111111111110 ONE: .WORD 00000000000000 .WORD 11000000000100 .WORD 11000000000110 .WORD 11000000000011 .WORD 11111111111111 .WORD 11111111111111 .WORD 11000000000000 .WORD 11000000000000 .WORD 11000000000000 .WORD 00000000000000 TWO: .WORD 11110000000110 .WORD 11111000000111 .WORD 11001100000011 .WORD 11000110000011 .WORD 11000011000011 .WORD 11000001100011 .WORD 11000000110011 .WORD 11000000011011 .WORD 11000000001111 .WORD 11000000000110 THREE: .WORD 01100000000011 .WORD 11100000000011 .WORD 11000000000011 .WORD 11000000000011 .WORD 11000001100011 .WORD 11000011110011 .WORD 11000011011011 .WORD 11000011001111 .WORD 11111110000111 .WORD 01111100000011 FOUR: .WORD 00000011111111 .WORD 00000011111111 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 11111111111111 .WORD 11111111111111 .WORD 00000011000000 .WORD 00000011000000 FIVE: .WORD 01110011111111 .WORD 11110011111111 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11111111000011 .WORD 01111110000011 SIX: .WORD 01111111111110 .WORD 11111111111111 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11111111000111 .WORD 01111110000110 SEVEN: .WORD 11111000000111 .WORD 11111100000111 .WORD 00000110000011 .WORD 00000011000011 .WORD 00000001100011 .WORD 00000000110011 .WORD 00000000011011 .WORD 00000000001111 .WORD 00000000000111 .WORD 00000000000011 EIGHT: .WORD 01111100111110 .WORD 11111111111111 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11111111111111 .WORD 01111100111110 NINE: .WORD 01100000111110 .WORD 11100011111111 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11000011000011 .WORD 11111111111111 .WORD 01111100111110 COLON: .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00011100011100 .WORD 00011100011100 .WORD 00011100011100 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 DASH: .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 .WORD 00000011000000 PERIOD: .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 11100000000000 .WORD 11100000000000 .WORD 11100000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 BLANK: .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .WORD 00000000000000 .RADIX 8. .ENDC .LIST .SBTTL HANDLER TERMINATION .DREND SP .END .MCALL .MODULE .MODULE TJ,VERSION=14,COMMENT= ; COPYRIGHT (c) 1987 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL RT-11 MM (TJU16) MAGTAPE HANDLER .SBTTL NOTES ON TJU16 HANDLER .SBTTL HARDWARE DEFINITIONS .MCALL .DRDEF, .ADDR .IIF NE MMG$T .MCALL .SYNCH .IIF NDF MM$FSM MM$FSM = 0 .IIF NDF MM$UN, MM$UN == 1 .DRDEF MM,20,SPECL$!SPFUN$!HNDLR$,0,172440,224 .IIF EQ MMG$T .DRPTR .DREST CLASS=DVC.MT .DRSPF <-1> .DRSPF <-2> .DRSPF <-3> .DRSPF <-4> .DRSPF <-5> .DRSPF <-6> .DRSPF <-7> .DRSPF <-8.> .IIF NE MM$FSM .DRSPF <-20.> .IIF EQ MM$FSM .FSM = 100000 .AUDIT .TJ .AUDIT .FSM SC = 100000 TRE = 040000 MCPE = 020000 DVA = 004000 PSEL = 002000 A17 = 001000 A16 = 000400 RDY = 000200 IE = 000100 FNOOP = 000000 FOFF = 000002 FREWIND = 000006 FDRCLR = 000010 FERASE = 000024 FWRTTM = 000026 FSPFOR = 000030 FSPBAK = 000032 FWRTCF = 000050 FWRTCR = 000056 FWRITE = 000060 FREADF = 000070 FREADR = 000076 GO = 000001 DLT = 100000 WCE = 040000 UPE = 020000 NED = 010000 NEM = 004000 PGE = 002000 MXF = 001000 MDPE = 000400 OR = 000200 IR = 000100 CLR = 000040 PAT = 000020 BAI = 000010 DRIVEBIT= 000001 DRIVE = 0 ATA = 100000 ERR = 040000 PIP = 020000 MOL = 010000 WRL = 004000 EOT = 002000 DPR = 000400 DRY = 000200 SSC = 000100 PES = 000040 SDWN = 000020 IDB = 000010 TM = 000004 BOT = 000002 SLA = 000001 CORCRC = 100000 UNS = 040000 OPI = 020000 DTE = 010000 NEF = 004000 CSITM = 002000 FCE = 001000 NSG = 000400 PEFLRC = 000200 INCVPE = 000100 DPAR = 000040 FMT = 000020 CPAR = 000010 RMR = 000004 ILR = 000002 ILF = 000001 ACCL = 100000 FCS = 040000 TCW = 020000 EAODTE = 010000 D7$200 = 0 D7$556 = 000400 D7$800 = 001000 D9$800 = 001400 D9$1600 = 002000 NORMAL = 000300 COREDP = 000320 EVPAR = 000010 ODDPAR = 0 EPCOMBO = EVPAR+NORMAL+D9$800 .SBTTL SOFTWARE DEFINITIONS RENAME = 5 ENTER = 4 LOOKUP = 3 DELETE = 2 CLOSE = 1 REDWRT = 0 WRTEOF = -1 FWDSPC = -2 BKSPC = -3 ERASE = -4 REWIND = -5 OFFLINE = -6 WRITE = -7 READF = -8. STR100 = -9. FN = 8. ILLARG = 5 DEVINUSE= 2 ERRGAPS = -100. REDREC = -1 WRIREC = -2 NOQUAL = 0 DRIVEGONE = 1 POSERR = 2 MEMERR = 3 WRITELOK = 4 RECERR = 5 SMLREC = 6 NOQUAL = 0 EOFCODE = 1 EOTCODE = 2 EOFEOT = 3 BOTCODE = 4 SYSPTR = 54 QCOMP = 270 SPUSR = 272 UNITMK = 7 NRETRY = 8. .SBTTL Install Code .DRINS MM .SBTTL SET COMMANDS .DRSET DENSE, NOP, O.DENS, NUM .DRSET ODDPAR, EVPAR, O.PAR, NO .DRSET DEFALT, NOP, O.DFLT, NUM .DRSET CSR, 160000, O.CSR, OCT .DRSET VECTOR, 500, O.VEC, OCT .DRSET RETRY, 127., O.RTRY, NUM O.DENS: CMP #809.,R0 BEQ 1$ CMP #800.,R0 BEQ 1$ CMP #1600.,R0 BEQ 2$ SEC RTS PC 1$: MOV #D9$800,R3 BR 3$ 2$: MOV #D9$1600,R3 BIC #EVPAR,DENSE 3$: BIC #3400,DENSE BIS R3,DENSE CLC RTS PC O.PAR: BR 2$ NOP MOV DENSE,R1 BIC #^C<3400>,R1 CMP #D9$1600,R1 BNE 1$ SEC RTS PC 1$: BIS R3,DENSE BR 3$ 2$: BIC R3,DENSE 3$: CLC RTS PC O.DFLT: CMP #9.,R0 BNE 1$ MOV #D9$800+NORMAL+ODDPAR,DENSE CLC RTS PC 1$: SEC RTS PC O.CSR: CMP R0,R3 BLO O.BAD MOV R0,INSCSR MOV R0,DISCSR .ADDR #MMCS1,R1 MOV #NREGS,R2 10$: MOV R0,(R1)+ ADD #2,R0 DEC R2 BGT 10$ O.GOOD: TST (PC)+ O.BAD: SEC RETURN O.VEC: CMP R0,R3 BHIS O.BAD MOV R0,MMSTRT BR O.GOOD O.RTRY: CMP R0,R3 BHI O.BAD MOV R0,RTRYCT BEQ O.BAD BR O.GOOD .IIF GT .-1000 .ERROR .SBTTL Global Definitions .IF NE MM$FSM .GLOBL FSMDIS, FSMABT, FSMDON .GLOBL FSMERR, CODE, DVTBL .GLOBL FSMSIZ, RESTOR .GLOBL MMCQE .IF NE MMG$T .GLOBL OLDBA, XBUMP, EXTADR .GLOBL JOBNM, SYNBLK, TEMP .GLOBL SINK, ERBSAV .ENDC .ENDC .SBTTL Handler Entry Point .DRBEG MM BR MM MMCS1: .WORD MM$CSR MMWC: .WORD MM$CSR+2 MMBA: .WORD MM$CSR+4 MMFC: .WORD MM$CSR+6 MMCS2: .WORD MM$CSR+10 MMDS: .WORD MM$CSR+12 MMER: .WORD MM$CSR+14 MMAS: .WORD MM$CSR+16 MMCC: .WORD MM$CSR+20 MMDB: .WORD MM$CSR+22 MMMR: .WORD MM$CSR+24 MMDT: .WORD MM$CSR+26 MMSN: .WORD MM$CSR+30 MMTC: .WORD MM$CSR+32 NREGS = <.-MMCS1>/2 RTRYCT: .WORD NRETRY MMUSED: .BYTE 1 .EVEN MM: .IF NE MMG$T MOV MMCQE,R5 CMP (R5)+,(R5)+ JSR PC,@$MPPTR MOV (SP)+,OLDBA BIT #1700,@SP BEQ 10$ TST (SP)+ MOV MMCQE,R5 BIS #HDERR$,@-(R5) JMP MMDONE 10$: ASL @SP ASL @SP ASL @SP ASL @SP MOV (SP)+,EXTADR .ENDC .IF EQ MM$FSM MOV MMCQE,R3 .IFF JMP FSMDIS $MT:: MOV MTCQ,R3 .ENDC TSTB MMUSED BEQ 12$ CALL CONCLR CLRB MMUSED 12$: CALL DRICLR TST (R3)+ MOV @R3,R0 MOVB R0,R4 SWAB R0 BIC #^C,R0 MOV R0,R1 BIS (PC)+,R0 DENSE: .WORD D9$800+NORMAL+ODDPAR MOV R0,@MMTC MOV #0,@MMCS2 CLR NFSREAD MOV PC,R0 ADD #RECOVE-.,R0 MOV R1,R5 ADD PC,R5 ADD #$TBL-.,R5 MOV @R3,R2 SWAB R2 ASR R2 ASR R2 ASR R2 BIC #177740,R2 .IF NE MMG$T MOVB R2,JOBNM .ENDC .ENABL LSB CMP #LOOKUP,R4 BNE 7$ .FOO = 0 .IF NE MMG$T .IF EQ MM$FSM .FOO = 1 MOV MMCQE,R4 JSR PC,@$GTBYT TSTB (SP)+ BNE 5$ JSR PC,@$GTBYT TSTB (SP)+ BNE 5$ .ENDC .ENDC .IF EQ .FOO TST @2(R3) BNE 10$ .ENDC CMPB #-1,@R5 BEQ 3$ .IF EQ MM$FSM MOV #DEVINUSE,R0 2$: MOV @#SYSPTR,R1 MOV R0,SPUSR(R1) .IFF MOV @#SYSPTR,R1 MOV #DEVINUSE,SPUSR(R1) .ENDC .IF NE MM$FSM JSR PC,RESTOR JMP $DONE .IFF BR 11$ .ENDC 3$: CLR 4(R3) MOVB R2,@R5 .IF NE MM$FSM BR 11$ .IFF 4$: MOV -2(R3),R1 BEQ 6$ BGT 5$ INC R1 BEQ 11$ 5$: MOVB #-1,@R5 MOV #ILLARG,R0 BR 2$ 6$: MOV #REWIND,R4 BR 8$ .ENDC 7$: CMP #CLOSE,R4 BNE 8$ MOVB #-1,@R5 BR 11$ 8$: MOV (PC)+,(R0)+ .BYTE -1,ERRGAPS MOV @MMDS,@R0 BIC #^C,(R0)+ CMP #STR100,R4 BEQ 11$ CMP #READF,R4 BLOS 12$ TST R4 BNE 10$ MOV R3,R1 CLR -2(R1) CMP (R1)+,(R1)+ MOV #READF,R4 TST @R1 BPL 9$ NEG @R1 INC R4 BR 20$ 9$: COM NFSREAD 20$: .IF NE MM$FSM MOV R4,CODE .ENDC BR 12$ 10$: TST -(R3) BIS #HDERR$,@-(R3) 11$: .IF NE MM$FSM JSR PC,RESTOR .ENDC mmdon1: JMP MMDONE 12$: ADD #FUNTAB-TABLE,R4 MOV R4,(R0)+ .IF NE MMG$T MOV 4(R3),R1 MOV R1,4(R0) .IFF TST (R3)+ MOV (R3)+,(R0)+ MOV @R3,@R0 MOV @R3,R1 .ENDC .DSABL LSB NEG R1 LOADGO: JSR PC,DISPAT TABLE: .BYTE /2 .BYTE /2 .BYTE /2 .BYTE /2 .BYTE /2 .BYTE /2 .BYTE /2 .BYTE /2 FUNTAB: .BYTE FREADF+IE+GO .BYTE FWRITE+IE+GO .BYTE FOFF+IE+GO .BYTE FREWIND+IE+GO .BYTE FERASE+IE+GO .BYTE FSPBAK+IE+GO .BYTE FSPFOR+IE+GO .BYTE FWRTTM+IE+GO REDEF: RIGHT: .IF NE MMG$T MOV (R0)+,@MMBA BIS @R0,R5 .IFF MOV -(R3),@MMBA .ENDC MOV R1,@MMWC ASL R1 mov r1,@mmfc br rightm FORSPA: BAKSPA: MOV R1,@MMFC AWFLINE: REWHINED: mov #5000.,r0 90$: dec r0 beq mmdon1 bit #sdwn,@mmds bne 90$ ERACE: RIGHTM: MOV R5,@MMCS1 CLRB CMDINI .IF NE MM$FSM JSR PC,RESTOR .ENDC RTS PC .SBTTL ABORT ENTRY POINT MMABRT: MOVB #-1,$FLG MOV R3,-(SP) MOV PC,R5 ADD #$TBL-.,R5 MOV MMCQE,R3 BEQ 7$ MOVB Q$JNUM(R3),-(SP);GET JOB NUMBER MOVB (SP)+,R3 ASR R3 ASR R3 ASR R3 BIC #177740,R3 CMP R3,R4 BNE 7$ CLRB $FLG CALL CONCLR 5$: .IF NE MM$FSM MOV R0,-(SP) MOV DVTBL,R0 BEQ 6$ MOV #-1,(R0)+ MOV #-1,@R0 6$: MOV (SP)+,R0 .ENDC 7$: CMPB R4,@R5 BNE 10$ MOVB #-1,@R5 10$: CMPB #-2,(R5)+ BNE 7$ MOV (SP)+,R3 JMP $DONE .SBTTL INTERRUPT ENTRY POINT .DRAST MM,5,MMABRT .SBTTL ERROR-ERROR ROUTINE DISPATCHER .ENABL LSB TST MMCQE BNE 114$ JMP $RTS 114$: MOV @MMCS1,R5 BMI 1$ NOERR0: JMP NOERR 1$: BIT #MCPE,R5 BNE NQ1 MOV LASTCOM,R4 BIT #MOL,@MMDS BNE 2$ CMP #FN+OFFLINE,R4 BEQ 2$ MOV #DRIVEGONE,R4 JMP AB1 2$: JSR PC,DISPAT .DSABL LSB .SBTTL TABLEE - DISPATCH TABLE TABLEE: .BYTE /2 .BYTE /2 .BYTE /2 .BYTE /2 .BYTE /2 .BYTE /2 .BYTE /2 .BYTE /2 .SBTTL ERROR-READ COMMAND WAS ISSUED LAST AND SC BIT WAS SET. .ENABL LSB ERREAD: MOV @MMDS,R5 BPL ERWRI1 BIT #ERR,R5 BEQ TMEOTC MOV @MMER,R4 CALL DRICLR BIT #CSITM,R4 BEQ 2$ BIT #PES,R5 BNE 1$ MOV #POSERR,R4 BR AB1 1$: CLR R4 BR ERWRI1 2$: CMP #EPCOMBO,DENSE BNE 26$ BIT #,R4;Isolate 2 error bits BNE 3$ jmp nexti 26$: BIT #,R4 BEQ 4$ 3$: MOV #REDREC,R4 BR ERWRI1 4$: BIT #CORCRC,R4 BEQ 5$ BIT #PES,R5 BNE 1$ BR 3$ 5$: BIT #FCE,R4 BNE 1$ NQ1: JMP NQUAL .DSABL LSB .SBTTL ERROR-WRITE COMMAND WAS ISSUED LAST AND SC BIT WAS SET. .ENABL LSB ERWRIT: TST @MMFC BEQ 1$ MOV #POSERR,R4 BIT #WRL,@MMDS BEQ AB1 MOV #WRITELOK,R4 BR AB1 1$: MOV @MMDS,R5 BPL 5$ BIT #ERR,R5 BEQ TMEOTC MOV @MMER,R4 CALL DRICLR BIT #NEF,R4 BEQ 2$ BR NQ1 2$: BIT #INCVPE+PEFLRC+CORCRC+NSG,R4 BEQ 4$ CMP #EPCOMBO,DENSE BNE 3$ BIC #INCVPE,R4 BNE 3$ NOERR2: JMP NOERR 3$: MOV #WRIREC,R4 BR 5$ 4$: BIT #CSITM,R4 BEQ NQ3 BIT #PES,R5 BEQ NQ3 BR 3$ ERWRI1: 5$: JSR PC,TREFND JMP CONT .DSABL LSB .SBTTL TAPEMARK AND EOT CHECKER TMEOTC: BIT #SSC,R5 BNE DRCLR BIT #TM+EOT,R5 BEQ NQ3 BR DRCLR .SBTTL ERROR-ERASE OR WRITE TAPEMARK COMMAND WAS ISSUED LAST AND SC BIT WAS SET. .ENABL LSB ERERAS: ERWRTM: MOV @MMDS,R5 BMI 4$ NQ3: JMP NQUAL 4$: BIT #ERR,R5 BEQ 10$ BIT #WRL,R5 BNE AB0 MOV @MMER,R4 CMP #EPCOMBO,DENSE BNE 8$ CMP #INCVPE,R4 BEQ NOERR2 8$: BIT #NEF,R4 BEQ NQUAL AB0: MOV #WRITELOK,R4 AB1: BR ABORT 10$: JSR PC,ONLINE CALL DRICLR CMP #FN+ERASE,LASTCOM BNE NOERR1 MOV #FN+WRITE,LASTCOM MOV OLDWC,R4 NEG R4 MOV MMWC,R5 MOV R4,(R5)+ MOV OLDBA,(R5)+ ASL R4 MOV R4,(R5)+ .IF NE MMG$T MOVB FUNTAB+1,R4 BIS EXTADR,R4 MOV R4,@MMCS1 .IFF MOVB FUNTAB+1,@MMCS1 .ENDC JMP ASTEXI .DSABL LSB .SBTTL ERROR-SPACING COMMAND WAS ISSUED LAST AND SC BIT WAS SET. .ENABL LSB ERBKSP: ERFWSP: MOV @MMDS,R5 BIT #,R5 BNE NEXTI TST R5 BPL NQUAL TSTB CMDINI BNE 2$ BIT #ERR,R5 BEQ 2$ MOV @MMER,R4 BIT #NEF,R4 BEQ 1$ BIT #BOT,R5 BNE NOERR BR NQUAL 1$: BIT #FCE,R4 BEQ NQUAL NOERR1: BR NOERR 2$: JSR PC,ONLINE BR DRCLR .DSABL LSB .SBTTL ERROR-REWIND OR REWIND/OFFLINE COMMAND WAS ISSUED LAST AND SC BIT WAS SET. .ENABL LSB ERREWD: EROFFL: MOV @MMDS,R5 BIT #ERR,R5 BEQ 1$ BIT #OPI,@MMER BEQ NQUAL BR 3$ 1$: TSTB RECOVERY BPL 4$ CMP #FN+OFFLINE,LASTCOM BEQ NOERR MOVB LASTCOM,RECOVERY NEXTI: MOV #DRIVEBIT,@MMAS INCB CMDINI 2$: MOV #IE,@MMCS1 BIT #PIP,@MMDS BEQ 3$ ASTX2: JMP ASTEXI DRCLR: 3$: CALL DRICLR BR NOERR 4$: BIT #SLA,R5 BNE 3$ CALL CONCLR BR 2$ .DSABL LSB .SBTTL ERROR-ABORT OPERATION IN PROGRESS NQUAL: CLR R4 ABORT: CALL CONCLR MOV #HDERR$,-(SP) EXCEP: .IF NE MM$FSM MOV (SP)+,R5 JMP FSMERR .IFF MOV MMCQE,R5 BIS (SP)+,@Q$CSW(R5) TST @R5 BEQ MMDONE .IF NE MMG$T COM SINK MOV @R5,ERBSAV MOV R4,TEMP MOVB Q$JNUM(R5),R5 ASR R5 ASR R5 ASR R5 MOV R5,JOBNM .IFF MOV R4,@(R5)+ .ENDC .IFTF MMDONE: .IFT JMP FSMDON .ENDC $DONE:: TSTB $FLG BNE $RTS .IF NE MMG$T MOV PC,R4 ADD #MMCQE-.,R4 MOV @#SYSPTR,R5 TST SINK BNE 1$ JMP @QCOMP(R5) 1$: CLR SINK JSR PC,@QCOMP(R5) MOV PC,R4 ADD #SYNBLK-.,R4 .SYNCH BR BADSYN MOV ERBSAV,R1 BIS #30000,@#177776 MOV R0,-(SP) MTPI (R1)+ MOV ERRBL2,-(SP) MTPI (R1)+ BADSYN: BR ASTEXI .IFF .DRFIN MM .ENDC $RTS: CLRB $FLG ASTEXI: RTSPC: RTS PC .SBTTL STATUS REPORTING-COME HERE IF NO ABORTS ISSUED NOERR: CLR R4 CONT: MOV R4,ERRSUM TSTB RECOVERY BPL RECOVR TST ERRSUM BEQ NEXT1 CMP #FN+READF,LASTCOM BNE 1$ MOVB #5,BACK1 MOVB RTRYCT,BACK5 MOV #FN+READF,R4 BR 2$ 1$: MOV #FN+ERASE,R4 2$: MOVB R4,RECOVERY BR REEDF1 NEXT0: CMP #FN+REWIND,R4 BNE NEXT1 MOVB R4,RECOVERY NEXT1: MOV @MMFC,R4 CMP #FN+READF,LASTCOM BNE NEXT2 BIT #TM,@MMDS BNE NEXT3 MOV OLDWC,R5 ASL R5 SUB R4,R5 BEQ NEXT3 BGT 1$ MOV #RECERR,R4 NEG R5 BR 2$ 1$: MOV #SMLREC,R4 2$: ASR R5 .IF NE MMG$T MOV R5,ERRBL2 .IFF MOV R5,-(SP) .IF NE MM$FSM MOV @MTCQ,R5 .IFF MOV @MMCQE,R5 .ENDC BEQ 3$ MOV @SP,2(R5) 3$: TST (SP)+ .ENDC .IF NE MMG$T JMP ABORT .IFF BR ABORT .ENDC NEXT2: CMP #FN+FWDSPC,LASTCOM BEQ 1$ CMP #FN+BKSPC,LASTCOM BNE NEXT3 1$: NEG R4 BEQ NEXT3 .IF NE MMG$T MOV R4,ERRBL2 .IFF .IF NE MM$FSM MOV @MTCQ,R5 .IFF MOV @MMCQE,R5 .ENDC BEQ NEXT3 MOV R4,2(R5) .ENDC .ENABL LSB NEXT3: MOV @MMDS,R5 CLR R4 BIT #BOT,R5 BEQ 1$ CMP #FN+REWIND,LASTCOM MMD1: BEQ MMDONE CMP #FN+OFFLINE,LASTCOM BEQ MMD1 MOV #BOTCODE,R4 BR 4$ 1$: BIT #TM,R5 BEQ 2$ CMP #FN+WRTEOF,LASTCOM BEQ 2$ INC R4 2$: BIT #EOT,R5 BEQ 3$ TST NFSREAD BNE 3$ CMPB (R4)+,(R4)+ 3$: TST R4 BEQ MMD1 4$: MOV #EOF$,-(SP) JMP EXCEP .DSABL LSB .SBTTL RECOVERY IN PROGRESS DISPATCHER RECOVR: MOV LASTCOM,R4 JSR PC,DISPAT TABLER: .BYTE /2 .BYTE /2 .BYTE 0 .BYTE /2 .BYTE 0 .BYTE /2 .BYTE /2 .BYTE 0 .SBTTL RECOVERY-READ WAS THE LAST COMMAND ISSUED .ENABL LSB REEDF: TST ERRSUM BPL NEXT1 DECB BACK1 BEQ 2$ BGT REEDF1 MOVB #5,BACK1 DECB BACK5 BEQ NQ2 REEDF1: MOV #-1,R5 BR 3$ 2$: MOV #-5,R5 3$: MOV R5,@MMFC BR BACH2 .DSABL LSB .SBTTL RECOVERY-WRITE WAS LAST COMMAND RITE: TST ERRSUM BEQ NEXT1 INCB TAPELEN BEQ NQ2 BIT #EOT,@MMDS BEQ REEDF1 NQ2: JMP NQUAL .SBTTL RECOVERY-FORWARD SPACE WAS THE LAST COMMAND FORE: MOV @MMFC,R5 BNE BACH1 FORE1: MOV MMBA,R5 MOV OLDBA,@R5 MOV OLDWC,-(R5) NEG (R5) MOV #FN+READF,LASTCOM .IF NE MMG$T MOVB FUNTAB,R4 BIS EXTADR,R4 MOV R4,-(R5) .IFF MOVB FUNTAB,@MMCS1 .ENDC RTS PC .SBTTL RECOVERY-REWIND WAS THE LAST COMMAND REWHYN: JMP MMDONE .SBTTL RECOVERY-BACKSPACE WAS LAST COMMAND .ENABL LSB BACH: CMPB #FN+READF,RECOVERY BEQ 1$ MOV #FN+ERASE,R4 MOVB FUNTAB+4,R5 BR 4$ 1$: MOV @MMFC,R5 BEQ 6$ BIT #BOT,@MMDS BEQ BACH2 2$: ADD #4,R5 BEQ 8$ 3$: NEG R5 BACH1: CALL DRICLR MOV #FN+FWDSPC,R4 MOV R5,@MMFC MOVB FUNTAB+6,R5 BR 4$ BACH2: CALL DRICLR MOV #FN+BKSPC,R4 MOV R5,@MMFC MOVB FUNTAB+5,R5 4$: MOV R4,LASTCOM MOV R5,@MMCS1 RTS PC 6$: TSTB BACK1 BEQ 2$ 8$: CALL DRICLR BR FORE1 DRICLR: MOV #,@MMCS1 RETURN CONCLR: MOV #CLR,@MMCS2 RETURN .DSABL LSB .SBTTL TRE (TRANSFER ERROR) BIT FOUND SUBROUTINE TREFND: MOV @MMCS2,R5 MOV #TRE,@MMCS1 BIT #NEM,R5 BEQ 1$ MOV #MEMERR,R4 BR 3$ 1$: BIT #NED,R5 BEQ 2$ MOV #DRIVEGONE,R4 BR 3$ 2$: BIT #MXF+MDPE+PGE+UPE+WCE,R5 BEQ 4$ CLR R4 3$: TST (SP)+ JMP ABORT 4$: BIT #DLT,R5 BEQ 5$ MOV #REDREC,R4 5$: RTS PC .IF NE MMG$T .SBTTL XBUMP SUBROUTINE XBUMP: MOV MMCQE,-(SP) ADD #Q$PAR,@SP ADD #10,@(SP)+ ADD #512.,OLDBA ADCB EXTADR+1 RTS PC .ENDC .SBTTL ONLINE SUBROUTINE ONLINE: BIT #SSC,R5 BEQ 1$ MOV #DRIVEBIT,@MMAS TSTB @MMDS BMI 1$ MOV #FNOOP+IE+GO,@MMCS1 TST (SP)+ 1$: RTS PC .SBTTL DISPATCH SUBROUTINE DISPAT: ADD @SP,R4 MOVB FUNTAB-TABLE(R4),R5 MOVB @R4,R4 BIC #177400,R4 ASL R4 ADD (SP)+,R4 JMP @R4 .SBTTL MAGTAPE DATA AREA $TBL: .REPT MM$UN .BYTE -1 .ENDR .BYTE -2 $FLG: .BYTE 0 .EVEN RECOVE: .BYTE -1 TAPELE: .BYTE ERRGAPS OLDEOT: BACK5: .BYTE 0 BACK1: .BYTE 0 .EVEN LASTCO: .WORD 0 OLDBA: .WORD 0 .IIF NE MMG$T, EXTADR: .WORD 0 OLDWC: .WORD 0 ERRSUM: .WORD 0 NFSREA: .WORD 0 .EVEN .IF NE MMG$T SYNBLK: .WORD 0 JOBNM: .WORD 0 .WORD 0,0 TEMP: .WORD 0 .WORD -1,0 SINK: .WORD 0 ERBSAV: .WORD 0 ERRBL2: .WORD 0 .ENDC .IF NE MM$FSM MTCQ:: .WORD 0 DRIVEN==MM$UN DVINFO::.REPT DRIVEN .WORD -1 .WORD -1 .WORD -1 .BYTE 0 .BYTE 0 .WORD 0,0,0 .ENDR .ENDC CMDINI: .BYTE 0 .EVEN .IF EQ MM$FSM .DREND MM .IFF .GLOBL $FKPTR,$INPTR .IIF NE MMG$T, .GLOBL $RLPTR,$MPPTR,$GTBYT,$PTBYT,$PTWRD .IIF NE ERL$G, .GLOBL $ELPTR .IIF NE TIM$IT, .GLOBL $TIMIT .ENDC SIZE=. SIZED=SIZE-MMSTRT/2 MTDONE==MMDONE MTCQE==MMCQE MT==MM MTLQE==MMLQE MTSTRT==MMSTRT .END .MCALL .MODULE .MODULE TM,VERSION=11,COMMENT= ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY .IIF NDF MT$FSM MT$FSM == 0 .SBTTL Edit History .SBTTL TM11 Magtape Handler Abstract .ENABL LC .SBTTL HARDWARE DEFINITIONS .MCALL .DRDEF, .ADDR .ASSUME .IIF NE MMG$T .MCALL .SYNCH .DRDEF MT,11,SPECL$!SPFUN$!HNDLR$,0,172520,224 .IIF EQ MMG$T .DRPTR .DREST CLASS=DVC.MT .DRSPF <-1> .DRSPF <-2> .DRSPF <-3> .DRSPF <-4> .DRSPF <-5> .DRSPF <-6> .DRSPF <-7> .DRSPF <-8.> .DRSPF <-9.> .IIF NE MT$FSM .DRSPF <-20.> .IIF NDF MT$UN, MT$UN == 1 .IIF EQ MT$FSM .FSM = 100000 .AUDIT .TM .AUDIT .FSM ILC = 100000 EOF = 040000 CRE = 020000 PAE = 010000 BGL = 004000 EOT = 002000 RLE = 001000 BTEOPI = 000400 NXM = 000200 SELR = 000100 BOT = 000040 CH7 = 000020 SDWN = 000010 WRL = 000004 RWS = 000002 TUR = 000001 ERR = 100000 D7$200 = 000000 D7$556 = 020000 D7$800 = 040000 D7$CORE = 060000 D9$800 = 060000 PWRCLR = 010000 PEVN = 004000 UNIT = 003400 CURDY = 000200 INTENB = 000100 FOFF = 000000 FREAD = 000002 FWRITE = 000004 FWRTTM = 000006 FSPFOR = 000010 FSPBAK = 000012 FWRTEXT = 000014 FREWIND = 000016 GO = 000001 GPSDN = 010000 .SBTTL SOFTWARE DEFINITIONS RENAME = 5 ENTER = 4 LOOKUP = 3 DELETE = 2 CLOSE = 1 REDWRT = 0 WRTEOF = -1 FWDSPC = -2 BKSPC = -3 WRTXTD = -4 REWIND = -5 OFFLINE = -6 WRITEPHY= -7 READF = -8. STR100 = -9. FN = 8. ILLARG = 5 DEVINUSE= 2 ERRGAPS = -101. NOQUAL = 0 DRIVEGONE = 1 POSERR = 2 MEMERR = 3 WRITELOK= 4 RECERR = 5 SMLREC = 6 NOQUAL = 0 EOFCODE = 1 EOTCODE = 2 EOFEOT = 3 BOTCODE = 4 SYSPTR = 54 QCOMP = 270 SPUSR = 272 UNITMK = 007 NRETRY = 8. .SBTTL INSTALLATION CHECKS .DRINS MT NOP MOV INSCSR,R0 TSTB 2(R0) BPL 1$ MOV #1000,2(R0) BIT #1000,2(R0) BNE 1$ SEC 1$: RTS PC .SBTTL SET COMMANDS .DRSET DENSE, NOP, O.DENS, NUM .DRSET DUMP, NOP, O.DUMP, NO .DRSET ODDPAR, PEVN, O.PAR, NO .DRSET DEFALT, NOP, O.DFLT, NUM .DRSET CSR, 160000, O.CSR, OCT .DRSET VECTOR, 500, O.VEC, OCT .DRSET RETRY, 127., O.RTRY, NUM O.DENS: CLR R3 CMP #200.,R0 BEQ DENS1 CMP #556.,R0 BEQ 1$ CMP #807.,R0 BEQ 2$ CMP #809.,R0 BEQ 3$ CMP #800.,R0 BEQ 3$ SEC RTS PC 1$: BIS #D7$556,R3 BR DENS1 2$: BIS #D7$800,R3 BR DENS1 3$: BIS #D9$800,R3 DENS1: BIC #D9$800,DENSE BIS R3,DENSE DENS3: CLC RTS PC O.DUMP: CLR R3 BR 1$ BR DFLT1 1$: BIS #D7$CORE,R3 BR DENS1 O.PAR: BR ODD NOP BIS R3,DENSE BR DENS3 ODD: BIC R3,DENSE BR DENS3 .ENABL LSB O.DFLT: CMP #7,R0 BEQ 7$ CMP #9.,R0 BEQ 9$ DFLT1: SEC RTS PC 9$: MOV #D9$800,DENSE BR DENS3 7$: MOV #D7$CORE,DENSE BR DENS3 .DSABL LSB O.CSR: CMP R0,R3 BLO O.BAD MOV R0,INSCSR MOV R0,DISCSR .ADDR #MTS,R1 MOV #NREGS,R2 10$: MOV R0,(R1)+ ADD #2,R0 DEC R2 BGT 10$ O.GOOD: TST (PC)+ O.BAD: SEC RETURN O.VEC: CMP R0,R3 BHIS O.BAD MOV R0,MTSTRT BR O.GOOD O.RTRY: CMP R0,R3 BHI O.BAD MOV R0,RTRYCT BEQ O.BAD BR O.GOOD .Assume . LE 1000,<;SET area overflow> .SBTTL Handler Entry Point .IF NE MT$FSM .GLOBL FSMDIS, FSMABT, FSMDON .GLOBL FSMERR, RESTOR, CODE .GLOBL DVTBL, FSMSIZ .GLOBL MTCQE .IF NE MMG$T .GLOBL OLDBA, XBUMP, EXTADR .GLOBL JOBNM, SYNBLK, TEMP .GLOBL SINK, ERBSAV .ENDC .ENDC .DRBEG MT BR MT MTS: .WORD MT$CSR MTC: .WORD MT$CSR+2 MTBRC: .WORD MT$CSR+4 MTCMA: .WORD MT$CSR+6 MTD: .WORD MT$CSR+10 MTRD: .WORD MT$CSR+12 NREGS = <.-MTS>/2 .Assume . LE MTSTRT+1000,<;SET object not in block 1> RTRYCT: .WORD NRETRY .Assume . LE MTSTRT+1000,<;SET object not in block 1> MT: .IF NE MMG$T MOV MTCQE,R5 CMP (R5)+,(R5)+ JSR PC,@$MPPTR MOV (SP)+,OLDBA BIT #1700,@SP BEQ 10$ TST (SP)+ MOV MTCQE,R5 BIS #HDERR$,@-(R5) JMP MTDONE 10$: MOV (SP)+,EXTADR .ENDC .IF EQ MT$FSM MOV MTCQE,R3 .IFF JMP FSMDIS $MT:: .ENDC TST (R3)+ MOV @R3,R0 MOVB R0,R4 BIC #^C,R0 MOV R0,R1 SWAB R1 BIS (PC)+,R0 DENSE: .WORD D9$800 .Assume . LE MTSTRT+1000,<;SET object not in block 1> MOV R0,@MTC CLR NFSREAD MOV PC,R0 ADD #RECOVE-.,R0 MOV R1,R5 ADD PC,R5 ADD #$TBL-.,R5 MOV @R3,R2 SWAB R2 ASR R2 ASR R2 ASR R2 BIC #177740,R2 .IF NE MMG$T MOVB R2,JOBNM .ENDC CMP #LOOKUP,R4 BNE 7$ .FOO = 0 .IF NE MMG$T .IF EQ MT$FSM .FOO = 1 MOV MTCQE,R4 JSR PC,@$GTBYT TSTB (SP)+ BNE 5$ JSR PC,@$GTBYT TSTB (SP)+ BNE 5$ .ENDC .ENDC .IF EQ .FOO TST @2(R3) BNE 11$ .ENDC CMPB #-1,@R5 BEQ 3$ .IF EQ MT$FSM MOV #DEVINUSE,R0 2$: MOV @#SYSPTR,R1 MOV R0,SPUSR(R1) BR 12$ .IFF MOV @#SYSPTR,R1 MOV #DEVINUSE,SPUSR(R1) JSR PC,RESTOR JMP $DONE .ENDC 3$: CLR 4(R3) MOVB R2,@R5 .IF NE MT$FSM BR 12$ .IFF 4$: MOV -2(R3),R1 BEQ 6$ BGT 5$ INC R1 BEQ 12$ 5$: MOVB #-1,@R5 MOV #ILLARG,R0 BR 2$ 6$: MOV #REWIND,R4 BR 8$ .ENDC 7$: CMP #CLOSE,R4 BNE 8$ MOVB #-1,@R5 BR 12$ 8$: MOV (PC)+,(R0)+ .BYTE -1,ERRGAPS TST (R0)+ CMP #STR100,R4 BEQ 12$ CMP #READF,R4 BLOS 13$ TST R4 BNE 11$ MOV R3,R1 CLR -2(R1) CMP (R1)+,(R1)+ MOV #READF,R4 TST @R1 BPL 9$ NEG @R1 INC R4 BR 10$ 9$: COM NFSREAD 10$: .IF NE MT$FSM MOV R4,CODE .ENDC BR 13$ 11$: TST -(R3) BIS #HDERR$,@-(R3) 12$: .IF NE MT$FSM JSR PC,RESTOR .ENDC JMP MTDONE 13$: ADD #FUNTAB-TABLE,R4 MOV R4,(R0)+ .IF NE MMG$T MOV 4(R3),R1 MOV R1,4(R0) .IFF TST (R3)+ MOV (R3)+,(R0)+ MOV @R3,@R0 MOV @R3,R1 .ENDC NEG R1 JSR PC,DISPAT TABLE: .BYTE REDEF-TABLE .BYTE RIGHT-TABLE .BYTE AWFLINE-TABLE .BYTE REWHINED-TABLE .BYTE RIGHTX-TABLE .BYTE BAKSPA-TABLE .BYTE FORSPA-TABLE .BYTE RIGHTM-TABLE FUNTAB: .BYTE FREAD+INTENB+GO .BYTE FWRITE+INTENB+GO .BYTE FOFF+INTENB+GO .BYTE FREWIND+INTENB+GO .BYTE FWRTEXT+INTENB+GO .BYTE FSPBAK+INTENB+GO .BYTE FSPFOR+INTENB+GO .BYTE FWRTTM+INTENB+GO REDEF: RIGHTX: RIGHT: .IF NE MMG$T MOV (R0)+,@MTCMA BIS @R0,R5 .IFF MOV -(R3),@MTCMA .ENDC ASL R1 FORSPA: BAKSPA: MOV R1,@MTBRC AWFLINE: REWHINED: RIGHTM: MOVB R5,@MTC .IF NE MT$FSM JSR PC,RESTOR .ENDC RTS PC .SBTTL INTERRUPT HANDLER AND ABORT ENTRY POINTS MTABRT: MOVB #-1,$FLG MOV R3,-(SP) MOV PC,R5 ADD #$TBL-.,R5 MOV MTCQE,R3 BEQ 7$ MOVB Q$JNUM(R3),-(SP);GET JOB NUMBER MOVB (SP)+,R3 ASR R3 ASR R3 ASR R3 BIC #177740,R3 CMP R3,R4 BNE 7$ CLRB $FLG MOV #PWRCLR,@MTC 5$: .IF NE MT$FSM MOV R0,-(SP) MOV DVTBL,R0 BEQ 6$ MOV #-1,(R0)+ MOV #-1,@R0 6$: MOV (SP)+,R0 .ENDC 7$: CMPB R4,@R5 BNE 10$ MOVB #-1,@R5 10$: CMPB #-2,(R5)+ BNE 7$ MOV (SP)+,R3 JMP $DONE .SBTTL INTERRUPT ENTRY POINT .DRAST MT,5,MTABRT .SBTTL ERROR-ERROR ROUTINE DISPATCHER TST MTCQE BNE 114$ JMP $RTS 114$: TST @MTC BMI 1$ .IF NE MMG$T JMP NOERR .IFF BR NOERR .ENDC 1$: MOV @MTS,R4 BPL 2$ BIT #SELR,R4 BNE 2$ MOV #DRIVEGONE,R4 BR ABORT 2$: MOV LASTCOM,R4 JSR PC,DISPAT TABLEE: .BYTE ERREAD-TABLEE .BYTE ERWRIT-TABLEE .BYTE EROFFL-TABLEE .BYTE ERREWD-TABLEE .BYTE ERWRTX-TABLEE .BYTE ERBKSP-TABLEE .BYTE ERFWSP-TABLEE .BYTE ERWRTM-TABLEE .SBTTL ERROR-WRITE OR WRITE WITH EXTENDED GAP COMMAND WAS ISSUED LAST AND ERR BIT WAS SET. .ENABL LSB ERWRIT: ERWRTX: BIT #WRL,@MTS BEQ 1$ ERWRI1: MOV #WRITELOK,R4 BR ABORT 1$: JSR PC,ABOCHK MOV R5,ERRSUM BNE CONT BIT #EOT,R4 BNE NOERR BR NQUAL .DSABL LSB .SBTTL ERROR-WRITE TM,FORWARD SPACE, OR BACKSPACE COMMAND GIVEN LAST AND ERR BIT SET ERWRTM: BIT #WRL,@MTS BNE ERWRI1 ERBKSP: ERFWSP: JSR PC,ABOCHK BIT #EOF+EOT,R4 BNE NOERR BR NQUAL .SBTTL ERROR-READ COMMAND WAS ISSUED LAST AND ERR BIT WAS SET. ERREAD: JSR PC,ABOCHK MOV R5,ERRSUM BNE CONT BIT #RLE+EOT+EOF,R4 BNE NOERR BR NQUAL .SBTTL ERROR-ABORT CHECK SUBROUTINE ABOCHK: MOV @MTS,R4 BIT #BTEOPI,R4 BEQ 1$ MOV #POSERR,R4 BR 4$ 1$: BIT #NXM,R4 BEQ 2$ MOV #MEMERR,R4 4$: TST (SP)+ BR ABORT 2$: CLR R5 BIT #CRE+PAE+BGL,R4 BEQ 3$ COM R5 3$: RTS PC .SBTTL ERROR-ABORT OPERATION IN PROGRESS ERREWD: EROFFL: NQUAL: CLR R4 ABORT: MOV #PWRCLR,@MTC MOV #HDERR$,-(SP) EXCEP: .IF NE MT$FSM MOV (SP)+,R5 JMP FSMERR .IFF MOV MTCQE,R5 BIS (SP)+,@Q$CSW(R5) TST @R5 BEQ MTDONE .IF NE MMG$T COM SINK MOV @R5,ERBSAV MOV R4,TEMP MOVB Q$JNUM(R5),R5 ASR R5 ASR R5 ASR R5 MOV R5,JOBNM .IFF MOV R4,@(R5)+ .ENDC .IFTF MTDONE: .IFT JMP FSMDON .ENDC $DONE:: TSTB $FLG BNE $RTS .IF NE MMG$T MOV PC,R4 ADD #MTCQE-.,R4 MOV @#SYSPTR,R5 TST SINK BNE 1$ JMP @QCOMP(R5) 1$: CLR SINK JSR PC,@QCOMP(R5) MOV PC,R4 ADD #SYNBLK-.,R4 .SYNCH BR BADSYN MOV ERBSAV,R1 BIS #30000,@#177776 MOV R0,-(SP) MTPI (R1)+ MOV ERRBL2,-(SP) MTPI (R1)+ BADSYN: RTS PC .IFF .DRFIN MT .ENDC $RTS: CLRB $FLG RTS PC .SBTTL STATUS REPORT COME HERE IF NO ABORTS ISSUED NOERR: CLR ERRSUM CONT: TSTB RECOVERY BPL RECOVR PTCH: MOV @MTS,R4 MOV LASTCOM,R5 TST ERRSUM BEQ NEXT0 CMP #FN+READF,R5 BNE 1$ MOVB #5,BACK1 MOVB RTRYCT,BACK5 BR 2$ 1$: MOV #FN+WRTXTD,R5 2$: MOVB R5,RECOVERY BR REEDF1 NEXT0: CMP #FN+REWIND,R5 BNE NEXT1 BIT #BOT,R4 BNE REWHYN MOVB R5,RECOVERY RTS PC NEXT1: CMP #FN+READF,LASTCOM BNE NEXT2 BIT #EOF,R4 BNE NEXT3 BIT #RLE,R4 BEQ 1$ MOV #RECERR,R4 BR ABORT 1$: MOV @MTBRC,R5 BEQ NEXT2 ASR R5 NEG R5 .IF NE MMG$T MOV R5,ERRBL2 .IFF .IF NE MT$FSM MOV @MTCQ,R4 .IFF MOV @MTCQE,R4 .ENDC BEQ 2$ MOV R5,2(R4) .ENDC 2$: MOV #SMLREC,R4 .IF NE MMG$T JMP ABORT .IFF BR ABORT .ENDC NEXT2: CMP #FN+FWDSPC,LASTCOM BEQ 1$ CMP #FN+BKSPC,LASTCOM BNE NEXT3 1$: MOV @MTBRC,R4 BEQ NEXT3 .IF NE MMG$T MOV R4,ERRBL2 .IFF NEG R4 .IF NE MT$FSM MOV @MTCQ,R5 .IFF MOV @MTCQE,R5 .ENDC BEQ 2$ MOV R4,2(R5) .ENDC 2$: .ENABL LSB NEXT3: MOV @MTS,R5 CLR R4 BIT #BOT,R5 BEQ 1$ CMP #FN+REWIND,LASTCOM MTD1: BEQ MTDONE CMP #FN+OFFLINE,LASTCOM BEQ MTDONE CMP (R4)+,(R4)+ BR 4$ 1$: BIT #EOF,R5 BEQ 2$ CMP #FN+WRTEOF,LASTCOM BEQ 2$ INC R4 2$: BIT #EOT,R5 BEQ 3$ TST NFSREAD BNE 3$ CMPB (R4)+,(R4)+ 3$: TST R4 BEQ MTD1 4$: MOV #EOF$,-(SP) JMP EXCEP .DSABL LSB .SBTTL RECOVERY IN PROGRESS DISPATCHER RECOVR: MOV LASTCOM,R4 JSR PC,DISPAT TABLER: .BYTE REEDF-TABLER .BYTE RITE-TABLER .BYTE 0 .BYTE REWHYN-TABLER .BYTE RITEX-TABLER .BYTE BACH-TABLER .BYTE FORE-TABLER .BYTE 0 .SBTTL RECOVERY-WRITE WAS LAST COMMAND RITEX: RITE: TST ERRSUM BEQ NEXT1 INCB TAPELEN BEQ NQ2 BIT #EOT,@MTS BEQ REEDF1 NQ2: JMP NQUAL .SBTTL RECOVERY-REWIND WAS THE LAST COMMAND REWHYN: MOV #PWRCLR,@MTC JMP MTDONE .SBTTL RECOVERY-READ WAS THE LAST COMMAND ISSUED .ENABL LSB REEDF: TST ERRSUM BEQ FOO DECB BACK1 BEQ 2$ BGT REEDF1 MOVB #5,BACK1 DECB BACK5 BEQ NQ2 REEDF1: MOV #-1,R5 BR 3$ 2$: MOV #-5,R5 3$: MOV R5,@MTBRC BR BACH2 FOO: JMP PTCH .DSABL LSB .SBTTL RECOVERY-FORWARD SPACE WAS THE LAST COMMAND FORE: MOV @MTBRC,R5 BNE BACH1 FORE1: MOV MTCMA,R5 MOV OLDBA,@R5 MOV OLDWC,-(R5) ASL @R5 NEG @R5 MOV #FN+READF,R4 MOVB FUNTAB,R5 BR BACH3 .SBTTL RECOVERY-BACKSPACE WAS LAST COMMAND .ENABL LSB BACH: CMPB #FN+READF,RECOVERY BEQ 1$ MOV OLDWC,R4 ASL R4 NEG R4 MOV R4,@MTBRC MOV OLDBA,@MTCMA MOV #FN+WRTXTD,R4 MOVB FUNTAB+4,R5 BR 4$ 1$: MOV @MTBRC,R5 BEQ 6$ BIT #BOT,@MTS BEQ 5$ 2$: ADD #4,R5 BEQ FORE1 3$: NEG R5 BACH1: MOV R5,@MTBRC MOV #FN+FWDSPC,R4 MOVB FUNTAB+6,R5 BACH3: 4$: MOV R4,LASTCOM .IIF NE MMG$T, BIS EXTADR,R5 MOVB R5,@MTC RTS PC BACH2: 5$: MOV #FN+BKSPC,R4 MOVB FUNTAB+5,R5 BR 4$ 6$: TSTB BACK1 BEQ 2$ BR FORE1 .DSABL LSB .SBTTL XBUMP SUBROUTINE .IF NE MMG$T XBUMP: MOV MTCQE,-(SP) ADD #Q$PAR,@SP ADD #10,@(SP)+ ADD #512.,OLDBA BCC 1$ ADD #20,EXTADR 1$: RTS PC .ENDC .SBTTL DISPATCH SUBROUTINE DISPAT: ADD @SP,R4 MOVB FUNTAB-TABLE(R4),R5 MOVB @R4,R4 ADD (SP)+,R4 JMP @R4 .SBTTL MAGTAPE DATA AREA $TBL: .REPT MT$UN .BYTE -1 .ENDR .BYTE -2 $FLG: .BYTE 0 .EVEN RECOVE: .BYTE -1 TAPELE: .BYTE ERRGAPS BACK5: .BYTE 0 BACK1: .BYTE 0 LASTCO: .WORD 0 OLDBA: .WORD 0 .IIF NE MMG$T, EXTADR: .WORD 0 OLDWC: .WORD 0 ERRSUM: .WORD 0 NFSREA: .WORD 0 .EVEN .IF NE MMG$T SYNBLK: .WORD 0 JOBNM: .WORD 0 .WORD 0,0 TEMP: .WORD 0 .WORD -1,0 SINK: .WORD 0 ERBSAV: .WORD 0 ERRBL2: .WORD 0 .ENDC .IF NE MT$FSM MTCQ:: .WORD 0 DRIVEN==MT$UN DVINFO::.REPT DRIVEN .WORD -1 .WORD -1 .WORD -1 .BYTE 0 .BYTE 0 .WORD 0,0,0 .ENDR .ENDC .IF EQ MT$FSM .DREND MT .IFF .GLOBL $FKPTR,$INPTR .IIF NE MMG$T, .GLOBL $RLPTR,$MPPTR,$GTBYT,$PTBYT,$PTWRD .IIF NE ERL$G, .GLOBL $ELPTR .IIF NE TIM$IT, .GLOBL $TIMIT .ENDC SIZE=. SIZED=SIZE-MTSTRT/2 .END mWu!'L|+:,*H_pϓk7R\Ñ_tݩYzU2XxPҭ EDs0B.L;yv67>!AJkLXո{.$;]j}8.-hn y 9zvCQO&޴k1"FT$ *~\O9jaiɋ}n+Ĝ7I`Z /"vaQdăY.M- 'LD&-RH[TS$?_Wv7x m j_<J*LJʇOxĘgv_%M-εyA\ȱ\ pwx wl1}6fz=T9"&O?_5\iy._v΢Ib@jTDXk,TjD#&f-Rco7P8~UHƋD6gQ= }@t1=@#FWqI |Y3ܔ~6|冡:fk %JxlR/%y7M!+%=qɟIέry%\^ XI X䔹Z;&e_}]CB hI.WS?.Pa/Ct*Ϋ/ΣRh$(K^ºA&I3ͥќ 6 T+Ūٜ$^ƆH+v Jjk^0$7]Ftw]41+8į},fyOӆ9Xr{㼉UJW5cŮ}:ex#U{Mp}]̲`&VI't{ܩD% #ڵ$Z K0RxԳEdBTn " :ƦyL¿oO3S&n֖}ԧsg4lQp*ֺ"r˱,`m>?K3^kRrw"1+*w$6*wZN"p|MJFPi@v+5PdqZ57Тo4>Tvc"4ίsg  a Ѩnp=Y+.3D YH׮3]@pruҔNJrBymZoa8p}{(;,F܎9u<$y`iYJy[}e(>)^Ԍ{rT;o{G[*ztgӃ*(2 >vKMlqtx]r;J- x:[JE$ S eXHeq1 |]t*Y*'4~}JP fЖ(-̤dM,j_3+|_!w$CoI-\ُ@N*]I2L%`2SL;#_$XB)>3LϫVw4q{`v&?n^ghZp%cD ڭ)[nT@A%@F:-:g LjZ[7gy'X4nH+G86Vfxے_6?}LU5(ĥtȾ<nj40eƪ&d_ ӚNO=7nI~ax/c/|]$z,R|CdB,fh1uOC }@$>υP> 79`t-|٫t<-`Eޕd~iZQ~hAEV)+5˛Gdn l%E2C1Ta+ f(#|$t[#'Z݂5^}"[FthQ'\#9 ٤3 #NZ şvWoO*VyAPuuw9H=o2Q?YړYϫYn(6dXH뇪{ KI YI>;ifi'+!s3lfQV`C fc3wvQ_rǍh`N=CX ypB%>ŸLԋU[2\+ؙLϟQLV\ٶTx v[3vm-Ro}jz_@8Z(Ol;H7[NAY9fڔYC,tٻyDz?b; D~>P nkS7&3H1B &3LW4!y^<|E ڒW2oX(l/X5eMz\?EAob(`L!R1M"n<;676c}!U6/xmSE35\ߐq P$oYri͍z2u>~&H\ta6dcte5nf'cbFָ=WNSI3KtW5=W@uk#aT+oz6؄Mz_1uRM<_cLD =zX(Vlن,