«Æ–,Ì›c,.; .; MODIFIED BY: .; .; E. A. FLOYD 14-OCT-80 .; EF020 -- FORCE CREATION OF SAVED ANSWER FILE .; .; EF021 -- UPDATE TO RUN ON VAX/VMS HOST .; .; EF026 -- UPDATE VERSION NUMBER AND COPYRIGHT .; .; E. A. FLOYD 15-JAN-81 .; EF038 -- REMOVE IAS REFERENCES - NO LONGER A SUPPORTED HOST .; .; E. A. FLOYD 4-FEB-81 .; EF039 -- ADD MS AS POSSIBLE DISTRIBUTION DEVICE .; .; E. A. FLOYD 11-FEB-81 .; EF041 -- REMOVE FOR COMPATIBILITY WITH SYSGEN SETUP .; .; P.J. KOBAR 30-MAR-81 .; PJK11S -- POST BL30 CLEANUP .; .; M.E. MACKAY 28-APR-81 .; MEM023 -- ADD LIMITED SUPPORT FOR TARGETING .; .; M.A. JOHNSON 13-MAY-81 .; MJ014 -- FIX VAX TASK ASSIGNMENTS (11MTKB, 11MVMR) .; .; M.A. JOHNSON 26-OCT-81 .; MJ024 -- FIX UP SOME OF THE VAX & TAPE PROC. PARTS (AT BL31E BUT SET BL32) .; .ENABLE SUBSTITUTION .ENABLE GLOBAL .DISABLE LOWERCASE .TEST .SETS $SGNUC [2:-1] .SETT $11SGN .SETF $MPLUS .SETF $VAX .SETF MSYS .IF EQ 1 .SETT MSYS .IFT MSYS .GOTO 10 .IF  EQ 6 .SETT $MPLUS .IFT $MPLUS .GOTO 10 .IF EQ 5 .SETT $VAX .IFT $VAX .GOTO 10 ; ; You are trying to do an RSX-11S system generation on a host system ; which is not supported in the RSX-11S system generation process. ; Only RSX-11M, RSX-11M-PLUS, and VAX/VMS are supported hosts. ; / .10: .IFT MSYS .SETS HOST "RSX-11M" .IFT $MPLUS .SETS HOST "RSX-11M-PLUS" .IFT $VAX .SETS HOST "VAX/VMS" ; ; RSX-11S Version 4.0 BL32 System Generation done on 'HOST' ; ; Copyright (C) 1979,1981 ; Digital Equipment Corporation, Maynard, Mass. ; All Rights Reserved. ; .SETS UIC .SETF $MCR .IF EQ "DCL" .OR .IF EQ "MCR" .GOTO 14 ; ; SGN -- Procedure can only be run from MCR or DCL ; .14: .IF EQ "MCR" .SETT $MCR .IF EQ "MCR" .GOTO 18 ; ; Setting the CLI to MCR ; SET TERM MCR .18: .IFT MSYS .GOTO 65 ; ; RSX-11S system generation set-up section ; ; The system device is the disk on which all of the host's, 'HOST', ; system files are stored. If your 11S target disk is the system device ; then there may possibly be a conflict in some file names (e.g., SYSLIB). ; .IFT $MPLUS ; .IFT $MPLUS ; Your target disk will be SY: which is currently assigned to .IFT $MPLUS ; to '''': .IFT $MPLUS ; .ASK Z Is the target disk, '''':, the system device .IFF Z .GOTO 22 .IF $SGNUC EQ "2,200" .GOTO 22 ; ; The system generation procedures will be put in [2,200] since you are ; targeting to the system disk on a Non-11M host. ; SET /UIC=[2,200] .SETS $SGNUC "2,200" .TESTFILE [0,0]002200.DIR .IF NE 1 UFD SY:[2,200] .GOTO 22 .2: ; ; Group number 2 is reserved for 11S SYSGEN use ; .22: .IFF Z .ASKN [1:10:1] $SYGRP What is the group number for the system files .IFF Z .ASKN [1:11:11] $UIC What is the group number for the executive files .IFT Z .ASKN [3:10:3] $SYGRP What is the group number for the system files .IFT Z .ASKN [3:10:3] $UIC What is the group number for the executive files .IF $SYGRP EQ 2 .OR .IF $UIC EQ 2 .GOTO 2 .SETF $TARGT .IF $SYGRP NE 1 .OR .IF $UIC NE 11 .SETT $TARGT .SETS TEMP "" .IFF $VAX .SETS P1 +"''"+":" .IFT $VAX .ASKS P1 Target device name .IFT $VAX .SETS TEMP P1[:] .IFT $VAX .IF TEMP NE ":" .SETS P1 P1+":" .IFT $VAX SET DEFAULT 'P1' .IFT $VAX ASN 'P1'=SY: .IFT $VAX ASN 'P1'=SY0: .IFT $VAX ASN 'P1'=LB: .IFT $VAX ASN 'P1'=LB0: .IFT $VAX ASN MP:=MP0: .IFT $VAX ASN TK:=TK0: .IFT $VAX .SETT $MPLUS .IFT $VAX ASN 'P1'['$SYGRP',54]11MTKB.TSK=TKB .IFT $VAX ASN 'P1'['$SYGRP',54]11MVMR.TSK=VMR .SETS $EXC "" .ASK COPY Copy the RSX-11S distribution files to the target disk .IFF COPY .GOTO 65 .ASKS $EXC Enter device for the RSX-11S distribution kit .TEST $EXC .SETS TEMPS $EXC[:] .IF TEMPS NE ":" .SETS $EXC $EXC+":" .SETF TAPE .SETS SKIT $EXC[1:2] .IF SKIT EQ "MM" .OR .IF SKIT EQ "MT" .OR .IF SKIT EQ "MS" .SETT TAPE .IFT TAPE .ASK $T2400 Is the RSX-11S distribution kit on a 2400 foot reel .IFNDF $T2400 .SETF $T2400 .SETS MEDIA "disk" .IFT TAPE .SETS MEDIA "tape" .60: ; ; Place the 'MEDIA' labeled 11SKIT1 on '$EXC' ; .ASK Z Is the 'MEDIA' ready on '$EXC' .IFF Z .GOTO 60 .IFF TAPE MOU '$EXC'11SKIT1 .IFT TAPE MOU '$EXC'/FOR .SETS UTIL "PIP" .IFT TAPE .SETS UTIL "FLX" .SETS NV "/NV" .IFT TAPE .SETS NV "/RS" .SETS INSW "" .IFT TAPE .SETS INSW "/DO/RW" .SETS DENS "" .IFT $T2400 .SETS DENS "/DNS:1600" 'UTIL' 'P1''NV'='$EXC'[200,200]11SCOPY.CMD'INSW''0DENS' @11SCOPY.CMD .; .65: @'UIC'SYSGEN 0«Æ–,Ì›c,È .; .; .; MODIFIED BY: .; .; .; E. A. FLOYD 3-JUL-80 .; EF015 -- ADD DIRECTIVE COMMON SUPPORT .; .; E. A. FLOYD 15-OCT-80 .; EF022 -- REMOVE COMMENTS CONCERNING PDT .; .; E. A. FLOYD 29-OCT-80 .; EF023 -- ADD CDA BUILD SUPPORT FOR NON-M HOSTS .; .; EF024 -- ADD BLDLAINIT BUILD SUPPORT AND .; RELEVANT FOR INCLUSION IN VMR .; .; EF025 -- ALWAYS USE MAC AND TKB (NO MORE "BIG") .; .; EF026 -- UPDATE VERSION NUMBER AND COPYRIGHT .; .; E. A. FLOYD 14-NOV-80 .; EF029 -- ADD ISA AND SETTIM SUPPORT, CLEANUP CDA .; .; E. A. FLOYD 24-NOV-80 .; EF031 -- CHANGE LENGTH OF OTL IN OTLBLD.CMD AND .; PERTINENT COMMENTS .; .; E. A. FLOYD 25-NOV-80 .; EF032 -- SET SYMBOL FOR M HOSTS AND CLEAN UP .; .; EF033 -- CHANGE COMMENT SO GEN PARTITION IS DEFINED .; AS EITHER TASK OR SYSTEM CONTROLLED .; .; E. A. FLOYD 26-NOV-80 .; EF034 -- CHANGE SYMBOL FOR RSDEMO GBLPAT .; .; E. A. FLOYD 15-JAN-81 .; EF038 -- REMOVE REFERENCES AND SUPPORT FOR IAS .; .; E. A. FLOYD 4-FEB-81 .; EF040 -- REMOVE SINGLE RL SUPPORT AND ADD .; PRVDSK SYMBOL FOR OBJECTS DISK .; AND MOVE EXEC AND FDX TTDRV OLBS .; AND BLD.CMD FILES TO PRVDSK FOR RK .; .; E. A. FLOYD 12-FEB-81 .; EF042 -- FIX ISA LIBRARY INSERTIONS AND USER .; WRITTEN DRIVER COMMENTS .; E. A. FLOYD 13-FEB-81 .; EF044 -- REMOVE TU58 SUPPORT FOR 11SKIT TYPE .; .; E. A. FLOYD 16-FEB-81 .; EF045 -- ADD SUPPORT FOR 3RD FLOPPY: 11SKIT3 .; .; E. A. FLOYD 19-FEB-81 .; EF048 -- MISCELLANEOUS CLEANUP .; .; E. A. FLOYD 10-MAR-81 .; EF051 -- FIX LOADING OF RELEASE KIT .; .; P.J. KOBAR 26-MAR-81 .; PJK043 -- REMOVE TU58 SUPPORT AND CLEAN UP .; .; P.J. KOBAR 9-APR-81 .; PJK044 -- LOWER CASE, 11MTKB AND MORE CLEAN-UP .; .; P.J KOBAR 15-APR-81 .; PJK049 -- FIX CDA BUILD CODE; UPDATE TASK SIZES .; .; P.J. KOBAR 16-APR-81 .; PJK050 -- FIX RSX-11M KIT DETECTION CODE .; .; P.J. KOBAR 16-APR-81 .; PJK051 -- FIX RSX-11S KIT DETECTION CODE .; .; M.E. MACKAY 28-APR-81 .; MEM023 -- ADD LIMITED SUPPORT FOR TARGETING .; .; M.A. JOHNSON 13-MAY-81 .; MJ013 -- FIX SO THAT DRIVERS MAY BE BUILT W/O .; BUILDING THE EXEC. AND ADD VMS ASSIGNMENTS .; .; M.E. MACKAY 26-MAY-81 .; MEM024 -- FIX MAC LINE LENGTH PROBLEM VIA "MAC @TKNASM" .; .; M.A. JOHNSON 15-JUN-81 .; MJ019 NUMEROUS CLEANUPS INCLUDING MAP SPOOLING, .; RK05 SPACE CLEANUPS, TASK INSTALLATION .; CHECKING FOR ON-LINE GENS, MISC. ETC. .;  .; M.A. JOHNSON 17-JUN-81 .; MJ020 COPY SYSLIB AND EXELIB TO THE BASELINE FROM .; PRVOBJ FOR RK05 DIST. KITS. COMMENT OUT ALL .; COPYING FROM FLOPPY DISK KITS (DX & DY) - .; THEY NO LONGER EXIST. FORCE DELETION OF THE .; 11S KIT FILES FOR RK05 DIST. KITS WHEN THE .; USER IS READY TO CONFIGURE THE SYSTEM WITH VMR. ; ; RSX-11S Version 4.0 BL32 System Generation Phase II ; ; Copyright (C) 1975, 1981 ; Digital Equipment Corp., Maynard, MA. 01754 ; All Rights Reserved. ;  ; Build The Executive And All Required Tasks ; ; This command file will produce the target system on your SY: disk. ; If it is an RK05 or an RL01, this command file will delete a number ; of files from this disk to make room for those required to complete ; this 11SGEN. You must be running on an expendable copy of ; your disk. Note however, that the disk will be left in a ; state such that RSX-11S sysgens may be performed at a later ; date. In addition, the sysgen itself may be terminated and ; may be restarted at just about any point to rebuild particular ; pieces of the system. ; .ENABLE SUBSTITUTION .ENABLE GLOBAL .SETS UIC .SETT $11SGN .SETS SMAC "" .0A: .ASKS $SGU In what UIC is SGNPARM.CMD if not '' .IF $SGU EQ "Y" .OR .IF $SGU EQ "" .SETS $SGU .; .; REMOVE BRACKETS IF SUPPLIED .; .TEST $SGU .SETN TEMPN 1 .SETN TEMPN2 .SETS TEMPS2 $SGU[1:1] .SETS TEMPS3 $SGU[:] .IF TEMPS2 EQ "[" .INC TEMPN .IF TEMPS3 EQ "]" .DEC TEMPN2 .SETS TEMPS $SGU[TEMPN:TEMPN2] .SETS $SGU TEMPS .TESTFILE ['$SGU']SGNPARM.CMD .IF EQ 1 .GOTO 0B ; 11SGEN2 -- SGNPARM does not exist in ['$SGU'] ---- Retry .GOTO 0A .0B: @['$SGU']SGNPARM.CMD .; .;DETERMINE CLI .; .SETF $MCR .IF EQ "DCL" .OR .IF EQ "MCR" .GOTO 0B00A ; ; SGN -- Procedure can only be run from MCR or DCL ; .0B00A: .IF EQ "MCR" .SETT $MCR .IF EQ "MCR" .GOTO 0B00B ; ; Setting the CLI to MCR ; SET TERM MCR .0B00B:  TIM .SETT UFDX .SETT TKBX .SETT PIPX .SETT LBRX .SETT EDIX .SETT FLXX .SETT MACX .SETT VMRX .SETS P1 "" .SETF MSYS .IF EQ 1 .SETT MSYS .IFT MSYS .SETN $SYGRP 1 .IFT MSYS .SETN $UIC 11 .IFF $ONL .OR .IFF MSYS .GOTO 0B03 .SETS ALLTSK "UFDTKBPIPLBRLOAEDIUNLFLXMACVMR" .SETN FRONT 1 .SETN REAR 3 .0B01: .SETS TASK ALLTSK['FRONT':'REAR'] .IFNINS 'TASK' .GOTO 0B02 .SETN FRONT FRONT+3 .SETN REAR REAR+3 .IF REAR LE 36 .GOTO 0B01 .GOTO 0B03 .0B02: .SETF 'TASK'X  ; ; You must install 'TASK' and any of the following tasks which are ; not installed on your system if you are performing your 11SGEN2 ; on-line: UFD TKB PIP LBR LOA EDI ; UNL FLX MAC VMR ; ; Please install them now. ; .PAUSE .GOTO 0B01 .0B03: .IFT MSYS .GOTO 0B1 .IFDF $UIC .IFDF $SYGRP .GOTO 0B21 ; ; The system device is the disk on which all of the host's system ; files are stored. If your 11S target disk is the system device ; then there may possibly be a conflict in some file names (e.g., SYSLIB). ; .SETT Z .IFNDF $SYGRP .ASK Z Is the target disk, '''':, the system device .GOTO 0B22 .0B2: ; ; Group number 2 is reserved for 11S SYSGEN use ; .0B22: .IFF Z .ASKN [1:10:1] $SYGRP What is the group number for the system files .IFF Z .ASKN [1:11:11] $UIC What is the group number for the executive files .IFT Z .ASKN [3:10:3] $SYGRP What is the group number for the system files .IFT Z .ASKN [3:10:3] $UIC What is the group number for the executive files .IF $UIC EQ 2 .OR .IF $SYGRP EQ 2 .GOTO 0B2 .0B21: .SETF $TARGT .IF $SYGRP NE 1 .OR .IF $UIC NE 11 .SETT $TARGT .IFT $TARGT .SETS SMAC "RSXMAC.SML/ML," .0B1: .IFNDF $MAP .ASK $MAP Are you building a mapped system .IFNDF $SPL .SETS $SPL "/-SP" .IFNDF $PWI .SETT $PWI .IFT $MAP .SETT MPD .IFF $MAP .SETF MPD .IFT $STT .SETT SETTIM .IFF $STT .SETF SETTIM .IFT MPD .SETS S "4" .IFF MPD .SETS S "0" .TESTFILE [0,0]00106'S'.DIR .IF EQ 1 .GOTO 00A .SETT UFD .IFINS UFD .GOTO 00 .SETF UFD INS SY:$UFD .00: UFD SY:['$SYGRP',6'S'] .IFF UFD REM UFD .00A: .SETT UFD .IFNDF $MPD .SETS $MPD "SY:" .; .; FIND OUT IT MAP DEVICE HAS TO BE MADE READY .; .IF $MPD EQ "SY:" .OR .IF $MPD EQ "LB:" .OR .IF $MPD EQ "NL:" .GOTO 01 .IF $MPD EQ "" .OR .IF $MPD EQ "TI:" .OR .IF $MPD EQ "TT:" .GOTO 01 ; ; The map device specified must already be mounted with UIC ['$SYGRP',3'S']. ; If it is not, respond to the next question with ^Z and do so. ; .01: .IFNDF $MPLUS .SETF $MPLUS .IFF $MPLUS .IF = 6 .SETT $MPLUS .IFNDF $VAX .SETF $VAX .IFF $VAX .IF = 5 .SETT $VAX .SETF MSYS .IF = 1 .SETT MSYS .1: .IFNDF $UIC .SETN $UIC 11 .IFT $VAX .ASKS P1 Target device name .IFT $VAX .SETS TEMPS P1[:] .IFT $VAX .IF TEMPS NE ":" .SETS P1 P1+":" .IFT $VAX SET DEFAULT 'P1' .IFT $VAX ASN 'P1'=SY: .IFT $VAX ASN 'P1'=SY0: .IFT $VAX ASN 'P1'=LB: .IFT $VAX ASN 'P1'=LB0: .IFT $VAX ASN TK:=TK0: .IFT $VAX ASN MP:=MP0: .IFT $VAX ASN 'P1'['$SYGRP',54]11MTKB.TSK=TKB .IFT $VAX ASN 'P1'['$SYGRP',54]11MVMR.TSK=VMR .IFT $VAX SET NOON .SETS TKBTM "TKB" .; .; A new version of the task builder which contains the "no message" switch .; must be used on an MPLUS V1.0 system so that executive commons, if .; they are chosen, will task build without error messages. Since .; executive commons are task-built separately from the executive itself, .; they produce unresolved symbols which are later resolved by building .; the exec. .; .IFT $MPLUS .SETS TKBTM "TKM" .IFINS 'TKBTM' .GOTO 1A .SETF TKBX .IFT $MPLUS INS SY:['$SYGRP',54]11MTKB/TASK=...TKM .1A: .SETT $11S .SETF DEVX .SETF LOAX .SETF LPX .SETF UNLX .SETS PRVDSK "" .SETS $PRV "SY:" .IFDF $RL .SET'$RL' $2RL .IFF $MPLUS .GOTO 1A1 .SETT $BGDSK .SETF $2RL .SETF $2RK .GOTO 1C .1A1: .IFNDF $BGDSK .ASK $BGDSK Do you have the RP04/5/6, RM02/3 or RK06/7 RSX-11M Kit .IFT $BGDSK .SETF $2RL .IFT $BGDSK .SETF $2RK .IFT $BGDSK .GOTO 1C  .IFNDF $2RK .ASK $2RK Do you have the dual RK05 RSX-11M Kit .IFT $2RK .SETF $2RL .IFT $2RK .SETS PRVDSK "PRVOBJ" .IFF $2RK .IFNDF $2RL .ASK $2RL Do you have the dual RL01/2 RSX-11M Kit .IFT $2RL .SETS PRVDSK "EXCPRV" .IFT $2RL .OR .IFT $2RK .GOTO 1B ; 11SGEN2 -- No RSX-11M/M-PLUS host kit was selected -- Retry .GOTO 1A1 .1B: .ASKS $PRV In which device is the 'PRVDSK' disk [DDU:] .IF $PRV EQ "" .GOTO 1B .IFT $2RK .OR .IFT $2RL MOU '$PRV''PRVDSK' .IFT $2RK ASN '$PRV'=LB: .1C: .IFF $2RK ASN SY:=LB: ; ; Expanded comments provide a complete description of every step in ; this 11SGEN command file. On the other hand, short comments ; provide virtually no explanatory text. ; .ASK D Do you want expanded comments .SETT PIP .IFINS PIP .GOTO 1D .SETF PIP INS SY:$PIP .1D: .IFT $BGDSK .GOTO 1E .IFT D ; .IFT D ; Make room on the baseline disk to complete the 11SGEN .IFT D ; .IFT .SETS SYS "4" .IFF .SETS SYS "0" SET /UIC=[1,1] PIP ['$SYGRP',3'S']*.*/PU/NM PIP ['$SYGRP',5'SYS']CTDRV.TSK;*/DE/NM,DBDRV.TSK;*,DPDRV.TSK;*,DRDRV.TSK;* PIP ['$SYGRP',5'SYS']CTDRV.STB;*/DE/NM,DBDRV.STB;*,DPDRV.STB;*,DRDRV.STB;* PIP 'UIC'SYSGEN2.CMD;*/DE/NM .IFT $2RK PIP SY:/NV='$PRV'[1,1]EXELIB.OLB,SYSLIB.OLB .IFT $2RK PIP SY:[1,1]EXELIB.OLB/PU/NM,SYSLIB.OLB PIP /FR .1E: .IFNDF $FUD .ASK $FUD Was the full duplex terminal driver chosen in Phase I .IFNDF $LPR .ASK $LPR Are you running on a machine with a line printer .IFT $LPR .SETT LPT .IFF $LPR .SETF LPT .SETS PIPDEV "TI:=" .SETS PIPSW "" .2: .IFT LPT .IFINS PRT... .SETS PIPDEV $MPD .IFT LPT .IFINS PRT... .SETS PIPSW "/SP" .IFT LPT .IFNINS PRT... .OR .IFT $VAX .SETS PIPDEV "LP:="+$MPD .IFT LPT .IFNINS PRT... .OR .IFT $VAX .SETS PIPSW "" .5: .; .;DETERMINE DEVICES INCLUDED IN SYSTEM .; .IFNDF $DEV .IFNDF $DV2 .IFNDF $DV3 .GOTO 15 .SETS DEV "$DEV" .6: .TEST 'DEV' .SETN TEMPN 1 .7: .IF TEMPN GT .GOTO 8 .SETN TEMPN2 TEMPN+1 .SETS TEMPS 'DEV'['TEMPN':'TEMPN2'] .INC TEMPN2 .SETN TEMPN TEMPN+3 .SETS TEMPS2 'DEV'['TEMPN2':'TEMPN'] .SETN 'TEMPS' 'TEMPS2'. .INC TEMPN .GOTO 7 .8: .IF DEV EQ "$DV3" .GOTO 15 .IF DEV EQ "$DV2" .GOTO 9 .SETS DEV "$DV2" .GOTO 6 .9: .SETS DEV "$DV3" .GOTO 6 .15: .SETT LBR .SETT EDI .SETT FLX .SETT TKB .SETT MAC .20: .IFT D ; .IFT D ; Create RSX-11S subset system library .IFT D ; if you have not already done so. .IFT D ; .IFINS LBR .GOTO 30 .SETF LBR INS SY:$LBR .30: .IF NE "['$SYGRP',1]" SET /UIC=['$SYGRP',1] .ASK Z Have you already created 11SLIB.OLB .IFT Z .GOTO 35 LBR LB:11SLIB/CR:30.:896.:320. .35: .SETF DEVCOM .IFT $DSS .OR .IFT $DUC .SETT DEVCOM .IFT $IPE .OR .IFT $CDB .SETT DEVCOM .IFF DEVCOM .GOTO 60 .IFT D ; .IFT D ; If you need FORTRAN run time support for the IP11/IP300, UDC-11, .IFT D ; ICS-11/ICR-11, LPS-11, DRS/DSS-11, AR-11, or LPA 11 subsystems, .IFT D ; then you must add the support routines to 11SLIB. .IFT D ; .ASK Z Do you want to add the FORTRAN run time modules to 11SLIB .IFF Z .GOTO 60 .SETN TEMPN 0 .IF IC GT 0 .INC TEMPN .IF IS GT 0 .INC TEMPN .IF UD GT 0 .INC TEMPN .IF IP GT 0 .INC TEMPN .IF AR GT 0 .OR .IF LS GT 0 .INC TEMPN .IF TEMPN EQ 0 .GOTO 50 .IFF $ISA .GOTO 50 .IF TEMPN GT 1 .GOTO 40 LBR LB:11SLIB/RP='$PRV'PURISA .IF IC GT 0 .OR .IF IS GT 0 LBR LB:11SLIB/RP='$PRV'PURICR .IF IC EQ 0 .IF IS GT 0 LBR LB:11SLIB/DE:.ICRDI .IFT $CDB LBR LB:11SLIB/RP=['$SYGRP',2'S']ICOM.ICR,ICTAB.ICR .IFT $DSS LBR LB:11SLIB/RP=['$SYGRP',2'S']ISCOM.IDS,DSSDI.IDS .IF UD GT 0 LBR LB:11SLIB/RP='$PRV'PURUDC .IFT $DUC LBR LB:11SLIB/RP=['$SYGRP',2'S']UDCOM.UDC .IF IP GT 0 LBR LB:11SLIB/RP='$PRV'PURPCS .IFT $IPE LBR LB:11SLIB/RP=['$SYGRP',2'S']IPCOM.PCS,IPMAP.PCS .50: .IF AR GT 0 .OR .IF LS GT 0 LBR LB:11SLIB/RP='$PRV'LPS .IF LA GT 0 LBR LB:11SLIB/RP='$PRV'LPA .GOTO 60 .40: .IF IC GT 0 LBR LB:ICSLIB/CR='$PRV'PURISA .IF IC GT 0 LBR LB:ICSLIB/RP='$PRV'PURICR .IF IS GT 0 LBR LB:ISLIB/CR='$PRV'PURISA .IF IS GT 0 LBR LB:ISLIB/RP='$PRV'PURICR .IF IS GT 0 LBR LB:ISLIB/DE:.ICRDI .IFT $CDB LBR LB:ICSLIB/RP=['$SYGRP',2'S']ICOM.ICR,ICTAB.ICR .IFT $DSS LBR LB:ISLIB/RP=['$SYGRP',2'S']ISCOM.IDS,DSSDI.IDS .IF UD GT 0 LBR LB:UDCLIB/CR='$PRV'PURISA .IF UD GT 0 LBR LB:UDCLIB/RP='$PRV'PURUDC .IFT $DUC LBR LB:UDCLIB/RP=['$SYGRP',2'S']UDCOM.UDC .IF IP GT 0 LBR LB:PCSLIB/CR='$PRV'PURISA .IF IP GT 0 LBR LB:PCSLIB/RP='$PRV'PURPCS .IFT $IPE LBR LB:PCSLIB/RP=['$SYGRP',2'S']IPCOM.PCS,IPMAP.PCS .IF AR GT 0 .OR .IF LS GT 0 LBR LB:LPSLIB/CR='$PRV'PURISA .IF AR GT 0 .OR .IF LS GT 0 LBR LB:LPSLIB/RP='$PRV'LPS .IF LA GT 0 LBR LB:LPALIB/CR='$PRV'LPA .60: .IFF LBR REM LBR .SETT LBR .SETF LPN .IFDF $MPD .IF $MPD EQ "LP:" .SETT LPN .IFNDF $MPD .ASK LPN Did you specify LP: as map device in Sysgen Phase I .70: .ASK EXEBLD Have you already built the Exec .IFT EXEBLD .GOTO 285 SET /UIC=['$SYGRP',2'S'] .220: .IFT D ; .IFT D ; Purge Exec build command files and assembly prefix files .IFT D ; PIP RSXBLD.CMD/PU/NM PIP ['$UIC',10]RSXMC.MAC/PU/NM .230: .IFNDF $UWD .ASK $UWD Do you wish to add User-Written driver(s) to the Exec .IFF $UWD .GOTO 260 .IFNDF $LOD .ASK $LOD Was loadable driver support selected during Sysgen Phase I ; ; Build user-written driver(s) ; ; You must edit the Executive build command file RSXBLD.CMD ; to include your user-written driver and data base in your system. ; ; If you are including a resident data base, locate the line ; in which the module SYSTB is referenced and add :USRTB ; immediately after it, for example: .SETS TEMPS "" ; LB:['$SYGRP',2'$GRP']RSX11'$SYS'/LB'TEMPS':SYSTB:USRTB:SYTAB:INITL,LB:['$SYGRP',1]EXELIB/LB/SS ; If you are not including a resident data base, add the line ; GBLDEF=$USRTB:0 ; to the file instead. ; ; For each resident driver, add a line of the form: ; LB:['$SYGRP',2'$GRP']RSX11'$SYS'/LB:xxDRV ; where other drivers are referenced (where xx is the device name, ; for example DK). .IFF $LOD .GOTO 240 ; NOTE: For each loadable driver, do not add a corresponding ; line to the build command file. .240: ; .IFT D ; .IFT D .IFT $LOD ; Your non-loadable drivers will automatically be linked .IFT D .IFF $LOD ; Your drivers will automatically be linked .IFT D ; with the Executive you are building. .IFT D ; .260: .IFT $2RK .IF NE "['$SYGRP',2'S']" SET /UIC=['$SYGRP',2'S'] .IFT $2RK PIP LB:/NV/NM=RSX11S.OLB,TTDRV,RSXBLD.CMD,TTDRVBLD .IFT $2RK PIP RSX11S.OLB;*/DE/NM,TTDRV;*,RSXBLD.CMD;*,TTDRVBLD;* .IFF LBR REM LBR .SETT LBR .IFF LPN .GOTO 270 .IFLOA LP: .SETT LPX .IFINS LOA .SETT LOAX .IFT LPX .GOTO 270 .IFF LOAX INS SY:$LOA .IFT $2RK ASN SY:=LB: LOA LP: .IFT $2RK ASN '$PRV'=LB: .IFF LOAX REM LOA .SETF LOAX .270: .IF NE "['$SYGRP',2'S']" SET /UIC=['$SYGRP',2'S'] .IFT D ; .IFT D ; Now we build the Executive .IFT D ; If you must make changes to the Executive build files .IFT D ; answer yes to the following question. Edit RSXBLD.CMD .IFT D ; by issuing the command EDI LB:RSXBLD.CMD. 11SGEN2 will .IFT D ; build the Executive after you resume from the pause. .IFT D ; .ASK Z Do you wish to edit the Executive build file .IFF Z .GOTO 273 .IFINS EDI .GOTO 272 .SETF EDI INS SY:$EDI .272: .IFT $VAX ; 11SGEN2 -- Pausing. To continue type "CONTINUE". .PAUSE .IFT $VAX ; 11SGEN2 -- continuing .IFF EDI REM EDI .SETT EDI .273: .IFINS 'TKBTM' .GOTO 280 .SETF TKB INS SY:$TKB .280: .IF NE "['$SYGRP',2'S']" SET /UIC=['$SYGRP',2'S'] 'TKBTM' @LB:RSXBLD .ASK Z Did the Executive build successfully .IFT Z .GOTO 285 ; ; We will pause now so that you can correct the problem. ; After resuming, we will build the Executive again. ; .IFT $VAX ; 11SGEN2 -- Pausing. To continue type "CONTINUE". .PAUSE .IFT $VAX ; 11SGEN2 -- continuing .GOTO 280 .285: SET /UIC=['$SYGRP',6'S'] .IFNDF $LOD .ASK $LOD Was loadable driver support selected during Sysgen Phase I .1150: .IFF $LOD .GOTO 1179 .ASK Z Do you want to build any loadable drivers now .IFF Z .GOTO 1179 .IFINS 'TKBTM' .GOTO 1160 .SETF TKB INS SY:$TKB .1160: .SETS $TKBX TKBTM @'UIC'SGNBLDDRV.CMD .IFT $LPA11 @['$SGU']BLDLAINIT .IFF TKB REM 'TKBTM' .SETT TKB .1179: .IF NE "['$SYGRP',2'S']" SET /UIC=['$SYGRP',2'S'] .IFF $DUC .IFF $CDB .IFF $DSS .IFF $IPE .GOTO 340 .IFT D ; .IFT D ; Now we build the IP11/IP300, UDC-11, ICS/ICR, OR DRS-11 .IFT D ; device common block. .IFT D ; The device common block resides on the I/O page and .IFT D ; is referenced whenever a task directly accesses any .IFT D ; I/O modules. .IFT D ; .IF $SYGRP EQ 1 .GOTO 1182 ; ; FILES IPBLD.CMD, UDCBLD.CMD, ICBLD.CMD, AND ISBLD.CMD ARE USED TO BUILD ; THE DEVICE COMMON BLOCKS. YOU WILL HAVE TO EDIT THESE FILES SO THAT ; ALL REFERENCES TO UFDS WITH GROUP NUMBER 1 ARE CHANGED TO REFERENCES ; TO UFDS WITH GROUP NUMBER '$SYGRP'. FOR EXAMPLE IF USING EDI, TYPE ; THE FOLLOWING COMMANDS: ; ; >EDI IPBLD.CMD ; *PA/[1,/['SYGRP', ; *EX ; ; WE WILL PAUSE NOW TO ALLOW YOU TO EDIT THESE COMMAND FILES ; .IFT $VAX ; 11SGEN2 -- Pausing. To continue type "CONTINUE". .PAUSE .IFT $VAX ; 11SGEN2 -- continuing .1182: .IFT $IPE 'TKBTM' @'$PRV'IPBLD .IFT $DUC 'TKBTM' @'$PRV'UDCBLD .IFT $CDB 'TKBTM' @'$PRV'ICBLD .IFF MPD .IFT $DSS ; .IFF MPD .IFT $DSS ; You must edit the DSS11 device common block .IFF MPD .IFT $DSS ; build file to set the base address to the nearest .IFF MPD .IFT $DSS ; 32-word bus address at or below the DSS11 module .IFF MPD .IFT $DSS ; address specified during 11SGEN Phase I. .IFF MPD .IFT $DSS ; .IFF MPD .IFT $DSS .IFT D ; Example of base address modification: .IFF MPD .IFT $DSS .IFT D ; .IFF MPD .IFT $DSS .IFT D ; If the base physical bus address of the .IFF MPD .IFT $DSS .IFT D ; DSS11 is 160010 and only one such module .IFF MPD .IFT $DSS .IFT D ; is installed, then the commands to the .IFF MPD .IFT $DSS .IFT D ; editor are: .IFF MPD .IFT $DSS .IFT D ; .IFF MPD .IFT $DSS .IFT D ; *L PAR= .IFF MPD .IFT $DSS .IFT D ; PAR=ISCOM:XXXXXX:400 .IFF MPD .IFT $DSS .IFT D ; *R PAR=ISCOM:160000:100 .IFF MPD .IFT $DSS .IFT D ; *ED .IFF MPD .IFT $DSS .IFT D ; .IFT MPD .OR .IFF $DSS .GOTO 300 .IFINS EDI .GOTO 290 .SETF EDI INS SY:$EDI .290: .IFT $DSS .IFF $BGDSK PIP /NV='$PRV'ISBLD.CMD .IFF MPD .IFT $DSS EDI ['$SYGRP',2'S']ISBLD.CMD .IFF EDI REM EDI .SETT EDI .300: .IFT $DSS 'TKBTM' @ISBLD .340: .IFF LPN .GOTO 350 .IFT LPX .GOTO 350 .IFINS UNL .SETT UNLX .IFF UNLX INS SY:$UNL .IFT $2RK ASN SY:=LB: UNL LP: .IFT $2RK ASN '$PRV'=LB: .IFF UNLX REM UNL .350: .SETF LPX .SETF UNLX .IFF TKB REM 'TKBTM' .SETT TKB .IFF $BGDSK PIP RSX11S.OBJ;*/DE/NM .IFT D ; .IFT D .IFF $DRC ; You now need the Executive map to layout .IFT D .IFT $DRC ; You now need the Executive maps to layout .IFT D ; the partitions in your new system. .IFT D ; .IF $MPD EQ "TT:" .OR .IF $MPD EQ "TT0:" .OR .IF $MPD EQ "NL:" .GOTO 390 .IF $MPD EQ "TI:" .OR .IF $MPD EQ "LP:" .OR .IF $MPD EQ "LP0:" .GOTO 390 .SETF Z .IFF $DRC .ASK Z Do you have the map already .IFT $DRC .ASK Z Do you have the maps already .IFT Z .GOTO 390 .IFLOA LP: .SETT LPX .IFT LPT .IFT LPX .GOTO 360 .IFINS LOA .SETT LOAX .IFF LOAX INS SY:$LOA .IFT $2RK ASN SY:=LB: .IFF LPX LOA LP: .IFT $2RK ASN '$PRV'=LB: .IFF LOAX REM LOA .360: .IFF $DRC .IFF Z PIP 'PIPDEV'['$SYGRP',3'S']RSX11S.MAP'PIPSW' .IFT $DRC .IFF Z PIP 'PIPDEV'['$SYGRP',3'S']RSX11S.MAP'PIPSW',EXCOM1.MAP,EXCOM2.MAP .IFT LPX .GOTO 380 .IFINS UNL .SETT UNLX .IFF UNLX INS SY:$UNL .IFT $2RK ASN SY:=LB: .IFT LPT .IFF LPX UNL LP: .IFT $2RK ASN '$PRV'=LB: .IFF UNLX REM UNL .380: .SETF LOAX .SETF LPX .SETF UNLX .390: .IFT D ; .IFT D ; Look in the map of the Exec for the symbol "$SYTOP" which .IFT D ; indicates the last address allocated to the Exec. User .IFT D ; partitions may start at any location beyond this address .IFT D ; as long as they fall on a 64 byte boundary. See the RSX-11M .IFT D ; Sysgen manual for a description of how to set up partitions. .IFT D ; You may wish to stop at this time to layout your partitions. .IFT D ; .391: .IFF $FUD .GOTO 399 .ASK Z Have you already built the full duplex terminal driver .IFT Z .GOTO 399 .392: .IFT D ; .IFT D ; Now we build the full duplex terminial driver .IFT D ; .IFT D ; .IFT D ; The task build command file for the full duplex terminal drive .IFT D ; specifies that it run in partition TTPAR, having a length of .IFT D ; 40000 octal. .IFT D ; .ASK Z Do you wish to edit the build command file for the terminal driver .IFF Z .GOTO 394 .IFINS EDI .GOTO 393 .SETF EDI INS SY:$EDI .393: EDI LB:TTDRVBLD.CMD .IFF EDI REM EDI .SETT EDI .394: .IFINS 'TKBTM' .GOTO 395 .SETF TKB INS SY:$TKB .395: .IF NE "['$SYGRP',24]" SET /UIC=['$SYGRP',24] 'TKBTM' @LB:TTDRVBLD.CMD .ASK Z Did the terminal driver build successfully .IFT Z .GOTO 396 .IFT D ; .IFT D ; We pause so you can correct the problem. After .IFT D ; resuming, we will build the terminal driver again. .IFT D ; .IFT $VAX ; 11SGEN2 -- Pausing. To continue type "CONTINUE". .PAUSE .IFT $VAX ; 11SGEN2 -- continuing .GOTO 395 .396: .IFF TKB REM 'TKBTM' .SETT TKB .IF $MPD EQ "TT:" .OR .IF $MPD EQ "TT0:" .OR .IF $MPD EQ "NL:" .GOTO 399 .IF $MPD EQ "LP:" .OR .IF $MPD EQ "LP0:" .OR .IF $MPD EQ "TI:" .GOTO 399 .ASK Z List full duplex terminal driver map .IFF Z .GOTO 399 .IFLOA LP: .SETT LPX .IFT LPT .IFT LPX .GOTO 397 .IFINS LOA .SETT LOAX .IFF LOAX INS SY:$LOA .IFT $2RK ASN SY:=LB: .IFF LPX LOA LP: .IFT $2RK ASN '$PRV'=LB: .IFF LOAX REM LOA .397: PIP 'PIPDEV'['$SYGRP',34]TTDRV.MAP'PIPSW' .IFT LPX .GOTO 398 .IFINS UNL .SETT UNLX .IFF UNLX INS SY:$ULN .IFT $2RK ASN SY:=LB: .IFT LPT .IFF LPX UNL LP: .IFT $2RK ASN '$PRV'=LB: .IFF UNLX REM ULN .398: .SETF LOAX .SETF LPX .SETF UNLOA .399: .ASK Z Do you want to continue and build the privileged tasks .IFT Z .GOTO 400 ; ; We will exit now. When you are ready to resume the building ; of the system, execute this indirect command file and ; answer Y to the following question: ; >* Have you already built the Exec? [Y/N]: ; .GOTO 1240 .400: .IFT $2RK .OR .IFT $2RL PIP ['$SYGRP',1]/NV='$PRV'['$SYGRP',1]11SLIB.OLB .IFT $2RK .OR .IFT $2RL DMO '$PRV' .IFT $2RK .OR .IFT $2RL ASN SY:=LB: .IFT D ; .IFT D ; Prepare to assemble and build the RSX-11S privileged .IFT D ; software components. .IFT D ; .IFT D ; The tasks TKTN, BASMCR, OTL, and SIP must be assembled, and the .IFT D ; task build command files possibly edited before they can be built. .IFT D ; The tasks RSDV05, RSDV52, and RSDV1H need only to be built, but .IFT D ; their command files may also be edited before they are built. .IFT D ; It is not necessary to save/print the assembly listings; .IFT D ; However, we recommend that you save/print the task build .IFT D ; maps. This is especially important when generating .IFT D ; an unmapped system -- without maps it will be difficult .IFT D ; to determine partition limits. .IFT D ; .401: .DISABLE LOWERCASE .ASKS ALD Assembly list device for privileged tasks (DDNN:) [D: NL:] .ENABLE LOWERCASE .IF ALD EQ "" .SETS ALD "NL:" .SETF LST .TEST ALD .SETS TEMPS ALD[:] .IF TEMPS NE ":" .SETS ALD ALD+":" .IF ALD EQ "LP0:" .SETS ALD "LP:" .IFF $ONL .OR .IF ALD NE "LP:" .GOTO 403 ; 11SGEN2 -- Listing files can not be sent directly to LP: -- Retry .GOTO 401 .403: .IF ALD EQ "LP:" .IFF $LPR .SETS ALD "TI:" .IF ALD EQ "SY:" .OR .IF ALD EQ "LB:" .SETT LST .IF ALD EQ "LP:" .OR .IF ALD EQ "SY:" .OR .IF ALD EQ "LB:" .GOTO 405 .IF ALD EQ "TI:" .OR .IF ALD EQ "TT:" .OR .IF ALD EQ "NL:" .GOTO 405 .ASK Z Is 'ALD' mounted as a FILES-11 volume with UFD ['$SYGRP',3'S'] .IFT Z .GOTO 405 ; ; We will pause now to allow you to mount and/or UFD 'ALD' .IFT $VAX ; 11SGEN2 -- Pausing. To continue type "CONTINUE". .PAUSE .IFT $VAX ; 11SGEN2 -- continuing .405: .DISABLE LOWERCASE .ASKS MPDV Map device for privileged tasks (DDNN:) [D: SY:] .ENABLE LOWERCASE .IF MPDV EQ "" .GOTO 408 .TEST MPDV .SETS TEMPS MPDV[:] .IF TEMPS NE ":" .SETS MPDV MPDV+":" .IF MPDV EQ "LP0:" .SETS MPDV "LP:" .IFF $ONL .OR .IF MPDV NE "LP:" .GOTO 408 ; 11SGEN2 -- Maps can not be sent directly to LP: -- Retry .GOTO 405 .408: .IF MPDV EQ "LP:" .IFF $LPR .SETS MPDV "TI:" .IF MPDV EQ "LP:" .OR .IF MPDV EQ "" .OR .IF MPDV EQ "LB:" .GOTO 410 .IF MPDV EQ "TI:" .OR .IF MPDV EQ "TT:" .OR .IF MPDV EQ "NL:" .GOTO 410 .ASK Z Is 'MPDV' mounted as a FILES-11 volume with UFD ['$SYGRP',3'S'] .IFT Z .GOTO 410 ; ; We will pause now to allow you to mount and/or UFD 'MPDV' .IFT $VAX ; 11SGEN2 -- Pausing. To continue type "CONTINUE". .PAUSE .IFT $VAX ; 11SGEN2 -- continuing .410: .IFNDF $TKT .GOTO 413 .SETF TKN .ASK Z Have you already built task TKTN .IFT Z .GOTO 417 .SET'$TKT' TKN .IFT TKN .SETS INTKN "" .IFF TKN .SETS INTKN "not " ; ; Task TKTN will 'INTKN'be included in your 11S system as a result ; of your selection in 11SGEN Phase I. ; .GOTO 417 .413: ; .IFT D ; TKTN is the task which interfaces with the Exec to control the .IFT D ; output of task termination and device not ready messages. It can .IFT D ; not be included if during Sysgen Phase I you indicated that you did .IFT D ; not want task termination and device not ready messages. The .IFT D ; RSX-11S version is produced by conditional assembly of the .IFT D ; RSX-11M source, which is included in the RSX-11S kits. .IFT D ; .ASK TKN Do you want to include task TKTN .417: .IFT D ; .IFT D ; The privileged tasks BASMCR, OTL, and SIP were specially designed .IFT D ; for use in the RSX-11S environment. Their inclusion in the system .IFT D ; is optional. If desired, they will be assembled and built under .IFT D ; control of this command file. .IFT D ; .ASK PRV Do you wish to include BASMCR, OTL, or SIP in your system .IFT D ; .IFT D ; The tasks RSDV05, RSDV52, and RSDV1H dynamically display the .IFT D ; the status of memory on a graphics terminal and can be built .IFT D ; for the VT05B terminal, VT52 terminal, and VT100 terminal .IFT D ; respectively. These tasks display which tasks are in memory .IFT D ; and where in memory they reside, which task is currently .IFT D ; running, and the status of pool. .IFT D ; .SETF V05 .SETF V52 .SETF V1H .ASK RSD Do you want to include RSDV05, RSDV52, or RSDV1H .IFT D ; .IFT D ; The RSX-11S subset file control services (FCS) are dist- .IFT D ; ributed as a single file containing the concatenated object .IFT D ; modules. They cannot be placed in the RSX-11M system object .IFT D ; library (SYSLIB.OLB). However, users who require this FCS .IFT D ; should link with the RSX-11S subset of SYSLIB (11SLIB.OLB) .IFT D ; created during this Sysgen. .IFT D ; .ASK FCS Do you wish to include the RSX-11S subset FCS .IFF MSYS .IFT D ; .IFF MSYS .IFT D ; The RSX-11M crash dump analyzer (CDA) .IFF MSYS .IFT D ; may also be built to run on a non-M .IFF MSYS .IFT D ; host system for analysis of RSX-11S .IFF MSYS .IFT D ; crash dumps. .IFF MSYS .IFT D ; .IFT MSYS .SETF CDA .IFF MSYS .ASK CDA Do you wish to build CDA for your host system .IFF TKN .IFF PRV .IFF RSD .IFF FCS .IFF SETTIM .GOTO 700 .IFT $MPLUS .OR .IFT $VAX .GOTO 700 .IFT D ; .IFT D ; If you have previously done an RSX-11S Sysgen on this disk, all .IFT D ; of the files were transferred to the UFD [2,20]. These were .IFT D ; optionally deleted by the Sysgen process. Therefore, unless .IFT D ; it was specified to delete the files or they were later .IFT D ; deleted independently, there is no need to copy all of the .IFT D ; files from the release kit again. .IFT D ; .ASK Z Do you have to copy the files from the release kit .IFF Z .GOTO 700 .420: .430: .; .SETF DXK .; .SETF DYK .SETF DMK .SETF DKK .SETF DLK .SETF MTK .SETF MMK .SETF MSK .SETF DLV .SETF MDV .SETF LDV .SETS INSW "" .SETS OUTSW "" .435: .ASKS DEV Enter device and unit of RSX-11S distribution kit (DDNN:) .IF DEV EQ "" .GOTO 435 .SETS D11S DEV[1:2] .IFNDF 'D11S'K .GOTO 540 .SETT 'D11S'K .IFF DKK .IFF DMK .IFF DLK .GOTO 450 .440: ; ; Place the RSX-11S release kit cartridge disk in drive 'DEV' ; .ASK Z Is the disk ready in drive 'DEV' .IFF Z .GOTO 440 .IFT $2RK .IFT DKK .GOTO 470 .IFT $2RL .IFT DLK .GOTO 470 .ASK LDV Does the driver have to be loaded .GOTO 470 .450: .SETT LDV .; .IFF DXK .IFF DYK .GOTO 480 .460: ; .; Place RSX-11S release kit floppy number one in drive 'DEV' .; .; .ASK Z Is the floppy ready in drive 'DEV' .; .IFF Z .GOTO 460 .470: .SETS COPY "PIP" .SETS FIL "" .SETT MDV .GOTO 550 .480: .SETS COPY "FLX" .SETS FIL "*.*" .520: .IFF MTK .IFF MSK .IFF MMK .GOTO 540 .530: ; ; Place the RSX-11S release kit magtape on drive 'DEV' ; .ASK Z Is the magtape ready on drive 'DEV' .IFF Z .GOTO 530 .SETF T2400 .IFT MSK .SETT T2400 .IFT MMK .ASK T2400 Is the tape a 2400 foot reel .IFT T2400 .SETS OUTSW "/DNS:1600" .GOTO 550 .540: ; ; 11SGEN2 - you have not chosen one of the standard RSX-11S ; distribution kit media. We will repeat the questions. .GOTO 430 .550: .IFF LDV .GOTO 560 .SETS LDEV "" .IFT DKK .SETS LDEV "DK:" .IFT DMK .SETS LDEV "DM:" .IFT DLK .SETS LDEV "DL:" .IFF DKK .IFF DMK .IFF DLK .GOTO 552 .IFLOA 'LDEV' .SETT DEVX .552: .IFLOA 'D11S': .SETT DEVX .IFT DEVX .GOTO 560 .IFINS LOA .SETT LOAX .IFF LOAX INS SY:$LOA .IFF DKK .IFF DMK .IFF DLK .GOTO 555 .IFT $MAP LOA 'LDEV'/PAR=GEN .IFF $MAP LOA 'LDEV' .555: .IFT $MAP LOA 'D11S':/PAR=GEN .IFF $MAP LOA 'D11S': .IFF LOAX REM LOA .560: .SETF LOAX SET /UIC=[2,20] .IFINS UFD .GOTO 570 .SETF UFD INS SY:$UFD .570: UFD SY:[2,20] .IFF UFD REM UFD .SETT UFD PIP *.*;*/DE/NM .IFT MDV MOU 'DEV'11SKIT1 .IFT MDV .OR .IFINS FLX .GOTO 580 .SETF FLX INS SY:$FLX .580: 'COPY' SY:'INSW'='DEV''FIL''OUTSW' .IFT MDV DMO 'DEV' .; .IFF DXK .IFF DYK .GOTO 680 .590:  .; .; Place RSX-11S release kit floppy number two in drive 'DEV' .; .; .ASK Z Is the floppy ready in drive 'DEV' .; .IFF Z .GOTO 590 .; .GOTO 640 .600: .; .; .640: .IFF DXK .IFF DYK .GOTO 680 .; .IFT MDV MOU 'DEV'11SKIT2 .; 'COPY' SY:'INSW'='DEV''FIL''OUTSW' .; .IFT MDV DMO 'DEV' .; .IFF DXK .IFF DYK .GOTO 680 .650: .; .; Place RSX-11S release kit floppy number three in drive 'DEV' .; .; .ASK Z Is the floppy ready in drive 'DEV' .; .IFF Z .GOTO 650 .660: .; .IFT MDV MOU 'DEV'11SKIT3 .; 'COPY' SY:'INSW'='DEV''FIL''OUTSW' .; .IFT MDV DMO 'DEV' .680: .IFF LDV .GOTO 690 .IFT DEVX .GOTO 690 .IFINS UNL .SETT UNLX .IFF UNLX INS SY:$UNL .IFF DKK .IFF DMK .IFF DLK .GOTO 685 UNL 'LDEV' .685: UNL 'D11S': .IFF UNLX REM UNL .690: .SETF DEVX .SETF UNLX .IFF FLX REM FLX .SETT FLX .700: .IFF $2RK .GOTO 705 .IFT D ; .IFT D ; Make room on the baseline disk to complete the 11SGEN .IFT D ; PIP 11SGEN.CMD;*/DE/NM PIP 11SGEN2.CMD/PU/NM .705: .IFF TKN .IFF PRV .IFF RSD .IFF CDA .IFF FCS .IFF SETTIM .GOTO 1140 .IFF TKN .IFF PRV .IFF RSD .IFF CDA .IFF FCS .GOTO 1110 .IFF TKN .IFF PRV .IFF RSD .IFF CDA .GOTO 1090 .IFF TKN .IFF PRV .IFF RSD .GOTO 1089 .720: .IFF TKN .IFF PRV .GOTO 750 SET /UIC=['$UIC',10] .IFINS UFD .GOTO 730 .SETF UFD INS SY:$UFD .730: UFD SY:['$UIC',10] .IFF UFD REM UFD .SETT UFD .740: .ASK Z Do you wish to make corrections to RSX-11S source modules .IFF Z .GOTO 750 SET /UIC=[2,20] ; ; We will now pause to allow you to apply any changes and/or ; corrections to the RSX-11S source modules. ; .IFT $VAX ; 11SGEN2 -- Pausing. To continue type "CONTINUE". .PAUSE .IFT $VAX ; 11SGEN2 -- continuing .750: .IFF TKN .GOTO 800 .IFINS MAC .GOTO 760 .SETF MAC INS SY:$MAC .760: SET /UIC=['$SYGRP',2'S'] .SETS TEMPS ",'ALD'['$SYGRP',3'S']TKTN'$SPL'" .IF ALD EQ "NL:" .SETS TEMPS "" .OPEN TKNASM.CMD .DATA TKTN'TEMPS'=LB:['$SYGRP',1]'SMAC'EXEMC/ML,SY:['$UIC',10]RSXMC/PA:1,SY:[2,20]TKTN .CLOSE MAC @TKNASM PIP TKNASM.CMD;*/DE .IFF MAC REM MAC .SETT MAC .IFT $2RK .IFT LST PIP 'ALD'['$SYGRP',3'S']*.LST;*/DE/NM .SETS TEMP "" .IFF MPD .SETS TEMP "-" .SETS BASE "0" .SETS TEMPS3 "" .IFF $PWI .SETS TEMPS3 "/-WI" .IFF MPD .SETS BASE "20000" .SETS TEMPS2 ",'MPDV'['$SYGRP',3'S']TKN'TEMPS3''$SPL'" .IF MPDV EQ "NL:" .SETS TEMPS2 "" .OPEN TKN11SBLD.CMD .ENABLE DATA ['$SYGRP',6'S']TKN/PR/'TEMP'MM'TEMPS2'=['$SYGRP',2'S']TKTN LB:['$SYGRP',1]EXELIB/LB,SY:['$SYGRP',6'S']RSX11S.STB/SS LB:['$SYGRP',1]SYSLIB/DL  / PRI=248 UNITS=1 ASG=TI:1 STACK=25 PAR=SYSPAR:'BASE':3700 TASK=TKTN / .DISABLE DATA .CLOSE .IFT D ; .IFT D ; The task build command file for TKTN specifies that it run in .IFT D ; partition SYSPAR, having a length of 3700 octal. .IFT D .IFF MPD ; For unmapped systems, its base address is 'BASE' .IFT D .IFF MPD ; octal. If you must alter the starting address, or .IFT D ; If you must change the partition name or length, .IFT D ; you will have to edit its task build command file. .IFT D ; .ASK Z Do you have to edit the task build command file for TKTN .IFF Z .GOTO 780 .IFINS EDI .GOTO 770 .SETF EDI INS SY:$EDI .770: EDI TKN11SBLD.CMD .IFF EDI REM EDI .SETT EDI .780: .IFINS 'TKBTM' .GOTO 790 .SETF TKB INS SY:$TKB .790: 'TKBTM' @TKN11SBLD.CMD .IFF TKB REM 'TKBTM' .SETT TKB .800: .IFF PRV .GOTO 1081 .IFT D ; .IFT D ; BASMCR is a privileged task which supplies a subset (or basic .IFT D ; set) of the RSX-11M MCR commands. It can not be included if .IFT D ; during Sysgen Phase I you indicated that you did not want any .IFT D ; terminal devices. Its size, depending upon options, ranges .IFT D .IFF MPD ; from 6300 to 12500 octal on unmapped systems. .IFT D .IFT MPD ; from 6400 to 14000 octal on mapped systems. .IFT D ; .ASK BMR Do you want to include task BASMCR .IFF BMR .GOTO 890 .IFINS UFD .GOTO 810 .SETF UFD INS SY:$UFD .810: UFD SY:[16,10] UFD SY:[16,2'S'] .IF ALD NE "NL:" UFD 'ALD'[16,3'S'] .IFF UFD REM UFD .SETT UFD SET /UIC=[16,10] PIP BMPRE.MAC;*/DE/NM PIP *.MAC;*/RM/NM PIP [16,*]*.*;*/DE/NM PIP [16,10]=[2,20]BMPRE.MAC PIP [16,10]/EN=[2,20]ABOBAS.MAC,ATLBAS,BRKBAS,ERRBAS,ERRMSG PIP [16,10]/EN=[2,20]FMTDV.MAC,FNDUCB,GNBLK,GETNUM,KEYWD PIP [16,10]/EN=[2,20]LKLST.MAC,MCRBAS,OPEBAS,PRSBAS,REDBAS PIP [16,10]/EN=[2,20]REMBAS.MAC,RPSBAS,RUNBAS,TIMBAS SET /UIC=[16,2'S'] .OPEN BASMCRASM.CMD .SETS TEMPS1 "16" .SETS PRE "BMPRE," .SETS TEMPS "ABOBAS" .GOSUB ASMBLD .SETS TEMPS "ATLBAS" .GOSUB ASMBLD .SETS TEMPS "BRKBAS" .GOSUB ASMBLD .SETS TEMPS "ERRMSG" .GOSUB ASMBLD .SETS TEMPS "ERRBAS" .GOSUB ASMBLD .SETS PRE "" .SETS TEMPS "FMTDV" .GOSUB ASMBLD .SETS TEMPS "FNDUCB" .GOSUB ASMBLD .SETS TEMPS "GNBLK" .GOSUB ASMBLD .SETS TEMPS "GETNUM" .GOSUB ASMBLD .SETS TEMPS "KEYWD" .GOSUB ASMBLD .SETS TEMPS "LKLST" .GOSUB ASMBLD .SETS PRE "BMPRE," .SETS TEMPS "MCRBAS" .GOSUB ASMBLD .SETS TEMPS "OPEBAS" .GOSUB ASMBLD .SETS TEMPS "PRSBAS" .GOSUB ASMBLD .SETS TEMPS "REDBAS" .GOSUB ASMBLD .SETS TEMPS "REMBAS" .GOSUB ASMBLD .SETS TEMPS "RPSBAS" .GOSUB ASMBLD .SETS TEMPS "RUNBAS" .GOSUB ASMBLD .SETS TEMPS "TIMBAS" .GOSUB ASMBLD .CLOSE .IFT D ; .IFT D ; The size of BASIC MCR is dependent upon the inclusion of .IFT D ; conditional assembly code. The inclusion of the code is .IFT D ; controlled by symbol definitions appearing in an assembly .IFT D ; prefix file. The default for these conditionals is .IFT D ; exclusion. The following options, along with the corres- .IFT D ; ponding control symbols, are available: .IFT D ; .IFT D ; R$$ATL - ATL/TAL COMMANDS .IFT D ; R$$ERM - ERROR MESSAGE TEXT .IFT D ; R$$OPE - OPEN COMMAND .IFT D ; .IFT D ; To include an option locate the desired conditional symbol .IFT D ; and remove the semicolon at the beginning of the line. For .IFT D ; example: .IFT D ; .IFT D ; *PL ;R$$ATL .IFT D ; ;R$$ATL = 0 ;INCLUDE ATL .IFT D ; *C /;// .IFT D ; R$$ATL = 0 ;INCLUDE ATL .IFT D ; * .IFT D ; .IFT D ; Repeat this for all desired options. Note that the symbols .IFT D ; appear on consecutive lines in alphabetical order in the file. .IFT D ; .ASK Z Do you wish to edit the assembly prefix file for BASMCR .IFF Z .GOTO 830 .IFINS EDI .GOTO 820 .SETF EDI INS SY:$EDI .820: EDI [16,10]BMPRE.MAC .IFF EDI REM EDI .SETT EDI .830: .IFINS MAC .GOTO 840 .SETF MAC INS SY:$MAC .840: MAC @BASMCRASM.CMD .IFF MAC REM MAC .SETT MAC .IFT $2RK .IFT LST PIP 'ALD'[16,3'S']*.LST;*/DE/NM SET /UIC=['$SYGRP',2'S'] PIP [16,10]BMPRE.MAC;*/DE/NM PIP [16,10]*.MAC;*/RM/NM PIP BASMCR.OBJ=[16,2'S']*.OBJ PIP [16,2'S']*.*;*/DE/NM .IFINS LBR .GOTO 850 .SETF LBR INS SY:$LBR .850: LBR BASMCR/CR:21.:64.:64.=BASMCR .IFF LBR REM LBR .SETT LBR PIP BASMCR.OBJ;*/DE/NM .SETS BASE "0" .SETS LENGTH "14000" .IFF MPD .SETS BASE "20000" .IFF MPD .SETS LENGTH "12500" .IFT MPD .SETS TEMPS "" .IFF MPD .SETS TEMPS "-" .SETS TEMPS3 "" .IFF $PWI .SETS TEMPS3 "/-WI" .SETS TEMPS2 ",'MPDV'['$SYGRP',3'S']BASMCR'TEMPS3''$SPL'" .IF MPDV EQ "NL:" .SETS TEMPS2 "" .OPEN BASMCRBLD.CMD .ENABLE DATA ['$SYGRP',6'S']BASMCR/PR/'TEMPS'MM'TEMPS2'=['$SYGRP',2'S']BASMCR/LB:MCRBAS:ERRBAS ['$SYGRP',2'S']BASMCR/LB ['$SYGRP',6'S']RSX11S.STB/SS LB:['$SYGRP',1]EXELIB/LB LB:['$SYGRP',1]SYSLIB/DL / PAR=MCRPAR:'BASE':'LENGTH' STACK=32 TASK=MCR... PRI=150 UNITS=1 ASG=TI:1 TSKV=$SSTAB:7 / .DISABLE DATA .CLOSE .IFT D ; .IFT D ; The task build command file for BASMCR specifies that it .IFT D .IFF MPD ; run in partition MCRPAR, length 'LENGTH' octal (unmapped). .IFT D .IFT MPD ; run in partition MCRPAR, length 'LENGTH' octal (mapped). .IFT D .IFF MPD ; For unmapped systems, its base address is 'BASE' .IFT D .IFF MPD ; octal. If you must alter that address, or .IFT D ; If you must change the partition name or length, .IFT D ; you will have to edit its task build command file. .IFT D ; .ASK Z Do you wish to edit the task build command file for BASMCR .IFF Z .GOTO 870 .IFINS EDI .GOTO 860 .SETF EDI INS SY:$EDI .860: EDI BASMCRBLD.CMD .IFF EDI REM EDI .SETT EDI .870: .IFINS 'TKBTM' .GOTO 880 .SETF TKB INS SY:$TKB .880: 'TKBTM' @BASMCRBLD.CMD .IFF TKB REM 'TKBTM' .SETT TKB .890: .IFT D ; .IFT D ; OTL is a privileged task which is the RSX-11S on-line task loader. .IFT D ; It performs the install, load, and fix functions for tasks which .IFT D ; were created on a host development system and copied via FLX to a .IFT D ; load medium. Depending on the number of load devices, etc, OTL .IFT D .IFF MPD ; ranges from 6200 to 10600 octal on unmapped systems. .IFT D .IFT MPD ; ranges from 8000 to 15000 octal on mapped systems. .IFT D ; .ASK OTL Do you want to include task OTL .IFF OTL .GOTO 980 .IFINS UFD .GOTO 900 .SETF UFD INS SY:$UFD .900: UFD SY:[20,10] UFD SY:[20,2'S'] .IF ALD NE "NL:" UFD 'ALD'[20,3'S'] .IFF UFD REM UFD .SETT UFD SET /UIC=[20,10] PIP SY:OTLPRE.MAC;*/DE/NM PIP SY:*.MAC;*/RM/NM PIP [20,*]*.*;*/DE/NM PIP [20,10]=[2,20]OTLPRE.MAC PIP [20,10]/EN=[2,20]OTL.MAC,OTLCD,OTLCM,OTLERR PIP [20,10]/EN=[2,20]OTLHD.MAC,OTLLB,OTLLD,OTLQIO,OTLRD SET /UIC=[20,2'S'] .OPEN OTLASM.CMD .SETS TEMPS1 "20" .SETS PRE "OTLPRE," .SETS TEMPS "OTL" .GOSUB ASMBLD .SETS TEMPS "OTLCD" .GOSUB ASMBLD .SETS TEMPS "OTLCM" .GOSUB ASMBLD .SETS TEMPS "OTLERR" .GOSUB ASMBLD .SETS TEMPS "OTLHD" .GOSUB ASMBLD .SETS TEMPS "OTLLB" .GOSUB ASMBLD .SETS TEMPS "OTLLD" .GOSUB ASMBLD .SETS TEMPS "OTLQIO" .GOSUB ASMBLD .SETS TEMPS "OTLRD" .GOSUB ASMBLD .CLOSE .IFT D ; .IFT D ; The size of OTL is dependent upon the inclusion of conditional .IFT D ; assembly code. The inclusion of the code is done in two ways, .IFT D ; by a single symbol definition and by macro calls appearing .IFT D ; in an assembly prefix file. The first controls the inclusion .IFT D ; of error message text. To include this option, locate the .IFT D ; symbol R$$ERM, and remove the semicolon from the beginning .IFT D ; of the line. The default for error message text is exclusion. .IFT D ; For example: .IFT D ; .IFT D ; *PL ;R$$ERM .IFT D ; ;R$$ERM=0 .IFT D ; *C /;// .IFT D ; R$$ERM=0 .IFT D ; .IFT D ; The other type of option concerns the exclusion of unwanted .IFT D ; device support. For each of the OTL load devices which .IFT D ; were included in Sysgen Phase I, corresponding support will be .IFT D ; generated in OTL. Naturally, support will not be generated for .IFT D ; those OTL load devices which were not included in Sysgen Phase I. .IFT D ; The following devices along with corresponding control symbols .IFT D ; may be supported by OTL: .IFT D ; .IFT D ; PR11 - PAPER TAPE READER ------ PR .IFT D ; RX11 - RX11 FLEXIBLE DISK ----- DX .IFT D ; RX21 - RX211 FLEXIBLE DISK ---- DY .IFT D ; TA11 - CASSETTE TAPE ---------- CT .IFT D ; TC11 - DECTAPE ---------------- DT .IFT D ; TM11 - TM/TMA/TMB11 MAGTAPE --- MT .IFT D ; TS11 - TS04 MAGTAPE ----------- MS .IFT D ; TU16 - TJ/TWU16-45 MAGTAPE ---- MM .IFT D ; TU58 - TU58 CARTRIDGE --------- DD .IFT D ; .IFT D ; To exclude OTL support for a device which has been generated into .IFT D ; your RSX-11S Executive, locate the corresponding device symbol .IFT D ; and place a semicolon at the beginning of the line. For example: .IFT D ; .IFT D ; *PL PR11 .IFT D ; INCLUD PR11,P$$R11 ;PC11/PR11 SUPPORT .IFT D ; *C //;/ .IFT D ; ; INCLUD PR11,P$$R11 ;PC11/PR11 SUPPPRT .IFT D ; * .IFT D ; .IFT D ; Perform this for all of the above devices which will be part of .IFT D ; your RSX-11S Executive, but for which you do not want OTL .IFT D ; support. Note that the symbols appear on consecutive lines in .IFT D ; alphabetical order in the file. .IFT D ; .ASK Z Do you wish to edit the assembly prefix file for OTL .IFF Z .GOTO 920 .IFINS EDI .GOTO 910 .SETF EDI INS SY:$EDI .910: EDI [20,10]OTLPRE.MAC .IFF EDI REM EDI .SETT EDI .920: .IFINS MAC .GOTO 930 .SETF MAC INS SY:$MAC .930: MAC @OTLASM.CMD .IFF MAC REM MAC .SETT MAC .IFT $2RK .IFT LST PIP 'ALD'[20,3'S']*.LST;*/DE/NM SET /UIC=['$SYGRP',2'S'] PIP [20,10]OTLPRE.MAC;*/DE/NM PIP [20,10]*.MAC;*/RM/NM PIP OTL.OBJ=[20,2'S']*.OBJ PIP [20,2'S']*.*;*/DE/NM .IFINS LBR .GOTO 940 .SETF LBR INS SY:$LBR .940: LBR OTL/CR:21.:128.:64.=OTL .IFF MPD LBR OTL=[2,20]BLXIOU .IFT MPD LBR OTL=[2,20]BLXIOM .IFF LBR REM LBR .SETT LBR PIP OTL.OBJ;*/DE/NM .SETS BASE "0" .SETS LENGTH "15000" .IFF MPD .SETS BASE "20000" .IFF MPD .SETS LENGTH "10600" .IFT MPD .SETS TEMPS "" .IFF MPD .SETS TEMPS "-" .SETS TEMPS3 "" .IFF $PWI .SETS TEMPS3 "/-WI" .SETS TEMPS2 ",'MPDV'['$SYGRP',3'S']OTL'TEMPS3''$SPL'" .IF MPDV EQ "NL:" .SETS TEMPS2 "" .OPEN OTLBLD.CMD .ENABLE DATA ['$SYGRP',6'S']OTL/PR/'TEMPS'MM'TEMPS2'=['$SYGRP',2'S']OTL/LB:OTL,OTL/LB LB:['$SYGRP',1]SYSLIB/LB:CAT5:SAVRG:SAVAL:CBTA ['$SYGRP',6'S']RSX11S.STB/SS,LB:['$SYGRP',1]EXELIB/LB LB:['$SYGRP',1]SYSLIB/DL / STACK=32 UNITS=3 ASG=TI:2 TSKV=$STVEC:7 PAR=OTLPAR:'BASE':'LENGTH' / .DISABLE DATA .CLOSE .IFT D ; .IFT D ; The task build command file for OTL specifies that it .IFT D .IFF MPD ; run in partition OTLPAR, length 'LENGTH' octal (unmapped). .IFT D .IFT MPD ; run in partition OTLPAR, length 'LENGTH' octal (mapped). .IFT D .IFF MPD ; For unmapped systems, its base address is 'BASE' .IFT D .IFF MPD ; octal. If you must alter that address, or .IFT D ; If you must change the partition name or length, .IFT D ; you will have to edit its task build command file. .IFT D ; .ASK Z Do you wish to edit the task build command file for OTL .IFF Z .GOTO 960 .IFINS EDI .GOTO 950 .SETF EDI INS SY:$EDI .950: EDI OTLBLD.CMD .IFF EDI REM EDI .SETT EDI .960: .IFINS 'TKBTM' .GOTO 970 .SETF TKB INS SY:$TKB .970: 'TKBTM' @OTLBLD.CMD .IFF TKB REM 'TKBTM' .SETT TKB .980: .IFT D ; .IFT D ; SIP is a privileged task which performs the RSX-11S system .IFT D ; image preservation duties. It replaces the RSX-11M SAV MCR .IFT D ; command. Depending on the number of load devices, etc, SIP .IFT D .IFF MPD ; ranges from 3500 to 6700 octal on unmapped systems. .IFT D .IFT MPD ; ranges from 3700 to 7400 octal on mapped systems. .IFT D ; .ASK SIP Do you want to include task SIP .IFF SIP .GOTO 1081 .IFINS UFD .GOTO 990 .SETF UFD INS SY:$UFD .990: UFD SY:[21,10] UFD SY:[21,2'S'] .IF ALD NE "NL:" UFD 'ALD'[21,3'S'] .IFF UFD REM UFD .SETT UFD SET /UIC=[21,10] PIP SY:SIPPRE.MAC;*/DE/NM PIP SY:*.MAC;*/RM/NM PIP [21,*]*.*;*/DE/NM  PIP [21,10]=[2,20]SIPPRE.MAC PIP [21,10]/EN=[2,20]SIP.MAC,SIPBOO,SIPCD,SIPERR PIP [21,10]/EN=[2,20]SIPLD.MAC,SIPQIO SET /UIC=[21,2'S'] .OPEN SIPASM.CMD .SETS TEMPS1 "21" .SETS PRE "SIPPRE," .SETS TEMPS "SIP" .GOSUB ASMBLD .SETS TEMPS "SIPBOO" .GOSUB ASMBLD .SETS TEMPS "SIPCD" .GOSUB ASMBLD .SETS TEMPS "SIPERR" .GOSUB ASMBLD .SETS TEMPS "SIPLD" .GOSUB ASMBLD .SETS TEMPS "SIPQIO" .GOSUB ASMBLD .CLOSE .IFF OTL .GOTO 1000 .GOTO 995 .ASMBLD: .SETS TEMPS2 ",'ALD'['TEMPS1',3'S']'TEMPS''$SPL'" .DATA 'TEMPS''TEMPS2'=LB:['$SYGRP',1]'SMAC'EXEMC/ML,SY:['$UIC',10]RSXMC/PA:1,SY:['TEMPS1',10]'PRE''TEMPS' .RETURN .995: .IFT D ; .IFT D ; The size of SIP is dependent upon conditional assembly code .IFT D ; in exactly the same manner as OTL. There are only a few minor .IFT D ; differences. OTL supports the paper tape reader using the .IFT D ; control symbol PR11; SIP on the other hand supports the paper .IFT D ; tape punch using the control symbol PP11. In addition, OTL .IFT D ; supports DECtape II cartridges using control symbol TU58 and .IFT D ; TS11 magnetic tape drives using the control symbol TS11. .IFT D ; Edit SIPPRE.MAC in the same way described for OTL. For example: .IFT D ; .IFT D ; *PL PP11 .IFT D ; INCLUD PP11,P$$P11 ;PC11/PR11 SUPPORT .IFT D ; *C //;/ .IFT D ; ; INCLUD PP11,P$$P11 ;PC11/PR11 SUPPPRT .IFT D ; * .IFT D ; .GOTO 1010 .1000: .IFT D ; .IFT D ; The size of SIP is dependent upon the inclusion of conditional .IFT D ; assembly code. The inclusion of the code is done in two ways, .IFT D ; by a single symbol definition and by macro calls appearing .IFT D ; in an assembly prefix file. The first controls the inclusion .IFT D ; of error message text. To include this option, locate the .IFT D ; symbol R$$ERM, and remove the semicolon from the beginning .IFT D ; of the line. The default for error message text is exclusion. .IFT D ; For example: .IFT D ; .IFT D ; *PL ;R$$ERM .IFT D ; ;R$$ERM=0 .IFT D ; *C /;// .IFT D ; R$$ERM=0 .IFT D ; .IFT D ; The other type of option concerns the exclusion of unwanted .IFT D ; device support. For each of the SIP load devices which .IFT D ; were included in Sysgen Phase I, corresponding support will be .IFT D ; generated in SIP. Naturally, support will not be generated for .IFT D ; those SIP load devices which were not included iN Sysgen Phase I. .IFT D ; The following devices along with corresponding control symbols .IFT D ; may be supported by SIP: .IFT D ; .IFT D ; PP11 - PAPER TAPE PUNCH .IFT D ; RX11 - RX11 FLEXIBLE DISK .IFT D ; RX21 - RX211 FLEXIBLE DISK .IFT D ; TA11 - CASSETTE TAPE .IFT D ; TC11 - DECTAPE .IFT D ; TM11 - TM/TMA/TMB11 MAGTAPE .IFT D ; TU16 - TJ/TWU16-45 MAGTAPE .IFT D ; .IFT D ; To exclude SIP support for a device which has been generated into .IFT D ; your RSX-11S Executive, locate the corresponding device symbol .IFT D ; and place a semicolon at the beginning of the line. For example: .IFT D ;  .IFT D ; *PL PP11 .IFT D ; INCLUD PP11,P$$P11 ;PC11 SUPPORT .IFT D ; *C //;/ .IFT D ; ; INCLUD PP11,P$$P11 ;PC11 SUPPORT .IFT D ; * .IFT D ; .IFT D ; Perform this for all of the above devices which will be part of .IFT D ; your RSX-11S Executive, but for which you do not want SIP .IFT D ; support. Note that the symbols appear on consecutive lines in .IFT D ; alphabetical order in the file. .IFT D ; .1010: .ASK Z Do you wish to edit the assembly prefix file for SIP .IFF Z .GOTO 1030 .IFINS EDI .GOTO 1020 .SETF EDI INS SY:$EDI .1020: EDI [21,10]SIPPRE.MAC .IFF EDI REM EDI .SETT EDI .1030: .IFINS MAC .GOTO 1040 .SETF MAC INS SY:$MAC .1040: MAC @SIPASM.CMD .IFF MAC REM MAC .SETT MAC .IFT $2RK .IFT LST PIP 'ALD'[21,3'S']*.LST;*/DE/NM SET /UIC=['$SYGRP',2'S'] PIP [21,10]SIPPRE.MAC;*/DE/NM PIP [21,10]*.MAC;*/RM/NM PIP SIP.OBJ=[21,2'S']*.OBJ PIP [21,2'S']*.*;*/DE/NM .IFINS LBR .GOTO 1050 .SETF LBR INS SY:$LBR .1050: LBR SIP/CR:20.:64.:64.=SIP .IFF LBR REM LBR .SETT LBR PIP SIP.OBJ;*/DE/NM .SETS TEMP "" .IFF MPD .SETS TEMP "-" .SETS BASE "0" .SETS LENGTH "7400" .IFF MPD .SETS BASE "20000" .IFF MPD .SETS LENGTH "6700" .SETS TEMPS3 "" .IFF $PWI .SETS TEMPS3 "/-WI" .SETS TEMPS2 ",'MPDV'['$SYGRP',3'S']SIP'TEMPS3''$SPL'" .IF MPDV EQ "NL:" .SETS TEMPS2 "" .OPEN SIPBLD.CMD .ENABLE DATA ['$SYGRP',6'S']SIP/PR/'TEMP'MM'TEMPS2'=['$SYGRP',2'S']SIP/LB:SIPBOO,SIP/LB LB:['$SYGRP',1]SYSLIB/LB:CBTA ['$SYGRP',6'S']RSX11S.STB/SS,LB:['$SYGRP',1]EXELIB/LB LB:['$SYGRP',1]SYSLIB/DL / STACK=32 UNITS=2 ASG=TI:2 TSKV=$STVEC:7 PAR=SIPPAR:'BASE':'LENGTH' / .DISABLE DATA .CLOSE .IFT D ; .IFT D ; The task build command file for SIP specifies that it .IFT D .IFF MPD ; run in partition SIPPAR, length 'LENGTH' octal (unmapped). .IFT D .IFT MPD ; run in partition SIPPAR, length 'LENGTH' octal (mapped). .IFT D .IFF MPD ; For unmapped systems, its base address is 'BASE' .IFT D .IFF MPD ; octal. If you must alter that address, or .IFT D ; If you must change the partition name or length, .IFT D ; you will have to edit its task build command file. .IFT D ; .ASK Z Do you wish to edit the task build command file for SIP .IFF Z .GOTO 1070 .IFINS EDI .GOTO 1060 .SETF EDI INS SY:$EDI .1060: EDI SIPBLD.CMD .IFF EDI REM EDI .SETT EDI .1070: .IFINS 'TKBTM' .GOTO 1080 .SETF TKB INS SY:$TKB .1080: 'TKBTM' @SIPBLD.CMD .IFF TKB REM 'TKBTM' .SETT TKB .1081: .IFF RSD .GOTO 1089 SET /UIC=['$SYGRP',2'S'] .IFT MPD PIP RMD.OLB/NV=[2,20]RMDMAP.OLB .IFF MPD PIP RMD.OLB/NV=[2,20]RMDUNM.OLB .ASK V05 Do you want to include task RSDV05 .IFF V05 .GOTO 1083 .SETS TEMP "V05" .SETS TEMPS1 "41401" .SETS TEMPS2 "41003" .GOSUB RSDBLD .IFT D ; .IFT D ; The task build file for RSDV05 specifies that it run .IFT D ; in partition RSDV05, length 40000 (octal). .IFT D .IFF MPD ; For unmapped systems, its base address is 20000 (octal). .IFT D ; If you must change the partition name or length, you .IFT D ; will have to edit the task build command file. .IFT D ; .ASK Z Do you wish to edit the task build command file for RSDV05 .IFF Z .GOTO 1083 .IFINS EDI .GOTO 1082 .SETF EDI INS SY:$EDI .1082: EDI RSDV05BLD.CMD .IFF EDI REM EDI .SETT EDI .1083: .ASK V52 Do you want to include task RSDV52 .IFF V52 .GOTO 1085 .SETS TEMP "V52" .SETS TEMPS1 "43001" .SETS TEMPS2 "42403" .GOSUB RSDBLD .IFT D ; .IFT D ; The task build command file for RSDV52 specifies that it .IFT D ; run in partition RSDV52, length 40000 (octal). .IFT D .IFF MPD ; For unmapped sysetms, its base address is 20000 (octal). .IFT D ; If you must change the partition name or length, you .IFT D ; will have to edit the task build command file. .IFT D ; .ASK Z Do you wish to edit the task build command file for RSDV52 .IFF Z .GOTO 1085 .IFINS EDI .GOTO 1084 .SETF EDI INS SY:$EDI .1084: EDI RSDV52BLD.CMD .IFF EDI REM EDI .SETT EDI .1085: .ASK V1H Do you want to include task RSDV1H .IFF V1H .GOTO 1087 .SETS TEMP "V1H" .SETS TEMPS1 "43001" .SETS TEMPS2 "42403" .GOSUB RSDBLD .GOTO 108A .RSDBLD: .IFT MPD .SETS MMSW "MM" .IFF MPD .SETS MMSW "-MM" .SETS BASE "0" .IFF MPD .SETS BASE "20000" .SETS TEMPS3 "" .IFF $PWI .SETS TEMPS3 "/-WI" .SETS TEMPS4 ",'MPDV'['$SYGRP',3'S']RSD'TEMP''TEMPS3''$SPL'" .IF MPDV EQ "NL:" .SETS TEMPS4 "" .OPEN RSD'TEMP'BLD.CMD .ENABLE DATA ['$SYGRP',6'S']RSD'TEMP'/PR/'MMSW''TEMPS4'= ['$SYGRP',2'S']RMD/LB:RMDEMO:RMDRIV:GBLCHA:'TEMP'CHA:GBLGBM:GBLMDM:'TEMP'MDM ['$SYGRP',2'S']RMD/LB:GBCOM:MDCOM:RMDXCM ['$SYGRP',2'S']RMD/LB:REMAP:GBINIT:MDINIT:GBPAGE:MDPAGE:GBCMD:MDCMD LB:['$SYGRP',1]SYSLIB/LB:CATB:CAT5:CBTA:CDDMG:C5TA:EDDAT ['$SYGRP',2'S']RMD/LB:NUL11S,['$SYGRP',6'S']RSX11S.STB/SS LB:['$SYGRP',1]SYSLIB/DL / ASG=TI:1:2 PRI=225 EXTSCT=$SCRN:6140 PAR=RSD'TEMP':'BASE':40000 TASK=RSD'TEMP' ;CLEAR OUT PAGE TABLE TO PREVENT TASK FROM TRYING TO ;LOAD IN ANOTHER PAGE. ALL KEYS REPLOT CURRENT PAGE GBLPAT=RMDEMO:$PGTBL:0:0:0:0:0:0:0:0 GBLPAT=RMDEMO:$PGTBL+20:0:0:0:0:0:0:0:0 GBLPAT=RMDEMO:$PGTBL+40:0:0:0:0:0:0:0:0 GBLPAT=RMDEMO:$PGTBL+60:0:0:0:0:0:0:0:0 GBLPAT=RMDEMO:$PGTBL+100:0:0:0:0:0:0:0:0 GBLPAT=RMDEMO:$PGTBL+120:0:0:0:0:0:0:0:0 GBLPAT=RMDEMO:$PGTBL+140:0:0:0:0:0:0:0:0 GBLPAT=RMDEMO:$PGTBL+160:0:0:0:0:0:0:0:0 ; TAILOR DISPLAY TO 11S GBLPAT=RMDEMO:$MDFRH:0 GBLPAT=RMDEMO:$MDFRE:0:0:0:0 GBLPAT=RMDEMO:$MDOTH:0 GBLPAT=RMDEMO:$MDOTN:0 GBLPAT=RMDEMO:$MDOTK:0 GBLPAT=RMDEMO:$MDPRH:'TEMPS1' GBLPAT=RMDEMO:$MDPRL:'TEMPS2' GBLPAT=RMDEMO:HEADER+6:20123:31126  GBLPAT=RMDEMO:$MDERH:0 GBLPAT=RMDEMO:$MDERR:0 // .DISABLE DATA .CLOSE .RETURN .108A: .IFT D ; .IFT D ; The task build command file for RSDV1H specifies that it .IFT D ; run in partition RSDV1H, length 40000 (octal). .IFT D .IFF MPD ; For unmapped systems, its base address is 20000 (octal). .IFT D ; If you must change the partition name or length, you .IFT D ; will have to edit the task build command file. .IFT D ; .ASK Z Do you wish to edit the task build command file for RSDV1H .IFF Z .GOTO 1087 .IFINS EDI .GOTO 1086 .SETF EDI INS SY:$EDI .1086: EDI RSDV1HBLD.CMD .IFF EDI REM EDI .SETT EDI .1087: .IFINS 'TKBTM' .GOTO 1088 .SETF TKB INS SY:$TKB .1088: .IFT V05 'TKBTM' @RSDV05BLD.CMD .IFT V52 'TKBTM' @RSDV52BLD.CMD .IFT V1H 'TKBTM' @RSDV1HBLD.CMD .IFF TKB REM 'TKBTM' .SETT TKB .1089: .IFF CDA .GOTO 1090 .; .; Set up symbols for CDABLD "BLD" file, MAPPED .; SET /UIC=['$SYGRP',24] .SETT $FCSTK .SETT $11M .SETF $11MPL .SETS $TYP1 "" .SETS $TYP2 ""  .SETS $LIBOP "" .SETS $CL "" .SETS $MMSW "/MM" .SETS $TK "SY:['$SYGRP',64]" .SETS $MP "['$SYGRP',34]" .SETS $OD "SY:['$SYGRP',24]" .SETS $LI "SY:['$SYGRP',20]" .SETS $GENB "GEN:0:70000" .SETS $COM "ON A MAPPED SYSTEM" .SETS $RSLIB "SYSLIB" .SETS $BLDID "11SGEN2.CMD" @CDABLD.BLD ; ; It may be necessary to edit the task build command file and ODL file ; to build CDA for the non-M host. Change the partition name and ; base address to match that of the partition (on the host system) into ; which CDA will be installed. You will also need to change the ODL ; file to reference the correct device on the host where SYSLIB and ; EXELIB reside. The files are named CDABLD.CMD and CDABLD.ODL. ; We will now pause to allow you to edit the command files. .; .IFT $VAX ; 11SGEN2 -- Pausing. To continue type "CONTINUE". .PAUSE .IFT $VAX ; 11SGEN2 -- continuing .; .IFINS TKB .GOTO 89A .SETF TKB INS SY:$TKB .89A: SET /UIC=['$SYGRP',64] TKB @['$SYGRP',24]CDABLD .IFF TKB REM TKB .SETT TKB ; The CDA.TSK file resides in ['$SYGRP',64] on your RSX-11S sysgen disk ; and can be run on the host system. .IFT $VAX ; CDA must be run in compatibility mode on VAX/VMS hosts. SET /UIC=['$SYGRP',2'S'] .1090: .IFF FCS .GOTO 1110 .IFT D ; .IFT D ; Add subset FCS to the RSX-11S system object library .IFT D ; SET /UIC=['$SYGRP',1] .IFINS LBR .GOTO 1100 .SETF LBR INS SY:$LBR .1100: LBR LB:11SLIB/RP=[2,20]FCS11S .IFF LBR REM LBR .SETT LBR PIP LB:11SLIB.OLB/PU/NM .1110: .IFF SETTIM .GOTO 1140 .IFT D .IFT SETTIM ; .IFT D .IFT SETTIM ; Support for the Set Time directive was chosen in .IFT D .IFT SETTIM ; Sysgen Phase I. Produce the SETTIM object module. .IFT D .IFT SETTIM ; SET /UIC=['$SYGRP',2'S'] .IFINS MAC .GOTO 1120 .SETF MAC INS SY:$MAC .1120: .SETS TEMPS ",'ALD'['$SYGRP',3'S']SETTIM'$SPL'" .IF ALD EQ "NL:" .SETS TEMPS "" .OPEN SETTIMASM.CMD .DATA SETTIM'TEMPS'=['$SYGRP',1]'SMAC'EXEMC/ML,['$UIC',10]RSXMC/PA:1,[2,20]SETTIM .CLOSE MAC @SETTIMASM PIP SETTIMASM.CMD;*/DE .IFF MAC REM MAC .SETT MAC .IFT $2RK .IFT LST PIP 'ALD'['$SYGRP',3'S']SETTIM.LST;*/DE/NM .1140: SET /UIC=['$SYGRP',6'S'] .1170: PIP *.*/PU/NM PIP ['$SYGRP',2'S']*.*/PU/NM .IFT D ; .IFT D ; The operation left to be performed is that of the final .IFT D ; configuration of the virgin executive using Virtual MCR. .IFT D ; .ASK Z Do you want to configure the Exec at this time using VMR .IFF Z .GOTO 1240 .IFT $2RK .IFT D ; .IFT $2RK .IFT D ; Provide enough space for the system image by deleting .IFT $2RK .IFT D ; libraries copied earlier to the baseline. .IFT $2RK .IFT D ; .IFT $2RK PIP [1,1]SYSLIB.OLB;*/DE/NM,EXELIB.OLB;* .IFT D; .IFT D ; The contents of your RSX-11S release kit currently resides .IFT D ; under the UFD [2,20]. If your SY: disk is not an RK06/07 or an .IFT D ; RP04/05/06 you may want to delete these files. Leaving .IFT D ; them on the disk will save the time of re-copying them the next .IFT D ; time you perform an RSX-11S Sysgen. If your SY: disk is an RK05, .IFT D ; they will be automatically deleted. .IFT D ; .IFF $2RK .ASK Z Do you want to delete the RSX-11S kit from this disk .IFT Z .OR .IFT $2RK PIP [2,20]*.*;*/DE/NM .SETS SIZE "/NV" .IFDF $TME .SETN BLKS ($TME*4.)+2. .IFDF $TME .IF BLKS GT 498. .SETN BLKS 498. .IFT MPD .AND .IFDF $TME .SETS SIZE "'SIZE'/CO/BL:'BLKS.'" .IFDF $TME .OR .IFF MPD .GOTO 1190 .IFT D ; .IFT D ; You now must specify whether the memory size which you .IFT D ; specified for your target system in SGN during Sysgen .IFT D ; Phase I is greater than 32K words. .IFT D ; .ASK Z Is your target system larger than 32K words .IFF Z .GOTO 1190 .IFT D ; .IFT D ; If you ever wish to have tasks fixed above 32K words in an .IFT D ; image of your target system, you must create a larger .IFT D ; copy of your system with PIP at this time. .IFT D ; .ASK Z Do you wish to create a larger copy of your system .IFF Z .GOTO 1190 .IFT D ; .IFT D ; At this time we will invoke PIP to allow you to create a .IFT D ; larger copy of your system. To do so, enter the following .IFT D ; command: .IFT D ; .IFT D ; PIP>RSX11S.SYS/NV/CO/BL:N.=RSX11S.TSK .IFT D ; PIP>^Z .IFT D ; .IFT D ; To create a system image in which task images may be fixed up .IFT D ; to M Kwords, you may calculate a value for N in the above .IFT D ; command as follows: .IFT D ; .IFT D ; N=(4*M)+2 .IFT D ; .IFT D ; For example, for the ability to fix tasks in the system image .IFT D ; up to 40K, the command would be: .IFT D ; .IFT D ; PIP>RSX11S.SYS/NV/CO/BL:162.=RSX11S.TSK .IFT D ; PIP>^Z .IFT D ; PIP .GOTO 1200 .1190: .IFT D ; .IFT D ; We will now make a copy of your target system .IFT D ; PIP RSX11S.SYS'SIZE'=RSX11S.TSK .1200: .IFT D ; .IFT D ; If you wish to make a copy of your task or system image file .IFT D ; on another device we will pause now to allow you to do so. .IFT D ; .ASK Z Do you wish to copy your system to another device .IFF Z .GOTO 1210 ; ; We will now pause to allow you to perform the copy. ; .IFT $VAX ; 11SGEN2 -- Pausing. To continue type "CONTINUE". .PAUSE .IFT $VAX ; 11SGEN2 -- continuing SET /UIC=['$SYGRP',6'S'] .1210: .IFT D ; .IFT D ; RSX11S.TSK is a backup copy of the 11S system you have just built. .IFT D ; If you do not wish to retain it, we will delete it now. .IFT D ; .ASK Z Do you wish to delete the system backup file RSX11S.TSK .IFT Z PIP RSX11S.TSK;0/DE/NM .IFT D ; .IFT D ; Your target system is now ready to set up partitions and install .IFT D ; the required tasks. The procedure to follow is: .IFT D ; 1) Run Virtual MCR .IFT D ; 2) Extend POOL space to base of first partition .IFT D ; 3) Set up your partitions .IFT D .IFT DEVCOM ; 3A) Setup common block for DSS, UDC or ICR/ICS .IFT D .IFT $LOD ; 3B) Load needed drivers .IFT D .IFT $DRC ; 3C) Set up a partition for the Directive Common .IFT D .IFT $LPA11 ; 3D) Install the LPA11 modules .IFT D ; 4) Install tasks (BASMCR, OTL, SIP, TKTN) .IFT D ; 5) Fix tasks into (virtual) memory .IFT D ; 6) Optionally set the time and save a copy of THE .IFT D ; system on a bootable medium .IFT D ; 7) Exit from virtual MCR and boot in your target system ; .IFF D ; Setup the target system basing commands on the following ; VMR example: ; ; >VMR ! RUN VIRTUAL MCR ; ENTER FILENAME:RSX11S.SYS ! VMR PROMPTS FOR FILE NAME ; VMR>SET /POOL=XXX ! EXTEND POOL TO FIRST PARTITION BASE .IFT $FUD ; VMR>SET /MAIN=TTPAR:XXX:XXX:TASK !SET UP FULL DUPLEX TT PARTITION .IFT $LOD ; VMR>SET /MAIN=DRVPAR:XXX:XXX:TASK ! SET UP DRIVER PARTITION .IFT $DRC ; VMR>SET /MAIN=EXCOM1:XXX:XXX:COM ! SET 1ST EXEC. COMMON .IFT $DRC ; VMR>INS EXCOM1 !INSTALL 1ST EXECUTIVE COMMON .IFT $DRC ; VMR>SET /MAIN=EXCOM2:XXX:XXX:COM ! SET 2ND EXEC. COMMON .IFT $DRC ; VMR>INS EXCOM2 !INSTALL 2ND EXECUTIVE COMMON ; VMR>SET /MAIN=SYSPAR:XXX:XXX:TASK ! SET UP TKTN PARTITION ; VMR>SET /MAIN=MCRPAR:XXX:XXX:TASK ! SET UP MCR PARTITION ; VMR>SET /MAIN=OTLPAR:XXX:XXX:TASK ! SET UP OTL PARTITION ; VMR>SET /MAIN=SIPPAR:XXX:XXX:TASK ! SET UP SIP PARTITION .IFT V05 ; VMR>SET /MAIN=RSDV05:XXX:XXX:TASK !SET UP RSDV05 PAR .IFT V52 ; VMR>SET /MAIN=RSDV52:XXX:XXX:TASK !SET UP RSDV52 PAR .IFT V1H ; VMR>SET /MAIN=RSDV1H:XXX:XXX:TASK !SET UP RSDV1H PAR ; VMR>SET /MAIN=GEN:XXX:XXX:SYS ! IF SYSTEM CONTROLLED PAR. ; VMR>SET /MAIN=GEN:XXX:XXX:TASK ! IF USER CONTROLLED PARTITION .IFT $LPA11 ; VMR>INS LAINIT !INSTALL THE LPA11 MODULES .IFT $LPA11 ; VMR>INS LAIN0 ! .IFF DEVCOM .GOTO 1220 .IFF $DSS .IFT MPD .SETS BAS "7710" .IFF $DSS .IFF MPD .SETS BAS "1710" .IFT $DSS .IFT MPD .SETS BAS "7610" .IFT $DSS .IFF MPD .SETS BAS "1610" .IFF $DSS .SETS BAS "1710" .IFT $CDB ; VMR>SET /MAIN=ICOM:'BAS':10:DEV ! SET UP COMMON .IFT $CDB ; VMR>INS ['$SYGRP',1]ICOM ! SET COMMON RESIDENT .IFT $DUC ; VMR>SET /MAIN=UDCOM:'BAS':10:DEV ! SET UP COMMON .IFT $DUC ; VMR>INS ['$SYGRP',1]UDCOM ! SET COMMON RESIDENT .IFT $DSS ; VMR>SET /MAIN=ISCOM:'BAS':10:DEV !SET UP COMMON .IFT $DSS ; VMR>INS ['$SYGRP',1]ISCOM ! SET COMMON RESIDENT .IFT $IPE ; VMR>SET /MAIN=IPCOM:'BAS':10:DEV !SET UP COMMON .IFT $IPE ; VMR>INS ['$SYGRP',1]IPCOM !SET COMMON RESIDENT .1220: .IFT $LOD ; VMR>LOA XX: ! LOAD XXDRV ; VMR>INS TKN ! INSTALL TASK TERMINATION TASK ; VMR>FIX TKTN ! FIX INTO MEMORY ; VMR>INS BASMCR ! INSTALL BASIC MCR ; VMR>FIX MCR... ! FIX INTO MEMORY ; VMR>INS OTL ! INSTALL ONLINE TASK LOADER ; VMR>FIX OTL ! FIX INTO MEMORY ; VMR>INS SIP ! INSTALL SYSTEM PRESERVATION TASK ; VMR>FIX SIP ! FIX INTO MEMORY .IFT V05 ; VMR>INS RSDV05 !INSTALL RSDV05 .IFT V05 ; VMR>FIX RSDV05 !FIX INTO MEMORY .IFT V52 ; VMR>INS RSDV52 !INSTALL RSDV52 .IFT V52 ; VMR>FIX RSDV52 !FIX INTO MEMORY .IFT V1H ; VMR>INS RSDV1H !INSTALL RSDV1H .IFT V1H ; VMR>FIX RSDV1H !FIX INTO MEMORY ; VMR>TIM 10:45 11/10/77 ! SET TIME AND DATE ; VMR>SAV DX:RSX11S ! SAVE SYSTEM ON RX01 FLOPPY ; VMR>^Z ! EXIT FROM VIRTUAL MCR ; .IFT D ; End of VMR example .IFT D ; .IFT D ; .IFT D ; .IFT D ; Now we will run Virtual MCR so that you may initialize .IFT D ; your system. Be sure to define all required partitions .IFT D ; at this time, because the SET function is not supported .IFT D ; in RSX-11S BASIC MCR. Furthermore, if you plan to .IFT D ; include BASIC MCR and OTL in your system, they must .IFT D ; be installed and fixed into memory. Other tasks, .IFT D ; such as SIP and TKTN may be loaded into a running .IFT D ; RSX-11S system using OTL. .IFT D ; .IFT D .IFT $LOD ; NOTE: Since LOAD and UNLOAD are not supported on .IFT D .IFT $LOD ; a running RSX-11S system, all required loadable .IFT D .IFT $LOD ; drivers must be loaded using VMR. .IFT D .IFT $LOD ; .IFT D .IFT $DRC ; NOTE: You have requested to include the .IFT D .IFT $DRC ; directive common. You must install the .IFT D .IFT $DRC ; common prior to exitting Virtual MCR .IFT D .IFT $DRC ; or your RSX-11S system will not boot. .SETS VMRTM "VMR" .IFT $MPLUS .SETS VMRTM "VMM" .IFINS 'VMRTM' .GOTO 1225 .SETF VMRX .IFF $MPLUS INS SY:$'VMRTM' .IFT $MPLUS INS SY:['$SYGRP',54]11MVMR/TASK=...'VMRTM' .1225: 'VMRTM' ; ; When this command file completes, your RSX-11S system is ; ready to run. ; .IFF VMRX REM 'VMRTM' .1240: .IFF PIP REM PIP .SETT PIP .IFF UFDX REM UFD .IFF TKBX REM 'TKBTM' .IFF PIPX REM PIP .IFF LBRX REM LBR .IFF EDIX REM EDI .IFF FLXX REM FLX .IFF MACX REM MAC SET /UIC='UIC' TIM .1250: .IFF $MCR ; Resetting the CLI b*ack to DCL .IFF $MCR SET /DCL=TI: ; *˜HqkQ›c, .NLIST ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NòO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; THIS IS THE BASIC MCR PREFIX FILE. IT IS USED TO CONTROL ; THE COMMANDS INCLUDED IN BASIC MCR. ; ; TO INCLUDE THE ATL AND TAL COMMANDS DEFINE R$$ATL ; TO INCLUDE ERROR MESSAGES AS WELL AS ERROR CODES DEFINE R$$ERM ; TO INCLUDE THE OPEN COMMAND DEFINE R$$OPE ; ;R$$ATL = 0 ; INCLUDE ATL ;R$$ERM = 0 ; INCLUDE ERROR MESSAGES ;R$$OPE = 0 ; INCLUDE OPEN .LIST òŸ» kQ›c, .TITLE ABOBAS - ABORT, CANCEL, AND RESUME MCR COMMAND PROCESSOR .IDENT "01" ; ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; ; ; VERSION: 01 ; BY: H. LEV ; DATE: 08/28/73 ; MODIFIED 12/30/74 ABOOV WAS MODIFIED INTO THIS MODULE ; ; ; ; THIS MODULE PROCESSES THE ABORT, CANCEL AND RESUME ; MCR COMMANDS. ; .MCALL DIR$,DEVDF$,TCBDF$ DEVDF$ ; DEFINE DCB, UCB, AND SCB OFFSETS TCBDF$ ; DEFINE TCB OFFSETS .SBTTL LOCAL DATA ; ; ERROR TABLES ; ; ; THIS TABLE CONTAINS ERRORS WHICH MAY BE RECEIVED FROM ; THE DIRECTIVES ABORT, CANCEL, AND RESUME. ; THE POSITION IN THE TABLE IS USED TO ; INDEX INTO THE ERROR TABLE ; ERCOD: .WORD -2. ; .WORD -7. ; .WORD -8. ; ; ; THIS ERROR TABLE CONVERTS DIRECTIVE ERRORS INTO CODES FOR ; MESSAGES GENERATED BY THE ERROR OVERLAY ; ERROR: TRAP 11. ; TASK NOT IN SYSTEM TRAP 13. ; TASK NOT ACTIVE TRAP 15. ; TASK NOT SUSPENDED ERR1: TRAP 2. ; SYNTAX ERROR DPB: .BLKW 3 ; DPB FOR ABORT, CANCEL, AND RESUME ; ; DIRECTIVE CODES ; ABO: .BYTE 83.,3. ; ABORT CAN: .BYTE 25.,3. ; CANCEL RES: .BYTE 47.,3 ; RESUME .SBTTL PROGRAM CODE ; ;+ ; *** - $ABOEP - ABORT MCR COMMAND ENTRY POINT ; *** - $CANEP - CANCEL MCR COMMAND ENTRY POINT ; *** - $RESEP - RESUME MCR COMMAND ENTRY POINT ; ; ; THIS ROUTINE PROCESSES THE ABORT, CANCEL, AND RESUME ; MCR COMMANDS. IT SETS UP A DPB WITH THE CORRECT DIRECTIVE ; CODE AND ISSUES IT. ; ;- ; ; ABORT ENTRY POINT ; $ABOEP::MOV ABO,-(SP) ; GET ABORT DIC BR COM ; ; ; CANCEL ENTRY POINT ; $CANEP::MOV CAN,-(SP) ; GET CANCEL DIC BR COM ; ; ; RESUME ENTRY POINT ; $RESEP::MOV RES,-(SP) ; GET RESUME DIC ; ; COMMON CODE ; COM: CALL $PRSR ; PARSE OFF TASK NAME CALL $NNBLK ; GET NEXT NON-BLANK BCC ERR1 ; SYNTAX ERROR MOV #DPB,R2 ; GET ADDRESS OF DPB MOV (SP)+,(R2)+ ; SET DIC MOV $MPARS,(R2)+ ; MOVE TASK NAME MOV $MPARS+2,(R2) ; INTO DPB ; ; CHECK THAT COMMAND CAME FROM TERMINAL WHICH STARTED TASK ; OR FROM A PRIVILEDGED TERMINAL ; MOV $MPARS+4,R0 ; GET TCB ADDRESS MOV T.UCB(R0),R0 ; GET TASK UCB ADDRESS MOV $MUCB,R1 ; GET TI UCB ADDRESS CMP R1,R0 ; TASK STARTED FROM THIS TERMINAL? BEQ 4$ ; YES BIT #U2.PRV,U.CW2(R1) ; NO, IS THIS A PRIVILEDGED TERMINAL? BNE 4$ ; YES TRAP 6. ; NO, PRIVILEGED COMMAND 4$: DIR$ #DPB ; ISSUE DIRECTIVE BCS 10$ ; SKIP IF ERROR RETURN ; RETURN TO DISPATCHER ; ; ERROR DETECTED DECIDE WHAT IT IS ; 10$: MOV $DSW,R0 ; GET DSW CLR R1 ; ZERO ERROR INDEX 20$: CMP R0,ERCOD(R1) ; IS THIS THE CODE BEQ 30$ ; YES TST (R1)+ ; NO, INDEX TO NEXT ONE BR 20$ ; LOOP 30$: JMP ERROR(R1) ; ISSUE ERROR .END B I8900,10 ; ; THIS TABLE CONTAINS ERROR CODES RETURNED BY THE DIRECTIVES ; l » kQ›c, .TITLE ATLBAS - ACTIVE TASK LIST MCR ROUTINE .IDENT "03" ; ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ; COPYRIGHT (C) 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; ; VERSION: 03 ; BY: H. LEV ; DATE: 09/06/73 ; MODIFIED: 12/10/74 ADD PMD TASK STATUS FLAG ; 3/10/75 LOCK SYSTEM LISTS WHILE RUNNING ; 5/23/75 REFORMAT PRINT OUT ; 6/4/75 CONVERT ATLOV TO ATLBAS ; ; ; ; HJL025 3/7/76 CHANGE PCB, TCB AND TASK HEADER ; JAK028 8/3/76 ADD PRI AND DPRI ; ; THIS MODULE PROCESSED THE MCR ATL AND TAL COMMANDS ; .IF DF R$$ATL .MCALL CALL,PCBDF$,DIR$,RETURN,WTSE$S .SBTTL EQUATED SYMBOLS EFN1 = 1 ;EVENT FLAG TO USE LUN1 = 1 ;LOGICAL UNIT FOR "TI" SPA = 040 ;BLANK PCBDF$ ; DEFINE PCB OFFSETS .SBTTL LOCAL DATA TI: .ASCIZ / TI - / ; PRI: .ASCIZ / PRI - / DPRI: .ASCIZ / DPRI - / IOC: .ASCIZ / IOC - / ; EFLG: .ASCIZ / EFLG -/ ; PCTR: .ASCIZ / PC -/ ; PS: .ASCIZ / PS -/ ; REGS: .ASCIZ / REGS 0-6 / ; NONE: .ASCIZ /NONE/ ; STAT: .ASCIZ / STATUS - / ; ; ; STATUS FLAG NAMES. IF FLAG IS SET IN T.STAT, T.ST2, T.ST3 ; THE FLAG NAME WILL BE PRINTED. ; ; T.STAT BITS STABLE: .ASCIZ /-EXE/ ; NOT IN EXECUTION (100000) .ASCIZ /RDN/ ; I/O RUNDOWN IN PROGRESS (40000) .ASCIZ /MSG/ ; TASK STOPPED FOR ABORT MESSAGE (20000) .ASCIZ /NRP/ ; TASK MAPPED TO NONRESIDENT PARTITION (10000) .BYTE 0 ; (4000) .BYTE 0 ; (2000) .BYTE 0 ; (1000) .ASCIZ /OUT/ ; TASK IS OUT OF MEMORY (400) .ASCIZ /CKP/ ; TASK IS CHECKPOINTED (200) .ASCIZ /CKR/ ; TASK CHECKPOINT REQUESTED (100) .BYTE 0 ; (40) .BYTE 0 ; (20) .BYTE 0 ; (10) .BYTE 0 ; (4) .BYTE 0 ; (2) .BYTE 0 ; (1) ; T.ST2 BITS .ASCIZ /AST/ ; AST IN PROGRESS (100000) .ASCIZ /DST/ ; AST RECOGNITION DISABLED (40000) .ASCIZ /-CHK/ ; TASK NOT CHECKPOINTABLE (20000) .ASCIZ /CKD/ ; CHECKPOINTING DISABLED (10000) .ASCIZ /BFX/ ; TASK BEING FIXED IN MEMORY (4000) .ASCIZ /FXD/ ; TASK IS FIXED IN MEMORY (2000) .ASCIZ /TIO/ ; TASK WAITING FOR TEMINAL I/O (1000) .ASCIZ /CAF/ ; CHECKPOINT SPACE ALLOCATION FAILURE (400) .ASCIZ /HLT/ ; TASK IS BEING HALTED (200) .ASCIZ /ABO/ ; TASK IS MARKED FOR ABORT (100) .ASCIZ /STP/ ; TASK STOPPED WITH PRI=0 IN PARTITION (40) .ASCIZ /STPA/ ;TASK STOPPED IN AST (20) .ASCIZ /SPNA/ ; SAVED TS.SPN ON AST IN PROGRESS (10) .ASCIZ /SPN/ ; TASK SUSPENDED (4) .ASCIZ /WFRA/ ; SAVED TS.WFR ON AST IN PROGRESS (2) .ASCIZ /WFR/ ; TASK IS IN A WAITFOR STATE (1) ; T.ST3 BITS .ASCIZ /ACP/ ; ANCILLIARY CONTROL PROCESSOR (100000) .ASCIZ /-PMD/ ; DUMP TASK ON SYNCHRONOUS ABORT (40000) .ASCIZ /REM/ ; REMOVE TASK ON EXIT (20000) .ASCIZ /PRV/ ; TASK IS PRIVILEGED (10000) .ASCIZ /MCR/ ; TASK REQUESTED AS EXTERNAL MCR FUNCTION (4000) .ASCIZ /SLV/ ; TASK IS A SLAVE (2000) .ASCIZ /CTL/ ; TASK WAS ACTIVATED BY CONTROLLING TASK (1000) .ASCIZ /RST/ ; TASK IS RESTRICTED (400) .ASCIZ /NSD/ ; NO SEND DATA ALLOWED (200) .ASCIZ /CAL/ ; CHECKPOINT SPACE ALLOCATED IN TASK IMAGE (100) .ASCIZ /ROV/ ; TASK HAS RESIDENT OVERLAYS (40) .ASCIZ /NET/ ;NETWORKS PROTOCOL LEVEL 2 (20) .BYTE 0 ; (10) .BYTE 0 ; (4) .BYTE 0 ; (2) .BYTE 0 ; (1) .EVEN TSKFLG: .WORD ; TASK LIST FILE ; 0 - ALL TASKS, 100000 - ACTIVE TASKS ;+ ; *** - $ATLEP - ACTIVE TASK LIST MCR COMMAND ENTRY POINT ; ; THIS ROUTINE FINDS ALL ACTIVE TASKS AND PRINTS OUT DATA ABOUT ; THOSE TASKS INCLUDING PS, PC, R0-R6, AND STATUS FLAGS ; FOR EACH ACTIVE TASK, IT IS PRINTED ON ; DEVICE "TI". ; ; *** - $TALEP - TASK LIST MCR COMMAND ENTRY POINT. THIS COMMAND ; LISTS ALL TASKS IN THE SYSTEM IN THE SAME MANNER ; AS ATL. ; ; OUTPUT FORMAT: ; TNAME TCBADD PNAME PCBADD LLLLLL-HHHHHH PRI - NN. DPRI - NN. ; STATUS - [STS...] ; TI - XXN: IOC - I. EFLG - EEEEEE EEEEEE PS - SSSSSS PC - PPPPPP ; REGS 0-6 000000 111111 222222 333333 444444 555555 666666 ; ; WHERE: ; TNAME - 1-6 CHAR TASK NAME ; TCBADD - TCB ADDRESS ; PNAME - PARTITION NAME ; PCBADD - PCB ADDRESS ; LLLLLL - BASE ADDRESS OF PARTITION ; HHHHHH - TOP ADDRESS OF PARTITION ; PRI - NN. IS TASK'S PRIORITY ; DPRI - NN. IS TASK'S DEFAULT PRIORITY ; [STS] - OPTIONALLY ZERO OR MORE 3 CHARACTER CODES INDICATING THE TASK STATUS ; XXN: - TI TERMINAL ; I. - I/O COUNT ; EEEEEE EEEEEE - EVENT FLAGS ; SSSSSS - PROCESSOR STATUS WORD ; CCCCCC - PROGRAM COUNTER ; 000000 - 666666 REGISTERS 0-6 ; ;- $ATLEP::MOV #TS.EXE,TSKFLG ; SET TO LIST ONLY ACTIVE TASKS BR ATL ; $TALEP::CLR TSKFLG ; SET TO LIST ALL TASKS ATL: MOV $MUCB,R0 ; GET TI UCB ADDRESS TST U.ATT(R0) ; IS DEVICE ATTACHED? BNE 7$ ; YES, ERROR MOV $MBUF,R0 ; GET BUFFER ADDRESS MOV R0,$MDPB+14 ; SET ADDRESS MOV #IO.ATT,$MDPB+2 ; SET ATTACH FUNCTION CALL $DOIO ; ISSUE ATTACH BR 10$ ; 7$: TRAP 26. ; LISTING DEVICE NOT AVAILABLE ; ; TERMINAL IS ATTACHED, DPB IS SET UP, NOW START SEARCHING STD ; 10$: CALL $LOCKL ; LOCK SYSTEM LISTS MOV $TSKHD,R5 ; GET ADDRESS OF FIRST TCB ATLNXT: TST T.TCBL(R5) ; IS THIS THE NULL TASK TCB? BNE 1$ ; NO JMP ATLEND ; YES,NULL TASK IS END OF TCB LIST 1$: BIT TSKFLG,T.STAT(R5) ; IS THIS TASK TO BE LISTED? BEQ 5$ ; YES MOV T.TCBL(R5),R5 ; NO, GET ADDRESS OF NEXT TCB BR ATLNXT ; LOOP ; ; PRINT LINE ONE ; 5$: MOV $MBUF,R0 ; GET BUFFER ADDRESS MOV T.NAM(R5),R1 ; GET TASK NAME CHARS 1-3 CALL $C5TA ; CONVERT TO ASCII MOV T.NAM+2(R5),R1 ; GET TASK NAME CHARS 4-6 CALL $C5TA ; CONVERT TO ASCII MOV R5,R1 ; GET TCB ADDRESS CALL CONSPA ; CONVERT TO OCTAL AND INSERT SPACE MOV T.PCB(R5),R4 ; GET ADDRESS OF PCB MOVB #40,(R0) ; SPACE MOVB (R0)+,(R0)+ ; MOV P.NAM(R4),R1 ; PRINT PARTITION NAME CALL $C5TA ; MOV P.NAM+2(R4),R1 ; CALL $C5TA ; MOV R4,R1 ; GET PCB ADDRESS CALL CONSPA ; CONVERT TO OCTAL .IF DF M$$MGE .IFF MOV P.REL(R4),R1 ; GET PARTITION BASE ADDRESS CALL CONSPA ; CONVERT TO OCTAL AND INSERT SPACE MOV P.REL(R4),R1 ; GET BASE ADDRESS OF PARTITION ADD P.SIZE(R4),R1 ; ADD SIZE TO GET TOP+1 DEC R1 ; GET TOP OF PARTITION MOVB #'-,(R0)+ ; PUT IN DASH INC R2 ; SET TO PRINT LEADING ZEROS CALL $CBOMG ; CONVERT TO ASCII .IFT MOV #$MPARS+4,R1 ; SET ADDRESS OF WORK AREA MOV P.REL(R4),(R1) ; GET PARTITION BASE ADDRESS MOV #SPA,(R0)+ ; PUT IN BLANK CLR 2(R1) ; ZERO HIGH PART CALL CON32W ; CONVERT FROM 32WD BLOCKS TO BYTES CALL .C2BTO ; CONVERT TO 18 BIT ADDRESS MOVB #'-,(R0)+ ; PUT IN HYPHEN MOV P.REL(R4),(R1) ; GET PARTITION BASE ADDRESS CLR 2(R1) ; ZERO HIGH PART ADD P.SIZE(R4),(R1) ; ADD PARTITION SIZE TO GET HIGH ADC 2(R1) ; ADDRESS CALL CON32W ; CONVERT FROM 32WD BLOCKS TO BYTES SUB #1,(R1) ; SET LAST ADDRESS IN USE SBC 2(R1) ; CALL .C2BTO ; CONVERT FROM BINARY TO OCTAL .ENDC MOV #PRI,R1 ;GET "PRI - " CALL MOVE ; CLR R1 ; BISB T.PRI(R5),R1 ;GET CURRENT PRIORITY CLR R2 ;SUPPRESS LEADING ZEROES CALL $CBDMG ;CONVERT TO DECIMAL MOVB #'.,(R0)+ ;INSERT DECIMAL POINT MOV #DPRI,R1 ;GET "DPRI - " CALL MOVE ; CLR R1 ; BISB T.DPRI(R5),R1 ;GET DEFAULT PRIORITY CLR R2 ;SUPPRESS LEADING ZEROES CALL $CBDMG ;CONVERT TO DECIMAL MOVB #'.,(R0)+ ;INSERT DECIMAL CALL PRINT ; PRINT THE LINE MOV $MBUF,R0 ; GET BUFFER ADDRESS AGAIN MOV #STAT,R1 ; GET ADDRESS OF TITLE CALL MOVE ; MOVE IT INTO LINE MOV T.STAT(R5),R1 ; GET STATUS FLAGS MOV #STABLE,R2 ; GET STATUS TABLE ADDRESS MOV #16.,R3 ; SET COUNT OF BITS CALL STATUS ; PRINT OUT STATUS FLAG NAMES MOV T.ST2(R5),R1 ; GET STATUS WORD TWO MOV #16.,R3 ; SET NUMBER OF BITS IN IT CALL STATUS ; PRINT OUT STATUS FLAG NAMES MOV T.ST3(R5),R1 ; GET STATUS WORD THREE MOV #16.,R3 ; SET NUMBER OF BITS IN IT CALL STATUS ; DISPLAY IT CALL PRINT ; PRINT OUT THE STATUS MESSAGE ; ; PRINT LINE TWO ; BIT #TS.OUT,T.STAT(R5) ; IS HEADER IN CORE? BNE 15$ ; NO, THEN CAN'T PRINT REGISTERS MOV P.HDR(R4),R4 ; GET ADDRESS OF HEADER MOV H.CSP(R4),R1 ; GET STACK POINTER MOV R1,-(SP) ; SAVE IT .IF NDF M$$MGE ADD #10,(SP) ; CORRECT IT FOR REGS STORED ON IT .ENDC MOV H.GARD(R4),R4 ; GET ADDRESS OF GUARD WORD .IF DF M$$MGE .IFT SUB #20,R4 ; GET ADDRESS OF CURRENT PS IN HEADER .IFF SUB #10,R4 ; GET ADDRESS OF R3 IN HEADER MOV (R1)+,-(R4) ; MOVE [R4] TO HEADER MOV (R1)+,-(R4) ; MOVE [R5] TO HEADER MOV (R1)+,-(R4) ; MOVE PC TO HEADER MOV (R1)+,-(R4) ; MOVE PS TO HEADER .ENDC MOV R5,-(SP) ; SAVE TCB ADDRESS 15$: MOV $MBUF,R0 ; GET BUFFER ADDRESS MOV #TI,R1 ; MOVE IN "TI - " CALL MOVE ; MOV T.UCB(R5),R3 ; GET TI UCB ADDRESS BNE 17$ ; GOT IT MOV #NONE,R1 ; NONE ASSIGNED, PRINT "NONE" CALL MOVE ; BR 18$ ; 17$: CALL $FMTDV ; PRINT TI NAME 18$: MOV #IOC,R1 ; PRINT " IOC - " CALL MOVE ; CLR R1 ; GET I/O COUNT BISB T.IOC(R5),R1 ; CLR R2 ; SET TO SUPPRESS LAEDING ZEROES CALL $CBDMG ; CONVERT TO DECIMAL MOVB #'.,(R0)+ ; PUT IN DECIMAL POINT MOV #EFLG,R1 ; PRINT " EFLG - " CALL MOVE ; MOV T.EFLG(R5),R1 ; GET FLAGS 1-16 CALL CONSPA ; CONVERT TO OCTAL MOV T.EFLG+2(R5),R1 ; GET FLAGS 17-32 BIT #TS.OUT,T.STAT(R5) ; IS TASK HEADER IN CORE? BNE 25$ ; NO, CAN'T PRINT REGISTERS CALL CONSPA ; CONVERT TO OCTAL MOV #PS,R1 ; PRINT " PS - " CALL MOVE ; MOV (R4)+,R1 ; GET REGISTER CONTENTS CALL CONSPA ; CONVERT TO OCTAL MOV #PCTR,R1 ; PRINT " PC - " CALL MOVE ; MOV (R4)+,R1 ; GET PC VALUE CALL CONSPA ; CONVERT TO OCTAL CALL PRINT ; PRINT IT ; ; PRINT LINE 3 ; MOV $MBUF,R0 ; SET BUFFER POINTER MOV #REGS,R1 ; PRINT " REGS 0-6 " CALL MOVE ; MOV #6.,R5 ; SET COUNT FOR REGS 0-5 ADD #14,R4 ; POINT TO ONE BEYOND REG 0 20$: MOV -(R4),R1 ; GET CONTENTS OF REG CALL CONSPA ; CONVERT AND STORE DEC R5 ; DONE ? BNE 20$ ; NO, LOOP MOV (SP)+,R5 ; GET TCB ADDRESS BACK MOV (SP)+,R1 ; GET SP 25$: CALL CONSPA ; CONVERT TO OCTAL CALL PRINT ; PRINT IT OUT 30$: MOV T.TCBL(R5),R5 ; GET ADDRESS OF NEXT TCB JMP ATLNXT ; TRY IT ; ; ALL ACTIVE TASKS HAVE BEEN DISPLAYED, DETTACH TERMINAL ; ATLEND: CALL $UNLKL ; UNLOCK SYSTEM LISTS MOV #IO.DET,$MDPB+2 ; SET DETTACH FUNCTION CALL $DOIO ; DETTACH ATLEXT: RETURN ; .SBTTL SUBROUTINES ;+ ; *** - CONSPA - INSERT A BLANK AND CONVERT R1 TO OCTAL ; ; INPUT: ; R0 - ADDRESS OF PLACE IN BUFFER TO PUT NEXT CHARACTER ; R1 - WORD TO BE CONVERTED ; ; OUTPUTS: ; R0 - UPDATED TO NEXT AVAILABLE WORD IN BUFFER ;- CONSPA: INC R2 ; SET TO GENERATE LEADING ZEROES MOVB #SPA,(R0)+ ; PUT IN SPACE CALL $CBOMG ; CONVERT TO OCTAL MAGNITUDE RETURN ; EXIT ;+ ; *** - STATUS - CONVERT ONE STATUS FLAGS TO 3 CHAR FLAG NAMES AND A PRECEDING BLANK ; THIS SUBROUTINE TESTS EACH STATUS FLAG AND IF IT IS ON, OUTPUTS ; A BLANK FOLLOWED BY THE THREE CHARACTER FLAG NAME. ; ; INPUT: ; R0 - ADDRESS OF NEXT AVAILABLE BYTE IN BUFFER ; R1 - STATUS FLAGS LEFT JUSTIFIED IN WORD ; R2 - ADDRESS OF NEXT ENTRY IN STATUS FLAG NAME TABLE ; ENTRIES CONTAIN ANY NUMBER OF CHARACTERS AND END IN A ZERO BYTE. ; NULL ENTRIES CONTAIN ONLY A ZERO BYTE ; R3 - COUNT OF STATUS BITS IN WORD ; ; OUTPUT: ; R0 - UPDATED TO NEXT AVAILABLE BYTE IN BUFFER ; R2 - ADDRESS OF NEXT ENTRY IN STATUS NAME TABLE ; R3 - ZERO ; ;- STATUS: MOV R4,-(SP) ; SAVE R4 10$: TST R1 ; IS HIGH BIT SET? BPL 20$ ; NO MOVB #SPA,(R0)+ ; YES, MOVE IN BLANK. 20$: MOVB (R2)+,R4 ; GET NEXT CHAR OF BIT NAME BEQ 30$ ; END OF STRING TST R1 ; IS FLAG SET BPL 20$ ; NO MOVB R4,(R0)+ ; YES, MOVE IN CHAR BR 20$ ; LOOP FOR NEXT CHAR 30$: ASL R1 ; SHIFT UP NEXT BIT DEC R3 ; ALL FLAGS TESTED? BNE 10$ ; NO MOV (SP)+,R4 ; RESTORE R4 RETURN ; EXIT ;+ ; *** - PRINT - COMPUTE LENGTH OF MESSAGE AND WRITE IT TO "TI" ; IF AN ERROR IS DETECTED THIS ROUTINE EXITS TO THE ERROR OVERLAY ; INPUTS: ; R0 - ADDRESS OF NEXT BYTE IN BUFFER ; $MDPB+14 - ADDRESS OF FIRST BYTE IN BUFFER ; ; OUTPUTS: ; NONE ;- PRINT: SUB $MDPB+14,R0 ; COMPUTE BUFFER LENGTH MOV R0,$MDPB+16 ; SET CHARACTER COUNT MOV #IO.WVB,$MDPB+2 ; SET WRITE LOGICAL BLOCK FUNCTION CALLR $DOIO ; ISSUE WRITE ;+ ; *** - MOVE - MOVE A STRING OF ASCII CHARACTERS ; ; INPUT: ; R0 - BUFFER POINTER ; R1 - ADDRESS OF INPUT STRING ; ; OUTPUT: ; R0 - UPDATED ; R1 - END OF STRING ; ;- MOVE: TSTB (R1) ; END OòF STRING? BEQ 10$ ; YES MOVB (R1)+,(R0)+ ; NO, MOVE NEXT CHARACTER BR MOVE ; LOOP 10$: RETURN ; ;+ ; *** - CON32W - CONVERT 32WD BLOCKS TO BYTES ; INPUT: ; R1 - ADDRESS OF TWO WORD AREA FOR CONVERSION ; OUTPUT: ; R1 - ADDRESS OF 18 BIT NUMBER ;- CON32W: MOV #6.,R2 ; SET SHIFT COUNT 10$: CLC ; CLEAR CARRY BIT ROL (R1) ; SHIFT BIT INTO CARRY ROL 2(R1) ; AND CARRY INTO HIGH PART DEC R2 ; DONE? BGT 10$ ; NO, LOOP RETURN ; YES, DONE .ENDC .END ò[» kQ›c, .TITLE BRKBAS - BREAKPOINT MCR COMMAND .IDENT "01" ; ; ; COPYRIGHT 1976, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; COPYRIGHT (C) 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; BY: H. LEV ; DATE: 12/13/74 ; VERSION: 01 ; ; MODIFIED FOR BASIC MCR BY: JO ANN KASSON 8/3/76 ; ; ; THIS MODULE PROCESSES THE MCR BREAKPOINT TRAP COMMAND ; ; IT IS USED TO PASS CONTROL TO XDT THE EXECUTIVE DEBUGGING TOOL ; IT WILL EXECUTE A BPT INSTRUCTION IF XDT HAS BEEN LINKED INTO ; THE EXEC, OTHERWISE IT WILL EXIT ; .IF DF X$$DBT .MCALL CALL,RETURN $BRKEP::CALL $SWSTK,20$ ; SWITCH TO SYSTEM STATE CMP #$TRACE,@#14 ; IS XDT LINKED INTO EXEC? BEQ 10$ ; NO BPT ; YES, EXECUTE BREAKPOINT TO WAKE UP XDT 10$: RETURN ; RETURN TOJ USER STATE 20$: JMP $MCR ; AND GO TO DISPATCHER .ENDC .END J""» kQ›c, .TITLE ERRBAS-ERROR MESSAGE ROUTINE .IDENT /01/ ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 01 ; BY: H. LEV ; DATE: 08/23/73 ; MODIFIED: 12/30/74 EDITED FOR USE WITH BASIC MCR ; ; ; THIS MODULE PROCESSES BASIC MCR ERROR MESSAGES ; .MCALL CALL,DIR$,RETURN,WTSE$S .SBTTL ERROR PROCESSING ;+ ; *** - $ERREP-ERROR MESSAGE OVERLAY PROCESSOR ; ; THIS ROUTINE IS CALLED VIA THE TRAP INSTRUCTION TO ; ISSUE ERROR MESSAGES FOR BASIC MCR. ; THE TRAP CODE IS USED TO INDEX INTO THE ERROR TABLE ; ; ;- .IF DF R$$ERM .IFTF $ERREP::MOV (SP)+,R0 ; GET ERROR CODE CMP (SP)+,(SP)+ ; POP OFF PC AND PS MOV #IO.WVB,$MDPB+2 ; SET FUNCTION TO WRITE VIRTUAL MOV R0,-(SP) ; SAVE ERROR CODE ASR (SP) ; CONVERT TO ERROR NUMBER .IFT SUB #2,R0 ; CORRECT FOR OFFSET ASL R0 ; CONVERT TO DOUBLE WORD INDEX 10$: MOV $ERRTB(R0),R4 ; GET ADDRESS OF MESSAGE MOV $ERRTB+2(R0),R5 ; GET MESSAGE LENGTH IN WORDS .IFTF MOV $MBUF,R0 ; SET BUFFER ADDRESS MOV R0,$MDPB+14 ; SET BUFFER ADDRESS IN DPB MOVB #15,(R0)+ ; PUT IN LEADING CR MOV $MCMD,R1 ; GET COMMAND NAME CALL $C5TA ; CONVERT NAME FROM RAD50 TO ASCII MOVB #' ,(R0)+ ; PUT IN SPACE MOVB #'-,(R0)+ ; PUT IN DASH MOVB #'-,(R0)+ ; DASH MOVB #' ,(R0)+ ; PUT IN SPACE MOV (SP)+,R1 ; GET ERROR CODE CLR R2 ; SET TO SUPPRESS LEADING ZEROES CALL $CBDMG ; CONVERT TO DECIMAL .IFT MOVB #' ,(R0)+ ; PUT IN " - " MOVB #'-,(R0)+ ; MOVB 8#' ,(R0)+ ; 20$: MOV (R4)+,R1 ; GET 3 MORE CHARS CALL $C5TA ; CONVERT FROM RAD50 TO ASCII DEC R5 ; DONE? BNE 20$ ; NO, LOOP .IFTF 30$: SUB $MDPB+14,R0 ; COMPUTE LENGTH OF LINE MOV R0,$MDPB+16 ; STORE IT IN DPB CALL $DOIO ; PRINT IT JMP $MCR ; GO TO DISPATCHER .ENDC .END ; 8""?TkQ›c, .TITLE ERRMSG-ERROR MESSAGE .IDENT /02/ ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 02 ; BY: H. LEV ; DATE: 08/23/73 ; MODIFIED 12/30/74 MODIFIED FOR BASIC MCR ; ; ; LOCAL MACRO ; ; THIS MACRO GENERATES ERROR MESSAGES IN THE PROPER FORMAT ; FOR ERROV TO PROCESS. ; ; NUM - IS NUMBER TO REFER TO ERROR MESSAGES ; MSG - IS THE MESSAGE TEXT ; .IF DF R$$ERM .MACRO .ERR NUM,MSG .PSECT .ERRTB .WORD ERR'NUM .WORD ERR'NUM'L/2 .PSECT .ERRS ERR'NUM:.RAD50 %'MSG'% ERR'NUM'L = .-ERR'NUM .ENDM ;+ ; *** - $ERRTB - ERROR MESSAGE ADDRESS TABLE ; EACH ERROR MESSAGE HAS A TWO WORD ENTRY OF THE FORM ; WORD1 - ADDRESS OF RAD50 MESSAGE ; WORD2 - LENGTH OF MESSAGE IN WORDS ; *** - $ERRLN - IS LENGTH OF TABLE IN BYTES ;- .LIST MEB .PSECT .ERRTB $ERRTB::.ERR 1, .ERR 2, .ERR 3, .ERR 4, .ERR 5, .ERR 6, .ERR 7, .ERR 8, .ERR 9, .ERR 10, .ERR 11, .ERR 12, .ERR 13, .ERR 14, .ERR 15, .ERR 16, .ERR 17, .ERR 18, .ERR 19, .ERR 20, .ERR 21, .ERR 22, .ERR 23, .ERR 24, .ERR 25, .ERR 26, .ERR 27, .PSECT .ERRTB $ERRLN == .-$ERRTB .ENDC .END èœ'pkQ›c, .TITLE FMTDV - FORMAT DEVICE NAME .IDENT "01" ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; VERSION: 01 ; BY: H. LEV ; DATE: 3/10/75 .MCALL RETURN ;+ ; *** - $FMTDV - PUT DEVICE NAME AND UNIT BUFFER ; ; INPUT: ; ; R0 - ADDRESS OF BYTE IN BUFFER ; R3 - ADDRESS OF UCB ; ; OUTPUT: R0 - UPDATED ; R1,R2,R3 ARE USED AND MODIFIED ; ;- $FMTDV::MOV U.DCB(R3),R2 ; GET DCB ADDRESS MOVB D.NAM(R2),(R0)+ ; PUT IN DEVICE MOVB D.NAM+1(R2),(R0)+ ; MNEMONIC MOV R0,-(SP) ; SAVE BUFFER POINTER MOV R3,R0 ; GET UCB ADDRESS SUB D.UCB(R2),R0 ; COMPUTE RELATIVE UCB ADDRESS MOV D.UCBL(R2),R1 ; GET UCB LENGTH CALL $DIV ; COMPUTE RELATIVE UNIT NUMBER ADD D.UNIT(R2),R0 ; COMPUTE ABSOLUTE UNIT NUMBER BIC #177400,R0 ; CLEAR HIGH BYTE MOV R0,R1 ; COPY IT MOV (SP)+,R0 ; RESTORE BUFFER POINTER CLR R2 ; SET TO SUPPRESS LEADING ZEROES CALL $CBOMG ; CO`NVERT TO OCTAL MOVB #':,(R0)+ ; PUT IN COLON (DEVICE TERMINATOR) RETURN ; RETURN .END `´'ºƒkQ›c, .TITLE $FDUCB - FIND UCB .IDENT "02" ; ; ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; VERSION: 02 ; BY: H. LEV ; DATE: 11/15/73 ; MODIFIED: 4/28/75 FOR USE BY BASIC MCR ; 3/10/75 SWITCH TO SYSTEM STATE FOR DEVICE LIST SEARCH ; ;+ ; *** - $FDUCB - FIND UCB FOR PHYSICAL DEVICE ; ; THIS SUBROUTINE PARSES THE DEVICE SPECIFIER FROM THE ; COMMAND STRING AND SEARCHES FOR THE DEVICE IN THE DEVICE TABLES ; ; INPUT: ; R0 - BUFFER ADDRESS ; R3 - PARAMETER AREA ADDRESS - 2 WORDS ; ; OUTPUT: ; CARRY SET - UCB NOT FOUND OR SYNTAX ERROR ; R3 = 0 - SYNTAX ERROR ; R3 <>0 - COULDN'T FIND LCB OR UCB ; CARRY CLEAR - UCB FOUND ; R0 - UPDATED ; R1 - ADDRESS OF UCB ; R2 - ADDRESS OF DCB ; R3 - PARM AREA ADDRESS ; (R3) - DEVICE MNEMONIC IN ASCII ; 2(R3) - UNIT NUMBER IN BINARY ; ;- $FDUCB:: MOVB (R0)+,(R3) ; GET UNIT MOVB (R0)+,1(R3) ; MNEMONIC CALL $COTB ; GET UNIT NUMBER CMP R1,#256. ; IS IT VALID? BHIS 55$ ; NO, ERROR MOV R1,2(R3) ; AND STORE IT CMPB R2,#': ; COLON MUST FOLLOW IT BNE 55$ ; ERROR, IT DOESN'T ; ; SCAN UCBS FOR DEVICE ; CALL $SWSTK,60$ ; SWITCH TO SYSTEM STATE MOV $DEVHD,R2 ; GET ADDRESS OF DEVICE TABLE 12$: CMP (R3),D.NAM(R2) ; IS THIS THE DEVICE ? BEQ 20$ ; YES 15$: MOV D.LNK(R2),R2 ; NO, POINT TO NEXT DCB BNE 12$ ; GOT ONE BEQ 50$ ; END OF DEVICES, ERROR 20$: MOV 2(R3),R5 ; GET UNIT NUMBER CMPB R5,D.UNIT(R2) ; IS UNIT ON THIS DCB? BLO 15$ ; NO CMPB R5,D.UNIT+1(R2) ; MAYBE BHI 15$ ; NO! MOVB D.UNIT(R2),R4 ; GET FIRST UNIT NUMBER MOV D.UCB(R2),R1 ; GET FIRST UCB ADDRESS SUB R4,R5 ; COMPUTE RELATIVE UNIT NUMBER BEQ 45$ ; FOUND IT 30$: ADD D.UCBL(R2),R1 ; NO, POINT TO NEXT UCB DEC R5 ; FOUND IT YET? BNE 30$ ; NO, LOOP 45$: MOV R1,4(SP) ; SET USER R1 MOV R2,6(SP) ; SET USER R2 RETURN ; RETURN TO USER STATE 50$: MOV @$HEADR,R3 ; GET USER SP INCB 6(R3) ; SET CARRY BIT HIN USER PS 55$: CLR R3 ; SEC ; SET CARRY 60$: RETURN ; .END Hò-¸LkQ›c, .TITLE GNBLK - GET NEXT NON-BLANK CHARACTER .IDENT "01" ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; VERSION: 01 ; BY: H.LEV ; DATE: 1/25/74 ; ; THIS SUBROUTINE GETS THE NEXT NON-BLANK CHARACTER AND TESTS ; FOR END OF LINE ; .MCALL RETURN ; ; EQUATES SYMBOLS ; CR = 15 ; CARRIAGE RETURN ESC = 33 ; ESCAPE SPA = 40 ; SPACE ;+ ; *** - $GNBLK - GET NEXT CHARACTER FROM BUFFER AND FIND NEXT NON-BLANK ; *** - $NNBLK - STARTING WITH CHARACTER IN R2, FIND NEXT NON-BLANK ; THIS SUBROUTINE GETS THE NEXT NON-BLANK CHARACTER AND ; TESTS IT FOR BEING AN END OF LINE CHARACTER. ; ; INPUT: ; R0 - BUFFER POINTER ; R2 - $NNBLK ONLY - THE FIRST CHARACTER TO BE TESTED ; ; OUTPUT: ; R0 - UPDATED TO POINT TO NEXT CHARACTER IN BUFFER ; R2 - FIRST NON-BLANK FOUND ; CARRY CLEAR - NO END OF LINE FOUND ; CARRY SET - END OF LINE (CR, ESC) FOUND, ITS IN R2.þ ; ;- $GNBLK::MOVB (R0)+,R2 ; GET NEXT CHARACTER $NNBLK::CLR R1 ; ZERO BLANK COUNT 5$: CMPB R2,#SPA ; IS IT BLANK? BNE 10$ ; NO INC R1 ; YES, SET BLANK FOUND MOVB (R0)+,R2 ; GET NEXT CHARACTER BR 5$ ; LOOP UNTIL NON-BLANK 10$: CMPB R2,#CR ; IS IT CARRIAGE RETURN (EOL)? BEQ 20$ ; YES CMPB R2,#ESC ; NO, IS IT ESCAPE (EOL)? BEQ 20$ ; YES TST R2 ; ZERO BYTE? BEQ 20$ ; YES CLC ; NO, SET NOT EOL FLAG BR 30$ ; 20$: SEC ; SET END OF LINE FLAG 30$: RETURN ; .END þœ,ÕZkQ›c, .TITLE GETNUM - CONVERT A NUMBER TO BINARY .IDENT "01" ; ; ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD MASS. ; COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 01 ; BY: H. LEV ; DATE: 11/15/73 .MCALL CALL ;+ ; *** - $GTNUM - CONVERT AN ASCII NUMBER TO BINARY. ; IF NUMBER ENDS WITH DECIMAL POINT INTERPRET ; AS A DECIMAL NUMBER. IF NOT, INTERPRET AS AN ; OCTAL NUMBER ; ; INPUT: ; R0 - BUFFEòR ADDRESS ; ; OUTPUT: ; R0 - UPDATED BUFFER POINTER ; R1 - CONVERT NUMBER IN BINARY ; R2 - LAST CHAR SCANNED (NOT DECIMAL POINT IF FOUND ; BUT CHAR AFTER IT). ; ;- $GTNUM::MOV R0,-(SP) ; SAVE BUFFER POINTER CALL $CDTB ; CONVERT DECIMAL TO BINARY CMPB R2,#'. ; END IN DECIMAL POINT ? BNE 10$ ; NO MOVB (R0)+,R2 ; YES, POINT BEYOND IT BR 20$ ; 10$: MOV (SP),R0 ; RETIEVE BUFFER POINTER CALL $COTB ; CONVERT TO OCTAL 20$: TST (SP)+ ; POP BUFFER ADDRESS RETURN .END ò¡E`kQ›c, .TITLE KEYWD - GET AND TEST KEYWORD .IDENT "01" ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; VERSION: 01 ; BY: H. LEV ; DATE: 09/19/73 ; .MCALL RETURN ; ; EQUATED SYMBOLS ; CR = 015 ; CARRIAGE RETURN SPA = 040 ; SPACE ;+ ; *** - .KEYWD TEST KEYWORD - BLANKS INGORED BETWEEN KEYWORD + EQUAL SIGNS ; ; INPUTS: ; R0-FIRST CHAR IN BUFFER ; R1-FIRST CHAR OF KEYWORD YOUR LOOKING FOR ; STRING ENDS WITH ZERO ; ; OUTPUTS: ; CARRY CLEAR & OVERFLOW CLEAR - GOOD KEYWORD FOUND WITH ; EQUALS AFTER IT. ; CARRY CLEAR & OVERFLOW SET - GOOD KEYWORD BUT NO EQUALS ; R0 - POINTS TO NEXT CHAR AFTER KEYWORD AND EQUALS IF FOUND ; R2 - LAST CHARACTER SCANNED (EQUALS IF FOUND) ; CARRY SET - BAD KEYWORD - NO MATCH ; R0 - POINTS TO START OF INPUT FIELD ( NO CHANGE) ; ; ;- .KEYWD::MOV R0,-(SP) ; SAVE BUFFER POINTER 10$: MOVB (R0)+,R2 ; GET CHAR FROM BUFFER CMPB R2,#SPA ; BLANK ? BEQ 10$ ; YES, SKIP IT CMPB R2,(R1)+ ; DO THE CHARACTERS MATCH? BNE 50$ ; NO, WRONG KEYWORD TSTB (R1) ; END OF KEYWORD? BNE 10$ ; NO, LOOP 20$: MOVB (R0)+,R2 ; GET NEXT CHARACTER CMPB R2,#'= ; EQUALS FOUND? BEQ 40$ ; YES CMPB R2,#CR ; NO, HOW ABOUT CR (EOL)? BEQ 30$ ; YES CMPB R2,#33 ; NO, HOW ABOUT ESC (EOL)? BEQ 30$ ; CMPB R2,#SPA ; SPACE ? BEQ 20$ ; YES, LOOP 30$: TST (SP)+ ; POP STACK SEV ; SET GOOD KEYWORD, BUT NO EQUALS BR 60$ ; Œ40$: TST (SP)+ ; POP STACK GOOD KEYWORD BR 60$ ; 50$: MOV (SP)+,R0 ; RESET BUFFER POINTER SEC ; CLV ; 60$: RETURN ; .END ŒÄLàykQ›c, .TITLE LKLST .IDENT /01/ ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; VERSION 01 ; ; D. N. CUTLER 28-FEB-75 ; ; LOCK/UNLOCK ROUTINES TO PROVIDE SYNCHRONIZED ACCESS TO SYSTEM DATA ; BASES. ; ;+ ; **-$LOCKL-LOCK SYSTEM DATA BASE LISTS ; ; THIS ROUTINE IS CALLED BY PRIVILEGED TASKS TO SYNCHRONIZE THEIR ACCESS ; TO SYSTEM DATA BASES. A SWITCH TO SYSTEM STATE IS EXECUTED AND THE LOCK ; WORD $LSTLK IS TESTED. IF ANOTHER TASK CURRENTLY OWNS THE LOCK, THEN A ; WAITFOR SIGNIFICANT EVENT IS EXECUTED. AT RESUMPTION OF THE CALLING TASK ; THE TEST IS REPEATED. ELSE THE CALLING TASK IS GRANTED OWNERSHIP. ; ; INPUTS: ; ; NONE. ; ; OUTPUTS: ; ; $LSTLK IS SET TO THE TCB ADDRESS OF THE CALLING TASK. ;- .ENABL LSB 10$: BCS 30$ ;IF CS ACCESS GRANTED $LOCKL::CALL $SWSTK,10$ ;SWITCH TO SYSTEM STATE TST $LSTLK ;LOCK CURRENTLY OWNED BY ANOTHER TASK? BEQ 20$ ;IF EQ NO CMP $TKTCB,$LSTLK ;OWNED BY CURRENT TASK? BEQ 20$ ;IF EQ YES CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENT 20$: MOV $TKTCB,$LSTLK ;SET CURRENT TASK AS OWNER MOV @$HEADR,R0 ;RETRIEVE SAVED STACK POINTER INC 6(R0) ;SET CARRY CONDITION CODE IN RETURN PS 30$: RETURN ; .DSABL LSB ;+ ; **-$UNLKL-UNLOCK SYSTEM DATA BASE LISTS ; ; THIS ROUTINE IS CALLED BY PRIVILEGED TASKS TO RELINQUISH OWNERSHIP OF ; SYSTEM DATA BASES. ; ; INPUTS: ; ; NONE. ; ; OUTPUTS: ; ; IF THE CALLING TASK IS NOT THE CURRENT OWNER, THEN A RETURN IS ; EXECUTED. ELSE OWNERSHIP IS RELINQUISHED AND A CHECK IS MADE TO ; SEE IF ANY TASK IS WAITING FOR A SIGNIFICANT EVENT. IF ANY TASK ; IS WAITING, THEN A SIGNIFICANT EVENT IS DECLARED. A RETURN TO THE ; CALLING TASK IS EXECUTED. ;- $UNLKL::CALL $SWSTK,10$ ;SWITCH TO SYSTEM STATE CMP $TKTCB,$LSTLK ;CURRENT TASK OWNER? BNE 10$ ;IF NE NO CLR $LSTLK ;RELINQUISH OWNERSHIP TST $SIGFL ;ANY TASK WAITING FOR A SIGNIFICANT EVENT? BEQ 10$ ;IF EQ NO CALL $DRDSE ;DECLARE A SIGNIFICANT EVENT 10$: RETURN ; .END  ÊQ» kQ›c, .TITLE MCRBAS-MCR DISPATCHER ROUTINE .IDENT /3.1/ ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD MASS. ; ; COPYRIGHT (C) 1976 ; COPYRIGHT (C) 1980 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 3.1 ; BY: H. LEV ; DATE: 08/23/73 ; MODIFIED: 12/31/74 MODIFIED MCROV TO USE WITH BASIC MCR ; ; JAK028 8/3/76 ; ; JRK122 31-DEC-79 REWRITE COMMAND LINE CHECK TO PREVENT POOL LOSS ; ; ; THIS IS THE DISPATCHER FOR THE MCR TASK ; .MCALL CALL,DIR$,MRKT$,QIO$,RETURN,SVTK$S,WTSE$S .MCALL WSIG$S .SBTTL EQUATED SYMBOLS CR = 15 ; CARRIAGE RETURN ESC = 033 ; ESCAPE (ALT MODE) HT = 011 ; HORIZONTAL TAB SPA = 040 ; SPACE EFN1 = 1 ; EVENT FLAF LUN1 = 1 ; "TI" LUN. .SBTTL GLOBAL DATA $MDPB::QIO$ IO.WVB,LUN1,EFN1,,$DPBST,,<0,0,0,0,0,0> $MPARS::.BLKW 4. ; PARAMETER AREA $DPBST::.BLKW 2 ; I/O STATUS BLOCK $SSTAB::.BLKW 6 ; SST VECTOR TABLE .WORD $ERREP ; TRAP ENTRY POINT $MBUF::.WORD 0 ; ADDRESS OF COMMAND BUFFER $MCMD::.WORD 0 ; RAD50 COMMAND NAME $MUCB::.WORD 0 ; ADDRESS OF TI UCB $MSTK::.WORD 0 ; INITIAL STACK POINTER $MTERM::.WORD 0 ; LINE TERMINATOR .SBTTL LOCAL DATA ; ; UNPRIVILEGED COMMANDS ; MCMDUP: .RAD50 /ABO/ ; ABORT .WORD $ABOEP ; .RAD50 /CAN/ ; CANCEL .WORD $CANEP ; .RAD50 /RES/ ; RESUME .WORD $RESEP ; .RAD50 /RUN/ ; RUN .WORD $RPSEP ; .RAD50 /TIM/ ; TIME .WORD $TIMEP ; .WORD 0 ; END OF TABLE ; ; PRIVILEGED COMMAND TABLE ; MCMDPR: .IF DF R$$ATL .RAD50 /ATL/ ; ACTIVE TASK LIST .WORD $ATLEP ; .ENDC .IF DF X$$DBT .RAD50 /BRK/ .WORD $BRKEP ;BREAK .ENDC .IF DF R$$OPE .RAD50 /OPE/ ; OPEN .WORD $OPEEP ; .ENDC .RAD50 /RED/ ; REDIRECT .WORD $REDEP ; .RAD50 /REM/ ; REMOVE .WORD $REMEP  ; .IF DF R$$ATL .RAD50 /TAL/ ; TASK LIST .WORD $TALEP ; .ENDC .WORD 0 ; ; ; PROMPT CHARACTER ; GTSGN: .ASCII <15><12>/>/ ; .EVEN MCR: .RAD50 /MCR/ ; NAME OF DISPATCHER DISLEN: .BLKW 1 ; BYTE COUNT-1 .SBTTL DISPATCHER CODE ;+ ; ; *** - $MCREP-MCR DISPATCHER ; ; THE MCR DISPATCHER OBTAINS COMMANDS FROM THE MCR UNSOLICITED ; MESSAGE QUEUE. IT EXTRACTS THE COMMAND VERB FROM THE COMMAND ; AND SEARCHES THE UNPRIVILEGED AND PRIVILEGED COMMAND TABLES ; FOR THE COMMAND. IF IT FINDS THE COMMAND IN THE TABLES ; IT WILL JUMP TO THE COMMAND PROCESSOR. ; ; SIDE EFFECTS-INPUT: ; ; $MCRHD-POINTS TO THE MCR UNSOLICITED MESSAGE QUEUE ; ; SIDE EFFECTS-OUTPUT: ; ; $MCMD - RAD50 COMMAND NAME ; $MDPB - QIO DPB SET UP FOR WRITE VIRTUAL ; $MBUF - ADDRESS OF COMMAND BUFFER ; $MUCB - ADDRESS OF TI UCB ; $MTERM - LINE TERMINATOR ; ; OUTPUTS: ; ; R0-POINTER TO NEXT CHARACTER IN COMMAND BUFFER AFTER ; COMMAND VERB. ; ;- ; ; GET NEXT BUFFER TO PROCESS ; .ENABL LSB START: MOV SP,$MSTK ; SAVE INITIAL STACK POINTER $MCR:: MOV $MSTK,SP ; RESET STACK POINTER MOV #IO.WVB,$MDPB+2 ; DEFAULT TO WRITE VIRTUAL MOV #40,$MDPB+20 ; RESET CARRIAGE CONTROL MOV MCR,$MCMD ; SET MCR DISPATCHER IN CONTROL MOV $MBUF,R0 ; DO WE HAVE TO PROMPT? ; IF NON-ZERO, IT MEANS MCR JUST ; PROCESSED A COMMAND AND SHOULD ; ISSUE THE PROMPTING CHARACTER. BEQ MCRP1 ; NO, WE WERE JUST CALLED BY EXEC. MOV #84.,R1 ; GET LENGTH OF BUFFER 5$: CALL $SWSTK,10$ ; SWITCH TO SYSTEM STATE CALLR $DEACB ; RELEASE COMMAND LINE 10$: CMPB $MTERM,#ESC ; LINE TERMINATED BY ESCAPE? BEQ MCRP1 ; YES, SKIP PROMPT MCRPMT: CALL PROMPT ; ISSUE PROMPT STRING MCRP1: CLR $MBUF ; SHOW BUFFER IS FREE CALL $SWSTK,40$ ; SWITCH TO SYSTEM STACK MOV $TKTCB,R0 ;GET MCR'S TCB ADDRESS ADD #T.RCVL,R0 ;GET RECIEVE QUEUE POINTER CALL $QRMVF ; REMOVE A MESSAGE BCC 20$ ; GOT ONE MOV $TKTCB,R5 ; GET MCR'S TCB ADDRESS CALLR $DREXT ; EXIT DIRECTLY TO EXEC ; ; GET A COMMAND TO PROCESS ; 20$: MOV R1,$MBUF ; SAVE BUFFER ADDRESS MOV 2(R1),R0 ; GET UCB ADDRESS BIC #1,R0 ; CLEAR PROMPT REQUEST BIT 30$: MOV U.RED(R0),R0 ; FOLLOW REDIRECT POINTER CMP R0,U.RED(R0) ; END OF LIST? BNE 30$ ; NO, CONTINUE DOWN IT MOV R0,$MUCB ; SET UCB ADDRESS MOV $HEADR,R2 ; GET OUR HEADER ADDRESS MOV R0,H.LUN+<*4>(R2) ; SET LUN1 UCB ADDRESS RETURN ; SWITCH TO USER STACK 40$: MOV $MBUF,R0 ; GET BUFFER ADDRESS BIT #1,2(R0) ; IS THIS A PROMPT REQUEST? BEQ 50$ ; NO ; ; BUFFER IS PROMPT REQUEST ; MOV #4.,R1 ; SET COUNT OF BYTES TO RELEASE MOV #CR,$MTERM ; SET TO PROMPT BR 5$ ; RELEASE BUFFER ; ; BUFFER CONTAINS A COMMAND ; 50$: CMP (R0)+,(R0)+ ; SKIP TO BEGINNING OF COMMAND MOV #80.,R2 ; SET MAX COUNT OF CHARS IN BUFFER MOV R0,R3 ; GET BUFFER ADDRESS .DSABL LSB MCR2: ;JRK122 DEC R2 ; END OF BUFFER? ;JRK122 BGE 3$ ; NO ;JRK122 TRAP 2 ; YES, SYNTAX ERROR ;JRK122 3$: MOVB (R3),R1 ; GET NEXT CHARACTER ;JRK122 CMPB R1,#'A+40 ; IS IT LOWER CASE? ;JRK122 BLO 5$ ; NO ;JRK122 CMPB R1,#'Z+40 ; PERHAPS ;JRK122 BHI 5$ ; NO ;JRK122 SUB #40,R1 ; YES, CONVERT TO UPPER CASE ;**-5 5$: MOVB R1,(R3)+ ; AND STORE IN BUFFER 10$: CMPB R1,#CR ; IS IT CARRIAGE RETURN (EOB) ? ;**-3 BEQ 25$ ; YES CMPB R1,#ESC ; IS IT ESCAPE ( ALT MODE )? BEQ 25$ ; YES ;JRK122 CMPB R1,#IE.EOF ; IS IT A ^Z ;JRK122 BNE MCR2 ; NO, CONTINUE SCAN 25$: MOVB #CR,-(R3) ; SET TERMINATOR TO CR MOV R1,$MTERM ; SAVE TERMINATOR CMP R0,R3 ; NULL LINE? BEQ RESTRT ; YES ; ; GET COMMAND NAME ; 30$: MOV $MBUF,R0 ; GET ADDRESS OF BUFFER CMP (R0)+,(R0)+ ; POINT TO DATA CLR R1 ; PERIOD IS TERMINATOR CALL $CAT5 ; CONVERT 3 CHARS TO RAD50 BCC 40$ ; TRAP 1. ; ILLEGAL MCR FUNCTION ; ; SCAN THE COMMAND TABLES FOR THE COMMAND TYPED IN. ; ; R1=RAD50 COMMAND NAME ; 40$: MOV #MCMDUP,R2 ; GET UNPRIVILEDGED COMMAND TABLE CALL CMDSRC ; SEARCH THIS TABLE FOR COMMAND TST (R2) ; DID WE FIND IT BNE PROCES ; YES ; ; SCAN PRIVILEDGED COMMAND TABLE ; MOV #MCMDPR,R2 ; GET PRIVILEDGED COMMAND TABLE CALL CMDSRC ; SEARCH TABLE FOR COMMAND TST (R2) ; DID WE FIND ONE? BNE 50$ ; YES TRAP 1. ; NO, ILLEGAL MCR FUNCTION ; ; COMMAND IS PRIVILEDGED , SEE IF TERMINAL IS PRIVILEDGED ; 50$: MOV $MUCB,R1 ; GET UCB ADDRESS BIT #U2.PRV,U.CW2(R1) ; IS TERMINAL PRIVILEDGED? BNE PROCES ; YES TRAP 6. ; NO, PRIVILEGED COMMAND ; ; PROCESS COMMAND ; PROCES: MOVB (R0)+,R1 ; GET NEXT CHARACTER CMPB R1,#SPA ; IS IT A SPACE? BEQ 5$ ; YES CMPB R1,#CR ; NO, IS IT A CARRIAGE RETURN ? BNE PROCES ; NO, LOOP DEC R0 ; YES, POINT TO "CR" 5$: MOV (R2)+,$MCMD ; SAVE COMMAND NAME CALL @(R2) ; PROCESS COMMAND RESTRT: JMP $MCR ; GET NEXT COMMAND .SBTTL SUBROUTINES ;+ ; ; *** - CMDSRC-SEARCH COMMAND TABLE FOR MATCH ; INPUT: ; ; R1 - COMMAND IN RAD50 ; R2 - ADDRESS OF COMMAND TABLE ; ; OUTPUT: ; ; R1 - PRESERVED ; R2 - ADDRESS OF COMMAND ENTRY IF FOUND ; (R2)><0 IF FOUND ; (R2)=0 OF NOT FOUND ; ;- CMDSRC: CMP R1,(R2) ; IS THIS THE COMMAND BEQ 10$ ; YES ADD #4.,R2 ; NO, INDEX TO NEXT ENTRY TST (R2) ; END OF TABLE BNE CMDSRC ; NO, TRY NEXT COMMAND 10$: RETURN ; RETURN ;+ ; *** - PROMPT - ISSUE PROMT TO "TI" ; ; INPUT: ; NONE ; ; OUTPUT: ; NONE ; ;- PROMPT: MOV #$MDPB+14,R5 ; GET DPB ADDRESS MOV #GTSGN,(R5)+ ; SET BUFFER POINTER MOV #3,(R5)+ ; SET CHARACTER COUNT CLR (R5) ; NO CARRIAGE CONTROL CALLR $DOIO ; ISSUE QIO .SBTTL GLOBAL SUBROUTINES ;+ ; *** - $DOIO - ISSUE QIO FROM $MDPB ; ; INPUT: ; $MDPB - QIO DPB USING LUN1 AND EFN1 ; ; OUTPUT: ; RETURNS TO CALLER IF NO ERRORS ; OTHERWISE ISSUES ERROR MESSAGE DIRECTLY ; ;- $DOIO:: DIR$ #$MDPB ; ISSUE QIO BCC 10$ ; NO ERRORS YET CMP #IE.UPN,$DSW ; OUT OF POOL SPACE? BNE 20$ ; NO BR 15$ ; YES 10$: WTSE$S #EFN1 ; WAIT TILL DONE BCC 30$ ; ALL OKAY CMPB #IE.NOD,$DPBST ; OUT OF POOL SPACE? BNE 20$ ; NO, ERROR 15$: WSIG$S ; YES, WAIT FOR SOME TO FREE UP BR $DOIO ; DTRY AGAIN 20$: TRAP 8. ; IO ERROR 30$: RETURN ; .END START DE`» kQ›c, .TITLE OPEBAS-OPEN MEMORY ROUTINE .IDENT /02.2/ ; ; ; COPYRIGHT (C) 1975, 1976, 1981 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE  TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; ; VERSION: 02.2 ; BY: H. LEV ; DATE: 08/23/73 ; MODIFIED: 12/31/74 MODIFIED OPEOV FOR USE WITH BASIC MCR ; ; ; HJL025 4/7/76 CHANGE PCB, TCB AND HEADER FORMAT ; JAK028 8/4/76 CORRECTION TO GETADD AND OPEN PAR SWITCH ; ; M. JOHNSON 04-JUN-81 ; MJ018 -- FIX CONDITIONAL ASSEMBLY SO THAT .C2BTO WILL BE ; ASSEMBLED IF EITHER R$$OPE OR R$$ATL ARE DEFINED ; ; M. JOHNSON 08-JUL-81 ; MJ020 -- ADD 22-BIT SUPPORT ; ; ; THIS MODULE PROCESSES THE MCR OPEN COMMAND ; .IF DF R$$OPE .MCALL CALL,DIR$,HWDDF$,RETURN,TCBDF$,WTSE$S .IF DF M$$MGE .MCALL HDRDF$,PCBDF$ .IFTF .SBTTL EQUATED SYMBOLS ; ; CONSTANTS ; CR = 15 ; CARRIAGE RETURN ESC = 33 ; ESCAPE (ALT MODE) ; LUN1 = 1 ; LOGICAL UNIT NUMBER FOR "TI" EFN1 = 1 ; EVENT FLAG SPA = 40 ; SPACE HWDDF$ ; DEFINE HARDWAE REGISTERS TCBDF$ ; DEFINE TCB OFFSETS .IFT HDRDF$ ; DEFINE TASK HEADER OFFSETS PCBDF$ ; DEFINE PCB OFFSETS .IFTF .SBTTL LOCAL DATA OPSGN: .BYTE 0 ; SIGN OF NUMBER OPCHNG: .BYTE 0 ; CONTENTS CHANGE FLAG ; 0 = NO CHANGE ; <>0 = CHANGED OPCONT: .WORD 0 ; CONTENTS OF OPEN LOCATION OPCAD: 0,0 ; CURRENT OPEN ADDRESS ; MJ020 ; MJ020 .IFT ; MJ020 ; MJ020 OPPCB: ; PCB ADDRESS OF TASK OR PARTITION ;**-7 OPNAM: .BLKW 2 ; TASK OR PARTITION NAME OPDIB: .WORD 0 ; DISPLACEMENT IN BLOCK OF LOCATION TO BE OPENED OPBLK: .WORD 0 ; BLOCK NUMBER OF LOCATION TO BE OPENED OPOLD: .WORD 0 ; OLD CONTENTS OF OPEN LOCATION OPMOD: .BLKW 2 ; ADDRESS MODIFICATION WORDS OPOPEN: .BYTE 0 ; OPEN TYPE ; 0 = ABSOLUTE ; 2 = PARTITION ; ; KEYWORD VALUES ; PAR: .ASCIZ /PAR/ ; .EVEN .IFTF ; ; OPEN COMMANDS ; CMDTAB: .WORD ESC ; ESCAPE .WORD OPEXIT ; EXIT .WORD CR ; OPEN NEXT .WORD OPECR ; .ASCIZ /^/ ; OPEN PREVIOUS .WORD OPEBK ; .ASCIZ /*/ ; OPEN INDIRECT .WORD OPEAT ; .ASCIZ /@/ ; OPEN INDIRECT .WORD OPEAT ; .ASCIZ /_/ ; OPEN PC OFFSET .WORD OPEOF ; .WORD 0 ; END OF TABLE ; ; TRAP ERROR INSTRUCTIONS ; OERTAB: TRAP 2. ; SYNTAX ERROR TRAP 12. ; INVALID ADDRESS TRAP 9. ; BYTE ADDRESS .SBTTL PARSE THE COMMAND ;+ ; *** - $OPEEP-OPEN MEMORY MCR COMMAND ; ; FORMAT: ; OPE[N] ADDRESS[+-N][/SW=VALUE]CR TYPED IN BY USER ; ADDRESS CONTENTS/[X]TERM DISPLAYED IN SYSTEM ; ; WHERE: ; ADDRESS-IS VALID OCTAL MEMORY ADDRESS ; N - IS OCTAL NUMBER TO BE ADDED [SUBTRACTED] FROM ADDRESS-(OPTIONAL) ; [/SW =VALUE] FOR SYSTEMS WITH MEMORY MANAGEMENT ; OPTIONAL SWITCHES WHICH INDICATE ADDRESS COMPUTATION METHOD ; NULL - ABSOLUTE ADDRESS ; /PAR=PARNAM - ADDRESSES RELATIVE TO PARTITION PARNAM ; CR - CARRIAGE RETURN ; CONTENTS - CONTENTS OF MEMORY LOCATION ; X - NEW VALUE TO BE DEPOSITED IN LOCATION( OPTIONAL) ; TERM - IS ONE OF THE FOLLOWING ; CR-CARRIAGE RETURN-OPEN NEXT LOCATION ; ^CR-OPEN PREVIOUS LOCATION ; *CR-OPEN LOCATION CONTENTS POINTS TO ;  @CR-OPEN LOCATION CONTENTS POINTS TO ; _CR-OPEN LOCATION AT PC OFFSET ; ESC-EXIT FROM OPEN ; ; SIDE EFFECTS-INPUT: ; $MBUF POINTS TO COMMAND BUFFER ; $MCMD CONTAINS "OPE" IN RAD50 ; ; INPUT: ; ; R5-POINTS TO NEXT CHARACTER IN BUFFER TO BE PROCESSED ; ; OUTPUT: ; ; NONE ; ;- $OPEEP::CLR R4 ; ZERO ERROR INDEX CLR OPCAD ; ZERO CURRENT ADDRESS CMPB (R0),#CR ; IS IT A CR? ; MJ020 BEQ 25$ ; YES, ERROR ; MJ020 ;  ; MJ020 ; WE'VE PASSED THE COMMAND VERB, GET ADDRESS ; MJ020 ; ; MJ020 MOVB (R0),R2 ; GET NEXT CHAR ; MJ020 CALL OSGN ; SEARCH FOR NEXT NON-BLANK ; MJ020 BCS 25$ ; ERROR, EOL ; MJ020 CALL OCTAL ; IS IT AN OCTAL DIGIT?  ; MJ020 BCS 25$ ; NO, ERROR ; MJ020 ; MJ020 .IFT ; IS MEMORY MGMT AVAILABLE? ; MJ020 ; MJ020 CLRB OPOPEN ; SET OPEN DEFAULT TO ABSOLUTE ; MJ020 ; MJ020 .IFTF  ; MJ020 ; MJ020 MOV #OPCAD,R1 ; GET ADDRESS FOR 18 BITS ; MJ020 CALL .COT2B ; CONVERT TO TWO WORDS ; MJ020 DEC R0 ; POINT TO CURRENT CHARACTER ; MJ020 10$: CLR OPSGN ; SET SIGN TO PLUS ; MJ020 CALL OSGN ; SEARCH FOR NEXT NON-BLANK ; MJ020 BCC 12$ ; EOL ; MJ020 JMP OPESIO ; CR, END OF LINE ; MJ020 12$: CALL OCTAL ; IS IT AN OCTAL DIGIT? ; MJ020 BCS 28$ ; NO, POSSIBLE ERROR ; MJ020 ; MJ020 .IFF ; MJ020 CALL $COTB ; CONVERT TO BINARY ; MJ020 ; MJ020 .IFT ; MJ020 MOV #OPMOD,R1 ; SET ADDRESS FOR ADDRESS MODIFIER ; MJ020 CALL .COT2B ; CONVERT TO TWO WORDS ; MJ020 .IFTF ; MJ020 ; MJ020 DEC R0 ; POINT TO CURRENT CHARACTER ; MJ020 TST OPSGN ; IS SIGN NEGATIVE? ; MJ020 BEQ 20$ ; NO ; MJ020 ; MJ020 .IFF ; MJ020 NEG R1 ; YES, NEGATE DISPLACEMENT ; MJ020 20$: ADD R1, OPCAD ; ADD TO CURRENT ADDRESS ; MJ020  ; MJ020 .IFT ; MJ020 SUB (R1),OPCAD ; SUBTRACT LOW PART ; MJ020 SBC OPCAD+2 ; AND CARRY ; MJ020 SUB 2(R1),OPCAD+2 ; AND HIGH PART ; MJ020 BR 23$ ; MJ020 20$: ADD (R1),OPCAD ; ADD LOW PART  ; MJ020 ADC OPCAD+2 ; ADD CARRY BIT ; MJ020 ADD 2(R1),OPCAD+2 ; AND HIGH PART ; MJ020 23$: ; MJ020 .IFTF ; MJ020 ; MJ020 BR 10$ ; LOOP ; MJ020 25$: TRAP 2. ; SYNTAX ERROR ; MJ020 ; MJ020 .IFF ; MJ020 28$: BR 25$ ; IF NO MEM. MGMT, THIS IS AN ERROR ; MJ020 ; MJ020 .IFT ; MJ020 28$: CMPB R2,#'/ ; KEYWORD COMING?  ; MJ020 BEQ 30$ ; YES ;**-23 BR 25$ ; NO, ERROR ; MJ020 ;**-5 .IFT ; ; IF SEGMENTATION UNIT IS AVAILABLE THE FOLLOWING ; KEYWORD IS ALLOWED ; /PAR=NNNNNN ; WHERE NNNNNN IS THE NAME OF A PARTITION ; 30$: INC R0 ; POINT TO NEXT CHARACTER ; MJ020 CLR OPNAM ; YES, ZERO NAME  ; MJ020 CLR OPNAM+2 ; FIELD ;**-1 MOV #PAR,R1 ; SEE IF ITS CALL .KEYWD ; "PAR" BVS 25$ ; NO, SYNTAX ERROR ; MJ020 BCC OPPAR ; YES ;**-1 BR 25$ ; ERROR ; MJ020 ; ;**-1 ; GET PARTITION NAME FROM BUFFER AND SEARCH PCB'S FOR IT ; OPPAR: INCB OPOPEN ; SET PARTITION TYPE OPEN CALL GETNAM ; GET PARTITION NAME BCS 20$ ; ERROR CALL $NNBLK ; SEE IF A VALID TERMINATOR IS NEXT BCC 20$ ; SYNTAX ERROR MOV #OPNAM,R3 ; POINT TO NAME MOV $PARHD,R0 ; GET ADDRESS OF PCB'S 5$: CMP P.NAM(R0),(R3) ; IS THIS THE PARTITION ? BNE 10$ ; NO CMP P.NAM+2(R0),2(R3) ; MAYBE BEQ 20$ ; YES 10$: MOV P.LNK(R0),R0 ; NO, GET ADDRESS OF NEXT PCB BNE 5$ ; LOOP IF NOT END OF PCBS BEQ OPER12 ; YES, END IS ZERO WORD 20$: MOV R0,OPPCB ; SAVE PCB ADDRESS BR OPESIO ; ; ; LOCAL ERRORS FOR MEMORY MANAGEMENT VERSION OF SOFTWARE ; OPER12: TRAP 7. ; PARTITION NOT IN SYSTEM .IFTF .SBTTL DISPLAY LOCATION ; ; END OF LINE FOUND, SET UP DPB FOR I/O TO "TI" ; OPESIO: MOV #IO.ATT,$MDPB+2 ; SET ATTACH FUNCTON CALL $DOIO ; DOIT ; ; DISPLAY LOCATIONS ADDRESS AND CONTENTS ; OPEDIS: ; MOV $MBUF,R0 ; GET ADDRESS OF MCR BUFFER .IFF TST OPCAD+2 ; IS ADDRESS TOO BIG? ; MJ020 BNE OPER8 ; YES, ERROR  ; MJ020 MOV OPCAD,R1 ; GET ADDRESS OF LOCATION TO BE DISPLAYED BIT #1,R1 ; IS ADDRESS ODD ? BNE OPER9 ; YES, ERROR CALL $CBOMG ; CONVERT TO OCTAL ASCII MOVB #SPA,(R0)+ ; PUT IN A BLANK MTPS #PR7 ;;; LOCK OUT INTERRUPTS MOV @#4,-(SP) ;;; SAVE INTERRUPT VECTOR MOV #2$,@#4 ;;; SET NEW VECTOR CLC ;;; MOV @OPCAD,R1 ;;; GET CONTENTS OF LOCATION BR 3$ ;;; SKIP ERROR PROCESSING ; ; INTERRUPT COMES HERE ON NON-EXISTANT MEMORY TRAP ; 2$: TST (SP)+ ;;; POP PC MTPS #0 ;;; RESET PS SEC ;;; SET ERROR 3$: MOV (SP)+,@#4 ;;; RESET INTERRUPT VECTOR MFPS -(SP) ;;; GET OLD PS MTPS #0 ;;; ALLOW INTERRUPTS BIT #1,(SP)+ ; CARRY SET IN OLD PS? BNE OPER8 ; YES, BAD ADDRESS CALL $CBOMG ; CONVERT TO ASCII BR 4$ ; .IFT MOV #OPCAD,R1 ; SET ADDRESS OF LOCATION ADDRESS BIT #1,(R1) ; IS ADDRESS ODD ? BNE OPER9 ; YES, BYTE ADDRESS ERROR MOV PC,R2 ; SET TO PRINT LEADING ZEROES BIT #FE.EXT,$FMASK ; 11/70 EXTENDED MEMORY SUPPORT? ; MJ020 BEQ 2$ ; NO ; MJ020 BIT #177700,2(R1) ; ADDRESS ABOVE 2048. K? ; MJ020 BNE OPER8 ; YES, ERROR ; MJ020 CALL .C22TO ; YES, CONVERT 22-BIT ADDRESS ; MJ020 BR 3$ ; ; MJ020 2$: BIT #177774,2(R1) ; ADDRESS ABOVE 128. K? ; MJ020 BNE OPER8 ; YES, ERROR ; MJ020 CALL .C2BTO ; CONVERT TO 6 OCTAL DIGITS 3$: MOVB #SPA,(R0)+ ; PUT IN BLANK ; MJ020 CALL OPEN ; GET CONTENTS OF LOCATION ;**-1 BCS OPER8 ; BAD ADDRESS MOV #OPOLD,R1 ; GET CURRENT CONTENTS OF LOCATION MOV PC,R2 ; SET TO PRINT LEADING ZEROES CALL .CBTO ; CONVERT TO OCTAL .IFTF ; ; WRITE OUT LINE ; 4$: MOVB #SPA,(R0)+ ; PUT IN SPACE MOVB #'/,(R0)+ ; PUT IN / MOV #$MDPB+14,R5 ; GET ADDRESS OF DPB BUFFER POINTER MOV $MBUF,(R5) ; AND SET ADDRESS OF BUFFER SUB (R5)+,R0 ; COMPUTE LENGTH OF BUFFER MOV R0,(R5)+ ; STORE LENGTH IN DBP MOV #44,(R5) ; SET LEAD LF, NO CR MOV #IO.WVB,$MDPB+2 ; SET WRITE LOGICAL BLOCK FUNCTION CALL $DOIO ; DO THE I/O MOV #IO.RVB,$MDPB+2 ; SET READ LOGICAL BLOCK MOV #80.,$MDPB+16 ; SET BUFFER LENGTH CALL $DOIO ; READ IN NEXT COMMAND MOVB $DPBST+1,R1 ; GET TERMINATOR CMPB #CR,R1 ; IS IT CR? BEQ 5$ ; YES CMPB #ESC,R1 ; IS IT ESC (ALT MODE) BNE OPER6 ; NO, ERROR 5$: MOV $DPBST+2,R3 ; GET COUNT OF CHARS READ MOV $MBUF,R0 ; GET ADDRESS OF BUFFER ADD R0,R3 ; GET ADDRESS OF LAST BYTE MOVB R1,(R3) ; PUT IN TERMINATOR ; ; NEXT COMMAND IS IN, DECODE IT ; CLRB OPCHNG ; SET NOT CHANGED CALL $GNBLK ; GET NEXT NON-BLANK BCS OPSKP ; EOL DEC R0 ; BACK UP BUFFER POINTER TO FIRST CHARACTER CALL OCTAL ; IS IT AN OCTAL DIGIT? ; MJ020 BCS OPSKP ; NO ;**-1 INCB OPCHNG ; YES, SHOW WE'RE CHANGING CONTENTS CALL $COTB ; CONVERT TO BINARY MOV R1,OPCONT ; SAVE NEW CONTENTS BR OPSKP .SBTTL ERROR PROCESSING ;*********************** ; ; ERROR PROCESSING WAS MOVED TO THIS SPOT SO THAT ; TRANSFERS TO THESE LABELS CAN BE MADE BY ; BRANCH INSTRUCTIONS, RATHER THAN BRANCH FOLLOWED BY ; JUMP INSTRUCTIONS. ; ;*********************** ; ; ERROR PROCESSING ; OPER9: INC R4 ; 8 BYTE ADDRESS OPER8: INC R4 ; 7 ADDRESS ERROR OPER6: ; SYNTAX ERROR CALL OPDET ; DETACH TTY ASL R4 ; DOUBLE ERROR CODE JMP OERTAB(R4) ; ISSUE ERROR MESSAGE .SBTTL DETERMINE FUNCTION TO BE PERFORMED ; ; TERMINATOR FOUND WHAT IS IT? ; OPSKP: .IFF MOV OPCAD,R5 ; GET CURRENT ADDRESS .IFTF MOV #CMDTAB,R3 ; GET ADDRESS OF VALID COMMANDS 10$: CMPB R2,(R3) ; SAME COMMAND? BEQ 20$ ; YES ADD #4,R3 ; NO, BUMP TO NEXT ONE TSTB (R3) ; END OF COMMANDS? BNE 10$ ; NO, TRY NEXT ONE BR OPER6 ; YES, ERROR 20$: TSTB OPCHNG ; CHANGE CONTENTS BEQ 30$ ; NO CALL STORE ; YES .IFT MOV OPCONT,OPOLD ; SAVE NEW CONTENTS .IFTF 30$: JMP @2(R3) ; GO TO COMMAND PROCESSOR OPECR: ADD #2,OPCAD ; SET ADDRESS TO NEXT WORD .IFT ADC OPCAD+2 ; .IFTF BR OPECOM ; OPEBK: SUB #2,OPCAD ; SET ADDRESS TO PREVIOUS WORD .IFT SBC OPCAD+2 ; .IFTF BR OPECOM ; OPEAT: .IFF MOV (R5),OPCAD ; SET NEW ADDRESS .IFT MOV OPOLD,OPCAD ; CLR OPCAD+2 ; .IFTF BR OPECOM ; OPEOF: .IFF MOVB (R5),R1 ; GET OFFSET .IFT MOVB OPOLD,R1 ; GET OFFSET .IFTF ASL R1 ; DOUBLE IT ADD #2,R1 ; ADD 2 TO IT ADD R1,OPCAD ; ADD TO CURRENT ADDRESS .IFT TST R1 ; POSITIVE? BMI 10$ ; NO ADC OPCAD+2 ; BR OPECOM 10$: SBC OPCAD+2 ; .IFTF OPECOM: JMP OPEDIS ; OPEXIT: MOVB #CR,@$MBUF ; PUT IN CARRIAGE RETURN MOV #1,$MDPB+16 ; SET OUT PUT COUNT CLR $MDPB+20 ; ZERO CARRIAGE CONTROL MOV #IO.WLB,$MDPB+2 ; SET WRITE VIRTUAL CALL $DOIO ; AND ISSUE QIO CALLR OPDET ; DETTACH TTY .SBTTL SUBROUTINES .IFT ;+ ; *** - OPEN - OPEN LOCATION ON A SEGMENTED SYSTEM ; ; INPUT: ; OPOPEN - OPEN TYPE ( ABSOLUTE, KERNAL, PARTITION, TASK) ; TELLS HOW TO DETERMINE ABSOLUTE ADDRESS ; OPCAD,+2 - ADDRESS OF LOCATION TO BE OPENED ( 18 BITS) ; OPPCB - ADDRESS OF PARTITION CONTROL BLOCK FOR TASK, PARTITION ; ; OUTPUT: ; OPDIB - DISPLACEMENT IN BLOCK OF LOCATION ; OPBLK - BLOCK NUMBER OF LOCATION ; OPOLD - CONTENTS OF LOCATION ; ;- OPEN: CLR OPBLK ; ZERO BLOCK NUMBER ; MJ020 MOVB OPOPEN,R1 ; IS THIS OPEN ABSOLUTE?  ; MJ020 BEQ OPEABS ; YES ;**-1 TST OPCAD+2 ; IS ADDRESS > 2**16 ? BNE OPEBAD ; YES, ERROR BR OPEPAR ;NO, OPEN PARTITION OPEBAD: SEC ; RETURN ; ; ; OPEN ABSOLUTE ; OPEABS: BIT #FE.EXT,$FMASK ; 22-BIT MEMORY SUPPORT? ; MJ020 BEQ 5$ ; NO, BRANCH ; MJ020 BIC #177700,OPCAD+2 ; CLEAR BITS 6-15 OF THE HIGH WORD (ABOVE 22) ; MJ020 BR 8$  ; MJ020 5$: BIC #177774,OPCAD+2 ; CLEAR BITS 2-15 OF THE HIGH WORD (ABOVE 18) ; MJ020 8$: MOV OPCAD+2,R1 ; GET HIGH BITS OF ADDRESS ; MJ020 MOV OPCAD,R2 ; GET LOW 16 BITS ;**-1 BIC #177700,R2 ; CLEAR BLOCK NUMBER MOV R2,OPDIB ; SET DIB MOV OPCAD,R2 ; GET LOW BITS AGAIN BIC #77,R2 ; CLEAR DIB MOV #6,-(SP) ; SET SHIFT COUNTER ; MJ020 10$: ROR R1 ; SHIFT FROM HIGH WORD THROUGH CARRY AND ; MJ020 ROR R2 ; INTO LOW WORD ; MJ020 DEC (SP) ; DONE? ; MJ020 BGT 10$ ; NO, LOOP ; MJ020 TST (SP)+ ; CLEAN UP STACK ; MJ020 MOV R2,OPBLK ; AND SAVE BLOCK NUMBER ;**-5 CMP R2,$SYSIZ ; IS ADDRESS VALID? (EXISTS?) BLO OPEMEM ; YES BIT #FE.EXT,$FMASK ; 22-BIT EXTENDED MEMORY SUPPORT? ; MJ020 BEQ 20$  ; NO, BRANCH ; MJ020 CMP R2,#177600 ; YES, OPENING EXTERNAL PAGE? ; MJ020 BR 30$ ; ; MJ020 20$: CMP R2,#7600 ; NO, OPENING EXTERNAL PAGE? ; MJ020 30$: BHIS OPEMEM ; YES ; MJ020 BR OPEBAD ; NO, ERROR - BAD ADDRESS ;**-2 ; ; OPEN PARTITION ADDRESS ; OPEPAR: MOV OPPCB,R1 ; GET PCB ADDRESS MOV OPCAD,R2 ; GET ADDRESS MOV R2,R3 ; YES , COPY ADDRESS BIC #77,R2 ;CLEAR LOW BYTE CALL ROR6 ; CONVERT TO 32 WORD BLOCK NUMBER CMP R2,P.SIZE(R1) ; IS IT IN PARTITION? BHIS OPEBAD ;NO MOV R3,R2 ; YES, COPY ADDRESS AGAIN OPEPCB: MOV R2,R3 ; COPY ADDRESS BIC #177700,R3 ; CLEAR OF BLOCK NUMBER MOV R3,OPDIB ; SAVE DIB BIC #77,R2 ; CLEAR OUT DIB CALL ROR6 ; ROTATE IT DOWN ADD P.REL(R1),R2 ; ADD PARTITION RELATIVE BLOCK NUM. MOV R2,OPBLK ; SAVE BLOCK NUMBER BR OPEMEM ; OPEN THE LOCATION ; ; ; OPEN THE LOCATION ; OPEMEM: CALL $SWSTK,40$ ; SWITCH TO SYSTEM STACK CALL OPEADD ; SET UP SAR AND PDR MOV @#4,-(SP) ; SAVE INTERRUPT VECTOR MOV #20$,@#4 ; SET NEW VECTOR MOV (R1),OPOLD ; GET CONTENTS BR 30$ ; SKIP ERROR PROCESSING ; ; INTERRUPT COMES HERE ON NON-EXISTANT MEMORY ; 20$: TST (SP)+ ; POP OFF PC MOV (SP)+,PS ; RESTORE PS MOV @$HEADR,R2 ; GET HEADER ADDRESS BIS #1,6(R2) ; SET CARRY BIT 30$: MOV (SP)+,@#4 ; RESET INTERRUPT VECTOR 40$: RETURN ; ;+ ; *** - STORE - STORE NEW VALUE IN CURRENT LOCATION ; ; INPUT: ; NON - SEGMENTED SYSTEM ; R5 - ADDRESS OF LOCATION TO BE MODIFIED ; SEGMENTED SYSTEM ; OPDIB - DISPLACEMENT IN BLOCK OF LOCATION ; OPBLK - ABSOLUTE BLOCK IN MACHINE OF LOCATION ; ; OUTPUT: ; ; LOCATION IS MODIFIED TO CONTENTS OF OPCONT ; ;- .IFF STORE: MOV OPCONT,(R5) ; SET NEW VALUE RETURN ; .IFT STORE: CALL $SWSTK,100$ ; SWITCH TO SYSTEM STACK CALL OPEADD ; SET SAR AND PDR MOV OPCONT,(R1) ; SET NEW VALUE 100$: RETURN ; RETURN TO USER STACK ;+ ; *** - OPEADD - SET UP SAR6 SO THAT THE REQUESTED ; LOCATION CAN BE READ OR ALTERED ; ; INPUT: ; OPDIB - DISPLACEMENT IN BLOCK OF WORD REQUESTED ; OPBLK - BLOCK NUMBER OF WORD DESIRED ; ; OUTPUT: ; SAR6 IS SET UP TO READ THE ADDRESS ; R1 - CONTAINS ADDRESS BIASED BY 140000 TO READ WORD ; ;- OPEADD: MOV OPBLK,@#KISAR6 ; SET BLOCK NUMBER IN SAR6 MOV OPDIB,R1 ; GET DIB ADD #140000,R1 ; MAKE IT LOOK LIKE ITS IN PAGE6 RETURN .IFTF .IFTF ;+ ; *** - OPDET-DETACH TERMINAL ; ; INPUTS-NONE ; ; OUTPUTS-NONE ; ;- OPDET: MOV #IO.DET,$MDPB+2 ; SET DETACH FUNCTION CALL $DOIO ; DO IT RETURN ; RETURN ;+ ; MJ020 ; *** - OSGN-LOOK FOR SIGN AND SET OPSGN ; MJ020 ; ; MJ020 ; THIS ROUTINE SCANS THROUGH BUFFER LOOKING FOR NEXT NON-BLANK ; MJ020 ; CHARACTER. IF ITS A SIGN, IT SETS OPSGN TO 0 IF + OR -1 IF -. ; MJ020 ; IT THEN CONTINES TO SCAN THE BUFFER. IT STOPS ON A NON-BLANK AND ; MJ020 ; NON-SIGN CHARACTER. ; MJ020 ; ; MJ020 ; INPUTS: ; MJ020 ; R0 - ADDRESS 1ST CHAR IN BUFFER ; MJ020 ; R2 - CHAR IN BUFFER ; MJ020 ; ; MJ020 ; OUTPUTS: ; MJ020 ; R0 - ADDRESS OF LAST CHAR LOOKED AT ; MJ020 ; R2 - LAST CHAR LOOKED AT ; MJ020 ; CARRY SET - CR FOUND ; MJ020 ; CARRY CLEAR - NOT CR ; MJ020 ; ; MJ020 ;- ; MJ020 OSGN: CMPB R2,#SPA ; IS IT A SPACE? ; MJ020 BNE 10$ ; NO ; MJ020 5$: INC R0 ; YES, SKIP IT ; MJ020 MOVB (R0),R2 ; GET NEXT CHAR  ; MJ020 BR OSGN ; LOOP ; MJ020 10$: CMPB R2,#CR ; IS IT CR? ; MJ020 BEQ 30$ ; YES ; MJ020 CMPB R2,#'+ ; PLUS SIGN? ; MJ020 BEQ 5$ ; YES ; MJ020 CMPB R2,#'- ; MINUS SIGN? ; MJ020 BNE 20$ ; NO  ; MJ020 COM OPSGN ; YES, NEGATE FLAG ; MJ020 BR 5$ ; ; MJ020 20$: CLC ; CLEAR CARRY, NO EOL ; MJ020 BR 40$ ; ; MJ020 30$: SEC ; SEC ; MJ020 40$: RETURN ; ; MJ020 ;+ ; MJ020 ;  ; MJ020 ; MJ020 ;+ ; MJ020 ; *** - OCTAL CHECK IF CHARACTER IS A VALID OCTAL DIGIT ; MJ020 ; ; MJ020 ; INPUTS:  ; MJ020 ; ; MJ020 ; R2 IS CHARACTER TO BE CHECKED ; MJ020 ; ; MJ020 ; OUTPUTS: ; MJ020 ; ; MJ020 ; CARRY - 0 VALID DIGIT  ; MJ020 ; CARRY - 1 INVALID DIGIT ; MJ020 ; ; MJ020 ;- ; MJ020 OCTAL: CMPB R2,#'0 ; IS THE DIGIT 0-7? LT IS ERROR ; MJ020 BLT 10$ ; NO ; MJ020 CMPB R2,#'7 ; MAYBE, GT IS ERROR ; MJ020 BGT 10$ ; NO ; MJ020 CLC ; YES, CLEAR CARRY ; MJ020 BR 20$ ; ; MJ020 10$: SEC ; SET CARRY ; MJ020 20$: RETURN ; ; MJ020 ; MJ020 ; MJ020  ; MJ020 .IFT ; MJ020 ; MJ020 ;+ ;**-79 ; *** - GETNAM - GET PARTITION NAME ; ; INPUT: ; R0 - POINTS TO BUFFER ; ; OUTPUT: ; R0- UPDATED TO NEXT CHARACTER IN BUFFER ; CARRY ; SET - DID'T GET A PROPER NAME ; CLEAR - GOT A GOOD NAME ; OPNAM,+2 - NAME GOTTEN BY ROUTINE ; ;- GETNAM: MOV PC,R1 ; SET ALLOW PERIODS CALL $CAT5 ; CONVERT TO RAD50 MOV R1,OPNAM ; STORE FIRST 3 CHARS BCS 10$ ; NO MORE TO GET CALL $CAT5 ; GET NEXT 3 CHARS MOV R1,OPNAM+2 ; STORE THEM TOO BCS 10$ ; LESS THEN 3 CHARACTERS? MOVB (R0)+,R2 ; NO, GET NEXT CHARACTER 10$: TST OPNAM ; DID WE GET A NAME ? BEQ 20$ ; NO CLC ; YES, SET GOOD FLAG BR 30$ ; 20$: SEC ; 30$: RETURN ; ;+ ; *** - ROR6 - ROTATE R2 RIGHT 6 BITS ; *** - ROR4 - ROTATE R2 RIGHT 4 BITS ; ; INPUT: ; R2 - CONTENTS TO BE ROTATED RIGHT ; ; OUTPUT: ; R2 - ROTATED REQUESTED AMOUNT ; ;- ROR6: CLC ; ZERO CARRY BIT ROR R2 ; ROR R2 ; ROR4: ROR R2 ; ROR R2 ; ROR R2 ; ROR R2 ; RETURN ; RETURN TO CALLER .ENDC ; MJ018 ; MJ018 .ENDC  ; MJ018 ;+ ; MJ018 .IF DF M$$MGE ; MJ018 ; MJ018 .IF DF R$$OPE ! R$$ATL ; MJ018 ; MJ018 ; THIS ROUTINE CONVERTS BINARY NUMBERS TO OCTAL ASCII DIGITS ; MJ020 ; ; MJ020 ; *** - .C22TO - CONVERTS A 22 BIT NUMBER TO OCTAL ; MJ020 ; *** - .C2BTO - CONVERTS AN 18 BIT NUMBER TO OCTAL ; MJ020 ; *** - .CBTO - CONVERTS A 16 BIT NUMBER TO OCTAL ; MJ020 ; ; MJ020 ; INPUT:  ; MJ020 ; R0 - BUFFER ADDRESS ; MJ020 ; R1 - ADDRESS OF TWO WORD BINARY NUMBER ; MJ020 ; (R1) - LOW PART ; MJ020 ; 2(R1) - HIGH PART ; MJ020 ; R2 - LEADING ZERO FLAG ; MJ020 ; 0 = SUPPRESS LEADING ZEROES  ; MJ020 ; 0 <> ALLOW LEADING ZEROES ; MJ020 ; ; MJ020 ; OUTPUT: ; MJ020 ; R0 - UPDATED ; MJ020 ; R1 - UNCHANGED ; MJ020 ; R2 - UNCHANGED  ; MJ020 ; R3 - USED ; MJ020 ;- ; MJ020 .MCALL SAVNR,RETURN ; MJ020 .ENABL LSB ; MJ020 .C22TO:: SAVNR ; SAVE R4 AND R5 ; MJ020 MOV (R1),R4 ; GET LOW PART ; MJ020 MOV 2(R1),R5 ; GET HIGH PART ; MJ020 BIC #177700,R5 ; CLEAR BITS NOT IN A 22-BIT ADDRESS ; MJ020 MOV #11.,-(SP) ; SET COUNT OF SHIFTS TO SET UP ; MJ020 CLR R3 ; ZERO DIGIT ; MJ020 SEC ; SET FLAG TO INDICATE END OF DATA ; MJ020 5$: ROL R4 ; SHIFT IN END MARK ; MJ020 ROL R5 ; SHIFT IN LOW BIT ; MJ020 ROL R3 ; SHIFT IN DIGIT  ; MJ020 DEC (SP) ; DONE? ; MJ020 BNE 5$ ; NO, LOOP ; MJ020 TST (SP)+ ; YES, CLEAN STACK ; MJ020 BR CBTO ; ; MJ020 ; MJ020 .C2BTO:: SAVNR ; SAVE R4 AND R5 ; MJ020 MOV (R1),R5 ; GET LOW PART  ; MJ020 MOV 2(R1),R3 ; GET HIGH PART ; MJ020 BIC #177774,R3 ; CLEAR BITS NOT IN AN 18-BIT ADDRESS ; MJ020 BR 10$ ; ; MJ020 ; MJ020 .CBTO:: SAVNR ; SAVE R4 AND R5 ; MJ020 MOV (R1),R5 ; GET LOW PART ; MJ020 CLR R3 ; ZERO DIGIT  ; MJ020 10$: CLR R4 ; ZERO LOWEST PART ; MJ020 SEC ; SET END FLAG ; MJ020 ROL R5 ; SHIFT IN END MARKER ; MJ020 ROL R3 ; SHIFT UP BIT INTO DIGIT ; MJ020 ; MJ020 CBTO: CLR -(SP) ; SET COUNT OF NON-ZERO DIGITS SEEN ; MJ020 25$: TST R3 ; ZERO DIGIT?  ; MJ020 BNE 30$ ; CONVERT IF NOT ; MJ020 TST (SP) ; YES, ANY NON-ZERO DIGIT SEEN YET ; MJ020 BNE 30$ ; YES ; MJ020 TST R2 ; NO, SUPPRESS LEADING ZERO? ; MJ020 BEQ 40$ ; YES ; MJ020 30$: ADD #'0,R3 ; NO, CONVERT TO OCTAL DIGIT ; MJ020 MOVB R3,(R0)+ ; AND PUT IT IN BUFFER ; MJ020 INC (SP) ; INCREMENT NUMBER OF DIGITS CONVERTED ; MJ020 40$: MOV #3,-(SP) ; SET SHIFT COUNT ; MJ020 CLR R3 ; ZERO DIGIT ; MJ020 50$: ROL R4 ; SHIFT LOW TO HIGH ; MJ020 ROL R5 ; SHIFT HIGH TO CARRY ; MJ020 ROL R3 ; SHIFT CARRY INTO DIGIT ; MJ020 DEC (SP) ; DONE? ; MJ020 BNE 50$ ; NO, LOOP  ; MJ020 TST (SP)+ ; CLEAR COUNT ; MJ020 TST R5 ; DONE? ; MJ020 BNE 25$ ; NO, LOOP ; MJ020 TST R4 ; MAYBE ; MJ020 BNE 25$ ; NO ; MJ020 TST (SP)+ ; YES, POP OFF ZERO COUNT ; MJ020 RETURN ; ; MJ020 .DSABL LSB  ; MJ020 ; MJ020 .ENDC ; MJ018 ; MJ018 .ENDC ; MJ018 ; MJ018 ;+  ; MJ018 .IF DF R$$OPE ; MJ018 ; MJ018 ; *** - .COT2B - CONVERT OCTAL NUMBER TO TWO BINARY WORDS ; THIS SUBROUTINE CONVERTS AN ASCII OCTAL ; NUMBER TO BINARY. IT ACCEPTS ONLY ; OCTAL DIGITS. ; ; INPUT: ; R0 - ADDRESS OF NEXT DIGIT IN BUFFER FOR NUMBER ; R1 - ADDRESS OF TWO WORD FIELD TO PUT CONVERTED NUMBER IN ; WORD 1 - LOW 16 BITS ; WORD 2 - HIGH 16 BITS ; ; OUTPUT: ; R0 - UPDATED BUFFER POINTER ; R1 - UNCHANGED ; R2 - TERMINATING CHARACTER ; ; CARRY BIT ; CLEAR - ONLY 16 BIT NUMBER ; SET - 32 BIT NUMBER ; ;- .COT2B::CLR (R1) ; ZERO OUT LOW 16 BITS CLR 2(R1) ; ZERO OUT HIGH 16 BITS 10$: MOVB (R0)+,R2 ; GET NEXT CHARACTER CMPB R2,#'0 ; IS IT <0 ? BLT 30$ ; YES CMPB R2,#'7 ; IS IT >7 ? BGT 30$ ; YES BIC #177770,R2 ; STRIP OF ASCII BITS MOV #3,-(SP) ; SET SHIFT ÆCOUNT 20$: CLC ; ZERO CARRY BIT ROL (R1) ; ROTATE BIT 15 ROL 2(R1) ; INTO BIT 16 DEC (SP) ; DONE ? BNE 20$ ; NO, LOOP FOR THREE BITS TST (SP)+ ; POP OFF COUNTER BIS R2,(R1) ; PUT IT IN BR 10$ ; GET NEXT DIGIT 30$: TST 2(R1) ; IS THERE MORE THAN 16 BITS ? BEQ 50$ ; NO SEC ; YES, SET 32 BIT FLAG 50$: RETURN ; RETURN TO CALLER .ENDC ;**-2 .END Æãf» kQ›c, .TITLE PRSBAS - PARSER FOR TASKNAME .IDENT "01" ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; ; VERSION 01 ; BY H. LEV ; DATE: 08/28/73 ; MODIFIED: 12/31/74 MODIFIED PR1OV FOR USE WITH BASIC MCR ; ; ; ; THIS IS THE PARSER FOR COMMANDS WHICH HAVE THE NAMES AS THEIR ONLY PARAMETER. ; .MCALL CALL,RETURN ; ; EQUATED SYMBOLS ; CR = 015 ; CARRIAGE RETURN SPA = 040 ; SPACE .SBTTL PARSER CODE ;+ ; *** - $PRSR - PARSER ENTRY POINT - GETS TASK NAME ; FOR COMMANDS: ; ABO[RT] TASKNAME ; CAN[CEL] TASKNAME ; REM[OVE] TASKNAME ; ; ; THIS ROUTINE OBTAINS THE TASK NAME FROM THE BUFFER AND ; CONVERTS IT TO RAD50. IT THEN SEARCHS FOR A VALID ; TERMINATOR WHICH IS ONLY 'CR'. IF IT FINDS IT, IT RETURNS TO ; THE COMMAND PROCESSOR . IF NOT FOUND, IT TRAPS ; THE ERROR PROCESSOR (SYNTAX ERROR). ; ; ; INPUT: ; R5 - POINTS TO NEXT CHARACTER IN COMMAND BUFFER ; $MBUF - CONTAINS ADDRESS OF BUFFER ; $MCMD - CONTAINS COMMAND PROCESSOR NAME AND ENTRY POINT ; ; ; OUTPUT: ; $MPARS, +2 CONTAINS RAD50 TASKNAME (2 WORDS) ; $MPARS+4 TCB ADDRESS ; ;- $PRSR:: CMPB (R0),#CR ; IS NEXT CHAR CARRIAGE RETURN? BEQ PRSRER ; YES, SYNTAX ERROR ; ; WE HAVE PASSED THE COMMAND VERB, NOW WE SHOULD BE AT ; THE START OF THE TASK NAME SO WE'LL TRY TO GET IT. ; 20$: MOV #$MPARS+2,R3 ; GET ADDRESS OF PARAMETER AREA CLR (R3) ; CLEAR IT CLR -(R3) ; OUT MOV PC,R1 ; SET FLAG TO ALLOW PERIODS CALL $CAT5 ; CONVERT TO RAD50 MOV R1,(R3)+ ; STORE THEM BEQ PRSRER ; ZERO MEANS NONE CONVERTED, SYNTAX ERROR BCS 40$ ; LESS THAN 3 CHARS CALL $CAT5 ; GET NEXT 3 MOV R1,(R3)+ ; STORE THEM BCS 40$ ; LESS THAN 3 CHARS MOVB (R0)+,R2 ; 3 GOT, GET NEXT CHARACTER ; ; TASKNAME IS STORED IN $MPARS AND $MPARS+2. 40$: MOV #$MPARS,R3 ; GET ADDRESS OF TASK NAME CLR $MPARS+4 ; SET TASK NOT IN SYSTEM CALL $SWSTK,45$ ; SWITCH TO SYSTEM STACK CALL $SRSTD ; SEARCH STD FOR TASK BCS 42$ ; ERROR NOT IN SYSTEM MOV R0,$MPARS+4 ; ÄSAVE TCB ADDRESS 42$: RETURN ; RETURN TO USER 45$: TST $MPARS+4 ; TASK FOUND? BEQ 50$ ; NO ERROR RETURN ; 50$: TRAP 11. ; TASK NOT IN SYSTEM PRSRER: TRAP 2. ; SYNTAX ERROR .END ÄLq» kQ›c, .TITLE REDBAS - MCR REDIRECT COMMAND PROCESSOR .IDENT "01" ; ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 01 ; BY: H. LEV ; DATE: 10/9/73 ; MODIFIED: 1/2/75 TO RUN WITH BASIC MCR ; ; ; ; THIS MODULE PROCESSES THE MCR REDIRECT COMMAND ; .MCALL CALL,RETURN ; ; EQUATED SYMBOLS ; SPA = 040 ; SPACE CR = 015 ; CARRIAGE RETURN ESC = 033 ; ESCAPE ;+ ; ***-$REDEP-REDIRECT MCR COMMAND PROCESSOR ; ; THIS ROUTINE PROCESSES THE MCR REDIRECT COMMNAND. ; IT CHANGES THE REDIRECT POINTER OF A UCB TO ; POINT TO ANOTHER UCB. ; ; FORMAT: ; RED[IRECT] NUD_OLD ; ; WHERE: ; [1RECT] IS OPTIONAL REST OF COMMAND NAME ; NUD IS DEVICE AND UNIT NAME TO WHICH OLD IS ; TO BE REDIRECTED ; _ IS THE REDIRECTION OPERATOR IT MAY BE ; EITHER "_" OR "=" ; OLD IS THE DEVICE AND UNIT NAME WHICH IS TO ; BE REDIRECTED TO NUD ; FORMAT OF NUD AND OLD: ; DDNN: ; WHERE ; DD - 2 MHAR DEVICE MNEMONIC ; NN - DEVICE UNIT NUMBER ; ; ;- $REDEP::MOVB (R0),R2 ; GET NEXT CHARACTER CMPB R2,#CR ; END OF LINE? BEQ REDER1 ; YES SYNTAX ERROR ; ; GET NEW AND OLD DEVICE UCB ADDRESSES ; MOV #$MPARS,R3 ; SET PARAMETER ADDRESS CALL $FDUCB ; GET UCB ADDRESS BCC 20$ ; SKIP IF FOUND NEW DEVICE UCB TST R3 ; SYNTAX ERROR? BEQ REDER1 ; YES TRAP 19. ; NEW DEVICE NOT IN SYSTEM 20$: MOV R1,(R3)+ ; SAVE NEW DEVICE UCB ADDRESS CALL $GNBLK ; GET NEXT NON-BLANK 25$: CMPB R2,#'= ; IS IT EQUALS SIGN? BNE REDER1 ; NO, SYNTAX ERROR CALL $FDUCB ; GET OLD DEVICE UCB ADDRESS BCC 30$ ; SKIP IF FOUND IT TST R3 ; SYNTAX ERROR? BEQ REDER1 ; YES TRAP 18. ; OLD DEVICE NOT IN SYSTEM 30$: MOV R1,(R3) ; SAVE OLD DEVICE UCB ADDRESS BITB #US.RED,U.ST2(R1) ; IS IT REDIRECTABLE? BEQ 70$ ; YES TRAP 27. ; NO, DEVICE NOT REDIRECTABLE ; ; NOW GET VALID TERMINATOR ; 70$: CALL $GNBLK ; GET NEXT NON-BLANK BCC REDER1 ; ANYTHING BUT EOL IS ERROR ; ; TEST DEVICE TYPES ; 80$: MOV $MPARS,R5 ; SET NEW DEVICE UCB ADDRESS MOV $MPARS+2,R4 ; GET UCB ADDRESS OF OLD DEVICE MOV U.DCB(R4),R0 ; GET DCB ADDRESS OF OLD DEVICE CMP #"TI,D.NAM(R0) ; IS IT "TI" ? BEQ REDER7 ; YES, CAN'T REDIRECT IT. MOV U.DCB(R5),R0 ; GET DCB ADDRESS OF NEW DEVICE CMP #"TI,D.NAM(R0) ; IS NEW DEVICE TI? BEQ REDER7 ; YES, CAN'T REDIRECT TO IT EITHER MOV R4,R0 ; COPY UCB ADDRESS 83$: MOV U.RED(R0),R0 ; FOLLOW REDIRECT POINTER CMP R0,U.RED(R0) ; IS THIS THE END? BNE 83$ ; NO, CONTINUE DOWN LIST BIT #DV.MNT,U.CW1(R0) ; IS DEVICE MOUNTABLE? BEQ 85$ ; NO BITB #US.MNT,U.STS(R0) ; YES, IS VOLUME MOUNTED? BEQ REDER8 ; YES, CAN'T REDIRECT IT THEN! 85$: TST U.ATT(R0) ; IS DEVICE ATTACHED? BNE REDER6 ; YES, CAN'T REDIRECT IT 87$: CMP R4,R5 ; REDIRECTING TO SELF ? BNE 90$ ; NO BIT #DV.PSE,U.CW1(R4) ; YES, IS IT A PSUEDO DEVICE ? BNE REDER5 ; YES, CAN'T REDIRECT PSUEDO DEVICE TO SELF BEQ 110$ ; NO, THEN DO IT ; ; AT THIS POINT R4 HAS ADDRESS OF UCB TO BE REDIRECTED ; AND R5 HAS ADDRESS OF UCB TO BE REDIRECTED TO. ; ; CHECK THAT NEW DEVICE IS NOT REDIRECTED TO OLD DEVICE ; TO PREVENT ENDLESS LOOP OF REDIRECTION ; 90$: MOV R5,R1 ; GET UCB ADDRESS 100$: MOV U.RED(R1),R0 ; GET REDIRECT POINTER CMP R0,R1 ; POINTING TO ITSELF? BEQ 110$ ; YES, END OF REDIRECT LIST CMP R0,R4 ; IS THE CURRENT UCB THE ONE TO BE REDIRECTED ? BEQ REDER4 ; YES, THIS IS AN ERROR. IF WE DO THE REDIRECT ; WE WILL HAVE A REDIRECTION LOOP MOV R0,R1 ; NO, COPY UCB ADDRESS BR 100$ ; LOOP ; ; EVERYTHING IS OKAY, ”REDIRECT OLD TO NEW ; 110$: MOV R5,U.RED(R4) ; REDIRECT, STORE NEW UCB ADDRESS IN OLD. RETURN ; RETURN TO DISPATCHER ; ; ERRORS ; REDER8: TRAP 25. ; 8 OLD DEVICE MOUNTED REDER7: TRAP 22. ; 7 TI REDIRECT ERR REDER6: TRAP 21. ; 6 OLD DEVICE ATTACHED REDER5: TRAP 20. ; 5 PSUEDO DEVICE REDIRECT ERR. REDER4: TRAP 17. ; 4 CIRCULAR REDIRECT ERR REDER1: TRAP 2. ; 1 SYNTAX ERROR .END ”Uq» kQ›c, .TITLE REMBAS REMOVE MCR COMMAND .IDENT /02.01/ ; ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD MASS. ; ; COPYRIGHT (C) 1976,1980 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 02 ; VERSION: 02.01 ; DATE: 08/29/73 ; MODIFIED: 12/30/74 ALTERED FIXOV TO GET REMOVE CODE FOR BASIC MCR ; ; ; HJL025 4/7/76 CHANGE PCB, TCB AND TASK HEADER FORMAT ; JAK028 8/12/76 CHANGE TCB FORMAT ; JAK029 12/14/76 DEALLOCATE INTERNAL TASK HEADER ; ; ; ; E. A. FLOYD 27-MAY-80 ; EF007 -- ADD V3.0 CHANGE FOR SYSTEM ; CONTROLLED PARTITION SUPPORT ; ; E. A. FLOYD 24-MAR-81 ; EF053 -- DEALLOCATE ATTACHMENT DESCRIPTORS ; ; ; THIS MODULE PROCESSES THE MCR REMOVE COMMAND ; .MCALL PCBDF$ PCBDF$ ; DEFINE PCB OFFSETS ;+ ; *** - $REMEP REMOVE MCR COMMAND ENTRY POINT ; ; THIS MODULE PROCESSES THE REMOVE MCR COMMAND ; ;- $REMEP::CALL $PRSR ; PARSE TASK NAME CALL $NNBLK ; GET NEXT NON-BLANK BCS 5$ ; GOOD, EOL TRAP 2. ; SYNTAX ERROR 5$: MOV $MPARS+4,R0 ; GET TCB ADDRESS TST T.STAT(R0) ; TASK ACTIVE? BMI 10$ ; NO TRAP 16. ; YES, ERROR 10$: CALL $SWSTK,$MCR ; SWITCH TO SYSTEM STATE MOV #$TSKHD-T.TCBL,R2 ; GET ADDRESS OF TASK LIST 15$: CMP T.TCBL(R2),R0 ; IS THIS THE POINTER TO OUR TASK BEQ 20$ ; YES MOV T.TCBL(R2),R2 ; NO, GET NEXT TCB BR 15$ ; TRY AGAIN 20$: MOV T.TCBL(R0),T.TCBL(R2) ; YES, REMOVE TCB AND RELINK LIST MOV T.PCB(R0),R5 ; GET PCB ADDRESS MOV P.MAIN(R5),R4 ; GET MAIN PCB ADDRESS ;EF007 BIT #PS.SYS,P.STAT(R4) ;IS PARTITION SYSTEM CONTROLLED? ;EF007 BEQ 27$ ;EQ => NO ;EF007 ;EF007 .IF DF M$$MGE&D$$YNM ;EF007 ;EF007 MOV R0,-(SP) ; ;EF007 MOV R1,-(SP) ;SAVE R0,R1,R2 ;EF007 MOV R2,-(SP) ; ;EF007 MOV T.PCB(R0),R1 ;GET ADDRESS OF PARTITION PCB ;EF007 MOV P.MAIN(R1),R0 ;GET MAIN PCB ADDRESS ;EF007 ;EF007 25$: MOV R0,R2 ;SAVE ADDRESS OF PREVIOUS PCB ;EF007 MOV P.SUB(R2),R0 ;GET ADDRESS OF NEXT PCB ;EF007 CMP R0,R1 ;TASK PCB? ;EF007 BNE 25$ ;NE =>NO ;EF007 MOV P.SUB(R0),P.SUB(R2) ;REMOVE PCB FROM LIST ;EF007 MOV (SP)+,R2 ; ;EF007 MOV (SP)+,R1 ;RESTORE R0,R1,R2 ;EF007 MOV (SP)+,R0 ; ;EF007 ;EF007 .IFTF ;EF007 ;EF007 27$: ADD #P.BUSY,R5 ;GET BUSY BIT ADDRESS ;EF007 BICB (R5)+,(R5) ; CLEAR IT ;**-1 BICB -(R5),P.BUSY+1(R4) ; AND MAIN BIT TOO ;EF007 .ENDC ;EF007 ;EF007 ; ; CANCEL SCHEDULED REQUESTS ; MOV R0,R5 ; SAVE TCB ADDRESS MOV #C.SCHD,R4 ; REMOVE PERIODIC REQUESTS CALL $CLRMV ; TST (R4)+ ; REMOVE CALL $CLRMV ; SINGLE SHOT REQUESTS CMP (R4)+,(R4)+ ; SET TO REMOVE TYPE 8 REQUESTS CALL $CLRMV ; REMOVE THESE REQUESTS ; ; REMOVE RECIEVE LIST ENTRIES AND FREE THEM UP  ; MOV R5,R4 ; GET TCB ADDRESS ADD #T.RCVL,R4 ; POINT TO RECIEVE LIST HEAD 30$: MOV R4,R0 ; COPY RECIEVE LIST HEAD CALL $QRMVF ; GET A RECIEVE PACKET BCS 31$ ;SKIP IF NO MORE MOV R1,R0 ;COPY PACKET ADDRESS CALL $DEPKT ;REALEASE PACKET SPACE BR 30$ ;LOOP UNTILL DONE 31$: .IF DF P$$LAS MOV R5,R4 ;GET TCB ADDRESS ADD #T.RRFL,R4 ;POINT TO RECIEVE BY REFERENCE LISTHEAD 32$: MOV R4,R0 ;COPY LISTHEAD CALL $QRMVF ;GET RECIEVE PACKET BCS 40$ ;SKIP IF DONE MOV R1,-(SP) ; SAVE PACKET ADDRESS MOV R5,-(SP) ; SAVE TCB ADDRESS MOV 10(R1),R5 ; GET ATTACHMENT DESCRIPTOR ADDRESS CALL $DETRG ; DETTACH REGION FROM TASK MOV (SP)+,R5 ; RESTORE TCB ADDRESS MOV (SP)+,R1 ; RESTORE PACKET ADDRESS MOV R1,R0 ; COPY ADDRESS OF PACKET CALL $DEPKT ; RELEASE PACKET SPACE BR 32$ ;LOOP UNTILL DONE .ENDC 40$: .IF DF M$$MGE MOV T.PCB(R5),R1 ; GET PCB ADDRESS MOV P.HDR(R1),R0 ; GET HEADER ADDRESS MOV H.HDLN(R0),R1 ; GET HEADER LENGTH CALL $DEACB ; DEALLOCATE INTERNAL TASK HEADER ;EF007 .IF DF D$$YNM ;EF007 ;EF007 MOV T.PCB(R5),R0 ;GET PCB ADDRESS ;EF007 MOV #P.LGTH,R1 ;GET LENGTH OF PCB ;EF007 CALL $DEACB ;DEALLOCATE PCB ;EF007 ;EF007 .ENDC ;EF007 ;EF007 .ENDC MOV R5,-(SP) ;COPY TCB ADDRESS ;EF053 BIT #FE.PLA,$FMASK ;PLAS SUPPORTED? ;EF053 BEQ 100$ ;EQ=>NO, CONT ;EF053 MOV R5,R4 ;COPY TCB ;EF053 50$: MOV R4,R0 ;RESTORE R0 ;EF053 MOV T.ATT(R4),R5 N ;GET ATT. LISTHEAD ;EF053 BEQ 100$ ;END OF LIST ;EF053 SUB #A.TCBL,R5 ;FAKE OUT LIST LINK ;EF053 CALL $DETRG ;DETACH REGION ;EF053 BR 50$ ;LOOP ;EF053 100$: MOV (SP)+,R5 ;RESTORE R5 ;EF053 MOV R5,R0 ;ADDRESS OF TCB MOV #T.LGTH,R1 ; SET TCB LENGTH CALLR $DEACB ; RELEASE SPACE OF TCB .END Ns» kQ›c, .TITLE RPSBAS - RUN COMMAND PARSER .IDENT "02" ; ; ; ; COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; COPYRIGHT (C) 1981 ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 02 ; BY: H. LEV ; DATE: 08/24/73 ; MODIFIED: 12/31/74 CHANGED TO RUN WITH BASIC MCR ; ; E. A. FLOYD 11-MAR-81 ; EF052 -- FIX PARSING OF TIME AND UNITS ; ; ; THIS IS THE PARSER FOR THE MCR RUN COMMAND ; .MCALL CALL,CLKDF$,DEVDF$,DIR$,RETURN ; ; EQUATED SYMBOLS ; CR = 015 ; CARRIAGE RETURN SPA = 040 ; SPACE ESC = 33 ; ESCAPE ; ; LOCAL OFFSETS INTO $MPARS ; TASK = 0 ; TASK NAME IN RAD50 TCB = 4 ; TCB ADDRESS CLKQ = 6 ; CLOCK QUE ELEMENT ADDRESS RUNTYP = 10 ; RUN TYPE; 0-RUN, 1-SYNC, 2-SCHEDULE CLKDF$ ; DEFINE CLOCK QUE OFFSETS DEVDF$ ; DEFINE DCB, UCB, AND SCB OFFSETS .SBTTL LOCAL DATA TIM: .ASCIZ /TSMH/ ; VALID TIME INTERVALS TIMCD: .BYTE 1,2,3,4 ; TIME CODES RSI: .ASCIZ /RSI/ ; RESCHEDULE INTERVAL UIC: .ASCIZ /UIC/ ; USER ID CODE .EVEN ; ; ERROR WORDS ; ERROR: TRAP 2. ; SYNTAX ERROR TRAP 10. ; INVALID TIME PARAMETER TRAP 4. ; INVALID KEYWORD TRAP 23. ; INVALID UIC .SBTTL GET TASK NAME IF ANY ;+ ; *** - $RPSEP-MCR RUN COMMAND PARSER ; THIS OVERLAY PARSES THE RUN COMMAND. ; IT ALLOCATES SPACE FOR A CLOCK QUE ELEMENT AND SETS ; UP THE TIME AND RESCHEDULE INTERVAL, IF ANY, THERE. ; IT STORES THE TASK NAME IN $MPARS AND ALSO THE ADDRESS ; OF THE CLOCK QUE ELEMENT. ; ; FORMAT: ; ; RUN TASKNAME [[DTIME]![ATIME]![SYNC [DTIME]][/SW=VALUE] ; ; WHERE: ; TASKNAME IS 1-6 CHARACTER TASK NAME ; DTIME IS START TIME IN DELTA UNITS OF THE FORM: ; NNNNNU ; WHERE: ; NNNNN IS A NUMBER ; U = T-TICKS ; S-SECONDS ; M-MINUTES ; H-HOURS ; ATIME IS START TIME IN ABSOLUTE TIME FORM ; HH:MM:SS ; WHERE: HH - IS HOURS 0<=HH<24 ; MM - IS MINUTES 0<=MM<60 ; SS - IS SECONDS 0<=SS<60 ; SYNC IS SYNCHRONIZATION UNIT ; WHICH MAY BE ; H - ON THE NEXT HOUR ; M - ON THE NEXT MINUTE ; S - ON THE NEXT SECOND ; T - ON THE NEXT TICK ; ; [/SW=VALUE] OPTIONAL KEYWORDS ; /RSI=RTIME IS OPTIONAL RESCHEDULE INTERVAL ; FORMAT FOR RTIME: IS SAME AS FOR DTIME ; /UIC=[GRP,PRG] - GROUP AND PROGRAMMER CODES ; GRP - IS GROUP CODE ; PRG - IS PROGRAMMER CODE ; ;- $RPSEP::CALL $PRSR ; PARSE OUT TASK NAME DEC R0 ; BACKUP BUFFER POINTER MOV #$MPARS,R5 ; GET PARAMETER AREA ADDRESS CLR RUNTYP(R5) ; ZERO RUN TYPE ; ; ALLOCATE CLOCK QUE ELEMENT ; 50$: CLR CLKQ(R5) ; SET NO CLOCK QUE ENTRY CALL $SWSTK,52$ ; SWITCH TO SYSTEM STACK MOV #C.LGTH,R1 ; SET LENGTH OF CLOCK QUE ELEMENT CALL $ALOCB ; ALLOCATE IT BCS 5$ ; COULDN'T GET ONE MOV R0,CLKQ(R5) ; SAVE ADDRESS 5$: RETURN ; RETURN TO USER STACK 52$: MOV CLKQ(R5),R4 ; GET CLOCK QUE ENTRY ADDRESS BNE 56$ ; GOOD, GOT A CLOCK QUE ELEMENT 54$: TRAP 3. ; NO POOL SPACE 56$: MOV #C.LGTH/2,R3 ; GET SIZE MOV R4,R1 ; COPY CLOCK QUE ADDRESS 57$: CLR (R4)+ ; ZERO WORD DEC R3 ; DONE ? BGT 57$ ; NO, LOOP MOV $MUCB,R4 ; GET UCB ADDRESS OF TERMINAL MOV U.UIC(R4),C.UIC(R1) ; STORE DEFAULT UIC CLR R4 ; CLEAR ERROR INDEX ; ; GET COMMAND PARAMETERS ; 60$: CALL $GNBLK ; GET NEXT NON-BLANK MOV $MPARS+CLKQ,R5 ; GET ADDRESS OF CLOCK QUEUE ENTRY BCS RUNIT ; EOL CMPB R2,#'/ ; KEYWORD? BEQ 100$ ; YES ; ; TEST FOR TYPE OF TIME FIELD ; 80$: INC $MPARS+RUNTYP ;SET UP ERROR FLAG ;EF052 CMPB R2,#'0 ; IS NEXT CHAR A VALID DIGIT ;EF052 BLO 95$ ; NO ;**-1 CMPB R2,#'9 ; MAYBE BHI 95$ ; DEFINTIM ; GET TIME FIELD CLR R4 ; ZERO ERROR CODE BCS RUNER2 ; SYNTAX ERROR DEC R0 ; BACK UP TO TERMINATOR MOV #2,$MPARS+RUNTYP ; SET SCHEDULE MODE BR 60$ ; ; ; SYNCHRONIZATION UNIT ; 95$: TST $MPARS+RUNTYP ; VALID FOR SYNC? BNE RUNER1 ; NO, SYNTAX ERROR TST R1 ; ANY BALNKS SEEN BEQ RUNER1 ; NO, SYNTAX ERROR INC $MPARS+RUNTYP ; SET SYCHRONIZATION RUN TYPE CALL TIMCOD ; GET TIME CODE BCS RUNER1 ; ERROR MOV R1,4(R5) ; STORE IT BR 60$ ; ; GET KEYWORD PARAMETERS ; 100$: MOV #UIC,R1 ; IS KEYWORD CALL .KEYWD ; "UIC" ? BCC 110$ ; YES MOV #RSI,R1 ; IS KEYWORD CALL .KEYWD ; "RSI" BCS RUNER3 ; NO, ERROR BVS RUNER3 ; ERROR ; ; RESCHEDULE INTERVAL (RSI) ; ADD #C.RSI,R5 ; POINT TO RSI PARAMETER FIELD CALL GETIME ; GET TIME BCS RUNER2 ; ERROR, INVALID TIME TST -(R5) ; IS COUNT ZERO ? BNE 86$ ; NO INC (R5) ; YES, SO SET IT TO ONE! BR 60$ ; TRY FOR ANOTHER KEYWORD ; ; USER ID CODE (UIC) ; 110$: BVS RUNER3 ; NO EQUALS, KEYWORD ERROR CMPB (R0)+,#'[ ; BRACKET NEXT ? BNE RUNER1 ; NO, SYNTAX ERROR CALL $GTNUM ; CONVERT GROUP CODE MOVB R1,C.UIC+1(R5) ; TO BINARY AND STORE BEQ RUNER4 ; ZERO IS ERROR CMPB #',,R2 ; COMMA NEXT ? BNE RUNER1 ; NO, SYNTAX ERROR CALL $GTNUM ; CONVERT PROGRAMMER CODE MOVB R1,C.UIC(R5) ; TO BINARY AND STORE BEQ RUNER4 ; ZERO IS ERROR CMPB #'],R2 ; TERIMNATOR ? BEQ 60$ ; YES BR RUNER1 ; NO, SYNTAX ERROR RUNIT: JMP $RUNEP ; EXECUTE RUN COMMAND .SBTTL ERROR PROCESSING RUNER4: INC R4 ; INVALID UIC RUNER3: INC R4 ; INVALID KEY WORD RUNER2: INC R4 ; INVALID TIME PARAMETER RUNER1: ; SYNTAX ERROR CALL $RLCLK ; RELEASE CLOCK QUE ENTRY ASL R4 ; DOUBLE INDEX JMP ERROR(R4) ; ISSUE ERROR .SBTTL SUBROUTINES ;+ ; *** - GETIME GET A TIME FIELD ; ; INPUTS: ; R0 - POINTS TO NEXT CHAR OF TIME FIELD ; R5 - POINTS TO TWO WORD FIELD; WORD1-TIME MAGNITUDE, WORD2-TIME INTERVAL ; OUTPUTS: ; R0 - POINTS TO NEXT CHARACTER IN BUFFER ; R1 - TIME IN MAGNITUDE ; R2 - TIME INTERVAL CHARACTER ; R5 - POINTS TO WORD AFTER TWO WORD BLOCK ; ; CARRY BIT ; CLEAR-NO ERRORS ; SET - BAD TIME FIELD ; ;- GETIME: CALL $CDTB ; CONVERT TO BINARY MOV R1,(R5)+ ; STORE DELTA TIME CALL TIMCOD ; GET TIME CODE BCS 30$ ; ERROR MOV R1,(R5) ; STORE IT 30$: RETURN ; ;+ ; *** - TIMCOD - CONVERT TIME CODE ; ; INPUT: ; R2 - CODE CHARACTER ; ; OUTPUT: ; R1 - TIME CODE NUMERIC ; ; USED: ; R1 ; ;- TIMCOD: CLR R1 ; ZERO INDEX INTO TABLE 10$: CMPB R2,TIM(R1) ; IS THISÐ THE CODE? BEQ 20$ ; YES INC R1 ; NO, INDEX TO NEXT CODE TSTB TIM(R1) ; END OF TABLE? BNE 10$ ; NO SEC ; YES, ERROR BR 30$ ; 20$: MOVB TIMCD(R1),R1 ; GET NUMERIC 30$: RETURN ; .END ÐÖs» kQ›c, .TITLE RUNBAS - RUN COMMAND .IDENT "02" ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD MASS. ; ; COPYRIGHT (C) 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; VERSION: 02 ; BY: H. LEV ; DATE: 08/24/73 ; MODIFIED: 12/31/74 CHANGED RUNOV TO RUN WITH BASIC MCR ; ; ; HJL025 4/7/76 CHANGE PCB, TCB, AND HEADER FORMAT ; ; ; THIS MODULE PROCESSES THE PARSED MCR RUN COMMAND ; .MCALL CALL,CLKDF$,RETURN,TCBDF$ ; ;EQUATED SYMBOLS ; TASK = 0 ; TASK NAME OFFSET INTO $MPARS TCB = 4 ; TCB ADDRESS CLKQ = 6 ; CLOCK QUE ELEMENT ADDRESS RUNTYP = 10 ; RUN TYPE, 0-RUN, 1-SYNC, 2-SCHEDULE CLKDF$ ; DEFINE CLOCK QUE OFFSETS TCBDF$ ; DEFINE TCB OFFSETS ; ; LOCAL DATA ; ERRCOD: .WORD 0 ; ERROR CODE INDEX ; ; ERROR TRAP CODES ; RERTAB: TRAP 2. ; SYNTAX ERROR TRAP 11. ; TASK NOT IN SYSTEM TRAP 16. ; TASK ACTIVE TRAP 14. ; TASK BEING ABORTED ;+ ; *** - $RUNEP - MCR RUN COMMAND EXECUTOR ; THIS OVERLAY RECEIVES CONTROL FROM THE RUN COMMAND PARSER ; WHICH SETS UP THE FOLLOWING AREAS FOR RUNEP: ; $MPARS, +2 TASK NAME IN RAD50 ; $MPARS+4 ADDRESS OF TCB ; $MPARS+6 ADDRESS OF CLOCK QUE ELEMENT ; $MPARS+10 RUN TYPE; 0-RUN, 1-SYNC, 2-SCHEDULE ; CLOCK QUE ELEMENT ; RUN AND SYNC ; +0 - DELTA TIME COUNT ;  +2 - DELTA TIME UNITS ; SYNC ; +4 - SYNCHRONIZATION UNIT ; SCHEDULE ; +0 - HOURS ; +2 - MINUTES ; +4 - SECONDS ; C.RSI,+2 RESCHEDULE INTERVAL UNITS AND CODE ; C.UIC UIC SPECIFIED ON COMMAND ; ; THIS OVERLAY USES THIS INFORMATION TO START UP A TASK. ; IF THE START TIME AND RESCHEDULE TIMES ARE ZERO, THE TASK ; IS STARTED BY A CALL TO THE EXECUTIVE SUBROUTINE $TSKRQ ; AND THE UCB ADDRESS OF THE REQUESTING TERMINAL IS PUT INTO ; THE TASKS TCB. IF ANY OF THESE TIMES ARE NONE ZERO, ; THE TASK IS REQUESTED BY MAKING AN ENTRY IN THE CORRECT ; CLOCK QUE. ;- $RUNEP:: CLR R4 ; ZERO ERROR INDICATOR CLR ERRCOD ; MOV #$MPARS,R5 ; GET ADDRESS OF PARAMETER AREA MOV RUNTYP(R5),R0 ; GET RUN TYPE CODE MOV CLKQ(R5),R5 ; GET ADDRESS OF CLOCK QUE ELEMENT TST R0 ; IS IT RUN REQUEST ? BEQ RUN ; YES DEC R0 ; NO, IS IT SYNC BEQ SYNC ; YES BR SCHED ; NO, MUST BE SCHEDULE THEN ; ; RUN ; .ENABL LSB RUN: MOV (R5),R0 ; GET DELTA TIME BIS C.RSI(R5),R0 ; ADD RSI BEQ 10$ ; IF ITS ZERO, THIS IS RUN NOW CALL DTIME ; CONVERT DELTA TIME TO TICKS CALL SETRSI ; SET RESCHEDULE TIME MOV $MPARS+TCB,C.TCB(R5) ; GET TCB ADDRESS CALL $SWSTK,RUNXT ; SWITCH TO SYSTEM STACK RUNINS: MOV R5,R0 ; GET QUEUE ELEMENT ADDRESS MOV C.TCB(R0),R5 ; GET TCB ADDRESS MOVB C.RQT(R0),R4 ; GET REQUEST TYPE MOV C.TIM(R0),R2 ; GET LOW PART MOV C.TIM+2(R0),R1 ; GET HIGH PART CALLR $CLINS ; INSERT IN CLOCK QUE 10$: BR RUNIMD ; RUN NOW .DSABL LSB .SBTTL SYNCHRONIZE TASK SYNC: MOV 2(R5),$MPARS+10 ; SAVE DTIME UNIT CALL SETRSI ; SET RESCHEDULE INTERVAL MOV 4(R5),$MPARS+6 ; SAVE SYNC UNITS MOV $MPARS+10,R1 ; GET DTIME UNIT MOV 2(R5),$MPARS+10 ; GET CLOCK REQUEST TYPE MOV R1,2(R5) ; SET DTIME UNITS CALL DTIME ; CONVERT DELTA TIME TO TICKS MOV $MPARS+10,2(R5) ;RESTORE CLOCK REQUEST TYPE MOV $MPARS+TCB,C.TCB(R5) ; GET TCB ADDRESS MOV $MPARS+6,R3 ; GET SYNC UNITS CALL $SWSTK,RUNXT ; SWITCH TO SYSTEM STACK 10$: DEC R3 ; TICKS ? BEQ RUNINS ; YES MOV R3,R2 ; GET UNITS TYPE ASL R2 ; MAKE IT INTO WORD INDEX NEG R2 ; CONVERT TO NEGATIVE OFFSET MOV $TKPS+2(R2),R1 ; GET MAX NUMBER OF UNITS DEC R1 ; SUBTRACT ONE FOR CARRIES OUT OF NEXT HIGHER UNIT SUB $TTNS+2(R2),R1 ; COMPUTE UNITS LEFT TILL SYNC TIME MOV R3,R2 ; GET UNITS CODE CALL TICKS ; CONVERT TO TICKS ADD R1,C.TIM(R5) ; ADD TO OTHER UNITS ADC C.TIM+2(R5) ; ADD R0,C.TIM+2(R5) ; BR 10$ ; LOOP UNTIL SYNC TIME IS CONVERTED TO TICKS .SBTTL SCHEDULE TASK SCHED: CALL $SWSTK,RUNXT ; SWITCH TO SYSTEM STACK MOV #2,-(SP) ; SET UNITS CODE TO SECONDS MOV R5,R3 ; COPY CLOCK QUE ELEMENT ADDRESS ADD #6,R3 ; POINT TO SECONDS TST $TTNS ; ANY TICKS CLOCKED ? BEQ 10$ ; NO, THAN NO CARRY OUT OF SECONDS DEC -2(R3) ; SUBTRACT ONE FOR CARRIES OUT OF SECONDS 10$: MOV (SP),R2 ; GET COUNT ASL R2 ; MAKE IT A WORD INDEX NEG R2 ; CONVERT TO NEGATIVE OFFSET MOV -(R3),R1 ; GET TIME SUB $TTNS+2(R2),R1 ; CONVERT TO RELATIVE TIME BGE 12$ ; IF POSITIVE OKAY  ADD $TKPS+2(R2),R1 ; NEGATIVE MEANS CARRY OUT OF NEXT HIGHER UNIT CMP #4,(SP) ; IS UNIT HOURS ? BEQ 12$ ; YES DEC -2(R3) ; NO, SO SUBTRACT FROM HIGHER UNIT 12$: MOV (SP),R2 ; GET UNITS CODE CALL TICKS ; CONVERT TO TICKS 15$: ADD R1,C.TIM(R5) ; ADD UP TICKS, LOW PART ADC C.TIM+2(R5) ; CARRY BIT ADD R0,C.TIM+2(R5) ; AND HIGH PART INC (SP) ; INCREMENT TO NEXT UNIT CMP (SP),#5 ; DONE ? BGT 17$ ; YES BLT 10$ ; NO, LOOP MOV $TKPS,R1 ; GET MAX TICKS SUB $TTNS,R1 ; COMPUTE TICKS LEFT THIS SECOND CLR R0 ; ZERO HIGH PART BR 15$ ; PROCESS TICKS 17$: TST (SP)+ ; CLEAR STACK MOV $MPARS+TCB,C.TCB(R5) ; GET TCB ADDRESS CALL SETRSI ; SET RESCHEDULE INTERVAL IF ANY BR RUNINS ; START UP TASK .SBTTL RUN IMMEDIATE RUNIMD: MOV $MPARS+TCB,R0 ; GET TCB ADDRESS BIT #T2.HLT,T.ST2(R0) ; IS TASK BEING ABORTED? BNE RUNER4 ; YES CALL $SWSTK,RUNXT ; SWITCH TO SYSTEM STACK MOV C.UIC(R5),R1 ; GET UIC MOV $MUCB,R2 ; GET UCB ADDRESS OF STARTING TERMINAL CMPB #33,$MTERM ; WAS TERMINATOR AN ESCAPE(ALTMODE) BNE 10$ ; NO BIS #T3.MCR,T.ST3(R0) ; YES, SET TO PROMPT ON EXIT 10$: CALL $TSKRQ ; REQUEST TASK BCS RUNER3 ; ERROR, TASK ALREADY ACTIVE CALL RLCLK ; RELEASE CLOCK QUEUE ENTRY RUNIM1: RETURN ; SWITCH BACK TO USER STACK RUNXT: TST ERRCOD ; ANY ERRORS BNE RUNERR ; YES, GO PROCESS THEM RUNEX: RETURN ; RETURN TO DISPATCHER .SBTTL ERROR PROCESSING RUNER4: INC R4 ; 4 TASK BEING ABORTED RUNER3: INC R4 ; 3 TASK ACTIVE RUNER2: INC R4 ; 2 TASK NOT IN SYSTEM RUNER1: MOV R4,ERRCOD ; SET ERROR CODE RUNERR: TST $STKDP ; ON SYSTEM STACK ? BEQ RUNIM1 ; YES, THEN GET OFF IT. CALL $RLCLK ; RELEASE CLOCK QUE ELEMENT MOV ERRCOD,R4 ; GET ERROR CODE ASL R4 ; DOUBLE IT JMP RERTAB(R4) ; ISSUE ERROR MESSAGE .SBTTL SUBROUTINES ;+ ; *** - TICKS - CONVERT TIME TO TICKS ; ; INPUT: ; R1 - NUMBER OF UNITS ; R2 - UNITS CODE 1-TICKS, 2-SECONDS, 3-MINUTES, 4-HOURS ; ; OUTPUT: ; R0 - HIGH PART OF TIME IN TICKS ; R1 - LOW PART OF TIME IN TICKS  ; R2 - ZERO ; ;- TICKS: CLR -(SP) ; PUSH HIGH PART OF ANSWER MOV R1,-(SP) ; PUSH LOW PART OF ANSWER 10$: DEC R2 ; TICKS DON'T NEED TO BE CONVERTED BLE 30$ ; DONE MOV R2,R0 ; NOT DONE, SO GET TIME CODE ASL R0 ; MAKE IT A WORD INDEX NEG R0 ; CONVERT TO NEGATIVE INDEX MOV $TKPS+2(R0),R0 ; GET NUMBER OF LOWER UNITS PER THIS UNIT MOV 2(SP),R1 ; GET HIGH PART BEQ 20$ ; IF HIGH PART IS ZERO, SKIP MOV R0,-(SP) ; SAVE MULTIPLIER CALL $MUL ; MULTIPLY MOV (SP)+,R0 ; RESTORE MULTIPLIER MOV R1,2(SP) ; STORE HIGH PART 20$: MOV (SP),R1 ; GET LOW PART CALL $MUL ; MULTIPLY ADD R0,2(SP) ; ADD HIGH PARTS MOV R1,(SP) ; SET LOW PART BR 10$ ; LOOP TILL CONVERTED TO TICKS 30$: MOV (SP)+,R1 ; SET LOW PART MOV (SP)+,R0 ; SET HIGH PART RETURN ;+ ; *** - SETRSI - CONVERT RSI TO TICKS AND STORE IN CLOCK ; QUE ELEMENT ; ; INPUT: ; R5 - ADDRESS OF CLOCK QUE ELEMENT ; C.RSI - RESCHEDULE COUNT ; C.RSI+2 - RESCHEDULE UNIT CODE ; ; OUTPUT: ; R5 - UNCHANGED ; C.RSI - LOW PART OF RSI IN TICKS ; C.RSI+2 - HIGH PART OF RSI IN TICKS ; ;- SETRSI: MOV C.RSI(R5),R1 ; GET RSI COUNT MOV C.RSI+2(R5),R2 ; GET UNITS CODE BEQ 10$ ; IF ZERO NO RESCHEDULE INTERVAL CALL TICKS ; CONVERT TO TICKS MOV R1,C.RSI(R5) ; STORE LOW PART MOV R0,C.RSI+2(R5) ; STORE HIGH PART MOVB #C.SCHD,C.RQT(R5) ; SET PERIODIC RESCHEDULE BR 20$ ; 10$: MOVB #C.SSHT,C.RQT(R5) ; SET SINGLE SHOT REQUEST 20$: RETURN ; ;+ ; *** - DTIME - CONVERT DELTA TIME TO CLOCK TICKS ; ; INPUT: ; R5 - ADDRESS OF CLOCK QUE ELEMENT ; 0(R5) - COUNT OF UNITS ; 2(R5) - UNITS CODE ; ; OUTPUT: ; R5 - UNCHANGED ; C.TIM(R5) - LOW PART OF TIME IN TICKS ; C.TIM+2(R5) - HIGH PART OF TIME IN TICKS ; ;- DTIME: MOV 2(R5),R2 ; GET UNITS CODE MOV (R5),R1 ; GET NUMBER OF THESE UNITS CALL TICKS ; CONVERT TO TICKS MOV R1,C.TIM(R5) ; SAVE DELTA TIME LOW MOV R0,C.TIM+2(R5) ; AND HIGH BIS R0,R1 ; IS IT ZERO ? BNE 10$ ; NO INC C.TIM(R5) ; YES, THEN FORCE TO DEFAULT OF 1 10$: RETURN ; .ENAhBL LSB ;+ ; *** - $RLCLK - RELEASE CLOCK QUE ELEMENT ; ; INPUT: ; $MPARS+CLKQ - ADDRESS OF CLOCK QUE ELEMENT ; ; OUTPUT: ; NONE ; ;- $RLCLK:: CALL $SWSTK,10$ ; SWITCH TO USER STACK RLCLK: MOV #C.LGTH,R1 ; GET LENGTH OF CLOCK QUE ELEMENT MOV $MPARS+CLKQ,R0 ; GET ADDRESS OF IT CALL $DEACB ; RELEASE IT 10$: RETURN ; .DSABL LSB .END hu~» kQ›c, .TITLE TIMBAS TIME AND DATE ROUTINE .IDENT "03" ; ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD MASS. ; COPYRIGHT (C) 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 02 ; BY: H. LEV ; DATE: 08/27/73 ; MODIFIED: 12/27/74  TO PRINT DATE IN FORMAT DD-MMM-YY ; MODIFIED: 12/31/74 TO RUN WITH BASIC MCR ; ; ; HJL026 4/7/76 CHANGE TIME FORMAT ; ; ; ; THIS MODULE PROCESSES THE MCR TIME COMMAND ; ; ; EQUATED SYMBOLS ; ; CR = 015 ; CARRIAGE RETURN SPA = 040 ; SPACE EFN1 = 1 ; EVENT LUN1 = 1 ; LOGICAL UNIT .MCALL CALL,DEVDF$,DIR$,HWDDF$,RETURN,WTSE$S DEVDF$ ; DEFINE DEVICE OFFSETS HWDDF$ ; DEFINE HARDWARE REGISTERS .SBTTL LOCAL DATA TIMTIM: .ASCIZ $::$ ; VALID TIME TERMINATOR TIMDAT: .ASCIZ $//$ ; VALID DATE TERMINATOR ; ; DATE FIELDS ; DAT: .RAD50 /JAN/ .RAD50 /FEB/ .RAD50 /MAR/ .RAD50 /APR/ .RAD50 /MAY/ .RAD50 /JUN/ .RAD50 /JUL/ .RAD50 /AUG/ .RAD50 /SEP/ .RAD50 /OCT/ .RAD50 /NOV/ .RAD50 /DEC/ ; ; VALID LIMITS FOR TIME AND DATE FIELDS ; .EVEN TIMLMT: .WORD 0,23. ; VALID LIMITS FOR HOURS .WORD 0,59. ; FOR MINUTES .WORD 0,59. ; FOR SECONDS .WORD 1,12. ; FOR MONTH .WORD 1,31. ; FOR DAY .WORD 0,99. ; FOR YEAR TDFLG: .WORD 0 ; TIME AND DATE FLAGS ; BIT 0 - TIME IS BEING SET ; BIT 1 - DATE IS BEING SET .SBTTL $TIMOV CODE ;+ ; *** - $TIMEP - TIME AND DATE MCR FUNCTION ; ; FORMAT: TIM [HH:MM:SS][ MM/DD/YY] ; ; WHERE: HH:MM:SS-IS OPTIONAL TIME OF DAY TO SET CLOCK TO ; HH=00-23 HOUR ; MM=0-59 MINUTE ; SS=0-59 SECOND ; ; MM/DD/YY-IS OPTIONAL DATE TO SET CALENDAR TO ; MM = 1-12 MONTH ; DD = 1-31 DAY ; YY = 0-99 YEAR ; ; IF NEITHER TIME NOR DAY IS SPECIFIED, THE CURRENT TIME AND DAY ; WILL BE PRINTED ON THE "TI" DEVICE. ; IF ONLY TIME IS SPECIFIED THE CLOCK WILL BE SET ; IF ONLY DATE IS SPECIFIED, THE CALENDAR WILL BE SET ; IF TIME AND DAY IS SPECIFIED THE CLOCK AND CALENDAR WILL BE SET ; THE ORDER OF TIME AND DATE ON THE COMMAND ; IS NOT SIGNIFICANT AND EITHER ORDER WILL BE ACCEPTED ; ;- $TIMEP:: CMPB (R0),#CR ; IS NEXT CHARACTER CARRIAGE RETURN? BEQ TIMDIS ; YES, DISPLAY CURRENT TIME AND DATE MOV $MUCB,R1 ; GET TI UCB ADDRESS BIT #U2.PRV,U.CW2(R1) ; IS TERMINAL PRIVILEGED? BNE 10$ ; YES TRAP 6. ; PRIVILEGED COMMAND ERROR ; ; THERE IS MORE IN LINE , DECIDE WHAT IS TO BE DONE ; 10$: CLR TDFLG ; INITIALIZE TIME/ DATE FLAGS MOV #$MPARS,R1 ; POINT TO PARAMETER AREA MOV #6.,R2 ; SET WORD COUNT 20$: CLR (R1)+ ; ZERO NEXT WORD DEC R2 ; DONE? BNE 20$ ; NO, LOOP 30$: CALL $CDTB ; GET A NUMBER CMPB R2,#': ; TERMINATOR FOR TIME? BEQ 40$ ; YES CMPB R2,#'/ ; NO, FOR DATE ? BNE 80$ ; NO, ERROR ; ; GET DATE FIELD ; BIS #2,TDFLG ; SET DATE FLAG MOV #TIMDAT,R4 ; SET TERMINATOR ADDRESS MOV #$MPARS+6,R3 ; POINT TO DATE STORAGE FIELD MOV #TIMLMT+14,R5 ; SET ADDRESS OF DATE FIELD LIMITS CALL GETDAT ; GET DATE FIELD BCS 80$ ; ERROR BR 70$ ; ; ; GET TIME FIELD ; 40$: BIS #1,TDFLG ; SET TIME FLAG MOV #$MPARS,R3 ; POINT TO TIME STORAGE FIELD CALL $GETIM ; GET TIME FIELD BCS 80$ ; ERROR 70$: CMPB R2,#CR ; YES, END OF LINE BEQ TIMSET ; YES CMPB #SPA,R2 ; SPACE ? BEQ 30$ ; YES 80$: TRAP 2. ; SYNTAX ERROR ; ; TIME AND DATE HAVE BEEN CONVERTED TO BINARY, NOW SET CLOCK + CALENDAR ; TIMSET: BIT TDFLG,#2 ; SETTING DATE? BEQ 5$ ; NO CALL TSTDAY ; YES, CHECK DAY VALUE BCS 30$ ; ERROR 5$: MTPS #PR7 ;;; LOCK OUT INTERRUPTS MOV #$MPARS+14,R3 ;;; SET ADDRESS OF DATE STORAGE FIELD BIT TDFLG,#2 ;;; DO WE HAVE DATE? BEQ 10$ ;;; NO MOV R1,$TKPS-10 ;;; SET DAYS IN THIS MONTH MOV -(R3),$TTNS-14 ;;; SET YEAR MOV -(R3),$TTNS-10 ;;; DAY MOV -(R3),$TTNS-12 ;;; AND MONTH 10$: BIT #1,TDFLG ;;; DO WE HAVE TIME ? BEQ 15$ ;;; NO MOV #$MPARS+6,R3 ;;; SET ADDRESS OF TIME STORAGE FIELDS MOV #$TTNS,R1 ;;; GET TIME ADDRESS MOV -(R3),-(R1) ;;; SET SECONDS MOV -(R3),-(R1) ;;; MINUTES MOV -(R3),-(R1) ;;; AND HOURS 15$: MTPS #0 ;;; ENABLE CLOCK INTERRUPT 20$: BR TIMXIT ; GOTO EXIT 30$: TRAP 2. ; SYNTAX ERROR ; ; DISPLAY DATE + TIME ; ; TIMDIS: MOV #$TTNS-6,R0 ;;; GET ADDRESS OF TIME MOV #$MPARS,R1 ; POINT TO PARAMETER BLOCK MTPS #PR7 ;;; INHIBIT CLOCK MOV (R0)+,(R1)+ ;;; GET HOURS MOV (R0)+,(R1)+ ;;; MINUTES MOV (R0)+,(R1)+ ;;; AND SECONDS MOV $TTNS-12,(R1)+ ;;; GET MONTH MOV $TTNS-10,(R1)+ ;;; DAY MOV $TTNS-14,(R1) ;;; AND YEAR MTPS #0 ;;; ENABLE CLOCK MOV #$MPARS,R5 ; GET ADDRESS OF TIME + DATE MOV $MBUF,R3 ; GET ADDRESS OF BUFFER MOV #TIMTIM,R4 ; GET ADDRESS OF TERMINATOR 10$: CALL CBT2A ; CONVERT PARAMETER TO ASCII TSTB (R4) ; END OF TIME BEQ 20$ ; YES MOVB (R4)+,(R3)+ ; NO, PUT IN TERMINATOR BR 10$ ; ; ; PUT IN DATE ; 20$: MOVB #40,(R3)+ ; PUT IN BLANK MOV (R5),R1 ; GET MONTH MOV 2(R5),(R5) ; SWAP WITH DATE MOV R1,2(R5) ; CALL CBT2A ; GET DAY MOVB #'-,(R3)+ ; PUT IN SEPARATOR MOV (R5)+,R1 ; GET MONTH DEC R1 ; CONVERT TO INDEX ASL R1 ; INTO DATE MOV DAT(R1),R1 ; GET DATE IN RAD50 MOV R3,R0 ; GET BUFFER ADDRESS CALL $C5TA ; CONVERT TO ASCII MOV R0,R3 ; COPY BUFFER POINTER MOVB #'-,(R3)+ ; PUT IN TERMINATOR CALL CBT2A ; GET YEAR ; ; PRINT OUT DATE + TIME FORMAT: HH:MM:SS DD-MMM-YY. ; MOV $MBUF,$MDPB+14 ; SET A BUFFER ADDRESS MOV #18.,$MDPB+16 ; LENGTH CALL $DOIO ; PRINT IT OUT ; ; EXIT ; TIMXIT: RETURN ; RETURN TO DISPATCHER .SBTTL SUBROUTINES ;+ ; *** - TMTSTL - TEST TIME DATE LIMITS ; ; INPUTS: ; R1 - CONTAINS VALUE TO BE TESTED ; R5 - POINTS TO TWO WORD LIMIT ENTRY ; WORD1 - LOW LIMIT ON VALUE ; WORD2 - HIGH LIMIT ON VALUE ; ; OUTPUTS: ; R1 - UNCHANGED ; R5 - UPDATED TO NEXT LIMIT ENTRY ; C - CLEAR GOOD VALUE LOW<=X<=HIGH ; C - SET BAD VALUE LOW>X OR X>HIGH ; ;- TMTSTL: CMP R1,(R5)+ ; IS VALUE LOWER THAN LOW LIMIT ? BLT 10$ ; YES, ERROR CMP R1,(R5)+ ; IS IT HIGHER THAN HIGH LIMIT ? BGT 10$ ; YES, ERROR CLC ; NO, GOOD VALUE BR 20$ ; RETURN 10$: SEC ; SET ERROR FLAG 20$: RETURN ; ; ;+ ; *** - CBT2A CONVERT BINARY TO TWO ASCII DIGITS ; ; INPUTS: ; ; R3 - POINTS TO BUFFER ; (R5) - CONTAINS NUMBER TO BE CONVERTED ; ; OUTPUTS: ; ; R3 - UPDATE TO POINT TO NEXT AVAILABLE BYTE IN BUFFER ; R5 - POINTS TO NEXT WORD IN LIST ((R5)+) ; ;- CBT2A: MOV (R5)+,R0 ; GET NUMBER FOR DIVIDEND MOV #10.,R1 ; SET DIVISOR CALL $DIV ; DIVIDE NUM BY 10. ADD #'0,R1 ; ADD ASCII BIAS TO LOW DIGIT ADD #'0,R0 ; ADD ASCII BIAS TO HIGH DIGIT MOVB R0,(R3)+ ; STORE HIGH DIGIT MOVB R1,(R3)+ ; STORE LOW DIGIT RETURN ; ;+ ; *** - TSTDAY - CHECK DAY VALUE WITH RESPECT TO MONTH ; ; INPUT: ; $MPARS+6 MONTH ; +10 DAY ; +12 YEAR ; ; OUTPUT: ; CARRY CLEAR - DAY OKAY ; CARRY SET - DAY BAD ; REGISTER R0 IS USED ; ;- TSTDAY: MOV $MPARS+6,R0 ; GET MONTH DEC R0  ; IS THIS JANUARY? BNE 5$ ; NO MOV #12.,R0 ; YES 5$: MOVB $DYPMN-1(R0),R1 ; GET DAYS FOR THIS MONTH DEC R0 ; IS THIS FEBRUARY? BNE 10$ ; NO BIT #3,$MPARS+12 ; IS THIS A LEAP YEAR? BNE 10$ ; NO INC R1 ; YES, IT HAS ONE MORE DAY 10$: CMP R1,$MPARS+10 ; IS DAY THE 29TH? BGT 20$ ; YES SEC ; NO, SET ERROR 20$: RETURN ; ;+ ; *** - $GETIM - GET TIME FIELD ; ; INPUT: ; R0 - ADDRESS OF BEGINNING OF MINUTE FIELD ; R1 - HOUR IN BINARY ; R2 - COLON ; R3 - PARAMETER ADDRESS FOR TIME ; ; OUTPUT: ; R0 - UPDATED ; R2 - TERMINATOR ; R3 - UPDATED ; ; USED: ; R4, AND R5 ; ;- $GETIM:: MOV #TIMTIM,R4 ; GET ADDRESS OF TIME TERMINATORS MOV #TIMLMT,R5 ; GET TIME LIMITS GETDAT: CALL TMTSTL ; TEST LIMITS BCS 50$ ; BAD MOV R1,(R3)+ ; STORE TIME CMPB R2,(R4) ; CHECK TERMINATOR BNE 20$ ; NOT RIGHT INC R4 ; POINT TO NEXT TERMINATOR CALL $CDTB ; CONVERT NEXT FIELD TO BINARY BR GETDAT ; LOOP 20$: TSTB (R4) ; END OF FIELD? BEQ 40$ ; YES TSTB 1(R4) ; NO, NE¢XT CHARACTER LAST? BNE 30$ ; NO, ERROR CMPB (R4),#': ; TIME FIELD? BEQ 40$ ; YES 30$: SEC ; ERROR BR 50$ ; 40$: CLC ; 50$: RETURN ; .END ¢ì`ÕfkQ›c, .IIF NDF $OTLEP .NLIST ; ; ; COPYRIGHT (C) 1975, 1979, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION 01.02 ; BY: THOMAS J MILLER ; DATE: 2/4/75 ; ; MODIFIED BY: ; ; J. H. MATTHEWS 22-JAN-79 ; ; JM024 -- ADDED RT FORMAT SUPPORT FOR TU58 AND RX02 ; AND TS11 SUPPORT ; ; E. A. FLOYD 23-NOV-80 ; ; EF031 -- ADD TCB, LABEL BLOCK, AND HEADER DEFINITIONS ; ; ; OTLPRE - PREFIX FILE FOR ASSEMBLING MODULES OF THE RSX-11S ONLINE TASK LOADER ; ;+ ; ; WHEN APPRORIATE, INDIRECT REGISTER REFERENCES IN OTL MODULES, NOT CONTAINING ; SYMBOLIC OFFSETS, ARE ACCOMPANIED IN THE COMMENT FIELD BY A DESCRIPTION OF THE ; EFFECTIVE ADDRESS OF THE REFERENCE FOR THE EXECUTION OF THE INSTRUCTION. ; THE DESCRIPTION CONSISTS OF A SYMBOL NAME ENCLOSED IN PARENS WHERE THE ; SYMBOL IS AN OFFSET IN A BLOCK OF DATA OR THE SYMBOL FOR AN OTL DATA LOCATION. ; ;- ; ; MACRO LIBRARY CALLS ; .MCALL PCBDF$ .MCALL TCBDF$,HDRDF$,LBLDF$ ;EF031 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS AND MASKS TCBDF$ ;DEFINE TCB OFFSETS AND MASKS ;EF031 LBLDF$ ;DEFINE LABEL BLOCK OFFSETS AND MASKS ;EF031 HDRDF$ ;DEFINE HEADER OFFSETS AND MASKS ;EF031 ; ; CONDITIONAL ASSEMBLY VARIABLE FOR FULL ERROR MESSAGE REPORTING. WITH FULL ; ERROR MESSAGE REPORTING, ERROR MESSAGES INCLUDE A NUMERIC ERROR CODE AND ; A BRIEF ASCII DESCRIPTION OF THE ERROR CONDITION. WITHOUT FULL ERROR MESSAGE ; REPORTING, THE ASCII DESCRIPTION IS OMITTED. FOR FULL REPORT OF ERRORS, THE ; SYMBOL "R$$ERM" MUST BE DEFINED HERE. IF FULL REPORT OF ERROR MESSAGES IS ; NOT DESIRED, THE DEFINITION OF "R$$ERM" MUST BE PRECEDED BY A SEMI-COLON. ; THE DEFINITION LINE FOR "R$$ERM" FOLLOWS. ; ;R$$ERM=0 ; ; MACRO FOR INCLUDING SUPPORT OF LOAD DEVICES ; ; THE FIRST ARGUMENT IN THE INCLUD MACRO IS THE SYMBOL WHICH OTL MODULES USE TO ; CONDITIONALIZE CODE SPECIFIC TO SUPPORT OF THE PARTICULAR LOAD DEVICE. ; THE SECOND ARGUMENT IS THE SYMBOL WHICH IS PLACED IN THE ASSEMBLY PREFIX MODULE ; RSXMC DURING SYSGEN TO INDICATE THE PRESENCE OF A DRIVER FOR THE DEVICE. THE ; MACRO CAUSES THE FIRST SYMBOL TO BE DEFINED IF THE SECOND SYMBOL IS PRESENT ; IN RSXMC. ; .MACRO INCLUD A,B .IF DF B A=0 .ENDC .ENDM ; ; EACH OF THE FOLLOWING INCLUD STATEMENTS CAUSE SUPPORT FOR THE DESIGNATED LOAD ; DEVICE TO BE INCLUDED IN OTL IF THE STANDARD DRIVER FOR THE DEVICE HAS BEEN ; GENERATED INTO THE SYSTEM. IF THE STANDARD DRIVER FOR A LOAD DEVICE HAS BEEN ; INCLUDED IN THE SYSTEM, BUT SUPPORT FOR THAT DEVICE IN OTL IS NOT DESIRED, ; THE CORRESPONDING INCLUD STATEMENT MUST BE PRECEDED BY A SEMI-COLON (;). ; NO DEVICE SUPPORT WILL BE GENERATED IN OTL FOR DEVICES FOR WHICH DRIVERS HAVE ; NOT BEEN GENERATED INTO THE SYSTEM. THE DEVICES ARE LISTED ALPHABETICALLY. ; INCLUD PR11,P$$R11 ;PC11/PR11 SUPPORT INCLUD RX11,R$$X11 ;RX11 SUPPORT INCLUD RX21,R$$X21 ;RX211 SUPPORT INCLUD TA11,T$$A11 ;TA11 SUPPORT INCLUD TC11,T$$C11 ;TC11 SUPPORT INCLUD TM11,T$$M11 ;TM11 SUPPORT ¾INCLUD TS11,T$$S11 ;TS11 SUPPORT INCLUD TU16,T$$J16 ;TU16 SUPPORT INCLUD TU58,T$$U58 ;TU58 SUPPORT ; ; INSURE FORMATTED BINARY VARIABLE DEFINED IF PAPER TAPE TO BE USED ; .IF DF PR11 R$$FB=0 .ENDC ; ; IF CASSETTE OR MAGTAPE DEFINE SINGLE BLOCK READ VARIABLE ; .IF DF TA11!TM11!TU16!TS11 R$$SBR=0 .ENDC ; ; SAVE REGISTER MACRO ; .MACRO SAVRG$ CALL $SAVAL .ENDM .IIF NDF $OTLEP .LIST ¾ì`kQ›c, .TITLE OTL .IDENT /02/ ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; COPYRIGHT (C) 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; VERSION: 01 ; BY: THOMAS J MILLER ; DATE: 2/4/75 ; ; OTL - MAIN CONTROL LOOP FOR RSX-11S ONLINE TASK LOADER ; ; ; MACRO LIBRARY CALLS ; .MCALL QIO$ $$$GLB=0 ;FORCE GLOBAL DEFINITION OF QIO OFFSETS QIO$ ; ; LOCAL SYMBOL DEFINITIONS ; TS$NHD=40000 ;COMMON BLOCK FLAG ; ; GLOBAL IMPURE DATA ; $UIC:: .BLKW 1 ;UIC UNDER WHICH OTL IS RUNNING $TCB:: .BLKW 1 ;POINTER TO ALLOCATED TCB $STKSV::.BLKW 1 ;STACK POINTER SAVE AREA ;+ ; ; *** - $OTLEP ENTRY POINT FOR THE ONLINE TASK LOADER ; ;- ; ; SAVE UIC UNDER WHICH OTL IS RUNNING AND STACK POINTER ; $OTLEP::MOV $HEADR,R0 ;PICK ADDRESS OF OTL'S HEADER MOV H.CUIC(R0),$UIC ;SAVE UIC MOV SP,$STKSV ;SAVE STACK POINTER ;+ ; ; *** - $RSTRT OTL RESTART POINT ; ; RESTORE STACK POINTER AND DETACH PREVIOUS LOAD DEVICE ; ;- $RSTRT::CLR $TCB ;CLEAR ALLOCATED TCB POINTER MOV #IO.DET,$LQDPB+Q.IOFN ;SET FOR DETACH CALL $QIOL ;DETACH OLD DEVICE (ERRORS ON DETACH ARE IGNORED) ; ; INITIATE NEXT TASK LOAD SEQUENCE ; CALL $OTLCD ;GET COMMAND AND DECODE IT CALL $OTLLD ;INITIALIZE LOAD DEVICE CALL $OTLLB ;PROCESS FIRST LABEL BLOCK BIT #TS$NHD,R4 ;IS TASK IMAGE COMMON BLOCK? BNE 10$ ;IF NE YES CALL $OTLHD ;PROCESS TASK HEADER AND LOAD TASK BR $RSTRT ;RESTART 10$: CALL $OTLCM ;LOAD COMMON BLOCK BR $RSTRT ;RESTART .END $OTLEP ì``kQ›c, .TITLE OTLCD .IDENT /02/ ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; COPYRIGHT (C) 1980 ; DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOO LIBRARY CALLS ; .MCALL EXIT$S ; ; LOCAL DATA ; ; ;EF030 ; WORD FOR AMOUNT TO INCREASE TASK SIZE (IN 32 WORD BLOCKS) ;EF030 ;EF030 .IF DF M$$MGE ;EF030 ;EF030 $INCAM::.BLKW= 1 ;EF030 ;EF030 .ENDC ;EF030 ; ASCII FOR DEFAULT EXTENSION ; TSKASC: .ASCIZ /TSK/ ; ;+ ; ; *** - $OTLCD READ AND PARSE AN OTL COMMAND LINE ; ;- .ENABL LSB $OTLCD::MOV #IO.ATT,$TQDPB+Q.IOFN ;SET ATTACH FUNCTION IN TTY DPB CALL $QIOT ;ATTACH TTY 1$: MOV #$FBBUF,R1 ;POINT TO COMMAND INPUT BUFFER MOV (PC)+,(R1)+ ;MOVE IN PROMPT .BYTE 15,'O ; MOV #"TL,(R1)+ ; MOVB #'>,(R1)+ ; SUB #$FBBUF,R1 ;CALCULATE COUNT CALL $OUTMG ;PRINT IT MOV #IO.RVB,$TQDPB+Q.IOFN ;SET TO READ VIRTUAL FUNCTION MOV #39.,R1 ;SET MAXIMUM COUNT CALL $QIOT ;READ COMMAND LINE BPL 5$ ;IF PL NO ERROR CMPB R0,#IE.EOF ;END OF FILE? (CNTRL/Z?) BEQ 4$ ;IF EQ YES TRAP ER.IOE ;ELSE I/O ERROR 4$: TST $IOSB+2 ;ANY INPUT? BNE 10$ ;IF NE YES, SYNTAX ERROR $OTLXT::MOV #IO.DET,$TQDPB+Q.IOFN ;SET FOR DETACH FUNCTION CALL $QIOT ;DETACH TERMINAL EXIT$S ;EXIT 5$: MOV $IOSB+2,R1 ;PICK UP CHARACTER COUNT BEQ 1$ ;IF EQ NO INPUT, PROMPT AGAIN MOV #IO.DET,$TQDPB+Q.IOFN ;SET DETACH FUNCTION IN TTY DPB CALL $QIOT ;DETACH TTY MOV #$FBBUF,R0 ;POINT TO COMMAND LINE MOV #$FLBLK,R3 ;POINT TO FILE BLOCK MOV #$FLRAD,R4 ;POINT TO DESTINATION FOR FILENAME RAD50 ; ; OTLPS - COMMAND LINE PARSER ; ; THIS IS A SPECIALIZED PARSER FOR EXTRACTING DOS FILENAME INFORMATION FROM ; OTL COMMAND LINES. TWO BLOCKS ARE FILLED IN AS THE RESULT OF THIS PARSE. ; THEY ARE: ; ; FILE-SPECIFIER BLOCK: WORD0= ASCII DEVICE NAME ; WORD1= OCTAL UNIT NUMBER ; WORD2= UIC ; WORD3= FILE-NAME STRING POINTER ; WORD4= FILE-EXTENSION STRING POINTER ; ; FILE-NAME RAD50: WORD0= FIRST WORD OF FILE-NAME RAD50 ; WORD1= SECOND WORD OF FILE-NAME RAD50 ; WORD2= FILE-EXTENSION RAD50 ; ; INPUTS: ; ; R0=POINTER TO COMMAND STRING ; R1=CHARACTER COUNT OF COMMAND STRING ; R3=POINTER TO FILE-SPECIFIER BLOCK ; R4=POINTER TO FILE-NAME RAD50 BLOCK ; ; OUTPUTS: ; ; BLOCKS ARE FILLED IN ; R0-R4 ARE LOST ; OTLPS: MOV R0,R5 ;COPY BUFFER POINTER 7$: CMPB (R5),#141 ;LOWER-CASE LETTER? BLO 8$ ;IF LO NO CMPB (R5),#172 ; BHI 8$ ;IF HI NO BICB #40,(R5) ;CONVERT TO UPPER CASE 8$: INC R5 ;POINT TO NEXT CHARACTER DEC R1 ;CHARS REMAINING? BNE 7$ ;IF NE YES CLRB (R5)+ ;CONVERT STRING TO ASCIZ CLRB (R5) ;SIMPLIFY DETECTION OF SINGLE CHAR  MOV (R0)+,(R3)+ ;INSERT DEVICE-NAME ASCII INTO SPEC BLOCK MOV #':-60,R2 ;INDICATE NEXT VALID NON-NUMERIC (-60) CALL COTB ;INSERT UNIT NUMBER INTO SPEC BLOCK TST (R3)+ ;BUMP SPEC BLOCK POINTER MOV $UIC,(R3) ;TENTATIVELY SET UIC CMPB (R0),#'[ ;EXPLICIT UIC? BNE 30$ ;IF NE NO INC R0 ;OTHERWISE POINT TO GROUP NUMBER MOV #',-60,R2 ;INDICATE NEXT VALID NON-NUMERIC CALL COTB ;INSERT GROUP NUMBER INTO SPEC BLOCK TSTB (R3)+ ;NULL GROUP NUMBER SPECIFIED? BNE 20$ ;IF NE NO 10$: TRAP ER.SYN ;SYNTAX ERROR 20$: MOVB #']-60,R2 ;INDICATE NEXT VALID NON-NUMERIC CALL COTB ;INSERT OWNER NUMBER INTO SPEC BLOCK TSTB (R3)+ ;NULL SPECIFIED? BEQ 10$ ;ERROR IF SO SWAB -(R3) ;REVERSE GROUP AND OWNER 30$: TST (R3)+ ;POINT TO FILE-NAME ENTRY 40$: MOV #$FLBUF,R1 ;POINT TO FILE-NAME BUFFER 45$: MOVB (R0)+,(R1)+ ;MOVE FILE NAME STRING CMP R1,#$FLBUF+11. ;MOVED ENOUGH? BLOS 45$ ;IF LO NO CLRB (R0)+ ;INSURE ASCIZ STRING MOV #$FLBUF,R0 ;SET TO CONTINUE PARSE MOV R0,(R3)+ ;INSERT FILE-NAME POINTER CLR R1 ;SET TO CONVERT TO RAD50 (STOP ON ".") CALL $CAT5 ;CONVERT IT MOV R1,(R4)+ ;MOVE IT INTO RAD50 BLOCK BNE 50$ ;BR IF NOT NULL TSTB -(R0) ;OTHERWISE DID WE TERMINATE ON A NULL? BNE 10$ ;ERROR IF NOT 50$: BCC 60$ ;CONTINUE IF CC DEC R0 ;OTHERWISE INSURE THAT WE POINT TO TERMINATOR 60$: CLR R1 ;SET FOR NEXT CONVERSION CALL $CAT5 ;CONVERT MOV R1,(R4)+ ;SET SECOND WORD OF FILE NAME BCS 70$ ;BR IF R2 CONTAINS TERMINATOR MOVB (R0)+,R2 ;OTHERWISE PICK UP NEXT CHAR 70$: MOV #TSKASC,(R3) ;TENTATIVELY SET FOR DEFAULT EXTENSION MOV (PC)+,(R4) ; .RAD50 /TSK/ ; ;PJK058 .IF DF M$$MGE ;PJK058 ;PJK058 CLR $INCAM ;CLEAR THE INCREMENT VALUE ;PJK058 ;PJK058 .ENDC ;PJK058 ;PJK058 TSTB R2 ;AT END OF LINE? BEQ 90$ ;EXIT IF SO CMPB R2,#'. ;ELSE WAS LAST CHAR A "."? BEQ 75$ ;PROCESS EXTENSION ;EF030 CMPB R2,#'/ ;ANY SWITCHES? ;EF030 BR 77$ ;PROCESS SWITCH ;EF030 75$: CLRB -1(R0) ;CONVERT FILE-NAME STRING TO ASCII ;EF030 CLRB -1(R0) ;CONVERT FILE-NAME STRING TO ASCIZ ;**-1 MOV R0,(R3) ;POINT TO SPECIFIED EXTENSION CLR R1 ;SET TO CONVERT IT CALL $CAT5 ;CONVERT TO RAD50 MOV R1,(R4) ;LOAD IT INTO RAD50 BLOCK BCS 80$ ;BR IF R2 CONTAINS TERMINATOR MOVB (R0)+,R2 ;ELSE PICK UP CHAR AFTER EXTENSION ;EF030 77$: ;EF030 ;EF030 .IF DF M$$MGE ;EF030 ;EF030 CMPB R2,#'/ ;ANY SWITCHES? ;EF030 BNE 10$ ;ERROR -- SYNTAX ;EF030 CMPB (R0)+,#'I ;PARSING FOR "INC" ;EF030 BNE 10$ ; ;EF030 CMPB (R0)+,#'N ; ;EF030 BNE 10$ ; ;EF030 CMPB (R0)+,#'C ; ;EF030 BNE 10$ ; ;EF030 CMPB (R0)+,#'= ; ;EF030 BNE 10$ ; ;EF030 CALLR INCPRO ;PROCESS INC SWITCH ;EF030 ;EF030 .ENDC ;EF030 80$: TSTB R2 ;AT END OF LINE? BNE 10$ ;ERROR IF NOT 90$: RETURN .DSABL LSB ; ; COTB - CONVERT OCTAL TO BINARY ; ; INPUTS: ; ; R0=POINTER TO START OF OCTAL STRING ; R2=ASCII OF VALID TERMINATOR - 60 ; R3=POINTER TO BYTE FOR CONVERTED NUMBER ; ; OUTPUTS: ; ; R0=POINTER TO CHARACTER AFTER TERMINATOR ; R1 IS LOST ; BYTE ADDRESSED BY R3 CONTAINS CONVERTED BINARY NUMBER ; COTB: CLRB (R3) ;INITIALIZE OUTPUT BYTE 10$: MOVB (R0)+,R1 ;PICK UP FIRST CHAR SUB #60,R1 ;CONVERT TO BINARY BITB #370,R1 ;VALID NUMERIC? BEQ 30$ ;IF EQ YES CMPB R1,R2 ;ELSE VALID TERMINATOR? BEQ 40$ ;EXIT IF SO 20$: TRAP ER.SYN ;ELSE SYNTAX ERROR 30$: ASLB (R3) ;SHIFT CURRENT BYTE AND CHECK FOR OVERFLOW BCS 20$ ; ASLB (R3) ; BCS 20$ ; ASLB (R3) ; BCS 20$ ; BISB R1,(R3) ;ACCUMULATE BINARY NUMBER BR 10$ ;GET NEXT CHAR 40$: RETURN ;EF030 .IF DF M$$MGE ;EF030 ;EF030 ; INCPRO - CONVERT A NUMBER TO BINARY (ASSUMED DECIMAL IF FOLLOWED BY A "." ;EF030 ; OTHERWISE, OCTAL) ;EF030 ; INPUT: R0 = BUFFER ADDRESS ;EF030 ; OUTPUTS: R0 = UPDATED BUFFER POINTER ;EF030 ; R1 = CONVERTED NUMBER TO BINARY ;EF030 ; R2 = LAST CHARACTER SCANNED (AFTER ".", IF FOUND) ;EF030 ; ;EF030 ;EF030 INCPRO: ;EF030 ;EF030 MOV R0,-(SP) ;SAVE BUFFER POINTER ;EF030 CALL $CDTB ;CONVER DECIMAL TO BINARY ;EF030 CMPB R2,#'. ;END IN DECIMAL POINT? ;EF030 BNE 60$ ;NO, OCTAL NUMBER ;EF030 MOVB (R0)+,R2 ;YES, POINT BEYOND IT ;EF030 BR 80$ ; ;EF030 60$: MOV (SP),R0 ;GET BUFFER POINTER ;EF030 CALL $COTB ;CONVERT OCTAL TO BINARY ;EF030 80$: TST (SP)+ ;CLEAN STACK ;EF030 ADD #77,R1 ;ROUND TO NEXT 32W BLOCK ;EF030 BIC #77,R1 ;CONVERT FROM BYTES ;EF030 ASR R1 ;TO 32 W BLOCKS ;EF030 ASR R1 ;CLEAR SIGN BIT ;EF030 ASR R1 ; ;EF030 ASR R1 ; ;EF030 ASR R1 ; ;EF030 ASR R1 ; ;EF030 CMP R1,#2000 ;INCREASE BY 32K? ;EF030 BLT 100$ ;NO ;EF030 TRAP ER.INC ;ERROR ;EF030 100$: MOV R1,$INCAM ;STORE BLOCK COUNT ;EF030 CMP R2,#52 ;END OF LINE? ;EF030 BEQ 120$ ;YES ;EF030 –TRAP ER.SYN ;NO, ERROR ;EF030 ;EF030 120$: ;EF030 RETURN ;EF030 ;EF030 .ENDC ;EF030 .END –ì`ÈkQ›c, .TITLE OTLCM .IDENT /02/ ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; COPYRIGHT (C) 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; VERSION 02 ; BY: THOMAS J MILLER ; (BASED ON INSTALL COMMON BLOCK PROCESSOR BY H. LEV) ; DATE: 2/21/75 ; ; ; 002 14-JUL-76 JO ANN KASSON ;V3 LABEL BLOCK AND HEADER CHANGES ; ; ; OTLCM - COMMON BLOCK PROCESSOR FOR THE RSX-11S ONLINE TASK LOADER ; ;+ ; ; *** - $OTLCM OTL COMMON BLOCK PROCESSING AND LOADING ; ; FOR MAPPED SYSTEMS THE P.PDR AND P.NAPR ENTRIES OF THE PARTITION CONTROL ; BLOCK ARE SET UP. LABEL BLOCKS AND CHECKPOINT AREA ARE PAST OVER, THE TASK ; IMAGE IS LOADED AND THE TCB IS DEALLOCATED. ; THE FOLLOWING REGISTERS ARE ASSUMED TO BE POINTING AS INDICATED: ; ; R2 -> P.STAT IN PCB ; R5 -> L$BMXZ IN LABEL BLOCK BUFFER ; ;- $OTLCM:: .IF DF M$$MGE .IFTF MOV #$PARRL,R3 ;POINT TO SAVED RELOCATION BIAS .IFT CMP (R3),#7600 ;I/O PAGE? ($PARRL) .IFF CMP (R3),#160000 ;I/O PAGE? ($PARRL) .ENDC BHIS 50$ ;IF HIS YES, DONE MOV -(R3),R0 ;PICK UP BLOCKS IN TABLE ($TBLBK) 10$: DEC R0 ;BLOCKS REMAINING? BEQ 30$ ;IF EQ NO 20$: CALL $RDBLK ;READ BLOCK BR 10$ ;RETURN FOR MORE 30$: CMP R3,#$HDRBK ;ALREADY PAST CHECKPOINT AREA? BEQ 40$ ;IF EQ YES, LOAD TASK IMAGE MOV -(R3),R0 ;ELSE LOAD COUNT OF CHECKPOINT AREA ($HDRBK) BNE 20$ ;IF NE THEN CHECKPOINT AREA EXISTS 40$: MOV $TSKSZ,R1 ;PICK UP SIZE ($TSKSZ) .IF DF M$$MGE MOV #140000,R5 ;SET VIRTUAL ADDRESS .IFF MOV $PARRL,R5 ;SET VIRTUAL ADDRESS .ENDC CALL $RDBK1 ;LOAD TASK IMAGE 50$: MOV $TCB,R0 ;PICK UP TCB ADDRESS CALLR $DETCB ;DEALLOCATE TCB AND RETURN TO MAIN CONTROL * ; ($DETCB IS IN OTLERR) .END *ì`""kQ›c, .TITLE OTLERR .IDENT /01.02/ ; ; ; COPYRIGHT (C) 1979,1980 ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION 01.02 ; BY: THOMAS J MILLER ; DATE: 2/4/75 ; ; ; MODIFIED BY: ; ; J. H. MATTHEWS 29-JAN-79 ; ; JM025 -- ADD SUPPORT FOR SYSTEM TYPE IN TASK LABEL BLOCK ; ; E. A. FLOYD 27-MAY-80 ; EF008 -- ADD V3.0 CHANGES FOR ; SYSTEM CONTROLLED PARTITIONS ; ; E. A. FLOYD 21-NOV-80 ; EF030 -- ADD INC SWITCH ERROR SUPPORT ; ; P.J. KOBAR 1-JUN-81 ; PJK058 -- FIX PROBLEMS WITH PLAS CODE ; ; OTLERR - ERROR HANDLER AND RECOVERY ROUTINE FOR THE RSX-11S ONLINE TASK ; LOADER ; ; ; LOCAL DATA ; ; ERROR CODE MACRO ; .MACRO ERRCOD NAM NAM==N N=N+1 .ENDM ; ; ERROR MESSAGE MACRO ; .IF DF R$$ERM .MACRO .ERR NUM,MSG .PSECT .ERRTB .WORD ER'NUM .PSECT .ERRS ER'NUM:.RAD50 %'MSG'%<'.-22> .ENDM .IFTF ; ; ERROR CODE DEFINITIONS ; N=2 ERRCOD ER.SYN ERRCOD ER.POL ERRCOD ER.NVK ERRCOD ER.DNS ERRCOD ER.PRV ERRCOD ER.PNS ERRCOD ER.IOE N=40. ERRCOD ER.NBA ERRCOD ER.APR ERRCOD ER.NAP ERRCOD ER.CHK ERRCOD ER.BFB ERRCOD ER.EOF ERRCOD ER.BIG ERRCOD ER.COM ERRCOD ER.OVL ERRCOD ER.TAE ERRCOD ER.TND ERRCOD ER.BMM ERRCOD ER.NCB ERRCOD ER.PSZ ERRCOD ER.NFL ERRCOD ER.CTP ERRCOD ER.CNL ERRCOD ER.CBL ERRCOD ER.CBB ERRCOD ER.CBP ERRCOD ER.PNC ERRCOD ER.ILD ERRCOD ER.NVI ERRCOD ER.PBS ERRCOD ER.CTG ERRCOD ER.BSZ ERRCOD ER.FRQ ERRCOD ER.NVD ERRCOD ER.IWB ERRCOD ER.TKB ERRCOD ER.INC ;EF030 ; ; *** - $STVEC SST VECTOR USED TO PROVIDE THE LINKAGE BETWEEN TRAP INSTRUCTIONS ; AND THE ERROR ROUTINE ; $STVEC::.WORD 0,0,0,0,0,0,ERRTRP ; ; ERROR MESSAGE PREFIX ; OTLMS: .ASCIZ /OTL -- / .IFT .ASCIZ / - / .IFTF .EVEN ; ; ERROR MESSAGE TABLE ; .IFT .PSECT .ERRTB ERRTAB=.- ;DEFINE SO CODE ER.SYN INDEXES TO START OF TABLE .ERR \ER.SYN, .ERR \ER.POL, .ERR \ER.NVK,<> .ERR \ER.DNS, .ERR \ER.PRV,<> .ERR \ER.PNS, .ERR \ER.IOE, .ERR \ER.NBA, .ERR \ER.APR, .ERR \ER.NAP, .ERR \ER.CHK, .ERR \ER.BFB, .ERR \ER.EOF, .ERR \ER.BIG, .ERR \ER.COM, .ERR \ER.OVL, .ERR \ER.TAE, .ERR \ER.TND, .ERR \ER.BMM, .ERR \ER.NCB, .ERR \ER.PSZ, .ERR \ER.NFL, .ERR \ER.CTP, .ERR \ER.CNL, .ERR \ER.CBL, .ERR \ER.CBB,  .ERR \ER.CBP, .ERR \ER.PNC, .ERR \ER.ILD, .ERR \ER.NVI, .ERR \ER.PBS, .ERR \ER.CTG,<> .ERR \ER.BSZ, .ERR \ER.FRQ, .ERR \ER.NVD, .ERR \ER.IWB, .ERR \ER.TKB, .ERR \ER.INC, ;EF030 .ENDC ;+ ; ; *** - ERRTRP ERROR TRAP PROCESSING ; ; THE EXEC PASSES CONTROL TO THIS ROUTINE UPON THE EXECUTION OF A TRAP ; INSTRUCTION WITHIN OTL. ; ; INPUTS FROM THE EXEC: ; ; (SP)=LOW ORDER BYTE OF TRAP INSTRUCTION * 2 ; ; OUTPUTS: ; ; AN APPROPRIATE ERROR MESSAGE IS PRINTED AND OTL IS RESTARTED. ; ;- .PSECT ERRTRP: MOV (SP)+,R5 ;PICK UP ERROR CODE MOV $STKSV,SP ;RESTORE STACK POINTER CALL CLENUP ;DEALLOCATE TCB AND FREE PARTITION MOV #OTLMS,R4 ;POINT TO ERROR MESSAGE PREFIX MOV #$FBBUF,R0 ;POINT TO OUTPUT BUFFER 10$: MOVB (R4)+,(R0)+ ;MOVE IT IN BNE 10$ ;CONTINUE UNTIL END OF MESSAGE MOV R5,R1 ;PICK UP ERROR CODE ASR R1 ;DIVIDE BY 2 TO GET ORIGINAL CODE CLR R2 ;ENABLE ZERO SUPPRESSION CALL $CBDMG ;CONVERT ERROR TO ASCII IN BUFFER .IF DF R$$ERM 15$: MOVB (R4)+,(R0)+ ;MOVE IN " - " BNE 15$ ; CMP R5,#ER.IOE*2 ;ERROR IN SECOND RANGE OF ERROR CODES? BLE 20$ ;IF LE NO SUB #*2,R5 ;ELSE ADJUST FOR CORRECT TABLE INDEX 20$: MOV ERRTAB(R5),R4 ;PICK UP ERROR MESSAGE POINTER MOV R0,R3 ;DUPLICATE BUFFER POINTER 25$: MOV (R4)+,R1 ;PICK UP FIRST WORD OF MESSAGE CALL $C5TA ;CONVERT AND MOVE INTO BUFFER 30$: CMPB (R3)+,#'. ;END OF MESSAGE? BEQ 40$ ;IF EQ YES CMP R3,R0 ;CHECKED ALL CHARS IN CURRENT CONVERSION? BLO 30$ ;IF LO NO BR 25$ ;CONVERT NEXT WORD OF RAD50 MESSAGE 40$: MOVB #15,-(R3) ;CHANGE PERIOD TO CARRIAGE RETURN SUB #$FBBUF-1,R3 ;CALCULATE CHARACTER COUNT FOR MESSAGE MOV R3,R1 ;PASS IT TO OUTPUT MESSAGE ROUTINE .IFF MOVB #15,(R0)+ ;MOVE CARRIAGE RETURN INTO BUFFER SUB #$FBBUF,R0 ;CALCULATE COUNT MOV R0,R1 ;PASS COUNT IN R1 .ENDC CALL $OUTMG ;PRINT IT JMP $RSTRT ;RESTART OTL ; ; CLENUP - ROUTINE TO DEALLOCATE TCB AND UNBUSY PARTITION ; .ENABL LSB CLENUP: MOV $TCB,R0 ;POINT TO ALLOCATED TCB BEQ 20$ ;IF EQ THEN ONE WAS NOT ALLOCATED ;EF008 .IF NDF D$$YNM ;EF008 ;EF008 CLR $TCB ;INDICATE NO TCB ALLOCATED ;EF008 .ENDC ;EF008 ;EF008 MOV T.PCB(R0),R1 ;PICK UP PCB POINTER BEQ 10$ ;IF EQ THEN NONE MOV P.MAIN(R1),R2 ;POINT TO MAIN PARTITION ;EF008 .IF DF D$$YNM ;EF008 ;EF008 BIT #PS.SYS,P.STAT(R2) ;IS PARTITION SYSTEM CONTROLLED? ;EF008 BEQ 7$ ;EQ => NO ;EF008 MOV R0,-(SP) ;SAVE R0 ;EF008 MOV T.PCB(R0),R1 ;GET ADDRESS OF PARTITION PCB ;EF008 MOV P.MAIN(R1),R0 ;GET MAIN PCB ADDRESS ;EF008 ;EF008 5$: MOV R0,R2 ;SAVE ADDRESS OF PREVIOUS PCB ;EF008 MOV P.SUB(R2),R0 ;GET ADDRESS OF NEXT PCB ;EF008 CMP R0,R1 ;TASK PCB? ;EF008 BNE 5$ ;IF NE, NO ;EF008 MOV P.SUB(R0),P.SUB(R2) ;REMOVE PCB FROM LIST ;EF008 MOV (SP)+,R0 ;RESTORE R0 ;EF008 BR 9$ ;SKIP BUSY BIT STUFF ;EF008 ;EF008 .IFTF ;EF008 ;EF008 7$: ADD #P.BUSY,R1 ;POINT TO SUBPARTITION BUSY FLAG WORD ;EF008 BICB (R1)+,(R1) ;SET SUBPARTITION TO UNBUSY (P.BUSY)(P.BUSY+1) ;**-1 BICB -(R1),P.BUSY+1(R2) ;SET MAIN PARTITION TO UNBUSY (P.BUSY) ;EF008 .IFT ;EF008 ;EF008 9$: MOV $PCB,R0 ;PICK UP PCB ADDRESS ;EF008 CLR $PCB ;INDICATE NO PCB ALLOCATED ;EF008 MOV #P.LGTH,R1 ;GET LENGHT OF PCB ;EF008 CALL $DEACB ;DEALLOCATE PCB ;EF008 ;EF008 .ENDC ;EF008 ;+ ; ; *** - $DETCB ROUTINE TO DEALLOCATE TCB ; ; INPUTS: ; ; R0=POINTER TO ALLOCATED TCB ; ; OUTPUTS: ; ; TCB IS DEALLOCATED ; ;- $DETCB:: 10$: ; .IF DF M$$MGE MOV #T.LGTH+T.EXT,R1 ;SET TCB LENGTH .IFF Ð MOV #T.LGTH,R1 ;SET TCB LENGTH .ENDC MOV $TCB,R0 ;PICK UP TCB POINTER ;EF008 CALL $SWSTK,20$ ;SWITCH TO SYSTEM STATE CALLR $DEACB ;DEALLOCATE TCB 20$: RETURN ; .DSABL LSB .END Ðì` 2kQ›c, .TITLE OTLHD .IDENT /2.03/ ; ; ; ; COPYRIGHT (C) 1976, 1981 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; VERSION: 02.03 ; ; BY: THOMAS J MILLER ; (BASED ON INSTALL TASK HEADER PROCESSOR BY H. LEV) ; DATE: 2/14/75 ; ; MODIFIED BY: ; ; JAK002 14-JUL-76 JO ANN KASSON ;V3 LABEL BLOCK AND HEADER CHANGES ; JAK003 29-APR-77 ; FIX - LOADING WITH TASK SIZE < 1000. ; ; E. A. FLOYD 9-MAY-80 ; EF004 -- V4.0 TCB CHANGES ; ; E. A. FLOYD 20-MAY-80 ; EF005 -- ADD TASK OVERLAID SEGMENT LOAD SUPPORT V3.0 ; ; P.J. KOBAR 1-JUN-81 ; PJK058 -- FIX PROBLEMS WITH PLAS CODE ; ; P.J. KOBAR 4-AUG-81 ; PJK064 -- INITIALIZE OFFSPRING CONTROL BLOCK LISTHEAD ;**NEW** ; ; ; OTLHD - TASK HEADER PROCESSOR PROCESSOR FOR THE RSX-11S ONLINE TASK LOADER ; ; ; MACRO LIBRARY CALLS ; .MCALL ALUN$,DIR$ ; ; LOCAL SYMBOL DEFINITIONS ; LUN3=3 ;LUN FOR LUT PROCESSING ; ; DPB FOR ASSIGN LUN ; ALUN3: ALUN$ LUN3 ;+ ; ; *** - $OTLHD ROUTINE TO COMPLETE HEADER AND TCB PROCESSING AND LOAD TASK ; ; CONTROL IS RECEIVED FROM THE MAIN CONTROL LOOP AFTER THE FIRST LABEL BLOCK ; HAS BEEN PROCESSED AND A TCB ALLOCATED. THE LUN TABLE IN THE TASK HEADER ; IS FILLED IN FROM SUCCEEDING LABEL BLOCKS AND REMAINING ENTRIES IN THE TASK  ; HEADER ARE FILLED IN FROM THEIR INITIAL VALUES IN THE TASK IMAGE HEADER. ; THE TASK IS LOADED FROM THE FIRST BLOCK BOUNDARY AFTER THE HEADER AND THE ; TCB IS COMPLETED AND INSERTED INTO THE STD. ; ;- $OTLHD:: .IF DF M$$MGE MOV #140000,$PARRL+2 ;REINITIALIZE ADDRESS DOUBLE WORD .IFF MOV $PARRL,$PARRL+2 ;REINITIALIZE ADDRESS DOUBLE WORD .ENDC ADD #H.LUN-512.,$PARRL+2 ;BUMP ADDRESS DOUBLE WORD TO BEGINNING OF ; OF LUN TABLE - 512 MOV $TSKSZ,-(SP) ;PUSH TASK SIZE TO CHECK FOR OVERRUN SUB #H.LUN,(SP) ;SUBTRACT SIZE OF FIRST PART OF HEADER BCS 112$ ;IF CS, OVERRUN ;EF005 .IF DF P$$LAS ;EF005 ;EF005 TST $SGMT ;RESIDENT OVERLAYS? ;EF005 BEQ 10$ ;EQ => NO ;EF005 DEC $TBLBK ;READ LABEL BLOCKS UP TO SEGMENT LOAD BLOCK ;EF005 ;EF005 .ENDC ;P$$LAS ;EF005 ;EF005 10$: DEC $TBLBK ;LABEL BLOCKS REMAINING? BEQ 100$ ;IF EQ NO, PROCEED TO READ IN TASK HEADER ;EF005 ADD #512.,$PARRL+2 ;BUMP ADDRESS DOUBLE WORD ;**-1 CALL $RDBLK ;READ NEXT LABEL BLOCK MOV R5,R2 ;INITIALIZE R2 (LAST NONZERO LUN ENTRY) MOV $HEADR,R4 ;GET POINTER TO OTL'S HEADER ADD #H.LUN+<*4>,R4 ;POINT TO THIRD LUN ENTRY 40$: CLR (R4) ;INITIALLY CLEAR UCB POINTER MOV (R5),ALUN3+A.LUNA ;MOVE DEVICE-NAME ASCII INTO ASSIGN DPB BEQ 50$ ;BR IF NONE CMP #"OV,(R5) ;LUN IS NAME OF OVERLAY DEVICE??? ;EF005 BNE 45$ ;NE => NO ;EF005 MOV #"LB,ALUN3+A.LUNA ;TASK LOAD DEVICE IS LB ;EF005 45$: MOV R5,R2 ;ELSE UPDATE LAST NONZERO ENTRY POINTER ;EF005 MOV 2(R5),ALUN3+A.LUNU ;MOVE IN UNIT NUMBER ;**-1 DIR$ #ALUN3 ;ATTEMPT TO ASSIGN THE LUN BCC 50$ ;CONTINUE IF SUCCESSFUL TRAP ER.ILD ;ELSE ERROR, ILLEGAL DEVICE 50$: MOV (R4),(R5)+ ;MOVE IN UCB POINTER CLR (R5)+ ;CLEAR WINDOW BLOCK POINTER CMP R5,#$LBLBF+512. ;AT END OF LABEL BLOCK YET? BLO 40$ ;IF LO NO, CONTINUE SUB #$LBLBF-4,R2 ;CALCULATE NUMBER OF BYTES OF UCB ENTRIES TO ; WRITE (AT LEAST ONE ENTRY WILL BE WRITTEN) CMP $TBLBK,#1 ;LAST LABEL BLOCK? BEQ 90$ ;IF EQ YES MOV #512.,R2 ;ELSE WRITE ENTIRE BLOCK 90$: MOV #$LBLBF,R0 ;SOURCE OF TRANSFER IS LABEL BUFFER MOV #$PARRL,R1 ;POINT TO DESTINATION ADDRESS DOUBLE WORD SUB R2,(SP) ;SEE IF ROOM FOR LUN ENTRIES BCS 112$ ;IF CS NO, OVERRUN CALL BLXO ;MOVE LUN ENTRIES INTO PLACE IN HEADER BR 10$ ;BRANCH TO PROCESS ANY REMAINING LUN ENTRIES ; ; READ IN TASK HEADER FROM TASK IMAGE AND INITIALIZE PS ENTRY. VERIFY HEADER. ; 100$: ;EF005 ;EF005 .IF DF P$$LAS ;EF005 ;EF005 TST $SGMT ;TASK OVERLAID? ;EF005 BEQ 110$ ;EQ => NO, ROOT SEGMENT ONLY ;EF005 MOV #$SGTBL,R5 ;POINT TO SEGMENT LOAD BUFFER ;EF005 MOV #512.,R1 ;SET LENGTH TO READ (1 DISK BLOCK) ;EF005 CALL $RDBK1 ;READ SEGMENT LABEL BLOCK INTO BUFFER ;EF005 MOV (R5),$TSKSZ ;GET SIZE OF ROOT SEGMENT ;EF005 ;EF005 .ENDC ;EF005 110$: CALL $RDBLK ;READ NEXT BLOCK FROM TASK IMAGE DEC $HDRBK ;WAS HEADER BLOCK READ? BGE 110$ ;IF GE NO, LOOP TO PASS CHECKPOINT AREA MOV H.HDLN(R5),(SP) ;SAVE HEADER LENGTH CMP (SP),$TSKSZ ;HEADER LENGTH GREATER THAN TASK SIZE? BLOS 115$ ;IF LOS NO 112$: TRAP ER.NVI ;INVALID TASK IMAGE 115$: MOV H.NLUN(R5),R0 ;PICK UP NUMBER OF LUNS ASL R0 ;CONVERT TO BYTES IN LUN TABLE ASL R0 ; MOV $NWNDS,R3 ;NUMBER OF ADDRESS WINDOWS IN TASK ASL R3 ;GET LENGTH FOR ALL ENTRIES ASL R3 ;EACH ENTRY IS 8. WORDS ASL R3 INC R3 ;INCLUDE WINDOW COUNT ENTRY ASL R3 ;CONVERT LENGTH TO BYTES ADD R3,R0 ;ADDRESS WINDOW PLUS LUNS MOV R0,$NWNDS ;SAVE LENGTH FOR LATER ;NUMBER OF WINDOWS NOT NEEDED ANY MORE ADD #H.LUN+<9.*2>,R0 ;ADD SIZE REMAINING IN HEADER CMP R0,(SP) ;DOES CALCULATION CHECK WITH HEADER SIZE? BNE 112$ ;IF NE NO ADD #H.LUN+<256.*4>+18.,R3 ;CALCULATE MAX. HEADER LEN. CMP (SP),R3 ;HEADER SIZE <= MAX.HEADER SIZE? BHI 112$ ;IF HI NO .IF DF M$$MGE MOV #170017,H.IPS(R5) ;SET INITIAL PS BIC #160000,$TKBSA ;CLEAR APR FROM BASE ADDRESS .IFF  MOV #17,H.IPS(R5) ;SET INITIAL PS .ENDC MOV $PARRL+2,R1 ;PICK UP ADDRESS OF LAST LUN ENTRY TRANSFER ADD R2,R1 ;ADJUST ADDRESS TO END OF LUN TABLE ;EF005 .IF DF P$$LAS ;EF005 ;EF005 MOV R1,$WNDBF ;SAVE FOR EXTRA WINDOW TRANSFER ;EF005 ADD #2*<8.+1>,$WNDBF ;POINT PAST WINDOW 0 ;EF005 ;EF005 .IFTF ;EF005 ;EF005 MOV H.GARD(R5),R3 ;PICK UP POINTER TO GUARD WORD SUB $TKBSA,R3 ;SUBTRACT BASE ADDRESS OF TASK BCS 112$ ;IF CS ERROR CMP R3,(SP) ;GUARD WORD > THEN HEADER LENGTH? BHIS 112$ ;IF HIS YES - ERROR MOV H.WND(R5),R3 ;PICK UP POINTER TO WINDOW COUNT ;EF005 .IFT ;EF005 ;EF005 MOV R0,-(SP) ;SAVE R0 ;EF005 MOV R1,-(SP) ;SAVE R1 ;EF005 MOV R2,-(SP) ;SAVE R2 ;EF005 MOV R4,-(SP) ;SAVE R4 ;EF005 ;EF005 CLR $WNDBF+2 ;INITIALIZE COUNT FOR XFER ;EF005 ADD R5,R3 ;MOVE TO # WINDOWS ;EF005 ADD #2,R3 ;ADJUST PAST COUNT TO 1ST WINDOW ;EF005 1150$: MOV $PCB,R4 ;PICK UP PCB POINTER ;EF005 ADD #20,R3 ;POINT TO 2ND WINDOW ;EF005 BIT #4,W.BLPD(R3) ;WINDOW MAPPED? ;EF005 BEQ 1155$ ;EQ =>NO, NO MORE MAPPED WINDOWS ;EF005 CMP W.BPCB(R3),R4 ;WINDOW FOR TASK REGION 0? ;EF005 BNE 1155$ ;NE => NO ;EF005 ADD #8.*2,$WNDBF+2 ;#BYTES TO XFER ;EF005 MOV P.ATT(R4),R4 ;PICK UP ATTACHMENT DESCRIPTOR POINTER ;EF005 INCB A.MPCT(R4) ;INCREMENT THE MAP COUNT ;EF005 MOV $WNDBF,2(R1) ;POINT PARRL+2 TO 2ND WINDOW ENTRY ;EF005 MOV #$PARRL,R1 ;GET PARTITION RELOCATION BIAS ;EF005 MOV #8.*2,R2 ;BYTES TO XFER ;EF005 MOV R3,R0 ;POINT TO HEADER WINDOW ENTRIES IN LABEL BUFFER ;EF005 MOV $PARRL,-(SP) ;SAVE RELOCATION BIAS ;EF005 CALL BLXO ;TRANSFER ;EF005 MOV (SP)+,$PARRL ;RESTORE RELOCATION BIAS ;EF005 ADD R2,$WNDBF ;ADJUST TO POINT PAST WINDOW JUST XFERRED ;EF005 BR 1150$ ;GET NEXT WINDOW IF THERE IS ONE ;EF005 ;EF005 1155$: MOV (SP)+,R4 ;RESTORE R4 ;EF005 MOV (SP)+,R2 ;RESTORE R2 ;EF005 MOV (SP)+,R1 ;RESTORE R1 ;EF005 MOV (SP)+,R0 ;RESTORE R0 ;EF005 MOV H.WND(R5),R3 ;PICK UP POINTER TO WINDOW COUNT ;EF005 ;EF005 .ENDC ;EF005 .IF DF M$$MGE SUB $TKBSA,R3 ;SUBTRACT BASE ADDRESS OF TASK BCS 112$ ;IF CS, ERROR .IFF MOV R3,-(SP) ;PUSH COPY ON STACK SUB $TKBSA,(SP)+ ;REDUCE BY BASE ADDRESS OF TASK BCS 112$ ;IF CS ERROR TST (SP)+ ;REMOVE HEADER LENGTH FROM STACK .IFT ADD #140000,R3 ;FORCE TO APR6 AND END OF LUN ENTRIES CALL $SWSTK,130$ ;SWITCH TO SYSTEM STATE MOV $PARRL,KISAR6 ;LOAD RELOCATION BIAS .IFTF 120$: CMP R1,R3 ;LAST LUN ENTRY ZEROED? BEQ 125$ ;IF EQ YES CLR (R1)+ ;ZERO LUN ENTRY BR 120$ ;LOOK AT NEXT 125$: .IFT RETURN 130$: .IFTF MOV R5,R0 ;COPY BUFFER POINTER FOR BLXO MOV #$PARRL,R1 ;POINT TO ADDRESS DOUBLE WORD .IFT MOV #140000,2(R1) ;SET BASE ADDRESS OF TRANSFER .IFF MOV (R1),2(R1) ;SET BASE ADDRESS OF TRANSFER .ENDC .IF DF M$$MGE ;EF005 ;EF005 MOV $PARRL,-(SP) ;SAVE RELOCATION BIAS ;EF005 ;EF005 .IFTF ;EF005 ;EF005 MOV #H.LUN,R2 ;SET TO TRANSFER THRULUN COUNT CALL BLXO ;TRANSFER FIRST SECTION OF HEADER ;EF005 .IFT ;EF005 ;EF005 MOV (SP)+,$PARRL ;RESTORE RELOCATION BIAS ;EF005 ;EF005 .ENDC ;EF005 ;EF005 ADD #H.LUN,2(R1) ;POINT TO LUN TABLE AT DESTINATION (PARRL+2) ADD #H.LUN,R0 ;POINT TO LUN COUNT ENTRY MOV $NWNDS,R3 ;GET LENGTH OF LUN TABLE PLUS ;WINDOW ENTRIES. ; ; SKIP OVER REMAINING ENTRIES IN THE HEADER. THESE INCLUDE LUN TABLE ; AND ADDRESS WINDOW ENTRIES. ; ; MOV #512.-H.LUN,R2 ;SET R3 TO MAXIMUM NUMBER OF BYTES LEFT IN ; CURRENT BLOCK FOR LUN ENTRIES 140$: SUB #512.,$TSKSZ ;REDUCE TASK SIZE BY BLOCK LAST READ BCC 145$ ; IF CC $TSKSZ > 0 ADD $TSKSZ,R2 ; REDUCE NUMBER OF BYTES USED IN BLOCK CLR $TSKSZ ; ZERO TASK SIZE 145$: CMP R3,R2 ;DO THE LUN ENTRIES PASS THE CURRENT END OF BLOCK? BLOS 150$ ;IF LOS NO CALL $RDBLK ;ELSE READ NEXT BLOCK FROM TASK IMAGE MOV R5,R0 ;POINT TO BEGINNING OF BLOCK ADD R2,2(R1) ;BUMP DESTINATION VIRTUAL ADDRESS ($PARRL+2) SUB R2,R3 ;REDUCE R3 BY LUN ENTRIES PAST MOV #512.,R2 ;SET NEW CONSTANT OF BYTES FOR LUN ENTRIES BR 140$ ;BR BACK TO SEE IF END OF LUN TABLE READ 150$: ADD R3,R0 ;POINT TO END OF LUN TABLE ADD R3,2(R1) ;($PARRL+2) SUB R3,R2 ;CALCULATE NUMBER OF BYTES IN CURRENT BLOCK ; AFTER LUN TABLE .IF DF M$$MGE MOV $PARRL,-(SP) ;SAVE RELOCATION BIAS ;EF005 ;**-1 .ENDC CALL BLXO ;MOVE IN TASK IMAGE TO NEXT BLOCK BOUNDARY ;EF005 .IF DF M$$MGE ;EF005 ;EF005 MOV (SP),$PARRL ;RESTORE AND KEEP COPY ON STACK ;EF005 ;EF005 .ENDC ;EF005 ;EF005 MOV 2(R1),R5 ;POINT TO BEGINNING OF LAST MOVE ($PARRL+2) ADD R2,R5 ;POINT TO END ; ;EF005 .IF DF P$$LAS ;EF005 ;EF005 TST $SGMT ;CHECK FOR PRESENCE OF OVERLAYS ;EF005 BNE 155$ ;NE => YES, TASK IS OVERLAID ;EF005 ;EF005 .ENDC ;P$$LAS ;EF005 ;EF005 MOV $TSKSZ,R1 ;SET SIZE OF REMAINING TASK TO LOAD CALL $RDBK1 ;LOAD THE TASK BR 157$ ;COPY HEADER ;EF005 155$: ;EF005 ;EF005 .IF DF P$$LAS ;EF005 ;EF005 CALL LDOVR ;LOAD REMAINDER OF ROOT AND ALL OVERLAYS ;EF005 CLR $SGMT ;CLEAR FLAG ;EF005 ;EF005 .ENDC ;EF005 ; ; CREATE A COPY OF THE HEADER IF THE SYSTEM IS MAPPED ; AND INITIALIZE TASK NAME IN THE REGISTER SAVE AREA IN THE HEADER FOR ODT ; ;EF005 157$: ;EF005 .IF DF M$$MGE MOV (SP)+,$PARRL ;RESTORE RELOCATION BIAS MOV (SP)+,R1 ;PICK UP SAVED COPY OF HEADER SIZE CALL $SWSTK,160$ ;SWITCH TO SYSTEM STATE CALL $ALOCB ;ALLOCATE A CORE BLOCK ROL (R4) ;SAVE C-BIT IN UNUSED LUN3 UCB POINTER ; IN OTL'S HEADER MOV R0,$HDRBK ;SAVE A POINTER TO THE BLOCK RETURN ;RETURN TO USER STATE 160$: MOV R1,R2 ;COPY SIZE OF BLOCK ROR (R4) ;RESTORE C-BIT BCC 170$ ;IF CC, BLOCK WAS ALLOCATED TRAP ER.POL ;ERROR, INSUFFICIENT POOL SPACE 170$: MOV $HDRBK,R1 ;RETRIEVE POINTER TO BLOCK MOV #$PARRL,R0 ;POINT TO ADDRESS DOUBLE WORD MOV #140000,2(R0) ;RESET BASE ADDRESS CALL .BLXI ;COPY HEADER SUB $TKBSA,H.GARD(R1) ;RELOCATE HEADER GUARD WORD POINTER ADD R1,H.GARD(R1) ; SUB $TKBSA,H.WND(R1) ;RELOCATE WINDOW BLOCK POINTER ADD R1,H.WND(R1) ; MOV H.WND(R1),R0 ;POINT TO WINDOW COUNT MOV W.BPCB+2(R0),R0 ;TASK PCB PTR IS IN ADDRESS WINDOW MOV R1,P.HDR(R0) ;SET POINTER BACK TO HEADER .IFF MOV $PARRL,R1 ;POINT TO TASK HEADER .ENDC MOV $TCB,R0 ;PICK UP TCB POINTER ;EF004 ;EF004 .IF DF S$$TOP!T$$BUF ;EF004 ;EF004 MOV H.EFLM(R1),T.EFLM(R0) ;MOVE EVENT FLAG MASK WORDS ;EF004 MOV H.EFLM+2(R1),T.EFLM+2(R0) ;INTO PLACE IN TCB ;EF004 ;EF004 .ENDC ;EF004 ;EF004 MOV $TKSZ,T.TKSZ(R0) ;FILL IN TASK SIZE ;EF004 ADD H.HDLN(R1),R1 ;POINT PAST HEADER GUARD WORD CMP -(R1),-(R1) ;POINT PAST REGISTER R1 LOCATION MOV T.NAM(R0),-(R1) ;MOVE IN FIRST OF TASK NAME ;**-1 MOV T.NAM+2(R0),-(R1) ;MOVE IN SECOND WORD OF TASK NAME ; ; FINISH INITIALIZATION OF TCB AND INSERT IT INTO THE STD ; MOV R0,R1 ;COPY POINTER ADD #T.RCVL,R1 ;ADJUST TO POINT TO RECEIVE LISTHEAD MOV R1,T.RCVL+2(R0) ;INITIALIZE BACK POINTER ADD #T.ASTL-T.RCVL,R1 ;POINT TO AST LISTHEAD MOV R1,T.ASTL+2(R0) ;INITIALIZE BACK POINTER .IF DF P$$LAS ADD #T.RRFL-T.ASTL,R1 ;POINT TO RECIEVE BY REFERENCE LISTHEAD MOV R1,T.RRFL+2(R0) ;INITIALIZE BACK POINTER .ENDC ;PJK064 .IF DF P$$OFF ;PJK064 ;PJK064 MOV R0,R1 ;GET START OF TCB ;PJK064 ADD #T.OCBH,R1 ;POINT TO OCB OFFSET ;PJK064 MOV R1,T.OCBH+2(R0) ;INITIALIZE BACKPOINTER ;PJK064 ;PJK064 .ENDC ;P$$OFF ;PJK064 ;PJK064 BIS #TS.EXE,T.STAT(R0) ;NOT EXECUTING BIS #T2.FXD!T2.CHK,T.ST2(R0) ;NOT CHECKPOINTABLE,FIXED BIS #T3.PMD,T.ST3(R0) ;NO PMD ;NO PMD, NOT CHECKPOINTABLE MOV #$TSKHD-T.TCBL,R1 ;MAKE STD HEAD LOOK LIKE A TCB AND POINT TO IT CALL $SWSTK,200$ ;SWITCH TO SYSTEM STATE 180$: MOV T.TCBL(R1),R2 ;POINT TO NEXT TCB CMPB T.PRI(R0),T.PRI(R2) ;PRI OF NEW TCB > THAN CURRENT TCB? BHI 190$ ;IF HI YES, INSERT NEW TCB HERE MOV R2,R1 ;MAKE CURRENT TCB LAST TCB BR 180$ ;TRY AGAIN 190$: MOV R2,T.TCBL(R0) ;POINT NEW TCB TO CURRENT TCB MOV R0,T.TCBL(R1) ;POINT LAST TCB TO NEW TCB .IF DF T$$KMG CMP T.NAM(R0),(PC)+ ;IS TASK TKTN? .RAD50 /TKT/ ; BNE 200$ ;IF NE NO CMP T.NAM+2(R0),(PC)+ ; .RAD50 /N/ ; BNE 200$ ;IF NE NO MOV R0,$TKNPT ;ELSE UPDATE TKTN POINTER .ENDC 200$: RETURN ;DONE ; ; $RDBLK - ROUTINE TO READ NEXT BLOCK FROM TASK IMAGE INTO LABEL BUFFER ; $RDBLK::MOV #$LBLBF,R5 ;POINT TO LABEL BUFFER MOV #512.,R1 ;SET COUNT FOR READ ; ; $RDBK1 - ROUTINE TO READ FROM TASK IMAGE AFTER INCREMENTING BLOCK NUMBER. ; ; INPUTS: ; ; R1=COUNT FOR READ ; R5=BUFFER FOR READ ; $RDBK1::INC $LQDPB+Q.IOPL+10 ;INCREMENT BLOCK NUMBER FOR READ CALLR $READ ;READ BLOCK .IF DF P$$LAS ;EF005 ; ;EF005 ; UPON ENTRY TO THIS ROUTINE, A PORTION OF THE TASK ROOT SEGMENT HAS BEEN LOADED;EF005 ; INTO MEMORY. LDOVR CALCULATES THE SIZE OT THE ROOT REMAINING ON DISK AND ;EF005 ; LOADS IT. LDOVR THEN INDEXES THE SEGMENT LOAD TABLE ($SGTBL) AND LOADS ;EF005 ; EACH OVERLAY ADJACENT IN MEMORY TO THE ROOT SEGMENT. WHEN A ZERO ENTRY ;EF005 ; IN $SGTBL IS REACHED, ALL OVERLAYS HAVE BEEN LOADED: CONTROL IS RETURNED ;EF005 ; TO OTLHD. ;EF005 ; ;EF005 ;INPUTS: ;EF005 ; Q.IOPL+10 CONTAINS LBN OF HEADER BLOCK ;EF005 ; R5 CONTAINS BYTE OFFSET INTO TASK PARTITION (DESTINATION OF XFER) ;EF005 ; R2 CONTAINS BYTE COUNT FROM PREVIOUS XFER ;EF005 ; ;EF005 ; ;EF005 ;EF005 LDOVR: ;EF005 ;EF005 10$: JSR PC,$SAVAL ;SAVE ALL REGISTERS ;EF005 ;EF005 INC $LQDPB+Q.IOPL+10 ;POINT PAST HEADER BLOCK (LBN) ;EF005 ;EF005 MOV $PARRL,$SGMT ;SAVE PARTITION RELOCATION BIAS ;EF005 MOV 2(R1),R5 ;POINT TO START OF LAST MOVE ;EF005 ADD R2,R5 ;POINT TO END ;EF005 ;EF005 MOV #$SGTBL,R3 ;POINT TO SEGMENT LOAD TABLE ;EF005 TST (R3)+ ;MOVE PAST ROOT SEGMENT ENTRY ;EF005 20$: ;EF005 MOV $TSKSZ,R1 ;GET BYTES REMAINING IN ROOT ;EF005 ADD #777,R1 ;ADD CONSTANT AND ;EF005 BIC #777,R1 ;ROUND TO EVEN # DISK BLOCK READS ;EF005 ;EF005 ;EF005 40$: ;EF005 MOV R5,$PARRL+2 ;BUMP DESTINATION ADDRESS (OFFSET) ;EF005 CALL $READ ;READ SEGMENT INTO TASK ADDR. SPACE ;EF005 ;EF005 SWAB R1 ;GET # BYTES READ IN ;EF005 ASR R1 ;CALCULATE #DISK BLOCKS JUST READ ;EF005 ADD R1,$LQDPB+Q.IOPL+10 ;BUMP LBN TO BLOCK FOR NEXT SEGMENT ;EF005 ;EF005 ; THE NEXT FEW INSTRUCTIONS MANIPULATE R1 AND $PARRL TO KEEP ADDRESS VALUES ;EF005 ; WITHIN THE RANGE OF KISAR6 -- THAT IS WE WANT TO KEEP R5 LESS THAN 160000 ;EF005 ;EF005 MOV $TSKSZ,R1 ;GET #BYTES JUST READ ;EF005 45$: CMP #4000,R1 ;IS R1 GREATER THAN 1K ;EF005 BHI 50$ ;NO, GO AHEAD AND UPDATE R5 ;EF005 SUB #4000,R1 ;REDUCE R1 ;EF005 ADD #40,$PARRL ;AND UPDATE THE PARTITION RELOCATION BIA;EF005 BR 45$ ;CONTINUE UNTIL R1 < 1K ;EF005 ;EF005 50$: ADD R1,R5 ;BUMP DESTINATION ADDRESS ;EF005 ;EF005 MOV (R3)+,$TSKSZ ;ANY MORE OVERLAYS TO LOAD? ;EF005 BEQ 100$ ;EQ => NO ;EF005 BR 20$ ;PROCEED TO READ IN SEGMENT ;EF005 ;EF005 ;EF005 ;EF005 ; ;EF005 ;THE NEXT SECTION OF CODE MODIFIES DATA IN THE TASK. THE OVERLAY IMPURE POINTER ;EF005 ;IS TAKEN FROM THE HEADER. THE IMPURE AREA IS SEARCHED FOR THE ADDRESS OF THE ;EF005 ;SEGMENT DESCRIPTOR TABLE (LOCATED AT THE END OF THE ROOT SEGMENT) AND THE ;EF005 ;DATA WORD CONTAINING THE SIZE OF THE DESCRIPTORS. KISAR6 IS THEN REMAPPED ;EF005 ;TO POINT TO THE SEGMENT DESCRIPTOR TABLE. THE TABLE IS INDEXED AND ;EF005 ;A BIT IN THE STATUS WORD OF EACH DESCRIPTOR IS SET TO INDICATE THAT THE ;EF005 ;SEGMENT HAS BEEN LOADED IN THE TASK ADDRESS SPACE. ;EF005 ;EF005 100$: ;EF005 MOV $SGMT,$PARRL ;RESTORE RELOCATION BIAS ($PARRL) AND ;EF005 MOV #$PARRL,R1 ;POINT R1 TO ADDRESS DOUBLE WORD ;EF005 MOV #140000,2(R1) ;RESET DESTINATION ADDRESS ;EF005 ADD #H.OVLY,2(R1) ;POINT TO ADDRESS OF IMPURE STORAGE AREA ;EF005 CALL $SWSTK,260$ ;SWITCH TO SYSTEM STATE ;EF005 MOV (R1),@#KISAR6 ;LOAD RELOCATION BIAS ;EF005 ;EF005 MOV $PARRL,R4 ;SAVE RELOCATION BIAS ;EF005 ;EF005 MOV @2(R1),-(SP) ;COPY ADDRESS OF IMPURE AREA TO STACK ;EF005 101$: CMP #4000,(SP) ;IS THE VALUE > 1K? ;EF005 BHI 102$ ;NO, CONTINUE THROUGH IMPURE AREA ;EF005 SUB #4000,(SP) ;REDUCE VALUE BY 1K ;EF005 ADD #40,$PARRL ;AND UPDATE RELOCATION BIAS ;EF005 BR 101$ ;CONTINUE UNTIL VALUE < 1K  ;EF005 ;EF005 102$: MOV (SP)+,R0 ;PICK UP ADDRESS OF IMPURE STORAGE AREA ;EF005 MOV #140000,2(R1) ;RESET DESTINATION ADDRESS ;EF005 ADD R0,2(R1) ;POINT DEST. ADDRESS TO IMPURE AREA ;EF005 ADD #N.STBL,2(R1) ;BUMP TO POINTER TO SEGMENT DESCRIPTOR TABLE ;EF005 MOV (R1),@#KISAR6 ;SET KERNEL APR 6 AND REMAP ;EF005 MOV @2(R1),-(SP) ;SAVE ADDRESS OF TABLE ;EF005 SUB #N.STBL,2(R1) ;BUMP BACK TO START OF IMPURE AREA ;EF005 ADD #N.SZSG,2(R1) ;BUMP TO WORD CONTAINING SEGMENT DESCRIPTOR SIZE;EF005 MOV @2(R1),R2 ;KEEP SIZE AND USE FOR INDEXING SEG. DESC. TABLE;EF005 ;EF005 MOV R4,$PARRL ;RESTORE RELOCATION BIAS ;EF005 ;EF005 110$: CMP #4000,(SP) ;AT OR PAST 1K BOUNDARY? ;EF005 BHI 120$ ;HI => NO, CONTINUE ;EF005 SUB #4000,(SP) ;DECREMENT OFFSET BY 1K ;EF005 ADD #40,$PARRL ;INCREMENT BIAS BY 1K FOR REMAPPING ;EF005 BR 110$ ;LOOP UNTIL OFFSET < 1K ;EF005 ;EF005 120$: MOV #140000,2(R1) ;SET DESTINATION ADDRESS IN ADDRESS DOUBLE WORD ;EF005 ADD (SP)+,2(R1) ;POINT TO BEGINNING OF SEGMENT DESCRIPTOR TABLE ;EF005 ;EF005 MOV (R1),@#KISAR6 ;SET KISAR6 TO SEGMENT TABLE IN TASK ADDR SPACE ;EF005 ;EF005 130$: TST @2(R1) ;END OF SEGMENT DESCRIPTOR TABLE? ;EF005 BEQ 210$ ;EQ => YES, RETURN ;EF005 BIS #20000,@2(R1) ;SET STATUS WORD TO SHOW SEGMENT IS LOADED ;EF005 ADD R2,2(R1) ;BUMP DEST. ADDR TO 1ST WORD OF NEXT DESCRIPTOR ;EF005 ;EF005 CMP #160000,2(R1) ;OVERRUN INTO APR 7? ;EF005 BHI 130$ ;HI => NO ;EF005 SUB #20000,2(R1) ;DECREMENT OFFSET BY 4K ;EF005 ADD #200,@#KISAR6 ;INCREMENT KISAR6 BY DIFFERENCE FROM OFFSET (4K);EF005 BR 130$ ;CONTINUE TO END OF TABLE ;EF005 ;EF005 ; THE NEXT SECTION OF CODE FINDS ALL WINDOW ENTRIES IN THE TASKS HEADER ;EF005 ; THAT ARE FOR TASK REGION ZERO BUT ARE NOT MAPPED AT RUN TIME AND ;EF005 ; INITIALIZES THOSE WINDOWS ;EF005 ;EF005 210$: MOV #$LBLBF,R5 ;GET PTR TO LABEL BUFFER (HEADER BLOCK) ;EF005 MOV $SGMT,$PARRL ;RESTORE RELOCATION BIAS ;EF005 CLR R4 ;INITIALIZE WORD COUNT ;EF005 MOV #$PARRL,R1 ;GET RELOCATION BIAS ;EF005 MOV (R1),@#KISAR6 ;SET MAPPING TO HEADER IN TASK REGION ;EF005 MOV #140000,R5 ;SET DISPLACEMENT ;EF005 MOV #140000,2(R1) ;SET DESTINATION ADDRESS ;EF005 ADD H.WND(R5),2(R1) ;POINT TO WINDOW COUNT ;EF005 MOV @2(R1),-(SP) ;GET #WNDWS FOR TASK REGION 0 ;EF005 ADD #22,2(R1) ;POINT PAST WINDOW COUNT AND WINDOW ZERO ;EF005 ;EF005 220$: DEC (SP) ;GET #WINDOWS FOR TASK LESS WINDOW ZERO ;EF005 BEQ 230$ ;EQ =>NO MORE WINDOWS ;EF005 ADD #10,R4 ;GET WORD COUNT (OCTAL 10 FOR EACH WINDOW) ;EF005 BR 220$ ;ANY MORE WINDOWS? ;EF005 ;EF005 230$: MOV 2(R1),R3 ;USE R3 TO INDEX INTO WINDOWS ;EF005 TST (SP)+ ;CLEAN STACK ;EF005 ;EF005 240$: CLR (R3)+ ;ZERO WINDOW WORDS ;EF005 DEC R4 ;REDUCE WORD COUNT ;EF005 BEQ 260$ ;EQ => NO MORE WORDS TO ZERO ;EF005 BR 240$ ;CONTINUE ZEROING ;EF005 Ž ;EF005 260$: RETURN ;RETURN TO USER STATE AND OTLHD ;EF005 ;EF005 .ENDC ;EF005 ; ; BLXO - ROUTINE TO TRANSFER DATA INTO USER ADDRESS SPACE WITH REGISTERS SAVED. ; BLXO: .IF DF M$$MGE .IFF SAVRG$ ;SAVE REGISTERS .ENDC CALLR .BLXO ;SIMPLY JUMP THERE (THE MAPPED VERSION OF ; .BLXO IMMEDIATELY CALLS $SWSTK) .END Žì`PKkQ›c, .TITLE OTLLB .IDENT /02.07/ ; ; ; COPYRIGHT (C) 1975, 1981 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; VERSION: 02.07 ; BY: THOMAS J MILLER ; (BASED ON INSTALL LABEL-BLOCK PROCESSOR BY H. LEV) ; DATE: 2/4/75 ; ; MODIFIED BY: ; ; JO ANN KASSON 12-JUL-76 ; JAK002 - V3 DATA STRUCTURES ; ; J. H. MATTHEWS 2-FEB-79 ; ; JM025 -- ADD SUPPORT FOR SYSTEM TYPE IN TASK LABEL BLOCK ; ; J. H. MATTHEWS 30-JAN-79 ; ; JM026 -- CORRECT PROBLEM OF OTL NOT SETTING THE ; PRIVILEGE BIT IN THE TCB FOR PRIVILEGED TASKS ; ; ; E. A. FLOYD 1-APR-80 ; EF002 -- CORRECT OTLLB TO PROPERLY CALCULATE ; THE NUMBER OF WINDOWS NEEDED BY A TASK ; ; E. A. FLOYD 9-MAY-80 ; EF004 -- MAKE V4.0 TCB CHANGES ; ; E. A. FLOYD 20-MAY-80 ; EF006 -- ADD SYSTEM CONTROLLED PARTITION SUPPORT V3.0 ; ; E. A. FLOYD 28-OCT-80 ; EF027 -- FIX BUG SO WINDOW SIZE EQUALS TASK LOAD SIZE ; ; E. A. FLOYD 5-NOV-80 ; EF028 -- FIX BUG TO SET MAP COUNT IN ATTACHMENT DESCRIPTOR ; ; E. A. FLOYD 21-NOV-80 ; EF030 -- ADD INCREMENT SUPPORT FOR ALLOCATING PARTITION ; AND FILLING IN TCB ; ; P.J. KOBAR 12-APR-81 ; PJK045 -- CLEAR W.BPCB WHEN INITIALIZING WINDOW BLOCKS ; OTHER THAN THE TASK REGION WINDOW. ; ; P.J. KOBAR 10-APR-81 ; PJK052 -- FIX PROBLEMS WITH CODE FOR UNMAPPED ASSEMBLY ; ; P.J. KOBAR 1-JUN-81 ; PJK058 -- FIX PROBLEMS WITH PLAS CODE ; ; P.J. KOBAR 26-JUN-81 ; PJK063 -- FIX PROBLEM WITH MAPPED NON-PLAS CODE ; ; P.J. KOBAR 4-AUG-81 ; PJK064 -- CORRECT ACCESS CODES FOR ATT DESCRIPTOR ; ; OTLLB - LABEL BLOCK PROCESSOR FOR THE RSX-11S ONLINE TASK LOADER ; ; ; LOCAL SYMBOL DEFINATIONS ; MXWBLK= 10 ;MAX NUMBER OF TASK WINDOW BLOCKS RMPTKB= 4 ;TASK BUILT FOR RSX-11MP ; ;**-52 ; ; HEADER OFFSETS ; WBLKS= 8.*2 ;WINDOW BLOCK SIZE LIBLEN= 14. ;SIZE OF LIBRARY ENTRY MAXLIB= LIBLEN*7. ;MAXIUM LENGTH OF LIBRARIES ; ; LOCAL STORAGE ; NUMLIB: .BLKW 1 ;NUMBER OF LIBRARIES ; ;EF004 ; GLOBAL STORAGE FOR SYSTEM CONTROLLED PARTITION AND OVERLAY SUPPORT ;EF004 ; ;EF004 $TKSZ::.BLKW 1 ;TASK SIZE FOR V4.0 TCB CHANGES FROM L$BMXZ ;EF004 $PCB:: .BLKW 1 ;POINTER TO SUB-PCB ;EF006 ;EF006 .IF DF P$$LAS ;EF006 ;EF006 $WNDBF::.BLKW 16. ;BUFFER FOR TASK REGION ZERO WINDOW ;EF006 $LIBBF::.BLKW 64. ;BUFFER FOR ALL LIBRARY WINDOWS ;EF006 $SGMT::.BLKW 1 ;FLAG TO INDICATE PRESENCE OF RESIDENT OVERLAYS ;EF006 ;EF006 .ENDC ;EF006 ; ; LIBRARY FLAGS ; LD$ACC= 100000 ;ACCESS CODE IS READ/WRITE LD$REL= 4 ;PIC LIBRARY ; ; BUFFER FOR FILE NAME ASCII FROM PARSED COMMAND LINE. NOTE THAT THIS ; BUFFER IS OVERLAID WITH THE TASK AND PARTITION PARAMETER SAVE AREA. ; BY THE TIME THE FIRST LABEL BLOCK IS READ IN THE FILE NAME IS NO ; LONGER REQUIRED. ; $FLBUF:: ; ; TASK AND PARTITION PARAMETER SAVE AREA ; $TSKSZ::.BLKW 1 ;TASK SIZE IN BYTES $TKBSA::.BLKW 1 ;TASK STARTING ADDRESS $HDRBK::.BLKW 1 ;HEADER RELATIVE BLOCK $TBLBK::.BLKW 1 ;BLOCKS IN LABEL BLOCK TABLE $PARRL::.BLKW 1 ;PARTITION RELOCATION BIAS .BLKW 1 ;WORD USED TO FORM ADDRESS DOUBLE WORD ; (USING PARTITION RELOCATION BIAS) $NWNDS::.BLKW 1 ;NUMBER OF WINDOWS IN TASK ;+ ; ; *** - $OTLLB OTL LABEL BLOCK PROCESSOR ; ; THIS MODULE ALLOCATES A TCB AND READS THE FIRST LABEL BLOCK OF THE TASK ; IMAGE. IT THEN PERFORMS CHECKS ON THE LABEL BLOCK, TASK AND PARTITION IN ; WHICH THE TASK IS TO BE INSTALLED. INFORMATION EXTRACTED FROM THE LABEL ; BLOCK IS WRITTEN DIRECTLY INTO THE HEADER IN THE PARTITION WHERE THE TASK ; WILL BE INSTALLED. ELEMENTS OF THE TCB ARE ALSO FILLED IN. ; ;- ; ; ALLOCATE TCB AND READ FIRST LABEL BLOCK ; $OTLLB:: ; .IF DF M$$MGE MOV #T.LGTH+T.EXT,R1 ;SET TCB LENGTH .IFF MOV #T.LGTH,R1 ;SET TCB LENGTH .ENDC CALL $SWSTK,10$ ;SWITCH TO SYSTEM STATE CALL $ALOCB ;ALLOCATE BLOCK FOR TCB MOV R0,$TCB ;SAVE TCB ADDRESS BCC 5$ ;IF CC RETURN CLR $TCB ;ELSE ALLOCATION FAILURE, INDICATE NO TCB ; ALLOCATED 5$: RETURN ; 10$: MOV $TCB,R0 ;PICK UP TCB POINTER BNE 20$ ;IF NE THEN ONE WAS ALLOCATED TRAP ER.POL ;OTHERWISE INSUFFICIENT POOL SPACE 20$: ADD R1,R0 ;POINT PAST ALLOCATED BLOCK 25$: CLRB -(R0) ;CLEAR TCB DEC R1 ; BNE 25$ ; MOV #$LBLBF,R5 ;POINT TO LABEL BUFFER MOV #512.,R1 ;AND PASS SIZE CALL $READ ;READ FIRST LABEL BLOCK ; ; PERFORM INITIAL CHECKS TO DETERMINE IF VALID LABEL BLOCK ; BIT #176000,L$BLDZ(R5) ;LEGAL TASK SIZE? ;EF006 BEQ 27$ ;IF EQ YES ;**-1 26$: TRAP ER.NVI ;ELSE INVALID TASK IMAGE 27$: CMP L$BPRI(R5),#250. ;PRIORITY IN RANGE (L$BPRI) BHI 26$ ;IF HI NO MOV L$BPRI(R5),T.PRI(R0) ;PUT PRIORITY IN TCB (L$BPRI) BNE 271$ ;IF NE HAVE ONE MOV #50.,T.PRI(R0) ;SET TO DEFAULT PRIORITY 271$:  .IF DF A$$PRI MOV T.PRI(R0),T.DPRI(R0) ;DEFAULT PRIORITY .ENDC CMP L$BBLK(R5),#2 ;TOO FEW TABLE BLOCKS? BLO 26$ ;IF LO YES ;EF006 .IF DF P$$LAS ;EF006 ;EF006 CMP L$BBLK(R5),#4 ;TOO MANY TABLE BLOCKS? ;EF006 BHI 26$ ;HI =>YES, INVALID IMAGE ;EF006 ;EF006 .IFF ;EF006 ;EF006 CMP L$BBLK(R5),#3 ;TOO MANY TABLE BLOCKS? BHI 26$ ;IF HI YES .ENDC ;EF006 ; ; SET TASK NAME IN TCB ; .IF DF P$$LAS MOV R0,R1 ;COPY TCB POINTER ADD #T.ATT,R1 ;ADJUST TO POINT TO ATTACHMENT ;DESCRIPTOR LISTHEAD MOV R1,T.ATT+2(R0) ;INITIALIZE BACK POINTER .ENDC ADD #T.NAM,R0 ;POINT TO NAME FIELD MOV R0,R3 ;SAVE POINTER TO NAME FIELD MOV (R5)+,(R0)+ ;SET FIRST WORD OF NAME (L$BTSK)(T.NAM) BEQ 30$ ;IF EQ THEN NO NAME IN LABEL BLOCK MOV (R5),(R0)+ ;SET SECOND WORD (L$BTSK+2)(T.NAM+2) BR 50$ ;CONTINUE 30$: MOV $FLRAD,-2(R0) ;GET TASK NAME FROM FILE NAME (T.NAM) BNE 40$ ;IF NE THEN FILE NAME SPECIFIED TRAP ER.TND ;TASK NAME UNDEFINED 40$: MOV $FLRAD+2,(R0)+ ;SET SECOND WORD OF TASK NAME (T.NAM+2) 50$: CALL $SWSTK,55$ ;SWITCH TO SYSTEM STATE CALL $SRSTD ;SEARCH STD FOR TASK OF SAME NAME ROR (R5) ;STORE CARRY BIT IN LABEL BUFFER (L$BTSK+2) RETURN ;RETURN TO USER STATE 55$: ROL (R5)+ ;RESTORE CARRY BIT (L$BTSK+2) BCS 60$ ;IF CS THEN TASK NAME NOT FOUND AND OK BIT #TS$NHD,L$BFLG-L$BPAR(R5) ;COMMON BLOCK? BNE 60$ ;IF NE YES, NO ERROR TRAP ER.TAE ;ELSE TASK ALREADY EXISTS ; ; FIND TASKS PARTITION ; 60$: MOV $PARHD,R2 ;POINT TO PARTITION CONTROL BLOCK LIST HEAD 70$: CMP (R5),P.NAM(R2) ;MATCH ON FIRST WORD OF NAME? (L$BPAR) BNE 75$ ;IF NE NO CMP 2(R5),P.NAM+2(R2) ;SECOND WORD OF NAME MATCH? (L$BPAR+2) BEQ 80$ ;IF EQ THEN PARTITION FOUND 75$: MOV (R2),R2 ;POINT TO NEXT PCB (P.LNK) BNE 70$ ;BRANCH BACK IF NOT AT END OF LIST 78$: TRAP ER.PNS ;OTHERWISE PARTITION NOT IN SYSTEM 80$: MOV R2,$LBLBF+2 ;SAVE A COPY OF PCB POINTER IN LABEL BUFFER; CMP (R5)+,(R5)+ ;SKIP PAST PARTITION NAME (L$BPAR)(L$BPAR+2) ; SAVE TASK STARTING VIRTUAL ADDRESS ; MOV (R5)+,-(SP) ;SAVE BASE ADDR. FOR FUTURE USE (L$BSA) ; ; PICK UP LABEL BLOCK FLAGS WORD ; MOV L$BFLG-L$BHGV(R5),R4 ;PICK UP FLAG WORD (L$BFLG) ; ; DETERMINE IF PARTITION IS APPRORIATE ; 81$: BIT #TS$NHD,R4 ;IS TASK IMAGE A COMMON BLOCK? BNE 82$ ;IF NE YES BIT #PS.COM,P.STAT(R2) ;IS PARTITION COOMON? BEQ 84$ ;IF EQ NO TRAP ER.COM ;ELSE ERROR, PARTITION IS COMMON 82$: BIT #PS.COM,P.STAT(R2) ;IS PARTITION COMMON? BNE 84$ ;IF NE YES TRAP ER.PNC ;ELSE ERROR, PARTITION IS NOT COMMON ; ; DETERMINE IF PARTITION IS ALREADY BUSY AND IF NOT, MAKE IT BUSY ; ;EF006 ;EF006 84$: MOV R2,$PCB ;INITIALIZE THE PCB ADDRESS SYMBOL ;EF006 ;EF006 .IF DF D$$YNM ;EF006 ;EF006 BIT #PS.SYS,P.STAT(R2) ;SYSTEM-CONTROLLED? ;EF006 BNE 105$ ;NE => YES, ;EF006 ;EF006 .ENDC ;EF006 ;EF006 MOV P.MAIN(R2),R1 ;POINT TO MAIN PARTITION PCB ;EF006 ADD #P.TCB,R2 ;POINT PAST BUSY FLAG WORD IN SUBPARTITION ;**-1 BIT #TS$NHD,R4 ;IS TASK IMAGE A COMMON BLOCK? BNE 100$ ;IF NE YES, IGNORE WHETHER IT IS BUSY OR NOT TSTB P.BUSY+1(R1) ;MAIN PARTITION BUSY? BPL 90$ ;IF PL NO 85$: TRAP ER.PBS ;ERROR, PARTITION ALREADY BUSY 90$: TSTB -(R2) ;SUBPARTITION BUSY? (P.BUSY+1) BNE 85$ ;IF NE YES BISB -(R2),P.BUSY+1(R1) ;SET MAIN PARTITION BUSY (P.BUSY) BISB (R2)+,(R2)+ ;SET SUBPARTITION BUSY (P.BUSY)(P.BUSY+1)  MOV $LBLBF+2,T.PCB-T.NAM(R3) ;POINT TCB TO PCB 100$: MOV $TCB,(R2)+ ;POINT PCB TO TCB (P.TCB) ;PJK052 .IF DF D$$YNM ;PJK052 ;PJK052 BR 110$ ;PJK052 105$: ADD #P.STAT,R2 ;BUMP POINTER TO P.STAT ;PJK052 ;PJK052 .ENDC ;PJK052 ;PJK052 ; ; CHECK IF TASK IS OVERLAID ; 110$: ;PJK052 .IF DF P$$LAS ;PJK052 ;PJK052 CLR $SGMT ;CLEAR SEGMENT INDICATOR ;PJK052 ;PJK052 .ENDC ;PJK052 ;PJK052 CMP (R5)+,(R5)+ ;SKIP TO TASK LOAD SIZE(L$BMGV)(L$BMXV) CMP (R5)+,(R5) ;LOAD SIZE = MAX SIZE (L$BLDZ)(L$BMXZ) BEQ 115$ ;IF EQ YES, TASK NOT OVERLAYED ;EF006 ;EF006 .IF DF P$$LAS ;EF006 ;EF006 TST L$BSGL-L$BMXZ(R5) ;IS SEGMENT LABEL BLOCK PRESENT? ;EF006 BNE 111$ ;NE => YES, PROCEED WITH CHECKS ;EF006 TRAP ER.TKB ; ;EF006 111$: INC $SGMT ;OVERLAID TASK WITH SEGMENT LABEL BLOCK ;EF006 BIT #TS$RES,R4 ;OVERLAYS RESIDENT? ;EF006 BNE 115$ ;NE =>YES, ELSE OVERLAYS NOT MEM RES ;EF006 ;EF006 .ENDC ;EF006 ;EF006 TRAP ER.OVL ;ELSE TASK IS OVERLAID ;**-1 ; ; DETERMINE IF MEMORY FOR PARTITION IS THERE ; 115$: MOV (R5),$TKSZ ;SAVE LOAD SIZE FOR TCB ;EF004 ;EF004 .IF DF M$$MGE ;EF030 ;EF030 TST $INCAM ;ANY INCREMENT? ;EF030 BEQ 117$ ;NO ;EF030 ;EF030 .IF DF P$$LAS ;EF030 ;EF030 TST $SGMT ;TASK OVERLAID? ;EF030 BEQ 116$ ;NO ;EF030 TRAP ER.INC ;NO INC WITH OVERLAID TASK ;EF030 ;EF030 .ENDC ;P$$LAS ;EF030 ;EF030 116$: ADD $INCAM,$TKSZ ;UPDATE TASK SIZE BY INCREMENT ;EF030 117$: ;EF030 ;PJK052 .IF DF D$$YNM ;PJK052 ;PJK052 BIT #PS.SYS,(R2) ;IS MAIN PCB FOR SYSTEM-CONTROLLED PARTITION ;PJK052 BEQ 120$ ;EQ => NO ;PJK052 SUB #P.STAT,R2 ;POINT R2 TO BEGINNING OF PCB ;PJK052 CALL FIND ;ALLOCATE SPACE IN PARTITION FOR TASK ;PJK052 MOV $PCB,$LBLBF+2 ;SAVE PTR TO SUB-PCB IN LABEL BUFFER ;PJK052 MOV $PCB,R2 ;POINT R2 TO ALLOCATED SUB-PCB ;PJK052 ADD #P.STAT,R2 ;POINT TO PCB STATUS WORD ;PJK052 120$: ;PJK052 .ENDC ;D$$YNM ;PJK052 ;PJK052 .ENDC ;M$$MGE ;PJK052 ;PJK052 ;**-2 .IF DF P$$LAS ADD #P.ATT-P.STAT,R2 ;POINT TO ATTACHMENT DESCRIPTOR LISTHEADR LISTHE MOV R2,2(R2) ;INITIALIZE BACK POINTER ADD #P.REL-P.ATT,R2 ;POINT TO RELOCATION BIAS  .IFF ADD #P.REL-P.STAT,R2 ;POINT TO RELOCATION BIAS .ENDC .IF DF M$$MGE .IF DF M$$EXT ;PJK058 ;PJK058 CMP (R2)+,#170000 ;I/O PAGE? ;PJK058 ;PJK058 .IFF ;PJK058 ;PJK058 CMP (R2)+,#7600 ;I/O PAGE? ;PJK058 .ENDC ;M$$EXT ;PJK058 .IFF CMP (R2)+,#160000 ;I/O PAGE? .IFTF BHIS 125$ ;IF HIS YES, SKIP CHECK MOV $SYSIZ,-(SP) ;PUSH SYSTEM SIZE .IFT SUB -2(R2),(SP) ;SUBTRACT PARTITION RELOCATION BIAS (P.REL) .IFF MOV -2(R2),R1 ;PICK UP PARTITION BASE ADDRESS (P.REL) CALL DIV64 ;CONVERT TO 32 WORD BLOCKS SUB R1,(SP) ;SUBTRACT FROM SYSTEM SIZE .IFTF BCS 78$ ;IF CS MEMORY NOT THERE MOV (R2),R1 ;PICK UP PARTITION SIZE IN BYTES (P.SIZE) .IFF CALL DIV64 ;CONVERT TO 32 WORD BLOCKS .ENDC SUB R1,(SP)+ ;SUBTRACT FROM SYSTEM SIZE BCS 78$ ;IF CS MEMORY NOT THERE BR 126$ ;PJK058 ; ; CHECK IF TASK WILL FIT IN PARTITION ; 125$: MOV (R2),R1 ;PARTITION SIZE (P.SIZE) ;PJK058 ;PJK058 .IF NDF M$$MGE ;PJK058 ;PJK058 CALL DIV64 ;CONVERT TO 32 WORD BLOCKS ;PJK058 ;PJK058 .ENDC ;M$$MGE ;PJK058 ;PJK058 126$: ;PJK058 CMP (R5),R1 ;MAX. TASK SIZE > PARTITION SIZE? (L$BMXZ) BLOS 130$ ;IF LOS THEN OK TRAP ER.BIG ;TASK TOO LARGE FOR PARTITION 130$: BIT #TS$NHD,R4 ;LIBRARY OR COMMON BLOCK? BNE 220$ ;IF NE YES BIT #TS$PRV,R4 ;PRIVILEGED TASK? .IF DF M$$MGE BEQ 140$ ;IF EQ NO .IFF BEQ 220$ ;IF EQ NO .IFTF BIS #T3.PRV,T.ST3-T.NAM(R3) ; SET PRIVILEGED BIT IN TCB .IFF CMP (R2),#60000 ;PARTITION SIZE > 12K? (P.SIZE) BLOS 220$ ;IF LOS NO TRAP ER.PSZ ;PARTITION TOO LARGE FOR PRIVILEGED TASK .IFT 140$: MOV (SP),R1 ;GET BASE ADDRESS OF TASK MOV #17777,-(SP) ;PUSH CONSTANT OF 4K-1 ONTO STACK BIT (SP),R1 ;TASK START ON 4K BOUNDARY? BEQ 160$ ;IF EQ YES TRAP ER.NBA ;INVALID BASE ADDRESS 160$: ASL R1 ;CALCULATE FIRST APR ROL R1 ; ROL R1 ; ROL R1 ; MOV #8.,R0 ;ASSUME TASK IS NOT PRIVILEGED ; ; A PRIVILEGE TASK WITHOUT THE EXECUTIVE RESIDENT CAN ; HAVE AN APR OF ZERO ; TST R1 ;BASE = 0? BEQ 210$ ;IF EQ YES- APR CAN BE ZERO BIT #TS$PRV,R4 ;TASK PRIVILEGED? BEQ 170$ ;IF EQ NO - ERROR ; ; IF R$$EXV IS DEFINED THEN AN EXTENDED EXECUTIVE EXISTS ; - FIRST APR MUST BE 5 OR 6. ; .IF DF R$$EXV CMP R1,#5 ;FIRST APR CANNOT BE LESS THEN 5 .IFF CMP R1,#4 ;FIRST APR CANNOT BE LESS THAN 4 .ENDC ;STARTING ADDRESS THE SAME BGE 180$ ;IF GE THEN OK 170$: TRAP ER.APR ;INVALID FIRST APR 180$: CMP R1,#6 ;FIRST APR MUST NOT BE GREATER THAN 6 BGT 170$ ;IF GT ERROR DEC R0 ;REDUCE NUMBER OF APRS FOR PRIVILEGED TASK 210$: SUB R1,R0 ;CALCULATE NUMBER OF APR'S REQUIRED ;EF006 .IF DF P$$LAS ;EF006 ;EF006 MOV -2(R5),R1 ;GET LOAD SIZE FOR CALCULATING APRS NEEDED ;EF006 ;EF006 .IFF ;EF006  ;EF006 MOV (R2),R1 ;PICK UP PARTITION SIZE (P.SIZE) ;PJK052 .ENDC ;PJK052 ;PJK052 215$: CALL MUL64 ;CONVERT P.SIZE TO BYTES OR ;EF006 ;LOAD SIZE FOR OVERLAID TASKS ;EF006 ADD (SP),R1 ;ROUND UP TO 4K BOUNDARY ;**-1 BIC (SP)+,R1 ;FINISH ROUNDING AND POP CONSTANT ROL R1 ;CALCULATE APR'S NEEDED TO MAP PARTITION ROL R1 ; ROL R1 ; ROL R1 ; CMP R1,R0 ;ENOUGH APR'S FOR TASK? BLE 230$ ;IF LE YES TRAP ER.NAP ;NOT ENOUGH APR'S FOR TASK .IFTF 220$: ;REFERENCE LABEL ; ; CHECK PARTITION BASE ADDRESS AND TASK STARTING ADDRESS ; .IFF CMP (SP),P.REL-P.SIZE(R2) ;BASE ADDRESS & START THE SAME? ; (L$BSA) BEQ 230$ ;IF EQ YES TRAP ER.BMM ;TASK AND PARTITION BASE MISMATCH .ENDC ; ; PUT MAXIUM TASK SIZE IN TCB ; 230$: MOV (R2),T.MXSZ-T.NAM(R3) ;PUT MAX. TASK SIZE IN TCB (L$BMXZ) ; ; SAVE TASK AND PARTITION PARAMETERS ; MOV #$TSKSZ,R1 ;POINT TO SAVE AREA MOV (R5)+,(R1) ;PICK UP TASK SIZE IN ;32-WORD BLOCKS (L$BMXZ)($TSKSZ) SWAB (R1) ;CONVERT TO BYTES ASRB (R1) ; ROR (R1) ; ROR (R1)+ ; MOV (SP),(R1)+ ;SAVE BASE ADDRESS OF TASK ($TKBSA) MOV L$BHRB-L$BOFF(R5),(R1) ;HEADER RELATIVE BLOCK ($HDRBK) SUB L$BBLK-L$BOFF(R5),(R1)+ ; AND MAKE IT RELATIVE TO LAST ; LABEL BLOCK ($HDRBK) MOV L$BBLK-L$BOFF(R5),(R1)+ ;BLOCKS IN TABLE ($TBLBK) MOV P.REL-P.SIZE(R2),(R1) ;PICK UP PARTITION ;RELOCATION BIAS ($PARRL) ADD (R5),(R1)+ ;ADD PARITION OFFSET ; ; NOTE THAT A POINTER TO THE PCB FOR THE PARTITION FOR THE TASK HAS ALREADY ; BEEN MOVED TO $LBLBF. IN THE FOLLOWING CODE DATA WILL BE MOVED INTO SUCCEEDING ; LOCATIONS IN THE LABEL BUFFER. EVENTUALLY THE ENTIRE BLOCK OF DATA WILL BE ; MOVED INTO THE TASK HEADER IN THE TASK'S PARTITION. INDIRECT REFERENCES ; INTO THE LABEL BUFFER THROUGH R0 WILL BE LABLED IN THE COMMENT FIELD BY THE ; OFFSET IN THE HEADER WHERE THEY WILL END UP. ; CLR NUMLIB ;INITIALIZE LIBRARY COUNT ;EF006 .IF DF P$$LAS  ;EF006 ;EF006 MOV #$WNDBF+2,R0 ;POINT TO SECOND WORD OF WINDOW BUFFER ;EF006 MOV $PCB,(R0)+ ;PUT PCB ADDRESS IN W.BPCB ;EF006 ;EF006 .IFF ;EF006 ;EF006 MOV #$LBLBF+4,R0 ;POINT R0 TO THIRD WORD OF LABEL BUFFER ;EF006 .ENDC ;EF006 ;EF006 BIT #TS$NHD,R4 ;LIBRARY OR COMMON BLOCK? BEQ 240$ ;IF EQ NO JMP OTLLBC ;YES- 240$: MOV (SP),(R0)+ ;MOVE TASK BASE ADDR. (W.BLVR) .IF DF M$$MGE ;EF006 .IF DF P$$LAS ;EF006 ;EF006 TST $SGMT ;TASK OVERLAID? ;EF006 BEQ 243$ ;EQ => NO ;EF006 MOV L$BLDZ-L$BOFF(R5),R1 ;USE TASK LOAD SIZE FOR W.BHVR ;EF006 BR 245$ ; ;EF006 ;EF006 .ENDC ;EF006 243$: MOV (R2),R1 ;GET SIZE (P.SIZE) ;EF006 245$: CALL MUL64 ;CONVERT TO BYTES ;EF006 MOV R1,(R0) ;CALCULATE LAST VIRTUAL ADDRESS ;**-2 .IFF MOV (R2),(R0) ;CALCULATE LAST VIRTUAL ADDRESS ;(P.SIZE)(W.BHVR) .IFTF 246$: ADD (SP),(R0) ;ADD TASK BASE ADDR (W.BHVR) ;EF006 DEC (R0)+ ;(W.BHVR) ;**-1 .ENDC .IF DF P$$LAS MOV R4,-(SP) ;SAVE FLAGS MOV #AS.RED!AS.WRT,R4 ;SET ACCESS CODE (R/W) ;PJK064 CALL SETATT ;GET ADDRESS OF ATTACHMENT DESCRIPTOR ;**-1 MOV (SP)+,R4 ;RESTORE FLAG WORD .IFF CLR (R0)+ ;ADDRESS OF ATTACHMENT DESCRIPTOR (W.BTT) .ENDC ;EF006 .IF DF P$$LAS ;EF006 ;EF006 TST $SGMT ;TASK OVERLAID? ;EF006 BEQ 247$ ;EQ => NO ;EF006 MOV L$BLDZ-L$BOFF(R5),(R0)+ ;USE TASK LOAD SIZE FOR W.BSIZ ;EF006 BR 249$ ; ;EF006 ;EF006 .ENDC ;EF006 ;EF006 247$: MOV (R2),(R0)+ ;SIZE OF WINDOW (P.SIZE) (W.BSIZ) ;EF006 249$: MOV (R5)+,(R0)+ ;PHYSICAL MEMORY OFFSET (L$BOFF)(W.BOFF) ;EF006 CLR $LBLBF ;CLEAR GARBAGE OUT OF HIGH BYTE ;**-2 MOVB (R5)+,$LBLBF ;SAVE NUMBER OF ADDRESS WINDOWS (L$BWND) CMPB #MXWBLK,$LBLBF ;MORE THAN 8. WINDOW BLOCKS BHIS 250$ ;IF HIS, THEN < 8. WINDOW BLOCKS TRAP ER.IWB ;TOO MANY WINDOWS 250$: CMPB #RMPTKB,(R5)+ ;TASK BUILT FOR RSX-11MP (L$BSYS) BNE 260$ ;IF EQ, NO TRAP ER.TKB ;BUILT FOR WRONG SYSTEM 260$: .IF DF M$$MGE MOV (SP),(R0) ;MOVE IN BASE ADDRESS (W.BFPD) CALL SETAPR ;SET APR ;PJK063 .IF DF P$$LAS ;PJK063 ;PJK063 MOV L$BLDZ-L$BSEG(R5),(R0) ;USE LOAD SIZE TO CALCULATE PDRS ;PJK063 ;PJK063 .IFF ;PJK063 ;PJK063 MOV (R2),(R0) ;GET MAX LENGTH ;PJK063 .ENDC ;PJK063 ;PJK063 CALL SETPDR ;CALCULATE NUMBER OF PDR'S ;AND CONTENTS OF LAST PDR .IFF CLR (R0)+ ;CLEAR APR AND ACCESS CODE FIELDS CLR (R0)+ ;CLEAR CONTENTS OF LAST PDR (L$BLPD) .ENDC TST (SP)+ ;POP BASE ADDRESS- CLEAN STACK ; ; PROCESS LIBRARY REFERENCES ; .ENABL LSB ADD #L$BLIB-L$BSEG,R5 ;POINT TO LIBRARY ENTRIES OTLLIB: TST (R5) ;END OF LIBRARY REFERENCE BLKS.(R$LNAM) BEQ 140$ ;IF EQ YES MOV $PARHD,R2 ;ELSE POINT TO FIRST PCB INC NUMLIB ;COUNT LIBRARIES 20$: CMP (R5),P.NAM(R2) ;CHECK IF COMMON BLOCK MATCHES ;PARTITION NAME (R$LNAM) BNE 30$ ;IF NE NO CMP +2(R5),P.NAM+2(R2) ;(R$LNAM) BEQ 40$ ;IF EQ MATCH 30$: MOV (R2),R2 ;POINT TO NEXT PCB (P.LNK) BNE 20$ ;BR IF ONE TRAP ER.NCB ;ELSE ERROR, INVALID COMMON BLOCK 40$: MOV P.STAT(R2),R3 ;SAVE STATUS BIT #PS.COM,R3 ;COMMON PARTITION? BNE 50$ ;IF NE YES TRAP ER.CTP ;ELSE COMMON BLOCK IS TASK PARTITION 50$: BITB P.BUSY(R2),P.BUSY+1(R2) ;COMMON BLOCK LOADED? BNE 60$ ;IF NE YES TRAP ER.CNL ;ELSE COMMON BLOCK NOT LOADED ERROR ; ; CHECK LIBRARY PARAMETERS ; 60$: MOV P.SIZE(R2),R1 ;PICK UP PARTITION SIZE .IF NDF M$$MGE CALL DIV64 ;CONVERT TO 32-WORD BLOCKS .ENDC CMP R$LMXZ(R5),R1 ;PARTITION LARGE ENOUGH?(R$LMXZ) BLOS 70$ ;IF LOS YES TRAP ER.CBL ;COMMON BLOCK LENGTH MISMATCH 70$: CMP (R5)+,(R5)+ ;POINT TO START OF ADDRESS BLOCK(R$LSA) .IF DF M$$MGE .IFF CMP P.REL(R2),(R5) ;BASE ADDRESS SAME? (R$LSA) BEQ 90$ ;IF EQ YES 80$: TRAP ER.CBB ;COMMON BLOCK BASE MISMATCH 90$: .ENDC ; ; SET UP PARTITION DESCRIPTOR FOR TASK HEADER ; .IF DF P$$LAS ;EF006 ;EF006 MOV #$LIBBF,R0 ;POINT TO LIBRARY WINDOW BUFFER ;EF006 ;EF006 .ENDC ;EF006 ;EF006 MOV R2,(R0)+ ;STORE PCB ADDRESS (W.BPCB) MOV (R5),(R0)+ ;STORE LOW VIRTUAL ADDRESS(R$LSA)(W.BLVR) .IF DF M$$MGE MOV P.SIZE(R2),R1 ;GET PARTITION SIZE CALL MUL64 ;CONVERT TO BYTES MOV R1,(R0) ;SET HIGH VIRTUAL ADDR4ESS (W.BHVR) .IFF MOV P.SIZE(R2),(R0) ;SET HIGH VIRTUAL ADDR. (W.BHVR) .IFTF ADD (R5)+,(R0) ;COMPLETE HIGH VIRTUAL ADDR.(R$LSA)(W.BHVR) DEC (R0)+ ;(W.BHVR) .ENDC .IF DF P$$LAS MOV R4,-(SP) ;SAVE FLAGS MOV #AS.RED!AS.WRT,R4 ;SET ACCESS CODE (R/W) ;PJK064 BIT #LD$ACC,R$LFLG-R$LHGV(R5) ;READ ONLY ACCESS? ;**-1 BNE 95$ ;IF NE NO MOV #AS.RED,R4 ;SET ACCESS CODE (R) ;PJK064 95$: ;**-1 CALL SETATT ;GET ADDRESS OF ATTACHMENT DESCRIPTOR MOV (SP)+,R4 ;RESTORE FLAG WORD .IFF CLR (R0)+ ;ADDR. OF ATTACHMENT DESCRIPTOR (W.BATT) .ENDC ADD #R$LOFF-R$LHGV,R5 ;POINT TO LIBRARY OFFSET MOV P.SIZE(R2),(R0)+ ;SIZE OF WINDOW (P.SIZE)(W.BSIZ) MOV (R5)+,(R0)+ ;LIBRARY OFFSET IN PARTITION (R$LOFF) ;(W.BOFF) ADD (R5)+,$LBLBF ;LIBRARY ADDRESS WINDOWS(R$LWND) CLRB $LBLBF+1 ;EF002 .IF DF M$$MGE MOV R$LSA-R$LSEG(R5),(R0) ;SET TO CALCULATE APR (W.BFPD) CALL SETAPR ;CALCULATE AND POP R0 MOV P.SIZE(R2),(R0) ;GET MAX. SIZE CALL SETPDR ;CALCULATE NUMBER OF PDR'S AND ;CONTENTS OF LAST PDR .IFF CLR (R0)+ ;CLEAR APR (W.BFPD) CLR (R0)+ ;CLEAR CONTENTS OF PDR (W.BLPD) .IFT TST -(R0) ;POINT BACK TO APR BYTE (W.BLPD) TST (R5)+ ;SKIP TO FLAG WORD (R$LSEG) MOVB -2(R0),R1 ;PICK UP APR BYTE (W.BFPD) BIT #PS.PIC,R3 ;COMMON BLK PIC? BEQ 110$ ;IF EQ NO BIT #LD$REL,(R5) ;TASK EXPECTING PIC? (LIBFLG) BNE 120$ ;IF NE YES 100$: TRAP ER.CBP ;COMMON BLOCK PARAMETER MISMATCH 110$: BIT #LD$REL,(R5) ;TASK EXPECTIN PIC? (LIBFLG) BNE 100$ ;IF NE YES, ERROR SUB #UISDR0,R1 ;RECALCULATE APR NUMBER ASRB R1 ; BIC #177770,R3 ;EXTRACT APR NUMBER FROM PCB STATUS CMPB R3,R1 ;PARTITION APR MATCH LABEL BLOCK APR? BEQ 120$ ;IF EQ YES TRAP ER.CBB ;ELSE ERROR 120$: BIT #LD$ACC,(R5)+ ;READ/WRITE ACCESS? (LIBFLG) BNE 130$ ;IF NE YES, ALREADY SET MOVB #2,(R0) ;ELSE SET FOR READ ONLY (H.PCBC+7) 130$: TST (R0)+ ;BUMP POINTER TO NEXT LIBRARY BLOCK .IFF CMP (R5)+,(R5)+ ;MOVE TO DATE (R$LSEG)(R$LFLG) .ENDC CMP (R5)+,(R5)+ ;SKIP TO NEXT LIBRARY ENTRY TST (R5)+ ;(R$LDAT) BR OTLLIB ;GET NEXT LIBRARY ENTRY 140$: .IF DF P$$LAS ;EF006 ;EF006 MOV $LBLBF,$WNDBF ;MOV #WINDOWS TO WINDOW BUFFER ;EF006 ;EF006 .ENDC ;EF006 ;EF006 MOV $LBLBF,$NWNDS ;SAVE TOTAL NUM. OF WINDOWS REQUIRED BY TASK MOV $LBLBF,R1 ;CALCULATE NUMBER OF WINDOWS SUB NUMLIB,R1 ;STILL NEEDED DEC R1 ;SUBTRACT ONE FOR TASK BEQ 160$ ;IF EQ NO EXTRA WINDOWS 150$: CLR (R0) ;CLEAR PCB ADDRESS (W.BPCB) ;PJK045 CLR W.BSIZ(R0) ;NEED ONLY CLEAR WINDOW SIZE ADD #WBLKS,R0 ;MOVE TO NEXT WINDOW DEC R1 ;MORE? BNE 150$ ;IF NE YES 160$: .IF NDF P$$LAS ;EF006 ;EF006 SUB #$LBLBF,R0 ;SIZE OF TRANSFER MOV R0,R2 ;MOVE INTO PLACE FOR TRANSFER ;EF006 .IFF ;EF006 ;EF006 MOV #,R2 ;MOVE WINDIW 0 PLUS PREVIOUS WORD (#WINDOWS) ;EF006 ;EF006 .ENDC ;EF006 ;EF006 MOV #$LBLBF+L$BLUN,R5 ;ADDRESS OF LUN COUNT MOV (R5),R5 ;GET NUMBER OF LUNS ASL R5 ;CHANGE TO BYTES ASL R5 ; ADD #H.LUN,R5 ;FIND END OF LUN TABLE IN HEADER ; ; MOVE THE PARTITION AND COMMON BLOCK INFORMATION INTO PLACE IN HEADER ; .IF DF P$$LAS ;EF006 ;EF006 MOV #$WNDBF,R0 ;POINT TO WINDOW BUFFER ;EF006 ;EF006 .IFF ;EF006 MOV #$LBLBF,R0 ;POINT TO BUFFER ;EF006 .ENDC ;EF006 MOV #$PARRL,R1 ;POINT TO FIRST WORD OF ADDRESS DOUBLE WORD  .IF DF M$$MGE MOV #140000,2(R1) ;SET BASE ADDRESS ADD R5,2(R1) ;ADD OFFSET TO BASE ;PJK052 ;PJK052 ;PJK052 .IF DF P$$LAS ;PJK052 ;PJK052 ;PJK052 CALL .BLXO ;TRANSFER WINDOW 0 TO HEADER IN TASK REGION ;PJK052 ADD R2,2(R1) ;POINT PAST WINDOW 0 ;PJK052 MOV $LBLBF,-(SP) ;GET #WINDOWS FOR TASK REGION ;PJK052 DEC (SP) ;SUBTRACT WINDOW 0 ;PJK052 BEQ 170$ ;EQ => NO WINDOWS LEFT TO MOVE ;PJK052 ASL (SP) ;CALCULATE # TASK WINDOWS ;PJK052 ASL (SP) ;LEFT IN HEADER ;PJK052 ASL (SP) ; ;PJK052 ASL (SP) ;CONVERT TO BYTES ;PJK052 170$: ADD (SP)+,2(R1) ;MOVE LIB ENTRIES PAST TASK WINDOWS ;PJK052 SUB $LBLBF,$WNDBF ;GET # LIB WINDOWS TO XFER ;PJK052 ;$WNDBF NO LONGER NEEDED ;PJK052 BEQ 200$ ;EQ => NO LIB ENTRIES TO XFER ;PJK052 MOV $WNDBF,R2 ;GET # LIB WINDOWS AND ;PJK052 ASL R2 ;CONVERT TO BYTES ;PJK052 ASL R2 ; ;PJK052 ASL R2 ; ;PJK052 ASL R2 ; ;PJK052 MOV #$LIBBF,R0 ;PJK052 MOV #$PARRL,R1 ; ;PJK052 CALLR .BLXO ;TRANSFER AND RETURN TO CONTROL LOOP ;PJK052 200$: RETURN ;RETURN TO CONTROL LOOP ;PJK052 ;PJK052 ;PJK052 .IFF ;PJK052 ;PJK052 CALLR .BLXO ;TRANSFER AND RETRUN TO CONTROL LOOP ;PJK052 ;PJK052 .ENDC ;PJK052 ;PJK052 ;PJK052 .IFF MOV (R1),2(R1) ;SET BASE ADDRESS ADD R5,2(R1) ;ADD OFFSET TO BASE ;PJK052 CALLR .BLXO ;TRANSFER AND RETURN TO CONTROL LOOP ;PJK052 .ENDC .DSABL LSB ;**-2 ; ; PROCESS LIBRARY LOAD ; OTLLBC: CMP P.NAM-P.SIZE(R2),(R3)+ ;LIBRARY NAME SAME AS PARTITION NAME? ; (T.NAM) BEQ 10$ ;IF EQ MAYBE 5$: TRAP ER.CBP ;ELSE COMMON BLOCK PARAMETER MISMATCH 10$: CMP P.NAM+2-P.SIZE(R2),(R3) ;(T.NAM+2) BNE 5$ ;IF NE NO MOV $LBLBF,T.PCB-T.NAM-2(R3) ;SET PCB POINTER IN TCB TO FREE ; PARTITION ON ERROR ADD #P.BUSY-P.SIZE,R2 ;POINT TO BUSY MASK IN PCB MOV P.MAIN-P.BUSY(R2),R1 ;POINT TO MAIN PARTITION BISB (R2),P.BUSY+1(R1) ;SET MAIN PARTITION BUSY (P.BUSY) BISB (R2)+,(R2)+ ;SET SUBPARTITION BUSY (P.BUSY)(P.BUSY+1) ADD #P.STAT-P.TCB,R2 ;POINT TO PARTITION STATUS BICB #PS.PIC,(R2) ;ASSUME NOT PIC (P.STAT) BIT #TS$PIC,R4 ;IS COMMON BLOCK PIC? .IF DF M$$MGE BEQ 20$ ;IF EQ NO .IFF BEQ 30$ ;IF EQ NO .IFTF BISB #PS.PIC,(R2) ;SET PIC BIT IN PCB (P.STAT) .IFT 20$: MOV (SP)+,(R0) ;DEPOSIT START ADDRESS IN BUFFER CALL SETAPR ;CALCULATE APR BYTE AND ACCESS CODE SUB #UISDR0,-(R0) ;RETRIEVE APR NUMBER ASRB (R0) ; BICB #PS.APR,(R2) ;CLEAR FIRST APR ENTRY (P.STAT) BISB (R0),(R2) ;AND SET NEW ONE IN PCB (P.STAT) .IFTF 30$: .IFF TST (SP)+ ;POP BASE ADDRESS OF STACK .IFTF RETURN .IFF ; ; DIV64 - DIVIDE NUMBER IN R1 BY 64 (LOW 6 BITS ASSUMED TO BE CLEAR) ; DIV64: ASL R1 ROL R1 ROLB R1 SWAB R1 RETURN .ENDC ; ; SETAPR - CALCULATE APR AND SET ACCESS CODE OF 6 ; ; THE ADDRESS IN THE LOCATION POINTED TO BY R0 IS CONVERTED TO AN APR NUMBER ; IN THE LOW BYTE OF THE WORD POINTED TO BY R0 AND AN ACCESS CODE OF 6 IS PLACED ; IN THE HIGH BYTE. R0 POINTS TO THE FOLLOWING WORD ON EXIT ; .IF DF M$$MGE SETAPR: ROL (R0) ;CALCULATE APR ROL (R0) ROL (R0) ROL (R0) ROL (R0) ;CONVERT TO WORD OFFSET BIC #177761,(R0) ;CLEAR ALL BUT APR NUMBER * 2 ADD #UISDR0,(R0)+ ;CONVERT TO POINTER INTO USER APR TABLE RETURN ; ;SETPDR - CALCULATE THE NUMBER OF PDR'S NEEDED TO MAP ; AND THE CONTENTS OF THE LAST APR ; ; THE SIZE IN THE LOCATION POINTED TO BY R0 IS CONVERTED TO THE ; NUMBER OF PDR'S NEEDED AND THE CONTENTS OF THE LAST PDR. THE NUMBER ; OF PDR'S IS PUT IN THE BYTE PRECEEDING THE WORD POINTED TO BY R0 AND THE ; CONTENTS OF THE LAST PDR IS PUT IN THE WORD POINTED TO BY R0. ; ON RETURN R0 IS POINTING TO THE NEXT WORD. ; SETPDR: DEC (R0) ;CALCULATE THE LOAD SIZE MINUS ONE ASL (R0) ;SHIFT APR'S REQUIRED MINUS ONE TO HIGH BYTE RORB (R0) ;LEN. OF LAST RANGE MINUS ONE IN LOW BYTE MOVB +1(R0),-1(R0) ;MOVE INTO PLACE (W.BNPD) SWAB (R0) ;IN HIGH BYE INCB -1(R0) ;CALCULATE APR'S REQUIRED MOVB #6,(R0) ;INSERT ACCESS CODE TST (R0)+ ;INCREMENT TO NEXT WORD RETURN ; ; .IF DF P$$LAS ; ; ; ; SETATT - GET ADDRESS OF ATTACHMENT DESCRIPTOR AND STORE ; IN THE POINTED TO BY R0. ON RETURN R0 WILL BE POINTING TO THE NEXT WORD. ; ; INPUT: ; R4 = ACCESS CODE ; SETATT: MOV R2,-(SP) ;SAVE REGISTER MOV R5,-(SP) ;SAVE MOV R0,-(SP) ;SAVE MOV $TCB,R5 ;GET ADDRESS OF TCB MOV $LBLBF+2,R2 ;GET ADDRESS OF PCB CALL $CRATT ;CREATE ATTACHMENT DESCRIPTOR BCC 10$ ;IF CC ATTACHMENT DESCRIPTOR WAS ALLOCATED TRAP ER.POL ;NONE ALLOCATED 10$: INCB A.MPCT(R1) ;INCREMENT MAP COUNT ;EF028 MOV (SP)+,R0 ;RESTORE MOV R1,(R0)+ ;STORE ADDRESS OF DESCRIPTOR MOV (SP)+,R5 ;RESTORE MOV (SP)+,R2 ;RESTORE RETURN .ENDC ;EF006 ;EF006 .IF DF D$$YNM ;EF006 ;EF006 ; ;EF006 ; FIND -- THIS ROUTINE ALLOCATES A PCB FOR THE TASK SUB-PARTITION ;EF006 ; AND CALLS $FNDSP TO ALLOCATE SPACE WITHIN THE SYSTEM-CONTROLLED ;EF006 ; PARTITION. ;EF006 ; ;EF006 ; INPUTS: ;EF006 ; R2 -- POINTER TO MAIN PCB ;EF006 ; ;EF006 ; ALL REGISTERS ARE PRESERVED ;EF006 ; ;EF006 ;EF006 FIND: ;EF006 JSR PC,$SAVAL ;SAVE ALL REGISTERS ;EF006 MOV #P.LGTH,R1 ;SET PCB LENGTH ;EF006 MOV R2,R5 ;SAVE POINTER TO MAIN PCB IN R5 ;EF006 CALL $SWSTK,10$ ;SWITCH TO SYSTEM STATE ;EF006 CALL $ALOCB ;ALLOCATE A PCB ;EF006 MOV R0,$PCB ;SAVE ADDRESS OF PCB ;EF006 BCC 5$ ;C = 0, RETURN ;EF006 CLR $PCB ;ALLOCATION FAILURE ;EF006 ;EF006 ;EF006 5$: RETURN ;IN USER STATE AGAIN ;EF006 ;EF006 10$: MOV $PCB,R0 ;PICK UP PCB ADDRESS ;EF006 BNE 15$ ;BLOCK SUCCESSFULLY ALLOCATED ;EF006 TRAP ER.POL ;INSUFFICIENT POOL ;EF006 ;EF006 15$: ADD R1,R0 ;POINT PAST PCB ;EF006 ASR R1 ;CHANGE BYTE TO WORD COUNT ;EF006 20$: CLR -(R0) ;AND CLEAR ;EF006 DEC R1 ; ;EF006 BNE 20$ ; ;EF006 ;EF006 ;EF006 MOV P.NAM(R5),P.NAM(R0) ;PUT MAIN PCB NAME ;EF006 MOV P.NAM+2(R5),P.NAM+2(R0) ;INTO ALLOCATED SUB-PCB ;EF006 MOV $TKSZ,P.SIZE(R0) ;PUT SIZE IN SUB-PCB ;EF006 ;EF006 ;EF006 CALL $SWSTK,100$ ;SWITCH TO SYSTEM STATE ;EF006 MOV R0,R4 ;USE R4 AS POINTER TO ALLOCATED PCB ;EF006 CALL $FNDSP ;ALLOCATE SPACE IN MAIN PARTITION ;EF006 MOV @$HEADR,R2 ;MOVE USER PS INTO R2 SO ;EF006 ADC 6(R2) ;THAT C BIT CAN BE PRESERVED FOR ;EF006 ;SUCCESSFUL ALLOCATION TEST ;EF006 ;EF006 BIT #1,6(R2) ;BIT SET MEANS ALLOCATION FAILURE, ;EF006 BNE 100$ ;NE => SET, RETURN AND TRAP ;EF006 MOV $TCB,R1 ;PICK UP TCB ADDRESS ;EF006 MOV $PCB,R0 ;PICK UP SUB-PCB ADDRESS ;EF011 MOV R0,T.PCB(R1) ;PUT PCB POINTER IN TCB ;EF011 MOV R1,P.TCB(R0) ;PUT TCBú ADDRESS IN SUB-PCB ;EF006 MOV R5,P.MAIN(R0) ;PUT MAIN-PCB ADDRESS IN SUB-PCB ;EF006 ;EF006 ;EF006 120$: RETURN ;RETURN TO USER STATE OR TO OTLLB ;EF006 100$: ;EF006 BCC 120$ ;TEST PRESERVED C BIT -- C=0 =>SUCCESS ;EF006 TRAP ER.PBS ;C=1, TRAP -- PARTITION BUSY ;EF006 ;EF006 ;EF006 .ENDC ;EF006 ; ; MUL64 - MULITPLY NUMBER IN R1 BY 64 ; MUL64: SWAB R1 ASRB R1 ROR R1 ROR R1 RETURN .ENDC .END úì` KkQ›c, .TITLE OTLLD .IDENT /01.03/ ; ; COPYRIGHT (C) 1975, 1981 ; DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 01.03 ; BY: THOMAS J MILLER ; DATE: 2/4/75 ; ; OTLLD - LOAD DEVICE INITIATOR FOR THE RSX-11S ONLINE TASK LOADER ; ; PREVIOUSLY MODIFIED BY: ; ; J.M. MATTHEWS ; ; MODIFIED BY: ; ; E.A. FLOYD 3-JAN-80 ; EF001 -- RT FORMAT SUPPORT ADDED FOR TU58 AND RX02 ; ; P.J. KOBAR 8-JUL-81 ; PJK065 -- CORRRECT SPELLING OF E$SIZ FOR TS11 ; ; ; ; MACRO LIBRARY CALLS ; .MCALL ALUN$,DIR$,GLUN$ ; ; DEVICE CHARACTERISTICS BIT MASKS ; CB.FB== 1 ;RECORDS ARE IN FORMATTED BINARY CB.FIL==2 ;FILE NAME REQUIRED CB.SBR==4 ;SINGLE-BLOCK READS REQUIRED LUN1=1 ;LUN 1 E$SIZ=0 ;INITIALIZE TABLE ENTRY SIZE ; ; LOCAL DATA ; ; I/O ROUTINE DRIVING PARAMETERS ; $FLGS:: .BLKW 1 ;DEVICE CHARACTERISTICS FLAGS ; ; DPB'S FOR SETTING UP LOAD DEVICE ; GLUN1: GLUN$ LUN1,$FBBUF ;GET LUN INFORMATION DPB FOR CHECKING REDIRECTION ALUN1: ALUN$ LUN1 ;DEVICE AND UNIT FILLED IN BY PARSER (SEE BELOW) ; ; DESTINATION FOR INFORMATION FROM PARSER. NOTE THAT DEVICE NAME AND UNIT ; ARE PLACED IN THE ASSIGN LUN DPB ; $FLBLK==ALUN1+A.LUNA ;FILE SPECIFIER BLOCK .BLKW 3 ; .IF DF TC11!RX11!TU58!RX21 ;EF001 ;**-1 .WORD 2000 ;RT PERMANENT FILE ENTRY CODE .ENDC $FLRAD::.BLKW 3 ;FILE NAME RAD50 ; ; TABLE OF VALID LOAD DEVICE BLOCKS ; ; THE FORMAT OF EACH DEVICE BLOCK IS: ; WORD0= DEVICE NAME IN ASCII ; WORD1= DEVICE CHARACTERISTICS FLAGS ; WORD2= ADDRESS OF DEVICE INITIATION ROUTINE ; WORD3= DEVICE-SPECIFIC PARAMETER ; ; NOTE: ; THE DEVICE BLOCKS MUST BE ORDERED ALPHABETICALLY BY THE DEVICE ; NAME ASCII REVERSED. THUS, FOR EXAMPLE, PR PRECEDES CT. ; $LODTB:: .IF DF TU58 XXX= . .ASCII /DD/ .WORD CB.FIL .WORD DDINI .WORD 6 ;DIRECTORY START BLOCK E$SIZ= .-XXX .ENDC .IF DF TU16 XXX= . .ASCII /MM/ .WORD CB.FIL!CB.SBR .WORD MTINI .WORD 14. ;LABEL BLOCK SIZE E$SIZ= .-XXX .ENDC .IF DF PR11 XXX= . .ASCII /PR/ .WORD CB.FB .WORD PRINI .WORD 0 ;DEVICE-SPECIFIC PARAMETER NOT USED E$SIZ= .-XXX .ENDC .IF DF TS11 XXX= . .ASCII /MS/ .WORD CB.FIL!CB.SBR .WORD MTINI .WORD 14. ;LABEL BLOCK SIZE E$SIZ= .-XXX ;PJK065 ;**-1 .ENDC .IF DF TA11 XXX= . .ASCII /CT/ .WORD CB.FIL!CB.SBR .WORD CTINI .WORD 32. ;LABEL BLOCK SIZE E$SIZ= .-XXX .ENDC .IF DF TC11 XXX= . .ASCII /DT/ .WORD CB.FIL .WORD DTINI .WORD 6 ;DIRECTORY START BLOCK E$SIZ= .-XXX .ENDC .IF DF TM11 XXX= . .ASCII /MT/ .WORD CB.FIL!CB.SBR .WORD MTINI .WORD 14. ;LABEL BLOCK SIZE E$SIZ= .-XXX .ENDC .IF DF RX11 XXX= . .ASCII /DX/ .WORD CB.FIL .WORD DXINI .WORD 6 ;DIRECTORY START BLOCK E$SIZ= .-XXX .ENDC .IF DF RX21 XXX= . .ASCII /DY/ .WORD CB.FIL .WORD DYINI .WORD 6 ;DIRECTORY START BLOCK E$SIZ= .-XXX .ENDC .WORD -1 ;TABLE TERMINATOR ; ; *** - $OTLLD LOAD DEVICE INITIALIZATION ; ; THIS ROUTINE ASSUMES THAT THE ASSIGN LUN DPB IS ALREADY SET UP. IT ASSIGNS ; THE LOAD DEVICE LUN AND DOES A GET LUN INFORMATION TO ASCERTAIN WHAT THE ; (POSSIBLY REDIRECTED-TO) LOAD DEVICE IS. IT THEN SEARCHES THE LOAD DEVICE ; TABLE TO SEE IF THE SPECIFIED DEVICE IS A VALID LOAD DEVICE. IF IT IS THE ; TABLE ENTRY IS USED TO INITIALIZE THE FLAGS WORD AND CALL THE APPROPRIATE ; INITIALIZATION ROUTINE TO PREPARE THE DEVICE AND THE LOAD DEVICE DPB FOR ; READING THE FIRST LABEL BLOCK. IF THE FILE IS IN FORMATTED BINARY, THE ; FORMATTED BINARY BUFFER IS PRIMED. ; $OTLLD::DIR$ #ALUN1 ;ASSIGN THE SPECIFIED LOAD DEVICE BCC 10$ ;IF CC THEN SUCCESSFUL ASSIGN TRAP ER.DNS ;ELSE DEVICE NOT IN SYSTEM 10$: DIR$ #GLUN1 ;GET EFFECTIVE DEVICE NAME MOV #$LODTB-E$SIZ+2,R0 ;INITIALIZE LOAD TABLE POINTER 20$: ADD #E$SIZ-2,R0 ;POINT TO NEXT ENTRY CMP $FBBUF,(R0)+ ;FOUND ENTRY? BHI 20$ ;IF HI THEN NOT THERE YET BEQ 30$ ;FOUND ENTRY TRAP ER.NVD ;IF LT, THEN DEVICE NOT IN TABLE 30$: TST $FLRAD ;WAS FILE NAME SPECIFIED? BNE 40$ ;IF NE YES BIT #CB.FIL,(R0) ;ELSE FILE NAME REQUIRED? BEQ 40$ ;IF EQ NO TRAP ER.FRQ ;ELSE ERROR - FILE NAME REQUIRED 40$: MOV (R0)+,$FLGS ;INITIALIZE FLAGS WORD MOV (R0)+,-(SP) ;SAVE ADDRESS OF INITIALIZATION ROUTINE MOV (R0)+,R5 ;SAVE DEVICE SPECIFIC WORD IN R5 MOV #IO.ATT,$LQDPB+Q.IOFN ;SET FOR ATTACH FUNCTION CALL $QIOLR ;ATTACH DEVICE MOV #IO.RLB,$LQDPB+Q.IOFN ;SET FUNCTION FOR DEVICE READ .IF DF R$$FB CALL @(SP)+ ;CALL INITIALIZATION ROUTINE BIT #CB.FB,$FLGS ;FORMATTED BINARY DEVICE? BEQ PRINI ;IF EQ, NO RETURN MOV #$FBBUF,$LQDPB+Q.IOPL ;ELSE POINT DPB TO FORMATTED BINARY BUFFER MOV #80.,$LQDPB+Q.IOPL+2 ;SET BUFFER SIZE CALLR $READ1 ;PRIME THE FORMATTED BINARY BUFFER .IFF CALLR @(SP)+ ;CALL INITIALIZATION ROUTINE AND EXIT .ENDC .IF DF TA11 ; ; CASSETE INITIALIZATION ROUTINE ; CTINI: CALL TINI ;REWIND TAPE AND SET UP FOR COROUTINE 10$: CALL @(SP)+ ;READ NEXT FILE NAME MOV $FLBLK+6,R3 ;POINT TO PARSED FILE NAME MOV #6,R2 ;SET BYTE COUNT FOR COMPARE CALL COMPAR ;CHECK IF MATCH BCS 10$ ;GET NEXT FILE NAME IF NO MATCH MOV $FLBLK+10,R3 ;POINT TO PARSED EXTENSION MOV #3,R2 ;SET BYTE COUNT FOR COMPARE CALL COMPAR ;CHECK IF MATCH BCS 10$ ;GET NEXT FILE NAME IF NO MATCH CMPB (R4)+,(SP)+ ;POINT TO BLOCK SIZE AND POP STACK CMP (R1)+,(R1)+ ;POINT PAST CHARACTER COUNT IN $LQDPB MOVB (R4)+,-(R1) ;MOVE IN HIGH BYTE OF BLOCK SIZE MOVB (R4)+,-(R1) ;MOVE IN LOW BYTE MOV #512.,R4 ;SET SIZE OF LABEL BLOCK IN R4 ; ; MAKE SURE THAT BLOCK SIZE IS EVENLY DIVISIBLE INTO LABEL BLOCK SIZE. ; 20$: SUB (R1),R4 ;DECREASE LABEL BLOCK SIZE BY CASSETTE BLOCK SIZE BEQ 30$ ;IF EQ THEN OK (EVENLY DIVISIBLE) BGT 20$ ;IF GT THEN CONTINUE TRAP ER.BSZ ;INVALID BLOCK SIZE 30$: .IFTF ; ; PAPER TAPE INITIALIZATION ROUTINE (NO INITIALIZATION REQUIRED) ; PRINI: RETURN .IFT ; ; COMPAR - STRING COMPARISON ROUTINE ; ; INPUTS: ; ; R2=CHARACTER COUNT ; R3=PTR TO ASCIZ COMPARISON STRING ; R4=PTR TO FILE NAME READ FROM TAPE ; ; OUTPUTS: ; ; CC IF MATCH ; CS IF NO MATCH ; R2,R3 DESTROYED ; IF CC, R4 POINTS PAST LAST CHARACTER COMPARED IN FILE NAME READ ; COMPAR: CMPB (R4)+,(R3)+ ;COMPARE CHARACTER BEQ 10$ ;CONTINUE FI EQUAL CMPB -1(R4),#40 ;ELSE WAS LAST CHAR A SPACE? BNE 20$ ;IF NOT, DEFINATELY NO MATCH TSTB -(R3) ;AT END OF ASCIZ COMPARISON STRING? BNE 20$  ;IF NE NO, NO MATCH 10$: DEC R2 ;DECREMENT COUNT BNE COMPAR ;IF NE CONTINUE BR 30$ ;ELSE MATCH, RETURN WITH CC 20$: SEC 30$: RETURN .ENDC .IF DF TM11!TU16!TS11 ; ; MAGTAPE INITIALIZATION ROUTINE ; MTINI: CALL TINI ;REWIND TAPE AND SET UP COROUTINE MOV #IO.STC,(R5) ;SET FOR SET MAGTAPE CHARACTERISTICS FUNC MOV #4,(R1) ;SET UP CHARACTISTICS BIT CALL $QIOLR ;INITIATE FUNCTION 10$: CALL @(SP)+ ;GET NEXT FILE NAME MOV #$FLRAD,R3 ;POINT TO FILE RAD50 CMP (R4)+,(R3)+ ;COMPARE FILE NAME AND EXTENSION BNE 10$ ; CMP (R4)+,(R3)+ ; BNE 10$ ; CMP (R4)+,(R3)+ ; BNE 10$ ; CMP (R4)+,$FLBLK+4 ;COMPARE UICS BNE 10$ ; TST (SP)+ ;POP COROUTINE ADDRESS MOV #512.,$LQDPB+Q.IOPL+2 ;SET BUFFER COUNT FOR TASK IMAGE READ RETURN .ENDC .IF DF TA11!TM11!TU16!TS11 ; ; COMMON MAGTAPE INITIALIZATION ROUTINE. UPON THE FIRST CALL TO THIS ROUTINE ; THE TAPE IS REWOUND, THE DEVICE-SPECIFIC WORD OBTAINED FROM THE LOAD TABLE ; (THE LABEL BLOCK SIZE) IS STORED IN THE BYTE COUNT WORD OF THE LOAD DEVICE ; DPB AND REGISTERS R1 AND R5 ARE SET TO POINT TO THE FIRST PARAMETER WORD OF ; THE LOAD DEVICE DPB AND THE FUNCTION WORD OF THE LOAD DEVICE DPB,RESPECTIVELY ; SUCCEEDING COROUTINE CALLS RESULT IN THE NEXT LABEL BLOCK BEING READ FROM ; THE TAPE INTO $LBLBF. ; TINI: MOV R5,$LQDPB+Q.IOPL+2 ;MOVE IN COUNT FOR LABEL-BLOCK COUNT MOV #$LQDPB+Q.IOFN,R5 ;POINT TO FUNCTION CODE WORD IN DPB MOV #IO.RWD,(R5) ;SET FOR REWIND FUNCTION CALL $QIOLR ;REWIND TAPE MOV #$LQDPB+Q.IOPL,R1 ;POINT TO FIRST PARAMETER WORD IN DPB CALL @(SP)+ ;RETURN TO CALLER 10$: MOV #IO.RVB,(R5) ;SET FOR READ FUNCTION MOV #$LBLBF,R4 ;POINT TO LABEL BLOCK BUFFER MOV R4,(R1) ; AND SET IT IN THE DPB CALL $QIOL ;READ FILE LABEL BPL 15$ ;IF PL NO ERROR CMPB R0,#IE.EOF ;END OF FILE? BEQ 17$ ;IF EQ YES, FILE NOT FOUND TRAP ER.IOE ;ELSE I/O ERROR 15$: TST (R4) ;FILE NAME READ? BNE 20$ ;IF NE YES 17$: TRAP ER.NFL ;ELSE ERROR - FILE NOT FOUND 20$: CALL @(SP)+ ;RETURN TO CALLER WITH FILE NAME MOV #IO.SPF,(R5) ;SET FOR SPACE FILE FUNCTION MOV #1,(R1) ;SET TO SPACE ONE FILE CALL $QIOLR ;SPACE FILE BR 10$ ;BRANCH TO READ NEXT FILE NAME .ENDC .IF DF TC11!RX11!TU58!RX21 ;EF001 ;**-1 ; ; RT TU58 INITIALIZATION ROUTINE (SAME AS RT FLOPPY ROUTINE) ; DDINI: ;REFERENCE LABEL ; ; RT DECTAPE INITIALIZATION ROUTINE (SAME AS RT FLOPPY ROUTINE) ; DTINI: ;REFERENCE LABEL ; ; RT RX02 INITIALIZATION ROUTINE (SAME AS RT RX11 FLOPPY ROUTINE) ; DYINI: ;REFERENCE LABEL ; ; RT FLOPPY INITIALIZATION ROUTINE ; DXINI: MOV #$LQDPB+Q.IOPL,R4 ;POINT TO FIRST PARAMETER WORD IN DPB MOV #$LBLBF,R0 ;POINT TO LABEL BUFFER FOR DIRECTORY BLOCK MOV R0,(R4)+ ;PLACE POINTER IN DPB MOV #512.,(R4)+ ;SET COUNT FOR ONE BLOCK CMP (R4)+,(R4)+ ;POINT TO BLOCK NUMBER MOV R5,(R4) ;SET THE BLOCK NUMBER BNE 10$ ;IF NE, ANOTHER DIRECTORY SEGMENT EXISTS 5$: TRAP ER.NFL ;ELSE ERROR, FILE NOT FOUND 10$: CALL DIRBLK ;READ FIRST DIRECTORY BLOCK TST (R0)+ ;POINT TO LINK WORD MOV (R0)+,R5 ;SAVE LINK WORD IN R5 TST (R0)+ ;POINT TO EXTRA BYTES ENTRY MOV (R0)+,R2 ;SAVE EXTRA BYTES IN R2 BIT #177401,R2 ;LEGAL VALUE? BNE 5$ ;IF NE NO, REPORT FILE NOT FOUND MOV (R0)+,R3 ;SAVE INITIAL START BLOCK 20$: CALL @(SP)+ ;MAKE SURE WE ARE STILL IN BUFFER CMP (R0),#4000 ;LOGICAL END OF DIRECTORY SEGMENT? BNE 30$ ;IF NE NO TST (SP)+ ;ELSE FLUSH COROUTINE ADDRESS BR DXINI ;BR TO HANDLE NEXT DIRECTORY SEGMENT 30$: MOV #$FLRAD-2,R1 ;POINT TO PERMANENT ENTRY CODE AND FILE NAME 40$: CALL @(SP)+ ;MAKE SURE WE ARE WITHIN BUFFER CMP (R0)+,(R1)+ ;MATCH? BNE 50$ ;IF NE NO CMP R1,#$FLRAD+6 ;AT END OF FILE NAME? BLO 40$ ;IF LO NO BR 60$ ;ELSE FILE FOUND 50$: SUB #$FLRAD+6,R1 ;CALCULATE NEGATIVE OF BYTES REMAINING SUB R1,R0 ;POINT TO FILE SIZE CALL @(SP)+ ;MAKE SURE WE ARE STILL WITHIN BUFFER ADD (R0)+,R3 ;UPDATE START BLOCK CMP (R0)+,(R0)+ ;POINT TO END OF FIXED PORTION OF ENTRY ADD R2,R0 ;POINT TO NEXT DIRECTORY ENTRY BR 20$ ;BR TO PROCESS NEXT DIRECTORY ENTRY 60$: MOV R3,(R4) ;PLACE START BLOCK IN DPB TST (SP)+ ;FLUSH COROUTINE ADDRESS RETURN ;RETURN TO CONTROL LOOP ; ; THE FOLLOWING COROUTINE IS USED TO CHECK THE CURRENT POSITION IN THE ; LABEL BUFFER AND READ DIRECTORY BLOCKS AS NECESSARY. ; DIRBLK: CALL $QIOLR ;READ A DIRECTORY BLOCK INC (R4) ;BUMP BLOCK NUMBER IN DPB 10$: CALL @(SP)+ ;RETURN TO CALLER CMP R0,#$LBLBF+512. ;PAST END OF BUFFER? BLO 10$ ;IF LO NO SUB #d512.,R0 ;ELSE ADJUST POINTER BR DIRBLK ;BR TO READ NEXT DIRECTORY BLOCK .ENDC .END dì`·kkQ›c, .TITLE OTLQIO .IDENT /03/ ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; COPYRIGHT (C) 1976, 1980 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; VERSION: 03 ; BY: THOMAS J MILLER ; DATE: 2/4/75 ; ; ; MODIFIED BY: ; ; JO ANN KASSON 30-AUG-76 ; JAK002 - LOADABLE DRIVERS & QIOW$ ; ; E. A. FLOYD 1-APR-80 ; EF003 -- CORRECT OTLQIO TO SENSE DEVICE ; CHARACTERISTICS TO READ SINGLE DENSITY ; FLOPPY FROM RX02 DRIVE ; ; E. A. FLOYD 27-MAY-80 ; EF009 -- ADD V3.0 SUPPORT FOR LOADING ; TASKS WITH RESIDENT OVERLAYS ; ; OTLQIO - COMMON QIO PROCESSING FOR THE RSX-11S ONLINE TASK LOADER ; ; ; MACRO LIBRARY CALLS ; .MCALL DIR$,QIO$,WTSE$ .MCALL DIR$,QIOW$ .MCALL QIOW$C ;EF003 ; ; LOCAL SYMBOL DEFINITIONS ; EFN1=1 ;EVENT FLAG 1 LUN1=1 ;LUN 1 LUN2=2 ;LUN 2 ; ; LOCAL DATA ; ; STATUS BLOCK AND DPB'S ; $IOSB:: .BLKW 2 ;I/O STATUS BLOCK $TQDPB::QIOW$ ,LUN2,EFN1,,$IOSB,,<$FBBUF,,'$> $LQDPB::QIOW$ ,LUN1,EFN1,,$IOSB,,<,,,,> ; ; OTL BUFFERS ; ;EF009 .IF DF M$$MGE&D$$YNM&P$$LAS ;EF009 ;EF009 $SGTBL::.BLKW 256. ;TABLE FOR SEGMENT LOAD LIST ;EF009 ;DISK LABEL BLOCK 3 ;EF009 ;EF009 .ENDC ;EF009 ;EF009 $FBBUF:: ;FORMATTED BINARY BUFFER AND CONSOLE I/O BUFFER .IF DF R$$FB .BLKB 80. .ENDC $LBLBF::.BLKW 256. ;LOAD DEVICE READ BUFFER ;+ ; ; *** - $OUTMG ROUTINE FOR OUTPUTTING MESSAGES TO THE CONSOLE ; ; INPUTS: ; ; R1=CHARACTER COUNT OF MESSAGE IN FBBUF ; ;- $OUTMG::MOV #IO.WVB,$TQDPB+Q.IOFN ;SET WRITE VIRTUAL FUNCTION CODE ;+ ; ; *** - $QIOT ENTRY POINT FOR CONSOLE INPUT ; ; INPUTS: ; ; R1=MAXIMUM CHARACTER COUNT FOR MESSAGE INPUT INTO FBBUF ; (FUNCTION CODE MUST BE ALREADY SET) ; ;- $QIOT:: MOV R1,$TQDPB+Q.IOPL+2 ;SET CHARACTER COUNT IN DPB MOV #$TQDPB,R0 ;POINT TO CONSOLE DPB BR QWAIT ;BR TO INITIATE TRANSFER ;+ ; ; *** - $QIOLR ENTRY POINT FOR READS FROM LOAD DEVICE WITH UNCONDITIONAL REPORT ; OF I/O ERRORS. ; ;- $QIOLR::MOV R0,-(SP) ;SAVE R0 QIOW$C IO.SEC,LUN1,EFN1,,,, ;EF003 CALL $QIOL ;READ FROM LOAD DEVICE BPL 10$ ;IF PL NO ERROR, RETURN CMPB R0,#IE.OFL ;DEVICE NOT IN SYSTEM (OFFLINE)? BNE 5$ ;IF NE NO TRAP ER.DNS ;ELSE DEVICE NOT IN SYSTEM 5$: TRAP ER.IOE ;I/O ERROR 10$: MOV (SP)+,R0 ;RESTORE R0 RETURN ; ;+ ; ; *** - $QIOL ENTRY POINT FOR READS FROM LOAD DEVICE ; ;- $QIOL:: MOV #$LQDPB,R0 ;POINT TO LOAD DEVICE DPB ; ;QWAIT - COMMON QIO CODE ; ; AT THIS POINT R0 IS ASSUMED TO POINT AT THE QIO DPB AND THE DPB IS ASSUMED ; TO BE SET UP. THE LAST INSTRUCTION BEFORE THE RETURN IS: ; ; MOV $IOSB,R0 ; ; THIS ALLOWS CALLERS TO USE BPL AS A NO-ERROR BRANCH IMMEDIATELY AFTER THE ; CALL. FURTHERMORE R0 CONTAINS THE STATUS OF THE TRANSFER ON RETURN. ; QWAIT: .IF DF M$$MGE MTPS #PR7 ;;;RAISE PRIORITY TO PR7 MOV $PARRL,UISAR6 ;;;SET RELOCATION BIAS .IFTF DIR$ R0 ;;;READ FROM LOAD DEVICE BCC 20$ ;;;CONTINUE IF CC .IF DF L$$DRV CMP $DSW,#IE.UPN ;DRIVER UNLOADED? BNE 30$ ;IF NE YES .ENDC TST $TCB ;;;ELSE HAS A TCB BEEN ALLOCATED? BEQ 10$ ;;;IF EQ NO, EXIT TRAP ER.POL ;;;ELSE ENTER ERROR ROUTINE TO CLEAN UP 10$: JMP $OTLXT ;;; 20$: ~ .IFT MTPS #0 ;;;DROP PRIORITY .ENDC 30$: MOVB $IOSB,R0 ;PASS BACK ERROR STATUS RETURN .END ~ì` qkQ›c, .TITLE OTLRD .IDENT /01.2/ ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; COPYRIGHT (C) 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; VERSION 01.02 ; BY: THOMAS J MILLER ; DATE: 2/4/75 ; ; MODIFIED BY: ; ; THOMAS J MILLER 8-NOV-75 ; ; TM001 -- CORRECT BUG IN CASSETTE AND MAGTAPE READS ; AND BUG WHICH ALLOWS SOME I/O ERRORS TO GO ; UNDETECTED. ; JAK002 SET PDR FOR LOADING FROM PAPER TAPE ; ; OTLRD - LOAD DEVICE INPUT ROUTINE FOR THE RSX-11S ONLINE TASK LOADER ; ; ; LOCAL IMPURE DATA FOR PROCESSING OF FORMATTED BINARY RECORDS ; .IF DF R$$FB FBPTR: .BLKW 1 ;SAVE AREA FOR POINTER INTO CURRENT BINARY RECORD FBCNT: .BLKW 1 ;CURRENT COUNT REMAINING IN BINARY RECORD CHKSUM: .BLKW 1 ;CHECKSUM ACCUMULATOR ;+ ; ; *** - $READ1 FIRST READ FROM LOAD DEVICE FOR FORMATTED BINARY MODE ; ; INPUTS: ; ; LQDPB ASSUMED TO BE ALREADY SET UP ; ; OUTPUTS: ; ; R0,R1,R2,R3 DESTROYED ; ;- .ENABL LSB $READ1::CLR $IOSB+2 ;INDICATE EMPTY BUFFER MOV #-1,R1 ;MAKE IT LOOK LIKE AN ENTRY WITH A ZERO COUNT ; (COUNT IS INCREMENTED AFTER PROCESSING BINARY ; RECORD HEADER) CLR CHKSUM ;INITIALIZE CHECKSUM BR 50$ ;BRANCH TO PROCESS FB HEADER ;+ ; ; *** - $READ READ FROM LOAD DEVICE ; ; INPUTS: ; ; R5=FINAL BUFFER ADDRESS ; R1=TRANSFER COUNT ; ; ALL REGISTERS ARE PRESERVED ; ;- .IFTF $READ:: SAVRG$ ;SAVE ALL REGISTERS TST R1 ;ZERO-LENGTH READ? BEQ 25$ ;IF EQ YES, RETURN .IFT BITB #CB.FB,$FLGS ;FORMATTED BINARY MODE? BNE 10$ ;IF NE YES .IFTF MOV #$LQDPB+Q.IOPL,R3 ;POINT TO FIRST PARAMETER WORD OF DPB MOV R5,(R3)+ ;SET BUFFER ADDRESS .IF DF R$$SBR BIT #CB.SBR,$FLGS ;SINGLE-BLOCK READS REQUIRED? BNE 4$ ;IF NE YES .IFTF MOV R1,(R3) ;ELSE ISSUE JUST ONE READ 3$: CALLR $QIOLR ; ; ; DEVICES WHICH MUST BE READ ONE BLOCK AT A TIME ARE READ DIRECTLY INTO THE ; DESIRED DESTINATION BUFFER WITH THE EXCEPTION OF THE LAST BLOCK READ IF IT ; IS LARGER THAN THE DESIRED BYTE COUNT REMAINING. IN THIS CASE THE ENTIRE ; BLOCK IS READ INTO $LBLBF AND THE DESIRED DATA IS MOVED INTO THE DESTINATION ; BUFFER. NOTE THAT THIS DOES NOT CONFLICT WITH 512. BYTE READS TO $LBLBF, ; SINCE THEY WILL ALWAYS COME OUT EVEN AND THE ENTIRE TRANSFER WILL BE READ IN ; DIRECTLY. ; .IFT 4$: MOV (R3),R2 ;PICK UP CHARACTER COUNT FOR READ 5$: SUB R2,R1 ;LAST READ? BEQ 3$ ;IF EQ YES AND READ IS EXACT SIZE DESIRED BCC 6$ ;IF CC THEN NOT LAST READ ADD R1,R2 ;CALCULATE REQUIRED COUNT FROM LAST READ MOV #$PARRL,R1 ;POINT TO ADDRESS DOUBLE WORD MOV -(R3),2(R1) ;POINT TO FINAL DESTINATION OF INPUT MOV #$LBLBF,(R3) ;DIVERT THIS READ TO LABEL BUFFER CALL $QIOLR ;READ LAST BLOCK MOV (R3),R0 ;POINT TO SOURCE FOR .BLXO CALLR .BLXO ;MOVE IN LAST PART OF TASK IMAGE AND EXIT 6$: CALL $QIOLR ;TRANSFER DIRECTLY INTO BUFFER .IF DF M$$MGE ADD (R3),R5 ;BUMP BUFFER POINTER BY COUNT READ CALL ADCHK ;CHECK THE ADDRESS MOV R5,-2(R3) ;UPDATE BUFFER POINTER FOR NEXT READ .IFF ADD (R3),-2(R3) ;UPDATE BUFFER POINTER FOR NEXT READ .ENDC BR 5$ ;BR BACK FOR NEXT READ .ENDC ; ; FORMATTED BINARY TRANSFERS ARE HANDLED HERE. THE FORMATTED BINARY BLOCKS ; ARE FIRST READ INTO FBBUF. HEADERS AND CHECKSUMS ARE VERIFIED AND DISCARDED ; AND THE DATA IS MOVED INTO THE FINAL BUFFER POINTED TO BY R5. ; BESIDES THE VALUES IN R5 AND R1 SET PRIOR TO ENTRY, THE FOLLOWING ELEMENTS ; DRIVE FORMATTED BINARY TRANSFERS: ; ; FBPTR=CURRENT POINTER INTO FORMATTED BINARY RECORD. THE VALUE IN ; THIS LOCATION IS LOADED INTO R3 UPON ENTRY AND UPDATED FROM ; FROM R3 UPON EXIT. R3 IS INITIALIZED AFTER EVERY READ FROM ;  THE LOAD DEVICE IN THE ROUTINE INBYT. ; ; FBCNT=COUNT OF REMAINING BYTES IN CURRENT BINARY RECORD. UPDATED ; FROM THE COUNT FIELD OF EACH BINARY RECORD HEADER AS IT IS ; ENCOUNTERED. ; ; CHKSUM=CUMULATIVE CHECKSUM COUNT FOR CURRENT BINARY RECORD. THIS ; LOCATION IS INITIALIZED TO ZERO UPON INITIAL ENTRY FROM $READ1. ; IT RETURNS TO ZERO AFTER EACH CORRECTLY READ BINARY RECORD. ; .IFT 10$: MOV FBPTR,R3 ;PICK UP FB RECORD POINTER 20$: SUB #1,R1 ;DECREMENT DESTINATION COUNT BCC 30$ ;IF CC, THEN MORE TO TRANSFER MOV R3,FBPTR ;ELSE UPDATE FB RECORD POINTER .IFTF 25$: RETURN ;RETURN, TRANSFER COMPLETE .IFT 30$: CALL INBYT ;GET NEXT BYTE FROM BINARY RECORD SUB #1,FBCNT ;DECREMENT FB RECORD COUNT, CHECKSUM BYTE? BCS 40$ ;IF CS, YES .IF DF M$$MGE MTPS #PR7 ;;;RAISE PRIORITY TO PR7 MOV $PARRL,UISAR6 ;;;SET RELOCATION BIAS MOV #77406,UISDR6 ;;; SET UP PDR LENGTH .IFTF MOVB R2,(R5)+ ;;;MOVE BYTE INTO BUFFER .IFT MTPS #0 ;;;DROP PRIORITY CALL ADCHK ;CHECK CURRENT ADDRESS 35$: .ENDC BR 20$ ;BRANCH TO GET NEXT BYTE 40$: TSTB CHKSUM ;VALID CHKSUM? BEQ 50$ ;IF EQ YES TRAP ER.CHK ;ELSE CHECKSUM ERROR 50$: CALL INBYT ;GET NEXT BYTE TST R2 ;HEADER RECORD? BEQ 50$ ;NO, SKIP NULLS DEC R2 ;IS IT IT A 1? BEQ 70$ ;IF EQ YES 60$: TRAP ER.BFB ;BAD FORMATTED BINARY 70$: CALL INBYT ;GET NEXT BYTE TST R2 ;IS IT NULL? BNE 60$ ;IF NE NO  CALL INBYT ;ACCUMULATE RECORD COUNT MOVB R2,FBCNT ; CALL INBYT ; MOVB R2,FBCNT+1 ; SUB #4,FBCNT ;ADJUST COUNT FOR HEADER BCS 60$ ;ERROR IF COUNT WAS LESS THAN 4 INC R1 ;ADJUST COUNT FOR LOOP BACK BR 20$ ;BRANCH TO PROCESS BINARY RECORD .DSABL LSB ; ; ; INBYT - GET NEXT BYTE FROM BINARY RECORD BUFFER AND REPLENISH IF NECESSARY ; ; INPUTS: ; ; $IOSB+2=CURRENT UNPROCESSED BYTE COUNT IN BINARY RECORD BUFFER ; R3=CURRENT POINTER IN BINARY RECORD BUFFER ; CHKSUM=CURRENT CHECKSUM FOR BINARY RECORD ; ; OUTPUTS: ; ; R2=BYTE FROM BINARY RECORD ; $IOSB+2,R3,CHKSUM UPDATED ; INBYT: SUB #1,$IOSB+2 ;DECREMENT BUFFER COUNT, CHARACTERS REMAINING? BCC 10$ ;IF CC YES CALL $QIOL ;READ INTO BINARY RECORD BUFFER BPL 8$ ;IF PL NO CMP R0,#IE.EOF ;END OF FILE? BEQ 5$ ;IF EQ YES TRAP ER.IOE ;ELSE I/O ERROR 5$: CMP $IOSB+2,R1 ;DESIRED COUNT RECEIVED? BHIS 8$ ;IF HIS YES TRAP ER.EOF ;ELSE UNEXPECTED EOF 8$: MOV #$FBBUF,R3 ;RESET BUFFER POINTER BR INBYT ;PROCESS FI6RST BYTE 10$: MOVB (R3)+,R2 ;PICK UP NEXT BYTE ADD R2,CHKSUM ;CUMULATE CHECKSUM RETURN .ENDC .IF DF M$$MGE ADCHK: CMP R5,#160000 ;PAST 4K BOUNDARY? BLO 10$ ;IF LO NO ADD #200,$PARRL ;BUMP RELOCATION BIAS SUB #20000,R5 ;ADJUST R5 BACK 10$: RETURN .ENDC .END 68xÕfkQ›c, .IIF NDF $SIP .NLIST ; .IDENT /01.1/ ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; COPYRIGHT (C) 1981 ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION 1.1 ; BY: THOMAS J MILLER ; DATE: 3/28/75 ; ; MODIFIED BY: ; J. GALLANT 27-FEB-81 ; JG004 -- ADD SUPPORT FOR RX02 DEVICE ; ; SIPPRE - PREFIX FILE FOR ASSEMBLING MODULES OF THE RSX-11S ; SYSTEM IMAGE PRESERVATION PROGRAM ; ; ; CONDITIONAL ASSEMBLY VARIABLE FOR FULL ERROR MESSAGE REPORTING. WITH FULL ; ERROR MESSAGE REPORTING, ERROR MESSAGES INCLUDE A NUMERIC ERROR CODE AND ; A BRIEF ASCII DESCRIPTION OF THE ERROR CONDITION. WITHOUT FULL ERROR MESSAGE ; REPORTING, THE ASCII DESCRIPTION IS OMITTED. FOR FULL REPORT OF ERRORS, THE ; SYMBOL "R$$ERM" MUST BE DEFINED HERE. IF FULL REPORT OF ERROR MESSAGES IS ; NOT DESIRED, THE DEFINITION OF "R$$ERM" MUST BE PRECEDED BY A SEMI-COLON. ; THE DEFINITION LINE FOR "R$$ERM" FOLLOWS. ; ;R$$ERM=0 ; ; MACRO FOR INCLUDING SUPPORT OF LOAD DEVICES ; ; THE FIRST ARGUMENT IN THE INCLUD MACRO IS THE SYMBOL WHICH SIP MODULES USE TO ; CONDITIONALIZE CODE SPECIFIC TO SUPPORT OF THE PARTICULAR LOAD DEVICE. ; THE SECOND ARGUMENT IS THE SYMBOL WHICH IS PLACED IN THE ASSEMBLY PREFIX MODUL ; RSXMC DURING SYSGEN TO INDICATE THE PRESENCE OF A DRIVER FOR THE DEVICE. THE ; MACRO CAUSES THE FIRST SYMBOL TO BE DEFINED IF THE SECOND SYMBOL IS PRESENT ; IN RSXMC. ; .MACRO INCLUD A,B .IF DF B A=0 .ENDC .ENDM ; ; EACH OF THE FOLLOWING INCLUD STATEMENTS CAUSE SUPPORT FOR THE DESIGNATED LOAD ; DEVICE TO BE INCLUDED IN SIP IF THE STANDARD DRIVER FOR THE DEVICE HAS BEEN ; GENERATED INTO THE SYSTEM. IF THE STANDARD DRIVER FOR A LOAD DEVICE HAS BEEN ; INCLUDED IN THE SYSTEM, BUT SUPPORT FOR THAT DEVICE IN SIP IS NOT DESIRED, ; THE CORRESPONDING INCLUD STATEMENT MUST BE PRECEDED BY A SEMI-COLON (;). ; NO SUPPORT WILL BE GENERATED INTO SIP FOR DEVICES FOR WHICH DRIVERS HAVE ; NOT BEEN GENETATED INTO THE SYSTEM. THE DEVICES ARE LISTED ALPHABETICALLY. ; INCLUD PP11,P$$P11 ;PC11 SUPPORT INCLUD RX11,R$$X11 ;RX11 SUPPORT INCLUD RX21,R$$X21 ;RX02 SUPPORT ; JG004 INCLUD TA11,T$$A11 ;TA11 SUPPORT INCLUD TC11,T$$C11 ;TC11 SUPPORT INCLUD TM11,T$$M11 ;TM11 SUPPORT INCLUD TU16,T$$J16 ;TU16 SUPPORT .IIF NDF $SIP .LIST 8xkQ›c, .TITLE SIP .IDENT /02.3/ ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; COPYRIGHT (C) 1976, 1977, 1979, 1980, 1981 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR  USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; VERSION: 02.3 ; BY: THOMAS J MILLER ; DATE: 3/25/75 ; ; MODIFIED BY: ; ; J. H. MATTHEWS 10-NOV-77 ; ; JM003 -- MODIFIED IOCHK TO LOOK FOR SYSCM AS LAST ENTRY ; IN ATL. ; ; J. H. MATTHEWS 30-APR-79 ; ; JM035 -- SET UP USER PDR 6 IF A MAPPED SYSTEM ; ; J. GALLANT 2-27-81 ; JG004 -- ADD SUPPORT FOR RX02 DEVICE ; ; J. GALLANT 7-23-81 ; JG005 -- ADD 22 BIT SUPPORT ; ; SIP - CONTROL LOOP FOR THE RSX-11S SYSTEM IMAGE PRESERVATION ; PROGRAM ; ; ; GLOBAL IMPURE DATA ; $TRPSV::.BLKW 1 ;NONEXISTANT MEMORY TRAP ADDRESS SAVE AREA $SAVE:: .BLKW 1 ;TEMPORARY SAVE AREA FOR TCB POINTER AND ; KERNAL STACK POINTER $FLGS:: .BLKW 1 ;DEVICE FLAGS SAVE AREA $UNIT:: .BLKW 1 ;DEVICE UNIT NUMBER ; ; *** - $SIP ENTRY POINT FOR THE RSX-11S SYSTEM IMAGE PRESERVATION PROGRAM ; $SIP:: MOV @#4,$TRPSV ;SAVE NONEXISTANT MEMORY TRAP ADDRESS ; ; *** - $RSTRT RESTART ENTRY POINT FOR SIP ; ; GET AND DECODE COMMAND LINE AND INITIALIZE LOAD DEVICE ; $RSTRT::MOV #$BOOT,SP ;SET STACK POINTER MOV #LUN1,R0 ;MOVE LOAD DEVICE LUN TO R0 CALL $DET ;DETACH PREVIOUS LOAD DEVICE (ERRORS IGNORED) INC R0 ;CALCULATE TI: LUN CALL $DET ;DETACH TI: (ERRORS IGNORED) CALL $SIPCD ;READ AND DECODE A COMMAND LINE CALL $SIPLD ;INITIALIZE LOAD DEVICE AND SET UP BOOTSTRAP ; ; LABEL BLOCK AND BOOT BLOCK PROCESSING ; MTPS #PR7 ;;;LOCK EVERYONE OUT CALL IOCHK ;;;CHECK FOR OUTSTANDING I/O MOV #IO.WLB,$QDPB+Q.IOFN ;;;SET FOR WRITE LOGICAL FUNCTION MOV #512.,R0 ;;;SET BOOT AND LABEL BLOCK COUNT CLR $QDPB+Q.IOPL+10 ;;;CLEAR BLOCK NUMBER MOV $FLGS,R3 ;;;PICK UP FLAGS WORD .IF DF M$$MGE MOV #77406,@#UISDR6 ;;; SET UP USER PDR 6 .ENDC .IF DF PP11 BIT #CB.PP,R3 ;;;IS DEVICE PAPER TAPE? BNE 20$ ;;;IF NE YES, SKIP TO CHECK FOR QUIET SYSTEM .ENDC BIT #CB.TAP,R3 ;;;TAPE DEVICE? BNE 10$ ;;;IF NE YES, SKIP TO WRITE LABEL MOV #$BOOT,$QDPB+Q.IOPL ;;;POINT TO BOOT BLOCK CALL $QIOWT ;;;WRITE BOOT BLOCK INC $QDPB+Q.IOPL+10 ;;;INCREMENT BLOCK NUMBER 10$: MOV #$LABBF,$QDPB+Q.IOPL ;;;POINT TO LABEL BUFFER CALL $QIOWT ;;;WRITE THE LABEL BLOCK .IF DF TA11!RX11 BIT #CB.MBB,R3 ;;;MULTI-BOOT BLOCK DEVICE? BEQ 15$ ;;;IF EQ NO CALL (R5) ;;;CALL SPECIAL ROUTINE TO WRITE FIRST PART OF BOOT MOV #$SETUP,$QDPB+Q.IOPL ;;;POINT TO SETUP ROUTINE FOR OUTPUT BR 17$ ;;;BR TO OUTPUT LAST BLOCK .ENDC 15$: BIT #CB.TAP!CB.DX,R3 ;;;TAPE DEVICE OR FLOPPY? BEQ 20$ ;;;IF EQ NO, BOOT ALREADY WRITTEN MOV #$BOOT,$QDPB+Q.IOPL ;;;POINT TO BOOT BLOCK 17$: CALL $QIOWT ;;;WRITE IT OUT ; ; WRITE OUT SYSTEM IMAGE ; 20$: CALL IOCHK ;;;CHECK FOR OUTSTANDING I/O MOV #$BTEND,@#4 ;;;POINT VECTOR 4 TO END OF BOOT BLOCK .IF DF M$$MGE .IF DF M$$EXT ; JG005 CLR @#SR3 ;;; DISABLE 22 BIT MODE AND UNIBUS MAP ; JG005 .ENDC ; JG005 MOV #CMODE!PR7,@#6 ;;;SET TO TRAP IN USER MODE MOV #CMODE!PR7,@#PS ;;;SET PREVIOUS TO KERNAL MFPI SP ;;;PUSH KERNAL STACK POINTER MOV (SP)+,$SAVE ;;;AND SAVE IT .ENDC MOV -(R4),R1 ;;;PICK UP THE CSR ADDRESS MOV -(R4),R0 ;;;PICK UP CORE SIZE .IF DF TA11!TC11!TM11!TU16 BIT #CB.PP!CB.DX!CB.DY,R3 ;;; PAPER TAPE OR FLOPPY ? ; JG004 BNE 85$ ;;;IF NE YES, SKIP UNIT SELECT LOGIC ;**-1 MOV R1,R4 ;;;COPY CSR ADDRESS INC R4 ;;;POINT TO UNIT SELECT BYTE .IF DF TU16 BIT #CB.MM,R3 ;;;TU16? BEQ 84$ ;;;IF EQ NO ADD #31,R4 ;;;ADJUST UNIT SELECT BYTE POINTER .ENDC 84$: BICB #7,(R4) ;;;CLEAR UNIT SELECT FIELD BISB $UNIT,(R4) ;;;SELECT UNIT .ENDC 85$: ;;; .IF DF PP11!TA11!RX11!RX21 ; JG004 ;**-1 BIT #CB.MBB!CB.PP,R3 ;;;MULTI-BLOCK BOOT DEVICE OR PAPER TAPE? BEQ 100$ ;;;IF EQ NO, INVOKE BOOT CODE .IF DF RX11 BIT #CB.DX,R3 ;;;FLOPPY? BEQ 90$ ;;;IF EQ NO MOV R0,R4 ;;;COPY NUMBER OF BLOCKS MOV $UNIT,R0 ;;;PASS UNIT NUMBER IN R0 .ENDC 90$: CALL (R5) ;;;EXECUTE BOOT CODE TO WRITE SYSTEM IMAGE ;;; (RETURN IS VIA A JUMP TO $RSTRT) .ENDC 100$: ;;; ; JG004 .IF DF RX21 ; JG004 BIT #CB.DY,R3 ;;; RX02 FLOPPY ? ; JG004 BEQ 110$ ;;; IF EQUAL NO ; JG004 .IF DF M$$MGE ; JG004 TST -(SP) ;;; STACK POINTER MUST BE AT SAME ; JG004 ;;; LEVEL FOR SAVING SYSTEM ; JG004 ;;; AS WHEN BOOTING SYSTEM. ; JG004 .ENDC ; JG004 .ENDC ; JG004 110$: ;;; ; JG004 JMP $BTBEG ;;; EXECUTE BOOT CODE ; JG004 ;**-1 ; ; SUBROUTINE TO CHECK FOR OUTSTANDING I/O ; ; INPUTS: ; ; TASK SWITCHING SHOULD BE LOCKED OUT ; ; OUTPUTS: ; ; R0 IS DŽESTROYED ; IF I/O IS OUTSTANDING, AN ERROR IS REPORTED DIRECTLY ; IOCHK: MOV $ACTHD,R0 ;;;PICK UP PTR TO FIRST ACTIVE TASK 10$: TSTB T.IOC(R0) ;;;OUTSTANDING I/O? BEQ 20$ ;;;IF EQ NO TRAP ER.IO ;;;ELSE REPORT ERROR 20$: MOV T.ACTL(R0),R0 ;;;GET NEXT ACTIVE TASK TST T.ACTL(R0) ;;;CHECK FOR POINTER TO SYSCM. BNE 10$ ;;;IF NE, THERE IS ONE RETURN ;;;ELSE RETURN .END $SIP Ž8xçkQ›c, .TITLE SIPBOO .IDENT /02.5/ ; ; COPYRIGHT (c) 1981 ; 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. ; ; ; ; ; VERSION 02.5 ; BY: THOMAS J MILLER ; (PARTS OF THIS MODULE HAVE BEEN TAKEN FROM THE PRESRV ; BOOT-BLOCK MODULE BY SCOTT SMITH.) ; DATE: 3/25/75 ; ; MODIFIED BY: ; ; JK002 JO ANN KASSON 26-JUL-76 ;ZERO UNLOADED MEMORY AND ; ;ADD DELAY IN TM11 BOOTSTRAP ;TO ALLOW BOOTING ON MOS 45 OR 11/70 ; ; ; J. H. MATTHEWS 4-NOV-77 ; ; JM002 -- ADD SUPPORT FOR ODD CSR'S. ; ; J. H. MATTHEWS 18-NOV-77 ; ; JM004 -- MODIFIED COUNTERS IN ROUTINE TO ZERO MEMORY ; SO THAT IF R2 > $SYSIZ, 1K OF MEMORY IS ZEROED. ; ; J. H. MATTHEWS 20-OCT-78 ; ; JM023 -- CORRECTED PROBLEM OF SIP ZEROING LAST 1K INCLUDED ;  IN $SYSIZ ; ; J. H. MATTHEWS 3-MAY-79 ; ; JM036 -- UPDATE RSX11S VERSION NUMBER TO 2.2 ; ; J. GALLANT 2-27-81 ; JG004 -- ADD SUPPORT FOR RX02 DEVICE ; ; E. A. FLOYD 10-JUN-80 ; EF014 -- AFTER SIZING SYSTEM, SIZE ; LAST PCB TO EXTEND TO END ; OF MEMORY ; ; J. GALLANT 23-JUL-81 ; JG005 -- ADD 22 BIT SUPPORT TO SIP ; ; SIPBOO - BOOT BLOCK AND SYSTEM STARTUP CODE FOR THE RSX-11S ; SYSTEM IMAGE PRESERVATION PROGAM ; ; ; MACRO DEFINITIONS ; .MACRO BEGBOO NAM,COND .IF DF COND $'NAM'BOO:: .WORD /2 .ENDM .MACRO ENDBOO NAM,NOPAGE NAM'END: .IF GT NAM'END-$'NAM'BOO-2-MX$LEN MX$LEN=NAM'END-$'NAM'BOO-2 .ENDC SIZCHK $'NAM'BOO+2,512.-$BTBEG+$BOOT .IF B NOPAGE .PAGE .ENDC .ENDM .MACRO SIZCHK ADDR,SIZE .IF GT .-ADDR-SIZE .ERROR .-ADDR-SIZE ;BOOT-BLOCK OVERFLOW .ENDC .ENDM ; ; LOCAL SYMBOL DEFINITIONS ; MX$LEN=0 ;INITIALIZE MAXIMUM BOOT BLOCK SIZE ; ; LOCAL MESSAGE DATA ; NOTE -- SYSID AND DEVNAM MUST BE WORD ALIGNED ; .PSECT BOTPRE .NLIST BEX SYSMSG: .ASCII <15><12>/ RSX-11S V4.0 BL/ ; JG004 SYSID: .ASCII /XXXX NNNK/ ;**-1 .IF DF M$$MGE .ASCII / MAPPED/<177> .ENDC .ASCIZ <15><12>/>/ DEVMSG: .ASCII <15><12>/DEVICE / DEVNAM: .ASCIZ /DDUU: NOT IN CONFIGURATION/ .EVEN .LIST BEX .PAGE ; ; DEVICE-SPECIFIC BOOT-BLOCK RELATED CODE ; ; THE BOOT-BLOCK RELATED CODE FOR EACH DEVICE CONSISTS OF ONE OR MORE OF THE ; FOLLOWING THREE ITEMS: ; ; 1)EVERY DEVICE HAS A BEGBOO-ENDBOO PAIR. IF AT LEAST ONE INSTRUCTION APPEARS ; BETWEEN THE BEGBOO-ENDBOO PAIR, ALL OF THE INSTRUCTIONS IN BETWEEN WILL ; BE MOVED INTO THE BOOT-BLOCK BUFFER AT $BTBEG AND THE BUFFER WILL BE ; PADDED AT THE END WITH NOP'S. IF THESE INSTRUCTIONS CONTAIN THE DEVICE- ; SPECIFIC BOOT BLOCK CODE, THEN A COMPLETE BOOT BLOCK MAY BE OUTPUT ; FROM $BOOT, THUS PREFIXING THE DEVICE-SPECIFIC CODE WITH THE REQUIRED COMMON ; BOOT-BLOCK CODE. THE DEVICE-SPECIFIC CODE BETWEEN THE BEGBOO-ENDBOO ; PAIR MUST BE CAPABLE OF WRITING AND READING THE ENTIRE SYSTEM IMAGE. ; THE CODE WILL BE ENTERED AT $BTBEG WITH THE FOLLOWING INPUTS: ; ; R0=SIZE OF SYSTEM IN BLOCKS (THE BLOCK SIZE DEPENDS ON THE DEVICE ; AND IS CALCULATED BY SIP FROM $SYSIZ IN THE EXEC.) ; R1=CSR ADDRESS (OBTAINED FROM THE SCB OF THE DEVICE UNIT.) ; R2=READ OR WRITE COMMAND (OBTAINED FROM THE LOAD DEVICE TABLE.) ; ; EXIT FROM THE DEVICE-SPECIFIC CODE IS VIA A TRANSFER OF CONTROL TO THE END ; OF THE CODE. CONTROL WILL THEN PASS THROUGH THE NOP'S TO $BTEND. AT ; THIS POINT R2 MUST STILL CONTAIN THE ORIGINAL COMMAND TO INDICATE IF THE ; SYSTEM HAS JUST BEEN BOOTED IN. ; ; 2)IMMEDIATELY FOLLOWING THE ENDBOO FOR A DEVICE, THERE MAY BE A SPECIAL ; SUBROUTINE FOR THE DEVICE WHICH MAY BE ENTERED VIA A CALL AT THE FIRST ; INSTRUCTION. SUCH A ROUTINE IS INCLUDED IF THE DEVICE DOES NOT USE THE ; STANDARD SINGLE BOOT BLOCK BEGINNING AT $BOOT. ; ; 3)FOLLOWING THE SUBROUTINE MAY BE DEVICE-SPECIFIC BOOT-BLOCK CODE WHICH ; IS OUTPUT BY THE SUBROUTINE AS REQUIRED BY THE DEVICE. THIS CODE WILL BE ; APPENDED BY THE COMMON CODE BEGINNING AT $BOOT, THUS PROVIDING USE OF ; THE SUBROUTINE SETUP UPON INPUT. ON INPUT, THE ENTRY POINT TO THIS CODE ; IS AT THE FIRST INSTRUCTION, AND ON OUTPUT THE ENTRY POINT IS PASSED BACK ; IN R5 BY THE SPECIAL SUBROUTINE. UPON ENTRY FOR OUTPUT AND AFTER THE ; CALL TO SETUP ON INPUT, REGISTERS R0-R2 ARE SET UP AS DESCRIBED ABOVE. ; .PAGE ; ; DECTAPE BOOTSTRAP ; ; THE FOLLOWING CODE IS MOVED TO THE BUFFER AT $BTBEG AND EXECUTED THERE ; BEGBOO DT,TC11 ;;; .ENABL LSB .IF DF M$$MGE DEC R0 ;;;REDUCE BLOCK COUNT BY ONE ASL R0 ;;;DOUBLE NUMBER OF BLOCKS .IFTF SWAB R0 ;;;CONVERT TO WORDS (*2 IF MAPPED) .IFT MOVB R0,R3 ;;;SAVE NUMBER OF 32K WORD BLOCKS INC R3 ;;; CLRB R0 ;;;CLEAR LOW ORDER BITS ROR R0 ;;;CONVERT BACK TO WORDS ADD #400,R0 ;;;READJUST BLOCK COUNT .IFTF NEG R0 ;;;CONVERT TO TWOS COMPLEMENT .IFT 1$: MOV #100000,2(R1) ;;;SET COUNT FOR 32K WORDS DEC R3 ;;;DONE YET? BLT 29$ ;;;IF LT YES BGT 2$ ;;;IF GT THEN NOT LAST BLOCK .IFTF MOV R0,2(R1) ;;;SET WORD COUNT 2$: CLR 4(R1) ;;;START AT LOCATION 0 .IFT BIT #60,R2 ;;;FIRST TIME THROUGH? BNE 15$ ;;;IF NE NO, SKIP BLOCK SEARCH .IFTF DTSRC: BIS #4000,@R1 ;;;REVERSE DIRECTION 5$: MOVB #3,@R1 ;;;INIT BLOCK SEARCH 7$: TSTB @R1 ;;;READY? BPL 7$ ;;;IF PL NO TST @R1 ;;;ERROR? BPL 5$ ;;;IF PL NO DTERR: TST -2(R1) ;;;END ZONE? BPL 30$ ;;;IF PL NO - FATAL DTFWD: BIC #4000,@R1 ;;;CLEAR REVERSE BIT MOVB #3,@R1 ;;;SEARCH FORWARD 10$: BIT #100200,@R1 ;;;DONE? BMI DTERR ;;;IF MI YES - AND WITH ERROR BEQ 10$ ;;;IF EQ LOOP CMP 6(R1),#2 ;;;ARE WE THERE? BLT DTFWD ;;;IF LT NOT YET BGT DTSRC ;;;IF GT WE PASSED IT 15$: MOVB R2,@R1 ;;;START THE FUNCTION 20$: TSTB @R1 ;;;DONE? BPL 20$ ;;;IF PL NO - LOOP TST @R1 ;;;ERRORS? BPL 25$ ;;;IF PL NO BIT #400,-2(R1) ;;;NONEXISTANT MEMORY? BNE 29$ ;;;IF NE YES, BR TO START UP SYSTEM BR 30$ ;;;ELSE BR TO HANDLE ERROR 25$: ;;;REFERENCE LABEL .IFT ADD #20,R2 ;;;BUMP EXTENDED BUS ADDRESS BITS BR 1$ ;;;LOOP BACK FOR NEXT TRANSFER .IFTF 29$: SEC ;;;INDICATE NO ERRORS 30$: MOVB #1,@R1 ;;;STOP TAPE MOTION .IFT BIC #160,R2 ;;;RETRIEVE ORIGINAL COMMAND .ENDC BCS 40$ ;;;IF CS THEN NO ERRORS CMP R2,#5 ;;;BOOTING IN? BEQ . ;;;IF EQ YES, LOOP HERE TRAP ER.IOE ;;;ELSE PRINT ERROR MESSAGE 40$: .DSABL LSB ENDBOO DT ;;; .ENDC ; ; CASSETTE BOOTSTRAP CODE ; ; NO CODE IS MOVED INTO THE BUFFER AT $BTBEG ; BEGBOO CT,TA11 ; ENDBOO CT,NOPAGE ; ; ; THE FOLLOWING SPECIAL CASSETTE BOOTSTRAP CODE IS EXECUTED TO OUTPUT ; THE FIRST BLOCK OF THE CASSETTE BOOTSTRAP. A SECONDARY BOOTSTRAP BLOCK IS ; OUTPUT IN THE MODULE SIP. ; MOV #CTBOO,R5 ;POINT TO CASSETTE BOOTSTRAP .IFTF .IF DF TA11!RX11 MBB0: MOV -2(R4),4(R5) ;SET CSR ADDRESS IN BOOT BLOCK MOV (R4),10(R5) ;SET READ COMMAND MBB1: MOV R5,$QDPB+Q.IOPL ;LOAD BOOTSTRAP ADDRESS IN DPB MOV #128.,R0 ;SET BYTE COUNT ADD #10.,R5 ;POINT TO ENTRY POINT FOR WRITING SYSTEM IMAGE CALLR $QIOWT ;WRITE BLOCK AND RETURN .ENDC .IFT ; ; THIS IS THE CASSETTE BOOTSTRAP CODE. IT IS EXECUTED IN PLACE TO READ OR ; WRITE THE SYSTEM IMAGE. ; CTBOO: NOP ;REQUIRED FIRST INSTRUCTION MOV (PC)+,R1 ;PICK UP CSR ADDRESS .BLKW 1 ;FILLED IN BY SIP MODULE MOV (PC)+,R2 ;PICK UP READ COMMAND .BLKW 1 ;FILLED IN BY SIP MODULE MOV #128.,R3 ;SET TO READ INTO NEXT BLOCK OF MEMORY MOV R3,R5 ;SET TO READ 128. BYTES CMP R2,#3 ;WRITE FUNCTION? BEQ 35$ ;IF EQ YES, BR TO CHANGE BLOCK SIZE 10$: .IF DF M$$MGE CMP R3,#160000 ;;;AT END OF APR6 RANGE? BLO 15$ ;;;IF LO NO MOV #140000,R3 ;;;ELSE RESET MEMORY ADDRESS ADD #200,UISAR6 ;;; AND BUMP RELOCATION BIAS 15$: .IFTF MOV R5,R4 ;;;LTH OF A BLOCK MOVB R2,@R1 ;;;START OPERATION 20$: TSTB @R1 ;;;WAIT FOR TRANSFER REQUEST BPL 20$ ;;; DEC R4 ;;;MORE BYTES? BLT 27$ ;;;IF LT NO - ILBS BIT #4,R2 ;;;READ? BNE 25$ ;;;IF NE YES MOVB (R3)+,2(R1) ;;;WRITE BR 20$ ;;;PROCEED 25$: MOVB 2(R1),(R3)+ ;;;STORE THE DATA BR 20$ ;;;LOOP 27$: BISB #20,@R1 ;;;SET ILBS BIT 30$: BITB #40,@R1 ;;;WAIT BEQ 30$ ;;; TST @R1 ;;;ERROR? BPL 32$ ;;;IF PL NO CMP R2,#5 ;;;BOOTING IN? BEQ . ;;;IF EQ YES, LOOP HERE TRAP ER.IOE ;;;ELSE PRINT ERROR MESSAGE 32$: CMP #.+4,PC ;;;HAVE WE RELOCATED YET? BEQ 40$ ;;;IF EQ YES MOV #CTBOO,R4 ;;;POINT TO DESTINATION .IFT MOV #2000,SP ;;;SET INITIAL SP .IFF MOV #$BOOT,SP ;;;SET SP .IFTF CALL @#128. ;;;RELOCATE (AND SET UP KT11 IF MAPPED) 35$: MOV #512.,R5 ;;;SET TO WRITE 512. BYTE BLOCKS .IFT CLR @#UISAR6 ;;;CLEAR USER APR6 MOV #140000,R3 ;;;INITIALIZE MEMORY ADDRESS .IFF CLR R3 ;;;RESET MEMORY ADDRESS .ENDC BR 10$ ;;;BRANCH TO READ IN CORE IMAGE 40$: DEC R0 ;;;MORE BLOCKS? BNE 10$ ;;;IF NE YES  TST (R2) ;;;EXIT VIA ODD ADDRESS TRAP SIZCHK CTBOO,128. ;;;CHECK SIZE OF BOOT STRAP .PAGE .ENDC ; ; MAGTAPE BOOTSTRAP ; ; THE FOLLOWING CODE IS MOVED TO THE BUFFER AT $BTBEG AND EXECUTED THERE. ; BEGBOO MT,TU16!TM11 ;;; $MMBOO==$MTBOO ;;;DEFINE FOR TU16 REFERENCE 5$: ;;;REFERENCE LABEL .IF DF M$$MGE MOV #CMODE!PR7,@#6 ;;;SET TO TRAP IN USER MODE AT PR7 .IFF MOV #PR7,@#6 ;;;SET TO TRAP AT PR7 .ENDC BR 45$ ;;;BR FOR TM11 BOOT (THE LOW-ORDER BYTE ;;; IS CLEARED HERE FOR EXECUTING THE TU16 ;;; BOOT FIRST) BR 15$ ;;;BR FOR TU16 BOOT 10$: MOV #172440,R1 ;;;SET DEFAULT CSR ADDRESS FOR TU16 MOV #71,R2 ;;;SET READ COMMAND 15$: MOV #40$-5$+$BTBEG,@#4 ;;;TRY MT ON MEMORY FAULT BIS #40,10(R1) ;;;RESET CONTROLLER 20$: MOV #-512.,6(R1) ;;;INIT FRAME COUNT REGISTER FOR WRITES MOV #-512./2,2(R1) ;;;NO. OF WORDS TO READ BIS R2,@R1 ;;;INIT OPERATION 30$: TSTB @R1 ;;;WAIT FOR COMPLETION BPL 30$ ;;;IF PL NOT DONE TST @R1 ;;;ERRORS? BPL 35$ ;;;IF PL NO BIT #4000,10(R1) ;;;NONEXISTANT MEMORY? BNE 70$ ;;;IF NE YES BR 62$ ;;;ELSE HANDLE ERROR 35$: DEC R0 ;;;MORE BLOCKS? BNE 20$ ;;;IF NE YES BR 70$ ;;;BRANCH AROUND NEXT BOOT 40$: MOV #172522,R1 ;;;DEFAULT CSR ADDRESS FOR TM11 MOV #60003,R2 ;;;SET READ COMMAND 45$: MOV #10$-5$+$BTBEG,@#4 ;;;TRY TU16 ON MEMORY FAULT CLR 4(R1) ;;;SET TO FILL FROM LOCATION 0 47$: BIT #1,-2(R1) ;;;READY FOR FIRST COMMAND? BEQ 47$ ;;;IF EQ NO 50$: MOV #-512.,2(R1) ;;;NO. OF BYTES PER RECORD BIS R2,@R1 ;;;START A READ MOV #25,R3 ;DELAY FOR THE SLOW TM11 55$: DEC R3 ;AND SOME MORE BNE 55$ ; 60$: BIT #1,-2(R1) ;;;TUR? BEQ 60$ ;;;IF EQ NO TST @R1 ;;;ERROR? BPL 65$ ;;;IF PL NO TSTB -2(R1) ;;;NONEXISTANT MEMORY BMI 70$ ;;;IF MI YES 62$: BIT #12,R2 ;;;BOOTING IN? BNE . ;;;IF NE YES, LOOP HERE TRAP ER.IOE ;;;ELSE PRINT ERROR MESSAGE 65$: DEC R0 ;;;MORE BLOCKS TO MOVE? BNE 50$ ;;;IF NE YES 70$: BIT #12,R2 ;;;READ COMMAND? BEQ 80$ ;;;IF EQ NO MOV R2,@#RDCMD ;;;ELSE INDICATE READ IN 80$: ;;; ENDBOO MT ;;; .ENDC ; ; FLOPPY BOOTSTRAP CODE ; ; NO CODE IS MOVED INTO THE BUFFER AT $BTBEG. ; BEGBOO DX,RX11 ENDBOO DX,NOPAGE ; ; THE FOLLOWING CODE IS THE SPECIAL ROUTINE WHICH OUTPUTS THE FIRST TWO ; SECTORS OF THE FLOPPY BOOTSTRAP. THE FINAL SECTOR IS OUTPUT BY THE SIP ; MODULE. THE ROUTINES MBB0 AND MBB1 ARE IN THE SPECIAL CASSETTE BOOTSTRAP ; ROUTINE. ; MOV #$QDPB+Q.IOPL+10,R1 ;POINT TO BLOCK NUMBER IN QIO DPB MOV #DXBOO+128.,R5 ;POINT TO SECOND BLOCK OF FLOPPY BOOT MOV #IO.WPB,$QDPB+Q.IOFN ;CHANGE FUNCTION TO WRITE PHYSICAL MOV #28.,(R1) ;POINT TO SECTOR 28. CALL MBB1 ;WRITE THE SECTOR MOV #DXBOO,R5 ;POINT TO FIRST SECTOR OF BOOT MOV #26.,(R1) ;POINT TO SECTOR 26. CALL MBB0 ;WRITE SECTOR AND CLACULATE ENTRY POINT FOR ;WRITING SYSTEM IMAGE MOV #30.,(R1) ;POINT TO SECTOR 30. FOR FINAL PART OF BOOT RETURN ; ; ; THE FOLLOWING CODE IS THE FLOPPY BOOTSTRAP. IT IS EXECUTED IN PLACE TO ; READ AND WRITE THE SYSTEM IMAGE. ; .ENABL LSB ;;; DXBOO: NOP ;;;REQUIRED FIRST INSTRUCTION MOV (PC)+,R1 ;;;PICK UP CSR ADDRESS .BLKW 1 ;;; MOV (PC)+,R2 ;;;PICK UP OP CODE .BLKW 1 ;;; 4$: TSTB (R1) ;;;WAIT HERE FOR DRIVE READY BEQ 4$ ;;; TST R0 ;;;UNIT 1? BEQ 5$ ;;;IF EQ NO BIS #10020,R2 ;;;SET UNIT=1 IN COMMAND 5$: MOV PC,R0 ;;;SET INITIAL COUNT BIT #2,R2 ;;;ARE WE BOOTING IN (READ FUNCTION)? BEQ SKEW1 ;;;IF EQ NO, BRANCH TO BUMP PARAMETERS MOV #<3*256.>+1,R4 ;;;INITIALIZE TRACK ADDRESS TO TRACK 1 SEC 3 MOV #3,R5 ;;;SET TO RELOCATE AFTER 3 READS MOV #200,R3 ;;;SET INITIAL MEMORY ADDRESS .IF DF M$$MGE MOV #2000,SP ;;;SET INITIAL SP .IFF MOV #$BOOT-2,SP ;;;SET SP .IFTF MOV PC,(SP) ;;;SET ADDRESS OF TRAN ROUTINE ADD #TRAN-.,(SP) ;;; BR RESUM ;;;BR TO READ NEXT SECTOR RESTRT: ;;;REFERENCE LABEL 10$: BIT #2,R2 ;;;EMPTY SILO? BNE 15$ ;;;IF NE YES 12$: CALL @(SP)+ ;;;WAIT FOR TR .IFT BPL BUMP ;;;IF PL DONE, CHECK ADDRESS .IFF BPL 30$ ;;;IF PL DONE .IFTF MOVB (R3)+,(R1) ;;;FILL SILO BR 12$ ;;;BR FOR MORE 15$: CALL @(SP)+ ;;;WAIT FOR TR .IFT BPL BUMP ;;;IF PL DONE, CHECK ADDRESS .IFF BPL 30$ ;;;IF PL DONE .IFTF MOVB (R1),(R3)+ ;;;EMPTY SILO BR 15$ ;;;BR FOR MORE 20$: SWAB R4 ;;;SWITCH TRACK AND SECTOR ADDRESSES MOVB R4,(R1) ;;;MOVE IN TRACK OR SECTOR ADDRESS FOR TRANSFER CMPB (R4)+,(R4)+ ;;;ADD IN INTERLEAVE FACTOR RESUM:  ;;; 30$: CALL @(SP)+ ;;;INITIATE FUNCTION OR WAIT BMI 20$ ;;;IF MI THEN ADDRESS BYTE IS NEEDED CMPB -(R4),-(R4) ;;;SUBTRACT INTERLEAVE FACTOR FROM TRACK ADDRESS DEC R5 ;;;TIME TO ADJUST ADDRESS? BLE SKEW0 ;;;IF LE YES RESUM0: CMP R4,#<27.*256.> ;;;TIME TO WRAP AROUND? BHIS BUMP1 ;;;IF HIS YES RESUM2: ;;;REFERENCE LABEL 50$: DEC R0 ;;;MORE BLOCKS TO GO? BNE 10$ ;;;IF NE NO BR DXDONE ;;;EXIT FROM BOOT .DSABL LSB ;;; .ENABL LSB ;;; 10$: TST -(R1) ;;;ERROR? BMI DXERR ;;;IF MI YES, HANDLE ERROR SWAB R2 ;;;SWITCH FUNCTIONS CALL @(SP)+ ;;;RETURN WITH N-BIT CLEAR (FUNCTION COMPLETE) TRAN: MOV R2,(R1)+ ;;;INITIATE FUNCTION 20$: TSTB -2(R1) ;;;TR OR DONE? BEQ 20$ ;;;IF EQ NO BPL 10$ ;;;IF PL DONE CALL @(SP)+ ;;;RETURN WITH N-BIT SET (MUST ACCESS DATA REG) BR 20$ ;;;BR TO WAIT SIZCHK DXBOO,128. ;;;CHECK SIZE OF FIRST BLOCK OF BOOT STRAP .DSABL LSB ;;; .ENABL LSB ;;; SKEW0: CMP R4,#<9.*256.>+1 ;;;TIME TO RELOCATE? BNE 10$ ;;;IF NE NO MOV #DXBOO,R4 ;;;POINT TO DESTINATION MOV R2,@#RDCMD-$SETUP+256. ;;;SAVE READ COMMAND CALL @#256. ;;;RELOCATE BOOTSTRAP (AND SET UP KT IF MAPPED) BR 5$ ;;;BR TO RESET PARAMETERS SKEW1: MOV R4,R0 ;;;SET BLOCK COUNT 5$: ASL R0 ;;;CONVERT FROM 256 WORD BLOCKS TO 64 ASL R0 ;;; WORD BLOCKS MOV #<17.*256.>+1,R4 ;;;ADDRESS SECTOR AFTER LABEL BLOCK MOV #5,R5 ;;;SET SKEW COUNTER .IFT CLR @#UISAR6 ;;;CLEAR USER APR6 MOV #140000,R3 ;;;INITIALIZE MEMORY POINTER .IFF CLR R3 ;;;INITIALIZE MEMORY POINTER .IFTF MOV #TRAN,(SP) ;;;SET COROUTINE ADDRESS BIT #2,R2 ;;;READING? BEQ RESTRT ;;;IF EQ NO INC R0 ;;;MUST BUMP COUNT SWAB R2 ;;;CHANGE FUNCTIONS BR RESUM ;;;READ NEXT SECTOR 10$: TST R5 ;;;SWITCH TO EVEN SECTORS? BEQ 20$ ;;;IF EQ YES CMP R5,#-13. ;;;TIME TO SKEW TO NEXT TRACK? BNE RESUM0 ;;;IF NE NO MOV #DXDONE,@#4 ;;;SET TO CATCH NONEXISTANT MEM TRAPS MOV #13.,R5 ;;;RESET SKEW COUNT ADD #<4*256.>+1,R4 ;;;SKEW TO NEXT TRACK AND ODD SECTORS  20$: ADD #<1*256.>,R4 ;;;SWITCH TO EVEN SECTORS BR RESUM0 ;;;RESUME .IFT BUMP: CMP R3,#160000 ;;;OVERFLOWED APR6 YET? BLO RESUM ;;;IF LO NO MOV #140000,R3 ;;;RESET MEMORY ADDRESS ADD #200,@#UISAR6 ;;;BUMP RELOCATION BIAS BR RESUM ;;;RESUME .ENDC BUMP1: ADD #-<26.*256.>,R4 ;;;WRAP AROUND TO BEGINNING OF TRACK BR RESUM2 ;;;CONTINUE DXERR: BIT #2,R2 ;;;BOOTING IN? BNE . ;;;IF NE YES, LOOP HERE TRAP ER.IOE ;;;ELSE PRINT ERROR MESSAGE DXDONE: BIC #10020,R2 ;;;CLEAR UNIT-SELECT BIT SWAB R2 ;;;CREATE ORIGINAL READ COMMAND JMP $BTEND ;;;JUMP TO END OF BOOT PROCESSING SIZCHK DXBOO,256. ;;;CHECK SIZE OF SECOND BLOCK OF BOOT .DSABL LSB ;;; .PAGE .ENDC ; ; JG004 ; FLOPPY BOOTSTRAP CODE FOR RX02 DEVICE ; JG004 ; ; JG004 ; SOME USEFUL INFORMATION: ; JG004 ; ; JG004 ; THIS CODE MUST BE POSITION INDEPENDANT. WHEN SAVING THE SYSTEM, ; JG004 ; THE CODE IS MOVED TO THE BUFFER AT $BTBEG AND EXECUTED THERE. ; JG004 ; WHEN BOOTING IN THE SYSTEM, THE RELOCATION ROUTINE ($SETUP) ; JG004 ; POSITIONS THE CODE BACK INTO SIP WHERE IT WAS ORIGINALLY ; JG004 ; LOCATED AND EXECUTED THERE. ; JG004 ; THIS CODE EVENTUALLY GETS WRITTEN OVER WHEN BOOTING IN ; JG004 ; THE SYSTEM. THE STACK IS VERY SENSITIVE. THE STACK POINTER ; JG004 ; MUST BE AT THE SAME LEVEL WHEN SAVING THE SYSTEM AS WHEN ; JG004 ; BOOTING THE SYSTEM. CO-ROUTINE ADDRESSES ARE LOCATED ON ; JG004 ; THE STACK AND MUST BE AT THE SAME POSITION ON THE STACK WHEN ; JG004 ; SAVING THE SYSTEM AS WHEN BOOTING THE SYSTEM. ; JG004 ; ; JG004 ; WHEN DOING EMPTY/FILL COMMANDS, YOU MUST USE THE PHYSICAL ; JG004 ; ADDRESS FOR THE BUFFER. A VIRTUAL ADDRESS WILL BE INTERPERTED ; JG004 ; AS A PHYSICAL ADDRESS. THIS IS BECAUSE THE RX02 IS AN ; JG004 ; NPR DEVICE. BLOCK MOVES ARE DONE TO EMPTY/FILL THE SILO. ; JG004 ; ; JG004 ; WHEN BOOTING THE SYSTEM, IF THERE IS ANY ERROR WHEN TRYING ; JG004 ; TO ACCESS THE DISK, THE PROGRAM WILL LOOP FOREVER. ; JG004 ; SINCE THE SYSTEM IS NOT YET IN MEMORY, ERRORS CANNOT BE HANDLED. ; JG004 ; ; JG004 ; WHEN DOING A HARDWARE BOOT, ONE LOGICAL BLOCK (512 BYTES) IS BROUGHT ; JG004 ; INTO MEMORY STARTING AT PHYSICAL LOCATION 0 FOR THE RX02 DEVICE. ; JG004 ; FOR DOUBLE DENSITY DISK, TWO SECTORS ARE READ IN. ; JG004 ; FOR SINGLE DENSITY DISK, ONE SECTOR IS READ IN. ; JG004 ; ; JG004 ; ; JG004 ; THE REGISTERS ARE USED AS FOLLOWS FOR SAVING AND BOOTING SYSTEM: ; JG004 ; ; JG004 ; R0 - BLOCK COUNT ; JG004 ; 64 WORD BLOCKS FOR SINGLE DENSITY ; JG004 ; 128 WORD BLOCKS FOR DOUBLE DENSITY ; JG004 ; R1 - CSR ADDRESS ; JG004 ; R2 - COMMAND CODE ; JG004 ; WHEN SAVING SYSTEM,WRITE AND FILL COMMANDS ; JG004 ; WHEN BOOTING SYSTEM,EMPTY AND READ COMMANDS ; JG004 ; R3 - PHYSICAL ADDRESS OF BUFFER ; JG004 ; TWO BITS IN THE CSR ARE ALSO USED FOR EXTENDED ADDRESSING ; JG004  ; (TO ACHIEVE 18 BIT ADDRESSING) ; JG004 ; R4 - TRACK AND SECTOR NUMBER ; JG004 ; TRACK 0 IS NOT USED. THIS IS TO BE COMPATIBLE WITH IBM. ; JG004 ; IBM DOES SOMETHING SPECIAL WITH THERE TRACK 0. ; JG004 ; R5 - SKEW COUNTER ; JG004 ; R6 - USER STACK POINTER ; JG004 ; SIP IS MAPPED TO USER APR 5. ; JG004 ; ; JG004 ; ; JG004 ; JG004 BEGBOO DY,RX21 ; JG004 ; ; JG004 ; THE FOLLOWING CODE IS MOVED TO THE BUFFER AT $BTBEG AND EXECUTED THERE. ; JG004 ; ; JG004 ; JG004 .ENABL LSB ;;; ; JG004 DYBOO: NOP ;;;REQUIRED FIRST INSTRUCTION ; JG004 BR 2$ ;;; ; JG004 DENS:: .WORD 0 ;;; = 128. WORDS - DOUBLE DENSITY ; JG004 ;;; = 64. WORDS - SINGLE DENSITY ; JG004 FUNCT: .WORD 0 ;;; FUNCTION CODE FOR I/O OPERATION ; JG004 BUFSIZ: .WORD 0 ;;; BUFFER SIZE INCREMENT IN BYTES ; JG004 ;;; 256. BYTES FOR DOUBLE DENSITY ; JG004 ;;; 128. BYTES FOR SINGLE DENSITY ; JG004 UNIT:: .WORD 0 ;;; CONTAINS UNIT # ; JG004 TRKBUF: .WORD 0 ;;; BUFFER FOR TRACK AND SECTOR # ; JG004 2$: TSTB (R1) ;;;WAIT HERE FOR DRIVE READY ; JG004 BEQ 2$ ;;; ; JG004 BIT #2,R2 ;;; BOOTING IN ? ; JG004 BNE 3$ ;;; YES ; JG004 TST UNIT ;;;UNIT 0? ; JG004 BEQ 5$ ;;;IF EQ YES ; JG004 BR 4$ ;;; NO ; JG004 3$: ;;; ; JG004 BIT #20,(R1) ;;; CHECK CSR FOR UNIT # - UNIT 1 ? ; JG004 BEQ 5$ ;;; IF EQ NO ; JG004 4$: ;;; ; JG004 BIS #10020,R2 ;;;SET UNIT=1 IN COMMAND ; JG004 5$: ;;; ; JG004 CMP #128.,DENS ;;; DOUBLE DENSITY ? ; JG004 BEQ 8$ ;;; YES ; JG004 MOV #128.,BUFSIZ ;;; # OF BYTES TO BUMP BUFFER ADDRESS BY ; JG004 BR 9$ ;;; ; JG004 8$: ;;; ; JG004 MOV #256.,BUFSIZ ;;; # OF BYTES TO BUMP BUFFER ADDRESS BY ; JG004 BIS #400,FUNCT ;;; SET DOUBLE DENSITY BIT IN COMMAND WORD ; JG004 9$: ;;; ; JG004 JMP SKEW12 ;;; YES - BOOTING IN ; JG004 RSTRT: ;;;REFERENCE LABEL ; JG004 CALL @(SP)+ ;;;WAIT FOR TR ; JG004 BPL RSUM ;;;IF PL DONE, CHECK ADDRESS ; JG004 MOV DENS,2(R1) ;;; ISSUE SECTOR SIZE ; JG004 CALL @(SP)+ ;;; DUMP SECTOR SIZE INTO CSR ; JG004 MOV R3,2(R1) ;;; ISSUE BUFFER ADDRESS ; JG004 ADD BUFSIZ,R3 ;;; UPDATE BUFFER ADDRESS ; JG004 BCC 14$ ;;; NO EXTENDED ADDRESSING NEEDED ; JG004 ADD #10000,FUNCT ;;; SET EXTENDED ADDRESSING BIT ; JG004 14$: ;;; ; JG004 BITB #240,(R1) ;;; ; JG004 BEQ 14$ ;;; LOOP UNTIL SILO IS FILLED/EMPTIED ; JG004 BR RSTRT ;;; ; JG004 20$: SWAB R4 ;;;SWITCH TRACK AND SECTOR ADDRESSES ; JG004 MOV R4,TRKBUF ;;; SAVE R4 ; JG004 BIC #177400,TRKBUF ;;; CLEAR HIGH BYTE ; JG004 MOV TRKBUF,2(R1) ;;; MOVE IN TRACK OR SECTOR ADDRESS FOR TRANSFE; JG004 CMPB (R4)+,(R4)+ ;;;ADD IN INTERLEAVE FACTOR ; JG004 RSUM: ;;; ; JG004 CALL @(SP)+ ;;;INITIATE FUNCTION OR WAIT ; JG004 BMI 20$ ;;;IF MI THEN ADDRESS BYTE IS NEEDED ; JG004 CMPB -(R4),-(R4) ;;;SUBTRACT INTERLEAVE FACTOR FROM TRACK ADDRESS; JG004 DEC R5 ;;;TIME TO ADJUST ADDRESS? ; JG004 BLE SKEW10 ;;;IF LE YES ; JG004 RSUM0: CMP R4,#<27.*256.> ;;;TIME TO WRAP AROUND? ; JG004 BLO RSUM2 ;;;IF LO NO ; JG004 ADD #-<26.*256.>,R4 ;;; WRAP AROUND TO BEG OF TRACK ; JG004 RSUM2: ;;;REFERENCE LABEL ; JG004 DEC R0 ;;;MORE BLOCKS TO GO? ; JG004 BNE RSTRT ;;;IF NE NO ; JG004 BR DYDONE ;;;EXIT FROM BOOT ; JG004 .DSABL LSB ;;; ; JG004 ; JG004 .ENABL LSB ;;; ; JG004 10$: ;;; ; JG004 TST (R1) ;;;ERROR? ; JG004 BMI DYERR ;;; IF MI YES, HANDLE ERROR ; JG004 SWAB R2 ;;;SWITCH FUNCTIONS ; JG004 CALL @(SP)+ ;;;RETURN WITH N-BIT CLEAR (FUNCTION COMPLETE) ; JG004 TRANSF: ;;; ; JG004 CLRB FUNCT ;;; CLEAR LOW BYTE ; JG004 BISB R2,FUNCT ;;; GET FUNCTION CODE ; JG004 MOV FUNCT,(R1) ;;; DUMP COMMAND IN CSR REG ; JG004 20$: ; JG004 BITB #240,(R1) ;;; TR OR DONE ? ; JG004 BMI 22$ ;;; TR SET ; JG004 BEQ 20$ ;;; LOOP TILL TR OR DONE SET ; JG004 BPL 10$ ;;; DONE SET ; JG004 22$: ;;; ; JG004 CALL @(SP)+ ;;;RETURN WITH N-BIT SET (MUST ACCESS DATA REG) ; JG004 BR 20$ ;;;BR TO WAIT ; JG004 .DSABL LSB ;;; ; JG004 ; JG004 .ENABL LSB ;;; ; JG004 SKEW12: ;;; ; JG004 ASL R0 ;;;CONVERT FROM 256 WORD BLOCKS TO 64 FOR SINGLE; JG004 BIT #200,DENS ;;; DOUBLE DENSITY FLOPPY ??? ; JG004 BNE 6$ ;;; YES - CONVERT ONLY TO 128 WORD BLOCKS ; JG004 ASL R0 ;;; ; JG004 6$: ;;; ; JG004 MOV #<17.*256.>+1,R4 ;;;ADDRESS SECTOR AFTER LABEL BLOCK ; JG004 MOV #5,R5 ;;;SET SKEW COUNTER ; JG004 CLR R3 ;;;INITIALIZE MEMORY POINTER ; JG004 MOV PC,-(SP) ;;; GET TRAN ADDRESS ON STACK ; JG004 ADD #TRANSF-.,(SP) ;;;SET COROUTINE ADDRESS ; JG004 BIT #2,R2 ;;;READING? ; JG004 BEQ RSTRT ;;;IF EQ NO ; JG004 INC R0 ;;;MUST BUMP COUNT ; JG004 BR RSUM ;;;READ NEXT SECTOR ; JG004 SKEW10:  ;;; ; JG004 TST R5 ;;;SWITCH TO EVEN SECTORS? ; JG004 BEQ 20$ ;;;IF EQ YES ; JG004 CMP R5,#-13. ;;;TIME TO SKEW TO NEXT TRACK? ; JG004 BNE RSUM0 ;;;IF NE NO ; JG004 MOV PC,R5 ;;; GET ADDRESS OF DYDONE ; JG004 ADD #DYDONE-.,R5 ;;;SET TO CATCH NONEXISTANT MEM TRAPS ; JG004 MOV R5,@#4 ;;; ; JG004 MOV #13.,R5 ;;;RESET SKEW COUNT ; JG004 ADD #<4*256.>+1,R4 ;;;SKEW TO NEXT TRACK AND ODD SECTORS ; JG004 20$: ADD #<1*256.>,R4 ;;;SWITCH TO EVEN SECTORS ; JG004 BR RSUM0 ;;;RESUME ; JG004 ; JG004 DYERR: ;;; ; JG004 BIT #2,R2 ;;; BOOTING IN? ; JG004 BNE . ;;; LOOP HERE ; JG004 TST (SP)+ ;;; POP STACK - PTR TO TRANSF WAS PUSHED ON ; JG004 TRAP ER.IOE ;;; ELSE PRINT ERROR MESSAGE ; JG004 DYDONE: ;;; ; JG004 BIC #10020,R2 ;;;CLEAR UNIT-SELECT BIT ; JG004 SWAB R2 ;;;CREATE ORIGINAL READ COMMAND ; JG004 TST (SP)+ ;;; POP STACK - PTR TO TRANSF WAS PUSHED ON ; JG004 .DSABL LSB ;;; ; JG004 ENDBOO DY ; JG004 .PAGE ; JG004 ; JG004 .ENDC ; JG004 ; ; PAPER TAPE BOOTSTRAP ; ; THE BUFFER AT $BTBEG IS FILLED WITH NOPS. ; BEGBOO PP,PP11 ;;; NOP ;;;FILL BUFFER WITH NOPS ENDBOO PP,NOPAGE ;;; ; ; THE FOLLOWING CODE OUTPUTS THE SYSTEM IMAGE IN ABSOLUTE LOADER FORMAT. ; CLR R3 ;;;POINT TO LOCATION 0 10$: MOV #$FBBUF-2,R4 ;;;POINT TO BLOCK LOAD POINT IN OUTPUT BUF MOV R3,(R4)+ ;;;ENTER BLOCK LOAD POINT 20$: MOV (R3)+,(R4)+ ;;;LOAD OUTPUT BUFFER CMP R4,#$CKSUM ;;;END OF BUFFER? BLO 20$ ;;;IF LO NO CLR (R4) ;;;CLEAR CHECK SUM MOV #$FBBUF-10.,R2 ;;;POINT TO OUTPUT BUFFER 30$: TSTB (R1) ;;;PUNCH READY? BPL 30$ ;;;IF PL NO TST (R1) ;;;ERRORS? BPL 40$ ;;;IF PL NO TRAP ER.IOE ;;;ELSE I/O ERROR 40$: MOVB (R2),2(R1) ;;;WRITE BYTE MOVB (R2)+,R5 ;;;COPY BYTE INTO R5 ADD R5,(R4) ;;;ACCUMULATE CHECKSUM CMP R2,R4 ;;;END OF BUFFER YET? BLO 30$ ;;;IF LO NO BHI 50$ ;;;IF HI THEN PAST CHECKSUM BYTE NEGB (R4) ;;;CALCULATE CHECKSUM BR 30$ ;;;BR TO OUTPUT CHECKSUM 50$: DEC R0 ;;;BLOCKS REMAINING? BGT 10$ ;;;IF GT YES BLT 60$ ;;;IF LT, TRANSFER ADDRESS HAS BEEN OUTPUT CLRB -(R2) ;;;RESET CHECKSUM BYTE .IF DF M$$MGE MOV @#UISAR5,-(R2) ;;;CALCULATE PHYSICAL TRANSFER ADDRESS SWAB (R2) ;;;CONVERT BASE ADDRESS TO BYTES ASRB (R2) ;;; ROR (R2) ;;; ROR (R2) ;;; ADD #$BOOT,(R2) ;;;CALCULATE ADDRESS OF $BOOT SUB #120000,(R2) ;;;SUBTRACT APR5 VIRTUAL BASE .IFF MOV #SYSTRT,-(R2) ;;;SET TRANSFER ADDRESS .ENDC MOV #6,-(R2) ;;;SET BYTE COUNT MOV #1,-(R2) ;;;FORMATTED BINARY HEADER CLR -(R2) ;;;OUTPUT FOUR NULLS CLR -(R2) ;;; BR 30$ ;;;OUTPUT IT 60$: JMP DONE ;;;RESTART SIP .PAGE .ENDC .PAGE ; ; COMMON BOOT-BLOCK CODE ; .PSECT $BOOT:: NOP ;;;FIRST WORD MUST BE A NOP MOV #$BOOT,R4 ;;;POINT TO DESTINATION OF BOOT BLOCK MOV R4,SP ;;;SET INITIAL SP CALL $SETUP ;;;RELOCATE BOOT AND ENABLE KT IF MAPPED BR $BTBEG ;;;EXECUTE BOOTSTRAP ; ; SETUP - ROUTINE TO RELOCATE BOOTSTRAP AND ENABLE KT11 IF SYSTEM ; IS MAPPED. ; ; INPUTS: ; ; R4 = DESTINATION ADDRESS ; ; OUTPUTS: ; ; BOOTSTRAP IS RELOCATED AND KT11 SET UP FOR MAPPED SYSTEM ; R0-R2 SETUP FOR BOOTSTRAP ; R3-R4 DESTROYED ; $SETUP::ADD R4,(SP) ;;;RELOCATE RETURN ADDRESS .IF DF M$$MGE MOV #PMODE!PR7,@#PS ;;;SET TO KERNEL MODE (PREVIOUS=USER) MOV #KISAR0,R0 ;;;POINT TO KERNAL APR0 MOV #KISDR0,R1 ;;;POINT TO KERNAL PDR0 MOV #UISAR0,R2 ;;;POINT TO USER APR0 CLR R3 ;;;SET INITIAL OFFSET 10$: MOV R3,(R0)+ ;;;SET KERNAL APR MOV R3,(R2)+ ;;;SET USER APR MOV #77406,(R1) ;;;SET UP KERNAL PDR MOV (R1)+,UISDR0-KISDR0-2(R1) ;;;SET UP USER PDR ADD #200,R3 ;;;BUMP R3 BY 4K WORDS CMP R0,#KISAR7 ;;;FIRST 7 APRS SET? BLOS 10$ ;;;IF LOS NO MOV #177600,-(R0) ;;; POINT KERNAL APR7 INTO I/O PAGE JG005 MOV (R0),-(R2) ;;;POINT USER APR7 INTO I/O PAGE J**-1 INC @#SR0 ;;;ENABLE MEMORY MANAGEMENT .IFTF MOV PC,R2 ;;;POINT TO BOOT PARAMETERS ADD #$BTDRV-.,R2 ;;; .IFT MOV (R2)+,@#UISAR5 ;RESTORE USER APR5 .IFTF MOV (R2)+,R0 ;;;PICK UP BLOCK COUNT FOR TRANSFER MOV (R2)+,R1 ;;;PICK UP CSR ADDRESS MOV (R2)+,R2 ;;;PICK UP TRANSFER COMMAND .IFT BIT #177000,PC ;;;RELOCATION REQUIRED? BEQ 15$ ;;;IF EQ YES MOV R2,(SP) ;;;SET RETURN ADDRESS FOR PAPER TAPE($BTBEG) BR 30$ ;;;BR TO EXIT 15$: ;;;REFERENCE LABEL .IFTF CLR R3 ;;;POINT TO BOOTSTRAP 20$: .IFT MOV (R3)+,-(SP) ;;;PICK UP WORD OF BOOTSTRAP MTPI (R4)+ ;;;MOVE IT INTO USER SPACE .IFF MOV (R3)+,(R4)+ ;;;MOVE BOOTSTRAP .IFTF CMP R3,#1000 ;;;DONE YET? BLO 20$ ;;;IF LO NO 30$: ;;;REFERENCE LABEL .IFT MOV #$BOOT-2,-(SP) ;;;PUSH USER STACK POINTER MTPI SP ;;; MOV (SP),-(SP) ;;;DUPLICATE RETURN ADDRESS ON STACK MOV #CMODE!PR7,2(SP) ;;;SET TO RETURN IN USER MODE RTI ;;;RETURN TO CALLER .IFF RETURN ;;;RETURN TO CALLER .IFTF ; ; BOOT-BLOCK DRIVING PARAMETERS ; $BTDRV:: .IFT .BLKW 1 ;;;SAVED UISAR4 .ENDC .BLKW 1 ;;;BLOCK COUNT .BLKW 1 ;;;CSR ADDRESS RDCMD: .BLKW 1 ;;;READ COMMAND SIZCHK $SETUP,128. ;;;CHECK SIZE OF COMMON AREA ; ; DEVICE BOOT CODE GOES HERE ; $BTBEG::.BLKB MX$LEN ;;;DEVICE BOOT BUFFER ; ; THE FOLLOWING CODE IS NOT PART OF THE BOOT BLOCK. IT IS EXECUTED AFTER ; THE ENTIRE SYSTEM IMAGE IS READ IN. FIRST THE CLOCK IS SET UP. ; .ENABL LSB ;;; $BTEND::CMP R2,RDCMD ;;;WAS THIS A BOOT IN? BEQ SYSTRT ;;;IF EQ YES DONE: MOV $TRPSV,@#4 ;;;RESTORE NONEXISTANT MEMORY ADDRESS VECTOR .IF DF M$$MGE .IF DF M$$EXT ;JG005 MOV #60,@#SR3 ; ENABLE 22 BIT ADDRESSING AND UNIBUS MAP ;JG005 .ENDC ;JG005 CLRB @#6+1 ;;; .ENDC MTPS #0 ;;;DROP PRIORITY .IF DF TA11!TM11!TU16 BIT #CB.EOF,$FLGS ;END OF FILE MARKERS REQUIRED? BEQ 3$ ;IF EQ NO MOV #IO.EOF,$QDPB+Q.IOFN ;SET FOR WRITE EOF FUNCTION CALL $QIOWT ;WRITE TWO EOF'S CALL $QIOWT ; .ENDC 3$: JMP $RSTRT ;RESTART SIP SYSTRT: MOV #NODEV,@#4 ;;;SET NONEXISTANT MEMOR TRAP .IF DF M$$EXT ;JG005 MOV #UBMPR,R5 ; POINT TO FIRST UNIBUS MAPPING REGISTER ;JG005 TST (R5) ; DOES I/O MAP EXIST ? ;JG005 BCS 7$ ; NO - DO NOT INITIALIZE MAP ;JG005 CLR R1 ; SET INITIAL ADDRESS TO ZERO ;JG005 MOV #5.,R4 ; SET NUMBER OF REGISTER PAIRS TO LOAD ;JG005 ; (EXEC MAPPING) ;JG005 5$: ; ;JG005 MOV R1,(R5)+ ; LOAD LOW 16 BITS OF ADDRESS ;JG005 CLR (R5)+  ; CLEAR HIGH 6 BITS OF ADDRESS ;JG005 ADD #20000,R1 ; ADVANCE 8K BYTES ;JG005 DEC R4 ; ANY MORE TO LOAD ? ;JG005 BGT 5$ ; IG GT YES ;JG005 BIS #HF.UBM,$HFMSK ; SET UNIBUS FEATURE MASK BIT ;JG005 BR 8$ ; JOIN COMMON CODE ;JG005 7$: ; ;JG005 CLR $UMRPT ; INDICATE NO I/O MAP IN THIS SYSTEM ;JG005 BIC #HF.UBM,$HFMSK ; CLEAR UNIBUS FEATURE MASK BIT ;JG005 8$: ; ;JG005 MOV #60,@#SR3 ; ENABLE 22 BIT ADDRESSING AND UNIBUS MAP ;JG005 .ENDC ;JG005  .IF NDF L$$SI1 TST @$CKCSR ;;;IS THE CLOCK OF THE SAVED SYSTEM THERE? BCC 10$ ;;;IF CC YES MOV #172540,$CKCSR ;;;ASSUME KW11-P MOV #172542,$CKCNT ;;; MOV #10.,$CKLDC ;;; MOV #1000.,$TKPS ;;;1000. TICKS PER SECOND MOV #$NONSI,@#100 ;;;RESET KW11-L VECTOR MOV #$CKINT,@#104 ;;;SET KW11-P VECTOR TST @$CKCSR ;;;IS IT THERE? BCC 10$ ;;;IF CC YES MOV #177546,$CKCSR ;;;MUST BE KW11-L MOV #177546,$CKCNT ;;; CLR $CKLDC ;;; MOV #60.,$TKPS ;;;60 TICKS PER SECOND MOV #$CKINT,@#100 ;;;SET KW11-L VECTOR MOV #$NONSI,@#104 ;;;RESET KW11-P VECTOR .ENDC ; ; DETERMINE WHICH DEVICES ARE PRESENT ; 10$: MOV $DEVHD,R5 ;;; GET ADDRESS OF DEVICE TABLE 20$: MOVB D.UNIT+1(R5),R3 ;;; COMPUTE NUMBER OF MOVB D.UNIT(R5),R1 ;;; UNITS ON THIS DCB SUB R1,R3 ;;; MOV D.UCB(R5),R4 ;;;GET ADDRESS OF FIRST UCB 30$: MOV U.SCB(R4),R1 ;;; GET ADDRESS OF SCB FOR NEXT DEVICE BIT #DV.PSE,U.CW1(R4) ;;; IS THIS A PSUEDO DEVICE? BNE 50$ ;;; YES, THEN SKIP TEST BICB #US.OFL,U.ST2(R4) ;;;TENTATIVELY CLEAR OFF-LINE BIT TSTB @S.CSR(R1) ;;;IS THE DEVICE THERE? BCC 40$ ;;; YES BISB #US.OFL,U.ST2(R4) ;;;SET DEVICE OFF-LINE BIT MOV #DEVNAM,R0 ;;;POINT TO DEVICE NAME IN MESSAGE MOV D.NAM(R5),(R0)+ ;;;MOVE IN DEVICE NAME MOVB D.UNIT+1(R5),R1 ;;;PICK UP HIGHEST UNIT NUMBER SUB R3,R1 ;;;CALCULATE NUMBER OF MISSING UNIT BIC #177700,R1 ;;;FORCE MODULO 64 CMP R1,#7 ;;;TWO DIGIT UNIT NUMBER? BHI 35$ ;;;IF HI YES MOVB #'0,(R0)+ ;;;IF NOT, USE ONE LEADING 0 35$: CLR R2 ;;;SET FOR ZERO SUPPRESSION CALL $CBOMG ;;;SET UNIT NUMBER ASCII IN BUFFER JSR R5,OUTMSG ;;;PRINT IT .WORD DEVMSG ;;; 40$: ADD D.UCBL(R5),R4 ;;;POINT TO NEXT UCB DEC R3 ;;;MORE UNITS? BGE 30$ ;;;IF GE YES 50$: MOV D.LNK(R5),R5 ;;; GET ADDRESS OF NEXT DCB BNE 20$ ;;; LOOP UNTIL DONE ; ; SET UP PARITY CSR ADDRESS TABLE ; .IF DF P$$RTY MOV #$PARTB,R0 ;;;GET ADDRESS OF PARITY CSR ADDRESS TABLE MOV R0,R1 ;;;COPY ADDRESS OF TABLE MOV #1,(R1)+ ;;;INSERT A ONE IN FIRST TABLE ENTRY MOV #MPAR-2,R2 ;;;GET ADDRESS OF FIRST PARITY REGISTER-2 MOV #16.,R3 ;;;SET NUMBER OF PARITY REGISTERS 51$: ADD #2,R2 ;;;ADVANCE TO NEXT PARITY CSR REGISTER MOV R2,(R1)+ ;;;ASSUME PARITY REGISTER PRESENT TST (R2) ;;;PARITY CSR REGISTER PRESENT? BCC 52$ ;;;IF CC YES MOV R0,-2(R1) ;;;POINT TO FIRST WORD OF TABLE 52$: DEC R3 ;;;ANY MORE TO SCAN? BGT 51$ ;;;IF GT YES MOV (R1),R1 ;;;11/70 CACHE PARITY CSR SEARCH DONE? BEQ 53$ ;;;IF EQ YES MOV #MPCSR-10,R2 ;;;POINT TO FIRST CSR ADDRESS -2 MOV #6,R3 ;;;SET COUNT OF REGISTERS BR 51$ ;;;SEARCH FOR THEM 53$: ;;;REF LABEL .ENDC ; ; DETERMINE SIZE OF SYSTEM ; CLR R1 ;;;CLEAR MEMORY SIZE COUNTER (IN 1K WORD UNITS) CLR R2 ;;;CLEAR MEMORY SIZE COUNTER (IN 32 WORD UNITS) .IF DF M$$MGE .IFF CLR R0 ;;;INITIALIZE MEMORY POINTER .IFTF 60$: .IFT MOV #140000,R0 ;;;INITIALIZE MEMORY POINTER MOV R2,UISAR6 ;;;INITIALIZE APR6 .IFTF TST (R0) ;;;MEMORY THERE? BCS 70$ ;;;IF CS NO INC R1 ;;;ELSE BUMP R1 BY 1 (K) ADD #40,R2 ;;;BUMP R2 BY 40 32 WORD BLOCKS (1K) .IF DF M$$EXT ;JG005 CMP R2,#170000 ; END OF MEMORY ? ;JG005 .IFF ;JG005 ;**-1 CMP R2,#7600 ;;;TO I/O PAGE YET? .ENDC ;JG005 .IFF CMP R2,#1600 ;;;TO I/O PAGE YET? .IFTF BHIS 70$ ;;;IF HI YES CMP R2,$SYSIZ ;;; SIZE > BOOT SIZE BHI 62$ ;;;IF HI YES .IFF ADD #4000,R0 ;;;BUMP ADDRESS BY 1K .ENDC BR 60$ ;;;TEST FOR MORE CORE 62$: MOV #2000,R3 ;;;ZERO 1K OF CORE 65$: MOV #0,(R0)+ ;;;STORE ZERO DEC R3 ;;;FINISHED ZEROING? BNE 65$ ;;;IF NE NO BR 60$ ;;;TEST FOR MORE CORE 70$: MOV R2,$SYSIZ ;;;SET CORE SIZE IN SYSTEM COMMON ;EF014 .IF DF M$$MGE&D$$YNM ;EF014 ;EF014 MOV R0,-(SP) ;SAVE R0 ;EF014 MOV R1,-(SP) ;SAVE R1 ;EF014 MOV #$PARHD,R0 ;PICK UP PCB LISTHEAD ;EF014 71$: MOV (R0),R1 ;GET ADDRESS OF NEXT PCB ;EF014 BEQ 77$ ;EQ => END OF LIST ;EF014 .IF DF M$$EXT ;EF014 CMP P.REL(R1),#177600 ;YES, IS IT DEVICE PARTITION? ;EF014 .IFF ;EF014 CMP P.REL(R1),#7600 ;IS THIS A DEVICE PARTITION? ;EF014 .ENDC ;EF014 BHIS 77$ ;YES ;EF014 MOV R1,R0 ;NO, GET NEXT PCB IN LIST ;EF014 BR 71$ ;LOOP UNTIL DEVICE PARTITION OR END ;EF014 77$: BIT #PS.SYS,P.STAT(R0) ;SYSTEM CONTROLLED PARTITION? ;EF014 BEQ 79$ ;NO ;EF014 MOV R2,-(SP) ;YES, GET SYSTEM SIZE IN BLOCKS ;EF014 SUB P.REL(R0),(SP) ;COMPUTE SIZE OF LAST PARTITION ;EF014 MOV (SP)+,P.SIZE(R0);AND SET IT ;EF014 ;EF014 79$: ;EF014 MOV (SP)+,R1 ;RESTORE R1 ;EF014 MOV (SP)+,R0 ;RESTORE R0 ;EF014 ;EF014 .ENDC ;EF014 ; ; PREPARE SYSTEM TO GO, PRINT SYSTEM ID MESSAGE AND EXIT ; MOV $HEADR,R0 ;;;POINT TO HEADER MOV H.LUN+<*4>(R0),R0 ;;;POINT TO LOAD DEVICE UCB CLR U.ATT(R0) ;;;PREVENT EXEC FROM PERFORMING DETACH MOV #SYSID,R0 ;;;POINT TO SYSTEM ID MESSAGE MOV $SYSID,(R0)+ ;;;MOVE IN SYSTEM BASE LEVEL MOV $SYSID+2,(R0)+ ;;; MOV (PC)+,(R0)+ ;;;MOVE IN SPACE, RUBOUT .BYTE 40,-1 ;;; MOV #-1,(R0) ;;;MOVE IN TWO MORE RUBOUTS OVER CORE SIZE DEC R0 ;;;POINT TO BEGINNING OF CORE SIZE CLR R2 ;;;ENABLE ZERO SUPRESSION CALL $CBDMG ;;;MOVE IN CORE-SIZE ASCII MOV #$CMDBF,R0 ;;;POINT TO BUFFER FOR TI: OUTPUT MOV #SYSMSG,R1 ;;;POINT TO SYSTEM ID MESSAGE 80$: MOVB (R1)+,(R0)+ ;;;MOVE ID MESSAGE TO BUFFER BNE 80$ ;;;IF NE MORE TO GO SUB #$CMDBF,R0 ;;;CALCULATE CHARACTER COUNT OF MESSAGE MOV $TRPSV,@#4 ;;;RESET NONEXISTANT MEMORY TRAP .IF DF M$$MGE CLRB @#6+1 ;;; MOV #CMODE!PR7,@#PS ;;;INSURE PROPER PREVIOUS MODE MOV $SAVE,-(SP) ;;;PUSH SAVED KERNAL STACK POINTER MTPI SP ;;;AND RESTORE IT .ENDC INC $PWRFL ;;;SIMULATE POWERFAIL TO RESET DRIVERS .IF NDF L$$SI1 MOV $CKLDC,@$CKCNT ;;;SET UP COUNT MOV #113,@$CKCSR ;;;ENABLE CLOCK .ENDC CALL $OUTMG ;;;PRINT SYSTEM ID MESSAGE JMP $SIPXT ;;;EXIT TO GIVE CONTROL TO SYSTEM .DSABL LSB ;;; ; ; ENTRY FOR BUS ERROR INTERRUPT ; NODEV: BIS #1,2(SP) ;;; SET CARRY BIT RTI ;;; RETURN ; ; CONSOLE OUTPUT ROUTINE ; ; INPUTS: ; ; (R5) = POINTER TO ASCIZ MESSAGE ; ; OUTPUTS: ; ; THE MESSAGE IS PRINTED TO THE CONSOLE TERMINAL IF ONE EXISTS ; R0 IS LOST ; OUTMSG: MOV (R5)+,R0 ;;;PICK UP ERROR MESSAGE POINTER 10$: TSTB TPS ;;;WAIT FOR READY CONDITION BCS 20$ ;;;IF CS, NO CONSOLE, EXIT BPL 10$ ;;;IF PL NOT READY MOVB (R0)+,TPS+2 ;;;OUTPUT CHARALCTER BNE 10$ ;;;IF NE THEN MORE TO GO 20$: RTS R5 ;;;RETURN .END L8x`kQ›c, .TITLE SIPCD .IDENT /01/ ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 01 ; BY: THOMAS J MILLER ; DATE: 3/23/75 ; ; SIPCD - COMMAND INPUT AND DECODING FOR THE RSX-11S SYSTEM IMAGE ; PRESERVATION PROGRAM ; ; ; MACRO LIBRARY LIBRARY CALLS ; .MCALL GTIM$S ; ; *** - $SIPCD READ AND PARSE A SIP COMMAND LINE AND SET UP LABEL BLOCK. ; $SIPCD::MOV #LUN2,R0 ;MOVE TI: LUN TO R0 CALL $ATT ;ATTACH TI: 1$: MOV #$CMDBF,R0 ;POINT TO INPUT BUFFER MOV (PC)+,(R0)+ ;MOVE IN PROMPT .BYTE 15,'S ; MOV #"IP,(R0)+ ; MOVB #'>,(R0)+ ; SUB #$CMDBF,R0 ;CALCULATE CHARACTER COUNT CALL $OUTMG ;PRINT IT MOV #IO.RVB,$QDPB+Q.IOFN ;SET FOR READ FUNCTION MOV #15.,R0 ;SET MAXIMUM READ COUNT CALL $QIOWT ;READ COMMAND LINE MOV #$CMDBF,R1 ;POINT TO INPUT BUFFER 2$: CMPB (R1),#141 ;PERFORM LOWER TO UPPER CASE CONVERSION ; IS CHARACTER IN LOWER CASE RANGE? BLO 5$ ;IF LO NO CMPB (R1),#172 ; BHI 5$  ;IF HI NO BICB #40,(R1) ;CONVERT TO UPPER CASE 5$: INC R1 ;BUMP POINTER TO NEXT CHARACTER DEC $IOSB+2 ;MORE CHARACTERS IN LINE? BGT 2$ ;IF GT YES BLT 1$ ;IF LT, THERE WAS NO INPUT, PROMPT AGAIN CLRB (R1)+ ;CONVERT STRING TO ASCIZ CLRB (R1)+ ;SIMPLIFY SINGLE CHARACTER CASE MOV #LUN2,R0 ;DETACH TERMINAL CALL $DET ; MOV #$CMDBF,R0 ;POINT TO INPUT BUFFER MOV #$ALUN1+A.LUNA,R1 ;POINT TO LOAD DEVICE ASSIGN DPB MOV (R0)+,(R1)+ ;MOVE IN DEVICE NAME CLR (R1) ;INITIALIZE UNIT NUMBER IN DPB 10$: MOVB (R0)+,R2 ;PICK UP NEXT INPUT CHARACTER SUB #60,R2 ;ASSUME NUMERIC AND CONVERT TO BINARY BITB #370,R2 ;WAS IT A NUMERIC? BNE 20$ ;IF NE NO ASLB (R1) ;MULTIPLY CURRENT NUMBER BY 8. BCS 40$ ;IF CS, UNIT NUMBER TOO LARGE ASLB (R1) ; BCS 40$ ; ASLB (R1) ; BCS 40$ ; BISB R2,(R1) ;ADD IN NEW DIGIT BR 10$ ;GET NEXT DIGIT 20$: CMPB R2,#':-60 ;WAS CHARACTER A ":"? BNE 40$ ;IF NE NO, ERROR MOV #$LABBF,R1 ;POINT TO LABEL BUFFER 30$: MOVB (R0)+,(R1) ;PICK NEXT CHARACTER FROM INPUT BEQ 50$ ;IF EQ, END OF INPUT STRING CMPB (R1),#'0 ;DETERMINE IF VALID ALPHANUMERIC BLO 40$ ;IF LO NO CMPB (R1)+,#'9 ; BLOS 30$ ;IF LOS YES 35$: CMPB -(R1),#'A ; BLO 40$ ;IF LO NO CMPB (R1)+,#'Z ; BLOS 30$ ;IF LOS YES 40$: TRAP ER.SYN ;SYNTAX ERROR 50$: CMP R1,#$LABBF+12. ;LEGAL LABEL LENGTH? BEQ 70$ ;IF EQ YES AND AT END BHI 40$ ;IF HI NO 60$: MOVB #40,(R1)+ ;PAD TO 12. CHARS WITH BLANKS BR 50$ ;BR TO CONTINUE PADDING 70$: MOV #"SI,(R1)+ ;INDICATE SIP CÜREATED FILE IN DEVICE NAME CLR (R1)+ ;UNIT 0, DEVICE 0 MOV #1,(R1)+ ;BLOCKING FACTOR = 1 MOV #512.,(R1)+ ;BLOCK SIZE GTIM$S R1 ;ENTER TIME AND DATE IN LABEL BUFFER RETURN ;RETURN TO CONTROL LOOP .END Ü8x""kQ›c, .TITLE SIPERR .IDENT /01/ ; ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; VERSION: 01 ; BY: THOMAS J MILLER ; DATE: 2/4/75 ; ; SIPERR - ERROR HANDLER AND RECOVERY ROUTINE FOR THE RSX-11S ; SYSTEM IMAGE PRESERVATION PROGRAM. ; ; ; LOCAL DATA ; ; ERROR CODE MACRO ; .MACRO ERRCOD NAM NAM==N N=N+1 .ENDM ; ; ERROR MESSAGE MACRO ; .IF DF R$$ERM .MACRO .ERR NUM,MSG .PSECT .ERRTB .WORD ER'NUM  .PSECT .ERRS ER'NUM: .RAD50 %'MSG'%<'.-22> .ENDM .IFTF ; ; ERROR CODE DEFINITIONS ; N=2 ERRCOD ER.SYN ERRCOD ER.POL ERRCOD ER.NVK ERRCOD ER.DNS ERRCOD ER.PRV ERRCOD ER.PNS ERRCOD ER.IOE N=66. ERRCOD ER.FRQ ERRCOD ER.NVD ERRCOD ER.IO ; ; *** - $STVEC SST VECTOR USED TO PROVIDE THE LINKAGE BETWEEN TRAP INSTRUCTIONS ; AND THE ERROR ROUTINE ; $STVEC::.WORD 0,0,0,0,0,0,ERRTRP ; ; ERROR MESSAGE PREFIX ; SIPMS: .ASCIZ /SIP -- / .IFT .ASCIZ / - / .IFTF .EVEN ; ; ERROR MESSAGE TABLE ; .IFT .PSECT .ERRTB ERRTAB=.- ;DEFINE SO CODE ER.SYN INDEXES TO START OF TABLE .ERR \ER.SYN, .ERR \ER.POL,<> .ERR \ER.NVK,<> .ERR \ER.DNS, .ERR \ER.PRV,<> .ERR \ER.PNS,<> .ERR \ER.IOE, .ERR \ER.FRQ,