Trailing-Edge
-
PDP-10 Archives
-
custsupcuspmar86_bb-x130b-sb
-
boot11.mac
There are 8 other files named boot11.mac in the archive. Click here to see a list.
TITLE BOOT11 TO BOOTSTRAP/DUMP PDP-11 CONNECTED VIA DL10 %4A(46)
SUBTTL S.POLEVITSKY/PFC/TWE/DAL/EAR/AMW 27 JUL 79
;COPYRIGHT (C) 1972,1979 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
.EDTR==0 ;DEC DEVELOPMENT
.MAJV==4 ;MAJOR VERSION
.MINV==1 ;MINOR VERSION
.EDIT==46 ;EDIT NUMBER
%%BT11==.EDTR*1B2+.MAJV*1B11+.MINV*1B17+.EDIT
SEARCH UUOSYM
.REQUIRE REL:HELPER
;PROGRAM WHICH BOOTSTRAPS AND DUMPS PDP-11S CONNECTED VIA DL10.
;WHEN RUN, BOOT11 TYPES "FILE: " AND WAITS FOR A FILE SPEC AND
;ONE OR TWO SWITCHES. /DUMP:M AND /END:N ASK FOR DUMP OF PDP-11
;ACS AND LOC. FROM M-N.
;/LOAD:N AND /START:N SPECIFY BOOTSTRAP FROM FILE AND SET START ADDRESS
;AT N. IF N IS ODD, OR IF /LOAD, THEN THE 11 WILL HALT BEFORE STARTING.
;/CLEAR:N SPECIFIES TO CLEAR -11 CORE FROM 0 TO N-1.
;IF ALONE, PROGRAM WILL RESTART; IF WITH /L OR /S, WILL THEN LOAD.
;/IMAGE CAUSES LOAD TO READ IMAGE RATHER THAN PACKED FORMAT.
;/PORTNO:P HANDLES PORT NUMBER P (0-3 ARE -11S ON DL-10#0, 4-7 ON #1)
;LOAD INSTRUCTIONS:
; .LOAD %H BOOT11.MAC, HELPER.REL[10,7]
IFNDEF V.CLR,<V.CLR==100000> ;END OF CLEAR AREA+1
IFNDEF V.DUMP,<V.DUMP==0> ;START OF DUMP
IFNDEF V.END,<V.END==100000> ;END OF DUMP+1
SUBTTL REVISION HISTORY
;%2(17) DELIVERED WITH FIRST DC75 SOFTWARE
;THE FOLLOWING IMPROVEMENTS WERE THEN MADE:
; HANDLE -11 NXM (BUS TRAP)
; HANDLE ALL FORMS OF BINARY FORMAT (ABS)
; HANDLE SFD
; SUPPRESS 0 LINES FROM DUMP
; CLEAN UP SOURCE FORMAT
; RELOCATE THE -11 COMMUNICATIONS AREA TO RELAX THE LOAD
; TIME REQUIREMENTS
; PRESERVE THE DL-10 PI-CHANNEL ASSIGNMENT
; CONVERT MESSAGES TO LOWER CASE
; CHECK FOR JUNK IN INPUT FORMAT
; MAKE SIZE OF WINDOW BETWEEN -10 AND -11 BE AUTOMATIC
; ADD BOOT'S VERSION TO DUMP HEADER LINE
; ADD /PORTNO:P AND MAKE PORT NUMBER AN OPTION
;DEFICIENCIES:
; THE AC'S ARE NOT PRESERVED DURING DUMPS. THUS REPEATED DUMPS
; HAVE JUNK IN THE AC'S.
; THE AC'S ARE NOT PRESET TO 0 AFTER /LOAD OR /START
; THERE IS A SLIGHT RACE CONDITION IN THE PRESERVATION OF
; THE PI-CHANNEL. THEREFORE THE MONITOR SHOULD
; ESTABLISH IT AS A CONSTANT AT ONCE TIME AND
; VERIFY/RESTORE IT OCCASIONALLY (ONCE/SECOND?)
;EDIT 35: EXECUTES A SET CPU UUO TO LET BOOT11 RUN ON CPU 0 ONLY.
; [AREA AFFECTED: STRTUP]
;EDIT 36: INCREASES THE TIMEOUT OF THE PDP-11 BY A FACTOR OF 10
; SINCE NEWER DL10 INTERFACES NEED A LONGER DELAY.
; [AREA AFFECTED: STPLP]
;EDIT 37: LOCKS BOOT11 AT A 1K BOUNDARY TO INSURE PROPER OPERATION
; ON A KI WITH THE 8K DL10 OPTION.
; [AREA AFFECTED: STRTUP]
;EDIT 40: ADDS TYPE OF FAILURE TO LOCK ERROR MESSAGE
; [AREAS AFFECTED: MACRO DEFINITIONS, STRTUP]
;EDIT 41: DETERMINES PHYSICAL LOCATION THAT BOOT11 IS LOCKED IN
; CORE EVEN WHEN LOCKED ABOVE 112K ON A KI.
; [AREA AFFECTED: STRTUP]
;EDIT 42: CAUSES BOOT11 TO REQUIRE A PORT SWITCH IF THERE
; IS MORE THAN ONE PDP-11 ON THE DL10'S.
; [AREAS AFFECTED: MACRO DEFINITIONS, SETCOD, STRTUP, SWTWIN, STORAGE]
;EDIT 43: ALLOWS PRINTING OF CPU SERIAL NUMBERS GREATER
; THAN 999 IN DUMP ROUTINE HEADING FORMAT.
; [AREA AFFECTED: DMHDV3]
;EDIT 44: INCREASES TIMEOUTS OF PDP-11 WHEN STARTING AND CLEARING.
; [AREAS AFFECTED: STPLP, WAITIN]
;EDIT 45: ADDS CODE TO LOG RELOADS VIA THE DAEMON. UUO
; [AREAS AFFECTED: ? ]
;EDIT 46: INCREASE THE PDL LEN TO HANDLE DAEMON UUO ERRORS.
; [AREAS AFFECTED: ? ]
SUBTTL DEFINITIONS
;DEVICE CODES
DLB==60 ;FIRST DL-10
DLC==64
DLB2==160 ;SECOND DL-10
DLC2==164
;VARIOUS DL-10 BITS
GETPIC==7 ;MASK FOR PI CHANNEL
;DEFINE THE VARIOUS I/O OP CODES
DEFINE MAKE11(ARG),<IRP ARG,<
DEFINE ARG'11(USER),<XLIST
IFB <USER>,<XCT ARG'.>
IFNB <USER>,<MOVE T1,ARG'.
IOR T1,[USER]
XCT T1>
LIST> >>
MAKE11 <GTPI,ENBL,DSAB,CLRA,CLRB,BASE,STRT,STOP,GSTS>
DEFINE WAITON <
XLIST
PUSHJ P,WAITIN
LIST
>
DEFINE TELL (STRING)<
XLIST
PUSHJ P,[OUTSTR [ASCIZ \" STRING\]
RETURN]
LIST >
DEFINE TELLCR (STRING)<
XLIST
PUSHJ P,[OUTSTR [ASCIZ \" STRING
\]
RETURN]
LIST >
DEFINE WARN (STRING)<
XLIST
PUSHJ P,[OUTSTR [ASCIZ \% STRING\]
RETURN]
LIST >
DEFINE WARNCR (STRING)<
XLIST
PUSHJ P,[OUTSTR [ASCIZ \% STRING
\]
RETURN]
LIST >
DEFINE ERROR (STRING)<
XLIST
JRST [OUTSTR [ASCIZ \? STRING
\]
JRST EXITX]
LIST>
DEFINE ERRORC (STRING,AC)< ;[40] DISPLAYS UUO FAILURE, INCLUDING CODE
XLIST
JRST [OUTSTR [ASCIZ \? STRING \]
ADDI AC,60
OUTCHR AC
OUTSTR [ASCIZ\
\]
JRST EXITX]
LIST>
DEFINE ERRCH (NUM)< ;[42] DISPLAYS A CHARACTER & TWO SPACES
XLIST
PUSHJ P,[ADDI NUM,60
OUTCHR NUM
OUTCHR [" "]
RETURN]
LIST>
DEFINE USEROR (STRING)<
XLIST
JRST [OUTSTR [ASCIZ \? STRING
\]
JRST STARTE]
LIST>
DEFINE RETURN <
XLIST
POPJ P,
LIST>
LOC 137
%%BT11
RELOC
;PARAMETERS
INDEV==1 ;INPUT CHANNEL
IIMODE==10 ;IMAGE MODE INPUT FROM INDEV
INMODE==14 ;INPUT FROM INDEV
OUTDEV==2 ;OUTPUT FOR DUMP
OUMODE==0 ;OUTPUT FROM OUTDEV
PDSIZ==50 ;SIZE OF PUSH DOWN LIST
ONES11==177777 ;=ALL ONES AS FAR AS THE 11 CAN SEE
;DEFINITIONS FOR DAEMON ERROR-LOGGING CALLS
;FILE SPEC BLOCK FOR ERROR LOGGING (USED TO REPORT LOAD/DUMP FILES)
ERFSFN==0 ;FILE NAME
ERFSEX==1 ;EXTENSION
ERFSDV==2 ;DEVICE
ERFSXX==3 ;PATH. BITS
ERFSPN==4 ;PPN
ERFSSF==5 ;SFD #1
ERFSLN==ERFSSF+6 ;LENGTH OF A FILE-SPEC BLOCK
;DEVCHR BIT DEFINITIONS
DEVPTR==200,,0 ;PAPER TAPE READER
;AC'S
T1=1 ;SCRATCHED IN SUBROUTINES
T2=T1+1
T3=T2+1
T4=T3+1
T5=T4+1 ;[42]
P1=T5+1 ;PRESERVED IN SUBROUTINES
P2=P1+1
P3=P2+1
P4=P3+1
BC=P4+1 ;BYTE COUNT OF DATA IN GROUP
BA=BC+1 ;OUTPUT BYTE ADDRESS
BYTE=BA+1 ;LAST -11 BYTE READ FROM FILE
FB=BYTE+1 ;MOD 4 POSITION IN INPUT WORD
RB=FB+1 ;RELOCATION FOR -11 BUFFER
P=17 ;CALL STACK
;DESCRIPTION OF OUTPUT FROM MACX11/P GENERATED ASSEMBLY
;THAT IS, WHAT INPUT SHOULD LOOK LIKE
;APPROXIMATELY
;-----------------------------------------------------------------------
;[(0-1)/8-BIT BYTE#2/8-BIT BYTE #1,,(18-19)/8-BIT BYTE #4/8-BIT BYTE #3]
;-----------------------------------------------------------------------
;THE ABOVE IS SO-CALLED PACKED MODE. IN IMAGE MODE, THEY APPEAR
;ONE BYTE PER WORD IN ASCENDING BYTE ORDER.
; THE BYTES IN -11 ORDERING (IE, AFTER ABOVE UNTANGLING) ARE:
; ANY NUMBER OF 0 BYTES (DISCARD)
; CONSTANT 1
; CONSTANT 0
; BCL
; BCU
; AL
; AU
; BC-6 BYTES OF DATA IN ORDER STARTING WITH THE BYTE FOR A
; C
; WHERE BC=BCU*400+BCL THE BYTE COUNT
; A =AU *400+AL THE FIRST BYTE ADDRESS
; C = THE CHECKSUM
; THE ABOVE CAN BE REPEATED INDEFINITELY.
; THE LAST SUCH GROUP HAS BC=6 AND THE STARTING ADDRESS IS A.
;THE CHECKSUM IS A SIMPLE ADD OF THE BYTES STARTING WITH CONSTANT 1 AND
;INCLUDING THE CHECKSUM--THE RESULT IS 0 IN 8 BITS.
SUBTTL LOAD PROGRAM
STARTE: CLRBFI ;CLEAR TTY INPUT IF ERROR
START: RESET
SETZM FWAZER ;CLEAR STORAGE
MOVE T1,[FWAZER,,FWAZER+1]
BLT T1,LWAZER
SETOM FWAONE ;PRESET SWITCH ANSWERS TO -1
MOVE T1,[FWAONE,,FWAONE+1]
BLT T1,LWAONE
START2: MOVE P,[IOWD PDSIZ,PDLST]
PUSHJ P,GETCOM ;GO GET COMMAND
START6: RESET ;RECLAIM SPACE IF RE-STARTING
XCT START2 ;SET UP PUSH DOWN LIST
PUSHJ P,SETCOD ;SETUP I/O CODES
SKIPGE A.DUMP ;SEE IF /DUMP
SKIPL A.END ;OR IF /END
JRST DODUMP ;GO DO DUMP
SKIPL A.STRT ;SEE IF /START
SKIPGE A.LOAD ;AND /LOAD
JRST .+2 ;NO--OK
USEROR Can't do both /LOAD and /START
SKIPL A.CLR ;SEE IF /CLEAR
JRST [SKIPGE A.LOAD ;YES--SEE IF /LOAD
SKIPL A.STRT ; OR /START
JRST .+1 ;YES--DO BOTH
JRST STRTLD] ;NO--GO START 11
SKIPN T2,DEV ;IS DEVICE NULL?
MOVSI T2,'DSK' ;YES, DEFAULT IS DSK
DEVCHR T2, ;GET INPUT DEVICE CHARACTERISTICS
TLNE T2,(DEVPTR) ;IS INPUT DEVICE PTR?
SETZM A.IMAG ;YES, THEN /IMAGE IS A DEFAULT SWITCH
MOVEI T1,INMODE ;SET INPUT MODE
SKIPL A.IMAG ;IS /IMAGE SWITCH SET?
MOVEI T1,IIMODE ;YES, THEN IMAGE MODE INPUT
SKIPN T2,DEV ;GET DEVICE
MOVSI T2,'DSK' ;DEFAULT TO DISK
MOVEI T3,INHDR ;POINT TO BUFFER HEADER
OPEN INDEV,T1 ;OPEN FILE
USEROR Can't OPEN the input device
SKIPE T1,NAME ;GET FILE NAME
JRST .+3
MOVE T1,['PDPXI0'] ;DEFAULT
ADD T1,A.PORT ;MAKE DEFAULT NAME INCLUDE PORT#
SKIPN T2,EXT ;GET EXTENSION
HRLZI T2,'BIN' ;DEFAULT
TRZ T2,-1 ;CLEAR NULL FLAG
RELOOK: MOVEI T3,0 ;CLEAR WORD
MOVE T4,DIRECT ;GET DIRECTORY
LOOKUP INDEV,T1 ;LOOKUP FILE
JRST [SKIPE EXT ;CHECK ARGUMENT
TLZ T2,-1 ;ALL DONE IF NON-ZERO
TLZE T2,-1 ;SEE IF DEFAULT EXT AND NO DOT
JUMPE T2,RELOOK ;YES--IF NOT FOUND TRY NULL EXT.
USEROR LOOKUP failed
]
MOVEM T1,LODFIL+ERFSFN;SAVE THE FILE NAME
HLLZM T2,LODFIL+ERFSEX; AND THE EXTENSION
MOVEI T1,INDEV ;GET THE CHANNEL NUMBER
MOVEM T1,LODFIL+ERFSDV; AND PUT IT WHERE "PATH." CAN FIND IT
MOVE T1,[XWD ERFSLN-ERFSDV,LODFIL+ERFSDV] ;SET UP AND
PATH. T1, ; DO THE UUO TO READ THE PATH
WARNCR PATH. UUO to read input file failed.
INBUF INDEV,0 ;SET UP SOME BUFFERS
STRTLD: PUSHJ P,STRTUP ;GO START UP -11
SKIPL A.CLR ;SEE IF /CLEAR
JRST [PUSHJ P,CLEAR ;YES--GO DO IT
SKIPGE A.LOAD ;SEE IF /LOAD
SKIPL A.STRT ; OR IF /START
JRST .+1 ;YES--GO DO IT
PUSHJ P,HALTIT ;STOP -11 PORT
JRST START] ;NO--GO ASK ABOUT FILE
TELL <PDP-11 loading from file: >
MOVEI T1,LODFIL ;GET THE ADDRESS OF THE FILE SPEC
PUSHJ P,TYPFIL ; AND APPEND IT TO THE MESSAGE
PUSHJ P,TYPCRL ;CLOSE THE MESSAGE WITH A CRLF
SETOM FB ;PRESET FILE BYTE POSITION
;BACK HERE FOR EACH GROUP OF DATA
LDGRPL: PUSHJ P,GETBYT ;GET BYTE
ERROR EOF at start of file group
JUMPE BYTE,LDGRPL ;LOOP THROUGH NULLS
CAIN BYTE,377 ;DISCARD DELETES
JRST LDGRPL ; ..
CAIE BYTE,1 ;VERIFY CONSTANT 1
ERROR File group has junk instead of constant 1
MOVEM BYTE,CHKSUM ;INITIALIZE CHECKSUM
PUSHJ P,GETBYT ;GET BYTE
ERROR EOF after file constant 1
SKIPE BYTE ;VERIFY CONSTANT 0
ERROR file group has junk instead of constant 0
PUSHJ P,GETWRD ;GET WORD
SKIPGE A.IMAG ;SEE IF IMAGE MODE
SKIPE T1 ;NO--SEE IF 0
JRST LDGRP2 ;OK
WARNCR File zero byte count--trying again in /IMAGE mode
PUSHJ P,HALTIT ;STOP -11
SETZM A.IMAG ;SET /IMAGE SWITCH
JRST START6 ;START AGAIN BUT NO COMMAND SCANNING
LDGRP2: MOVEI BC,-6(T1) ;GET DATA BYTE COUNT
SKIPGE BC ;SEE IF ACCEPTABLE
ERROR File group byte count less than 6
PUSHJ P,GETWRD ;GET WORD
MOVEM T1,ADDRES ;SAVE AS STARTING ADDRESS
JUMPE BC,THATAL ;JUMP IF THIS IS THE START BLOCK
;LOOP GETTING DATA AND TRANSFERRING IT TO THE -11
LDDATL: MOVEI P1,20 ;DO 20 BYTES (10 WORDS)
CAIGE BC,20 ;MAKE SURE FILE HAS THAT MANY
MOVE P1,BC ;NO--USE WHAT IS IN FILE
MOVE P2,P1 ;SET COUNT FOR FETCH
MOVE T1,ADDRES ;GET STARTING ADDRESS
MOVEM T1,BLOADR(RB) ;TELL -11 PROGRAM
MOVEM P1,BLOCNT(RB) ;TELL -11 NUMBER OF BYTES
MOVE BA,[POINT 8,BLODAT(RB),35] ;POINT TO DATA AREA
PUSHJ P,CLRTRA ;CLEAR TRANSFER AREA
;LOOP FILLING BUFFER FOR ONE TRANSFER TO THE -11
LDDATM: PUSHJ P,GETBYT ;GET BYTE
ERROR EOF during data in file group
DPB BYTE,BA ;STUFF INTO BUFFER
TLCE BA,(POINT 0,0,27) ;SWITCH BYTES
AOS BA ;ADVANCE WORD EVERY TWO
SOJG P2,LDDATM ;LOOP FILLING BUFFER
MOVE T1,ADDRES ;GET STARTING ADDRESS
CAIL T1,10 ;SEE IF BELOW 4/6 AREA
JRST LDDOIT ;NO--OK TO PROCEED
ADDI T1,-4(P1) ;SEE IF END IS BELOW 4/6 AREA
JUMPL T1,LDDOIT ;JUMP IF YES
;HERE WHEN LOAD OVERLAPS 4/6 AREA--MUST PROTECT AND SAVE THIS
;AND CLEAN UP 4 AND 6 AT THE END
MOVN T1,T1 ;COMPLEMENT OVERLAP
ADDB T1,BLOCNT(RB) ;COMPUTE OK LENGTH BELOW 4
JUMPLE T1,SAVE46 ;NONE--GO SAVE 4/6
WAITON ;YES--TRANSFER THAT MUCH
SAVE46: MOVE BA,[POINT 8,BLODAT(RB),35]
MOVE T1,ADDRES ;GET ADDRESS OF FIRST BYTE IN AREA
HRRZI T2,(P1) ;GET COUNT OF BUFFER
SAVELP: LDB T3,BA ;GET THIS BYTE
CAIN T1,4 ;SEE IF 4
DPB T3,[POINT 8,CORE.4,35]
CAIN T1,5 ;SEE IF 5
DPB T3,[POINT 8,CORE.4,27]
CAIN T1,6 ;SEE IF 6
DPB T3,[POINT 8,CORE.6,35]
CAIN T1,7 ;SEE IF 7
DPB T3,[POINT 8,CORE.6,27]
TLCE BA,(POINT 0,0,27) ;SWITCH BYTES
AOS BA ;ADVANCE WORD EVERY TWO
AOS T1 ;ADVANCE ADDRESS
SOJG T2,SAVELP ;LOOP UNTIL DONE
;NOTE THAT 7 CAN BE CLOBERRED BY 0
;SINCE LOAD LOOP HAS 0 THERE
MOVEI T1,10 ;FIRST GOOD ADDRESS IS 10
SUB T1,ADDRES ;LENGTH OF PROBLEM
LSH T1,-1 ;DITTO IN -10 WORDS
MOVEI T2,(P1) ;GET OLD BYTE COUNT
SUB T2,T1 ;DECREASE
SUB T2,T1 ; TO NEW VALUE
JUMPLE T2,LDIDIT ;JUMP IF NONE ABOVE 7
MOVEM T2,BLOCNT(RB) ;TELL -11 HOW FAR TO GO
JUMPE T1,LDNOBL ;IF STARTED AT 7, THEN NO BLT
MOVEI T2,BLODAT(RB) ;GET TARGET OF BLT
ADD T2,T1 ;GET START
MOVSS T2 ;SETUP BLT
HRRI T2,BLODAT(RB) ;SET TARGET
BLT T2,BLODAT+6(RB) ;TRANSFER DATA
LDNOBL: MOVE T2,ADDRES ;GET ORIGINAL ADDRESS
ADD T2,T1 ;ADVANCE TO
ADD T2,T1 ; NEW ONE
MOVEM T2,BLOADR(RB) ;TELL -11
MOVEI T3,0 ;GET A ZERO
CAIN T2,7 ;IF STARTS AT 7,
DPB T3,[POINT 8,BLODAT(RB),27] ; CLEAR OUT 7
LDDOIT: WAITON ;HAVE -11 TRANSFER IT
SKIPE NXMADR(RB) ;SEE IF NXM IN -11
ERROR NXM in -11 memory
LDIDIT: MOVEI T1,20 ;ADVANCE ADDRESS
ADDM T1,ADDRES ; ..
SUBI BC,20 ;DECREMENT COUNT TO GO
JUMPG BC,LDDATL ;LOOP UNTIL DONE
PUSHJ P,GETCHK ;VERIFY CHECKSUM
JRST LDGRPL ;GO LOOK FOR NEXT GROUP
THATAL: PUSHJ P,GETCHK ;VERIFY CHECKSUM
MOVEI T1,^D10 ;TAPE SHOULD HAVE AT LEAST 10 TRAILING NULLS
SKPEND: SOJL T1,LDDONE ;IF 10 NULLS THERE, TAPE END IS OK
PUSHJ P,GETBYT ;GET NEXT BYTE
JRST LDDONE ;EOF IS OK
JUMPE BYTE,SKPEND ;SKIP TRAILING NULLS
ERROR Junk after start group
LDDONE: MOVE T1,CORE.4 ;GET NEW CONTENTS OF 4
MOVEM T1,BLODAT(RB) ;GIVE TO -11
MOVE T1,CORE.6 ;GET NEW CONTENTS OF 6
MOVEM T1,BLODAT+1(RB) ;GIVE TO -11
MOVEI T1,4 ;GET CONSTANT
MOVEM T1,BLOADR(RB) ;SET START ADDRESS
MOVEM T1,BLOCNT(RB) ;SET DISTANCE
WAITON
SKIPGE T2,A.STRT ;SEE IF /START
MOVE T2,A.LOAD ;NO--TRY /LOAD
SKIPG T2 ;UNLESS NON-ZERO ARG
MOVE T2,ADDRES ; USE FILE ADDRESS
GSTS11 T1 ;GET MEMORY STATUS
TDNE T1,OK... ;SEE IF OK
TRO T2,1 ;NO--SET TO HALT
MOVEI T1,137 ;SET JUMP @(PC)+
TRZN T2,1 ;MAKE IT EVEN
SKIPL A.LOAD ;SEE IF /LOAD
MOVEI T1,0 ;OR IF WAS ODD, FORCE HALT
MOVEM T2,BLOADR(RB) ;STORE START ADDRESS
MOVE P1,T1 ;SAVE FLAG
PUSHJ P,STOPIT ;GO STOP OR STARTUP -11 PROGRAM
SKIPN P1 ;SEE IF HALT
TELLCR PDP-11 loaded
SKIPE P1 ;OR IF JMP
TELLCR PDP-11 started
CLOSE INDEV, ;CLOSE INPUT FILE
RELEAS INDEV, ;RELEASE IT
PUSHJ P,ERRLOA ;DO DAEMON. TO LOG THE RELOAD
JRST GOHOME ;GO BACK TO MONITOR
SUBTTL LOADER SUBROUTINES
;ROUTINE TO GET AND VERIFY CHECKSUM
GETCHK: PUSHJ P,GETBYT ;GET CHECKSUM
ERROR EOF found when looking for checksum
MOVE T1,CHKSUM ;GET RESULT
TRNN T1,377 ;SEE IF OK
RETURN ;YES
ERROR Checksum failure
;ROUTINE TO GET ONE -11 WORD INTO T1
GETWRD: PUSHJ P,GETBYT ;GET RH BYTE
ERROR EOF during first byte of a word
PUSH P,BYTE ;SAVE AWAY
PUSHJ P,GETBYT ;GET LH BYTE
ERROR EOF during second byte of a word
MOVE T1,BYTE ;MOVE TO ANSWER
LSH T1,8 ;POSITION LH BYTE
IOR T1,(P) ;INCLUDE RH BYTE
POP P,(P) ;DISCARD SAVED BYTE
RETURN
;ROUTINE TO GET ONE -11 BYTE FROM FILE INTO BYTE
GETBYT: SKIPL A.IMAG ;SEE IF /IMAGE MODE
JRST GETBYW ;YES--GET NEXT WORD
AOS FB ;ADVANCE FILE BYTE
ANDI FB,3 ; (MOD 4)
JUMPN FB,GETBYC ;IF NOT NEW WORD, JUST FETCH BYTE
GETBYW: SOSL INHDR+2 ;COUNT DOWN WORDS
JRST GETBYA ;STILL SOME THERE SO PROCEED
IN INDEV, ;NO--GET NEXT BUFFER
JRST GETBYW ;OK--GO TRY AGAIN
STATZ INDEV,740000 ;SEE IF ERROR
ERROR Input file read error
RETURN
GETBYA: AOS INHDR+1 ;ADVANCE TO NEXT WORD
MOVE BYTE,@INHDR+1 ;GET WORD
SKIPL A.IMAG ;SEE IF /IMAGE
JRST GETBYI ;YES--GO GET IMAGE WORD
TLNN BYTE,(6B2) ;NO--TEST FOR NO JUNK
TRNE BYTE,6B20 ; IN EITHER HALF
ERROR Junk bits in input file
GETBYC: LDB BYTE,PTRTAB(FB) ;GET BYTE
JRST GETBYR ;GO RETURN DATA
GETBYI: TDNE BYTE,[-1-377] ;SEE IF ANY JUNK
ERROR Junk in input file--may not be /IMAGE mode
GETBYR: ADDM BYTE,CHKSUM ;ACCUMULATE IN CHECKSUM
AOS (P) ;SKIP RETURN
RETRET: RETURN
PTRTAB: POINT 8,@INHDR+1,17
POINT 8,@INHDR+1,9
POINT 8,@INHDR+1,35
POINT 8,@INHDR+1,27
SUBTTL DUMP ROUTINE
DODUMP: SKIPGE A.LOAD ;SEE IF /LOAD
SKIPL A.STRT ;OR IF /START
USEROR Can't /LOAD and /DUMP at the same time
SKIPL A.CLR ;SEE IF /CLEAR
USEROR Can't /CLEAR and /DUMP at the same time
MOVEI T1,OUMODE ;SET OUTPUT MODE
SKIPN T2,DEV ;GET DEVICE
MOVSI T2,'DSK' ;DEFAULT TO DISK
MOVSI T3,OUTHDR ;POINT TO BUFFER HEADER
OPEN OUTDEV,T1 ;OPEN FILE
USEROR Can't OPEN the output device
SKIPE T1,NAME ;GET FILE NAME
JRST .+3
MOVE T1,['PDPXI0'] ;DEFAULT
ADD T1,A.PORT ;MAKE DEFAULT NAME INCLUDE PORT#
SKIPN T2,EXT ;GET EXTENSION
HRLZI T2,'LSD' ;DEFAULT
TRZ T2,-1 ;CLEAR NULL FLAG
MOVEI T3,0 ;CLEAR PROTECTION, ETC.
MOVE T4,DIRECT ;GET DIRECTORY
ENTER OUTDEV,T1 ;ENTER FILE
USEROR ENTER failed
MOVEM T1,DMPFIL+ERFSFN;SAVE THE FILE NAME
HLLZM T2,DMPFIL+ERFSEX; AND THE EXTENSION
MOVEI T1,OUTDEV ;GET THE CHANNEL NUMBER
MOVEM T1,DMPFIL+ERFSDV; AND PUT IT WHERE "PATH." CAN FIND IT
MOVE T1,[XWD ERFSLN-ERFSDV,DMPFIL+ERFSDV] ;SET UP AND
PATH. T1, ; DO THE PATH. TO READ THE FILESPEC
WARNCR PATH. UUO to read dump file-spec failed.
OUTBUF OUTDEV,0 ;SET DEFAULT BUFFERS
;ACCUMULATE HEADING DATA
STRTDM: MOVE T1,[POINT 7,HEADER]
MOVEM T1,HEDPNT ;INIT POINTER FOR HEADER MSG
PUSHJ P,HEDTXT
ASCIZ /PDP-11 #/
MOVE T1,A.PORT ;GET PORT NUMBER
PUSHJ P,HEDDIG ; AND PRINT
PUSHJ P,HEDTXT
ASCIZ / dump by BOOT11 /
LDB T1,[POINT 9,.JBVER##,11]
PUSHJ P,HEDOCT ;PRINT VERSION NUMBER
LDB T1,[POINT 6,.JBVER,17] ;GET MINOR VERSION #
JUMPE T1,DMHDV1 ;JUMP IF NONE
SUBI T1,1 ;FAKE OUT DIVIDE
IDIVI T1,^D26 ;GET LAST LETTER
JUMPE T1,DMHDV0 ;JUMP IF ONLY 1 LETTER
ADDI T1,"A"-1 ;CONVERT 1ST LETTER
PUSHJ P,HEDCHR
DMHDV0: MOVEI T1,"A"(T2)
PUSHJ P,HEDCHR ;OUTPUT LAST LETTER
DMHDV1: HRRZ T1,.JBVER ;GET EDIT NUMBER
JUMPE T1,DMHDV2 ;JUMP IF ZERO
MOVEI T1,"("
PUSHJ P,HEDCHR
HRRZ T1,.JBVER
PUSHJ P,HEDOCT
MOVEI T1,")"
PUSHJ P,HEDCHR ;FINISH "(EDIT NUMBER)"
DMHDV2: LDB T1,[POINT 3,.JBVER,2] ;GET "WHO MADE EDIT"
JUMPE T1,DMHDV3 ;JUMP IF DIGITAL DID
MOVEI T1,"-"
PUSHJ P,HEDCHR
XCT DMHDV2 ;GET "WHO" BACK
PUSHJ P,HEDDIG ; AND PRINT
DMHDV3: MOVEI T1,11 ;HORIZONTAL TAB
PUSHJ P,HEDCHR
MSTIME T1, ;GET TIME OF DAY (MILLESECONDS)
IDIVI T1,^D60000 ;GET MINUTES
IDIVI T1,^D60 ;GET HOURS
PUSH P,T2 ;SAVE REMAINDER AS MINUTES
PUSHJ P,HEDDEC ;PRINT QUOTIENT AS HOURS
MOVEI T1,":"
PUSHJ P,HEDCHR ;PRINT COLON
POP P,T1 ;GET MINUTES BACK
PUSHJ P,HEDDEC ; AND PRINT
MOVEI T1,11
PUSHJ P,HEDCHR ;PRINT TAB
DATE T1,
IDIVI T1,^D31*^D12 ;YEAR GOES TO T1
ADDI T1,^D64 ;ADD IN BASE YEAR
IDIVI T2,^D31 ;T2 GETS MONTH, T3 GETS DAY
PUSH P,T1 ;SAVE YEAR
PUSH P,[ASCII /JAN/
ASCII /FEB/
ASCII /MARCH/
ASCII /APRIL/
ASCII /MAY/
ASCII /JUNE/
ASCII /JULY/
ASCII /AUG/
ASCII /SEPT/
ASCII /OCT/
ASCII /NOV/
ASCII /DEC/](T2)
MOVEI T1,1(T3) ;GET DAY
PUSHJ P,HEDDEC ; AND PRINT
MOVEI T1,"-"
PUSHJ P,HEDCHR
POP P,T1 ;GET MONTH
PUSHJ P,HED7 ; AND PRINT
MOVEI T1,"-"
PUSHJ P,HEDCHR
POP P,T1
PUSHJ P,HEDDEC ;PRINT YEAR
MOVE T1,[20,,11] ;GET SYSTEM
GETTAB T1, ; SERIAL NUMBER
MOVEI T1,0 ;UNKNOWN
SKIPLE T1 ;SEE IF OK
CAILE T1,^D9999 ;[43] MAXIMUM PRINTABLE SERIAL NUMBER IN HEADING
JRST DMHDV5 ;SYSTEM NUMBER BAD
PUSH P,T1 ;SAVE NUMBER
PUSHJ P,HEDTXT
ASCIZ / System / ;[43]
POP P,T1
PUSHJ P,HEDDEC ;PRINT SYSTEM NUMBER
DMHDV5: MOVSI T1,(ASCII / /)
PUSHJ P,HED7 ;PRINT SPACES
MOVSI T4,-5 ;SET HEADER COUNT
DMHDV6: MOVEI T1,11 ;POINT TO TABLE
HRL T1,T4 ;POINT TO ENTRY
GETTAB T1, ;GET SYSTEM HEADER LINE
MOVEI T1,0 ;UNKNOWN
PUSHJ P,HED7 ;PRINT TEXT
AOBJN T4,DMHDV6 ;LOOP UNTIL DONE
MOVEI T1,0
PUSHJ P,HEDCHR ;STUFF NULL IN AT END OF HEADER
PUSHJ P,LHEAD ;GO LIST HEADER
PUSHJ P,STRTUP ;GO START UP -11
TELL <PDP-11 dumping to file: >
MOVEI T1,DMPFIL ;GET THE FILESPEC
PUSHJ P,TYPFIL ; AND PRINT IT OUT
PUSHJ P,TYPCRL ;CLOSE OFF WITH A CRLF
;DUMP AC'S 4 PER LINE
MOVSI P3,-7 ;DUMP SEVEN AC'S
DMLPAC: PUSHJ P,LTAB ;SPACE OVER
MOVEI T1,"R" ;LABEL AS
PUSHJ P,LCHAR ; REGISTER
MOVEI T1,"0"(P3) ;NUMBER REGISTER
PUSHJ P,LCHAR ; IN LISTING
MOVEI T1,[ASCIZ /: /]
PUSHJ P,LSTRG ;LIST PREFIX
MOVEI T1,BLODAT(RB) ;GET START OF TRANSFER AREA
ADDI T1,(P3) ;ADD AC NUMBER
MOVE T1,(T1) ;GET AC CONTENTS
PUSHJ P,L6OCT ;LIST IT
MOVEI T1,-3(P3) ;SEE IF DONE WITH FIRST 4
JUMPN T1,.+2 ;NO--PROCEED
PUSHJ P,LCRLF2 ;YES--NEW LINE
AOBJN P3,DMLPAC ;LOOP FOR ALL AC'S WHICH WORK
PUSHJ P,LCRLF2 ;BLANK LINES
PUSHJ P,LCRLF2 ;AND MORE
MOVE T1,BLOCNT(RB) ;GET CORE 4
MOVEM T1,CORE.4 ;SAVE FOR LATER
MOVE T1,BLOADR(RB) ;GET CORE 6
MOVEM T1,CORE.6 ;SAVE FOR LATER
;DUMP CORE 10-WORDS PER LINE
SKIPGE P1,A.DUMP ;GET STARTING ADDRESS
MOVEI P1,V.DUMP ;DEFAULT
TRZ P1,17 ;ROUND DOWN TO EVEN 10-WORDS
SKIPGE P2,A.END ;GET ENDING ADDRESS
MOVEI P2,V.END ;DEFAULT
SUBI P2,1 ;STOP BEFORE GETTING THERE
TRO P2,17 ; BUT ROUND UP THE EVEN 10-WORDS
MOVEI P4,0 ;SET INITIAL LINE POSITION
;BACK HERE FOR LOOP BY 10-WORD HUNKS
DMLOOP: CAML P1,P2 ;SEE IF DONE YET
JRST DMDONE ;YES--GO BIND OFF OUTPUT
SKIPN LASZER ;SKIP LINE COUNT IF 0 LINES
AOS P4 ;ADVANCE LINE
CAIG P4,^D22 ;SEE IF DONE WITH THIS PAGE
JRST DMNOHD ;NO NEED FOR HEADER
MOVEI T1,14 ;ISSUE FORM FEED
PUSHJ P,LCHAR ; TO LISTING
PUSHJ P,LHEAD ;ISSUE HEADER
MOVEI P4,0 ;CLEAR LINE COUNT
DMNOHD: MOVNI T1,20 ;TRANSFER 20 BYTES (10 WORDS)
MOVEM T1,BLOCNT(RB) ;FROM THE -11 CORE
MOVEM P1,BLOADR(RB) ;STARTING AT START ADDRESS
PUSHJ P,CLRTRA ;CLEAR TRANSFER AREA
WAITON ;WAIT FOR -11 TO READ ITS CORE
SKIPE NXMADR(RB) ;SEE IF END OF CORE
JRST DMNXM ;YES--GO HANDLE IT
JUMPN P1,DMSEEZ ;SEE IF FIRST GROUP
MOVE T1,CORE.4 ;YES--GET REAL 4/5
MOVEM T1,BLODAT+2(RB) ;SET WHERE -11 WOULD HAVE
MOVE T1,CORE.6 ;GET REAL 6/7
MOVEM T1,BLODAT+3(RB) ;SET WHERE -11 WOULD HAVE
DMSEEZ: MOVSI P3,-10 ;SEE IF ALL 0
HRR P3,RB ;RELOCATE
SKIPN BLODAT(P3) ;CHECK DATA
AOBJN P3,.-1 ;LOOP FOR AREA
JUMPGE P3,DMZERO ;JUMP IF ALL ZERO
PUSHJ P,DMZRLN ;NO--CLEAN OFF PREVIOUS ONE
SETZM LASZER ;CLEAR ZERO'S BEING SKIPPED
MOVEI T1,20(P1) ;GET START OF NEXT LINE
MOVEM T1,FIRZER ;SET AS FIRST POSSIBLE ZERO
MOVE T1,P1 ;GET STARTING ADDRESS
PUSHJ P,L6OCT ;LIST IT
MOVEI T1,":" ;FLAG AS ADDRESS
PUSHJ P,LCHAR ;IN LISTING
MOVSI P3,-10 ;SET FOR 10-WORDS
DMLP1: PUSHJ P,LTAB ;SPACE OVER
MOVEI T1,BLODAT(RB) ;GET LOCATION OF TRANSFER AREA
ADDI T1,(P3) ;POINT TO CORRECT WORD
MOVE T1,(T1) ;GET WORD
PUSHJ P,L6OCT ;LIST IT
MOVEI T1,-3(P3) ;SEE IF DONE WITH 4 WORDS YET
JUMPN T1,.+2 ;NO--PROCEED
PUSHJ P,LTAB ;YES--ONE EXTRA TAB
AOBJN P3,DMLP1 ;LOOP FOR THIS LINE
PUSHJ P,LCRLF2 ;END 2 LINES
JRST DMGOLP ;GO AROUND LOOP
DMZERO: MOVEI T1,16(P1) ;SET POSSIBLE END OF ZERO BLOCK
MOVEM T1,LASZER ;FOR DUMP
DMGOLP: ADDI P1,20 ;ADVANCE 20 BYTES (10 WORDS)
JRST DMLOOP ;LOOP UNTIL DONE
;HERE WHEN NXM IN -11 MEMORY
DMNXM: PUSHJ P,DMZRLN ;ISSUE FINAL ZERO LINE
SETZM LASZER ;CLEAR FINAL ZERO
MOVEI T1,[ASCIZ / NXM at /]
PUSHJ P,LSTRG ;LIST HEADER
SOS T1,NXMADR(RB) ;GET BAD ADDRESS
PUSHJ P,L6OCT ;LIST IT
PUSHJ P,LCRLF2 ;END LINE
DMDONE: PUSHJ P,DMZRLN ;CLEAR OUT FINAL ZEROS
PUSHJ P,HALTIT ;STOP -11
TELLCR PDP-11 dumped
CLOSE OUTDEV, ;CLOSE FILE
RELEAS OUTDEV, ;RELEASE IT
PUSHJ P,ERRDMP ;CALL DAEMON TO LOG THE DUMP.
JRST GOHOME ;AND FINISH WORK
SUBTTL DUMP SUBROUTINES
;LIST ZERO LINE IF ANY
DMZRLN: SKIPN LASZER ;SEE IF ANYTHING
RETURN ;NO--GIVE UP
PUSHJ P,LTAB ;YES--SPACE OVER
PUSHJ P,LTAB
MOVE T1,LASZER ;GET END
SUB T1,FIRZER ;GET LENGTH-2
ADDI T1,2 ;GET LENGTH IN BYTES
LSH T1,-1 ;CONVERT TO WORDS
PUSHJ P,L6OCT ;LIST THAT
MOVEI T1,[ASCIZ / words from /]
PUSHJ P,LSTRG ;LIST TITLE
MOVE T1,FIRZER ;GET START
PUSHJ P,L6OCT ;LIST
MOVEI T1,[ASCIZ / to /]
PUSHJ P,LSTRG ;LIST TITLE
MOVE T1,LASZER ;GET END POINT
PUSHJ P,L6OCT ;LIST
MOVEI T1,[ASCIZ / are all zero
/]
JRST LSTRG ;LIST AND RETURN
;LIST 6 DIGITS IN OCTAL
L6OCT: LSHC T1,-^D18 ;POSITION NUMBER
MOVEI T3,6 ;SET DIGIT COUNTER
L6OCTL: MOVEI T1,0 ;CLEAR ACCUMULATOR
LSHC T1,3 ;GET DIGIT
ADDI T1,"0" ;CONVERT TO ASCII
PUSHJ P,LCHAR ;LIST IT
SOJG T3,L6OCTL ;LOOP UNTIL DONE
RETURN
;LIST HEADING
LHEAD: MOVEI T1,HEADER ;GET HEADER
PUSHJ P,LSTRG ;LIST IT
;FALL INTO LCRLF2
;LIST END OF LINE AND A BLANK LINE
LCRLF2: MOVEI T1,[ASCIZ /
/]
;FALL INTO LSTRG
;LIST ASCIZ STRING
LSTRG: MOVE T2,T1 ;GET POINTER
HRLI T2,(POINT 7) ;SET ASCII POINTER
LSTRGL: ILDB T1,T2 ;GET CHARACTER
JUMPE T1,RETRET ;RETURN IF DONE
PUSHJ P,LCHAR ;ELSE LIST IT
JRST LSTRGL ;LOOP UNTIL DONE
;LIST TAB
LTAB: MOVEI T1,11 ;GET TAB
;FALL INTO LCHAR
;LIST CHARACTER
LCHAR: SOSG OUTHDR+2 ;COUNT CHARACTER IN BUFFER
JRST LCHARB ;NO ROOM--GO MAKE SOME
LCHARL: IDPB T1,OUTHDR+1 ;OK--STORE CHARACTER
RETURN
LCHARB: OUT OUTDEV, ;OUTPUT DATA BUFFER
JRST LCHARL ;AND NOW GO DO CHARACTER
ERROR Output device error
SUBTTL -11 HANDLER SUBROUTINES
;ROUTINE TO COMPUTE I/O CODES AS FUNCTION OF /PORTNO:P
SETCOD: MOVE P2,A.PORT ;GET /PORTNO
CAILE P2,7 ;KEEP IN RANGE
USEROR Port number must be 0-7
IDIVI P2,4 ;SPLIT INTO -11 AND DL NUMBERS
MOVE P1,[CONO DLB,
CONO DLB2,](P2)
MOVE P2,[CONI DLC,
CONI DLC2,](P2)
MOVE P4,P3 ;GET PORT
IMULI P4,3 ; *3
;IN THIS ROUTINE:
; P1=I/O INSTR ON DLB
; P2=I/O INSTR ON DLC
; P3=-11 NUMBER
; P4=3*-11 NUMBER (FOR LSH)
MOVEM P2,GTPI. ;GET PI ASSIGNMENT
SUB P2,[<CONI>-<CONO>] ;SWITCH TO CONO
MOVEI T1,1B31 ;ENABLE
LSH T1,(P4) ;SELECT -11
IOR T1,P2 ;DLC
MOVEM T1,DSAB. ;DISABLE -11
TRO T1,1B20 ;TURN ON
MOVEM T1,ENBL. ;ENABLE -11
MOVEI T1,7B32 ;INTERRUPTS AND ENABLE
LSH T1,(P4) ;SELECT -11
IOR T1,P2 ;DLC
MOVEM T1,CLRA. ;CLEAR CONO
MOVEI T1,<WINDOW/1K>B33(P3) ;WINDOW SIZE AND WHICH -11
IOR T1,P1 ;DLB
MOVEM T1,BASE. ;SET BASE ADDRESS
SUB P2,[<CONO>-<DATAO>] ;SWITCH TO DATAO
MOVEI T1,CLRB.. ;POINT TO DATUM
IOR T1,P2 ;DLC
MOVEM T1,CLRB. ;CLEAR DATAO
MOVEI T1,STRT.. ;POINT TO DATUM
IOR T1,P2 ;DLC
MOVEM T1,STRT. ;START -11
MOVEI T1,STOP.. ;POINT TO DATUM
IOR T1,P2 ;DLC
MOVEM T1,STOP. ;STOP -11
MOVSI T1,(7B14) ;CLEAR ERRORS
LSH T1,(P4) ;SELECT -11
MOVEM T1,OK... ;SAVE FOR TESTS
TLO T1,(1B0) ;ACTIVATE THE CLEAR
MOVEM T1,CLRB.. ;SAVE DATUM
MOVEI T1,1B31 ;START BIT
LSH T1,(P4) ;SELECT -11
MOVEM T1,RN... ;SAVE FOR TESTS
MOVEM T1,STRT.. ;SAVE DATUM
LSH T1,1 ;STOP BIT (SELECTED)
MOVEM T1,STOP.. ;SAVE DATUM
SUB P2,[<DATAO>-<DATAI>] ;SWITCH TO DATAI
MOVEM P2,GSTS. ;SAVE AS GET STATUS
MOVEI T1,5B32 ;EXIST AND POWER BITS
LSH T1,(P4) ;SELECT CORRECT -11
MOVEM T1,UP... ;SAVE FOR TESTS
RETURN
;ROUTINE TO START -11
SP.CR0==1 ;[35] SPECIFY CPU 0
.STCPU==14 ;[35] SET CPU
STRTUP: MOVE T1,[.STCPU,,SP.CR0] ;[35] RUN ON CPU0
SETUUO T1, ;[35] ASK FOR IT
JFCL ;[35] AND IGNORE A FAILURE
HRRZ RB,.JBFF## ;GET FREE CORE FOR -11 BUFFER
ADDI RB,WINDOW ;ROUND UP TO
TRZ RB,WINDOW ; MULT OF 512 IN CASE 8K OPTION IN -11
MOVEI T1,WINDOW+1000(RB) ;[37]GET END OF SMALLEST 8K AREA
;[37] SO WE CAN GET PHYSICAL 1024
;[37] WORD BOUNDARY ON A KI
MOVEI T4,1(T1) ;GET NEW .JBFF
HRRM T4,.JBFF ;STORE AWAY
CORE T1, ;GET SPACE FROM MONITOR
ERROR Insufficient core
; [37] DELETED 7 INSRTUCTIONS
;**; HRLZ T1,RB ;CLEAR AREA
;**; HRRI T1,1(RB) ; TO PROTECT
;**; SETZM (RB) ; AGAINST SICK
;**; BLT T1,777(RB) ; -11. (0 IS IMMEDIATE)
;**; MOVSI T1,BASEAD ;COPY CLEAN
;**; HRR T1,RB ; -11 CODE
;**; BLT T1,LEN11-1(RB) ; TO AREA
MOVEI T1,CCINT ;SET FOR
HRRM T1,.JBINT## ; ^C TRAP
SETZB T4,CCINTP ;KEEP TIMESHARING ON
TRPSET T4, ; BUT GIVE SELF IOT
ERROR TRPSET failed
MOVEI T4,3 ;[41] AVOID SOME FAILURES (EVM NOT REQUESTED)
LOCK T4, ;[41] NOW LOCK THAT LOW SEGMENT
ERRORC LOCK failure, T4 ;[40] DISPLAY LOCK FAILURE CODE
HRLOI T1,-2 ;[41] TEST FOR KA
AOBJP T1,STRTU1 ;[41] JUMP IF KA
HRROI T1,100 ;[41] SET T1 FOR GETTAB TO FIND UPMP LOCATION
GETTAB T1, ;[41] DETERMINE UPMP LOCATION
ERROR GETTAB 100 to find UPMP failed
HRRZI T4,1(T1) ;[41] NOW DETERMINE JOB'S FIRST PAGE
; [37] INSERTED 9 INSTRUCTIONS
STRTU1: TRNE T4,1 ;[37] IF ON AN ODD PAGE
ADDI RB,1000 ;[37] THEN ADJUST TO EVEN
HRLZ T1,RB ;[37] CLEAR AREA
HRRI T1,1(RB) ;[37] TO PROTECT
SETZM (RB) ;[37] AGAINST SICK
BLT T1,777(RB) ;[37] -11. (0 IS IMMEDIATE)
MOVSI T1,BASEAD ;[37] COPY CLEAN
HRR T1,RB ;[37] -11 CODE
BLT T1,LEN11-1(RB) ;[37] TO AREA
LSH T4,9
MOVEI T4,(T4) ;GET 9 BITS OF ADDRESS
ADDI T4,(RB) ;INCLUDE OFFSET IN THIS PROGRAM
STRPRT: MOVE T1,F.PORT ;[42] CHECK IF DEFAULT PORTNO SPECIFIED
JUMPE T1,STRTU2 ;[42] JUMP IF PORT SPECIFIED (I.E.,F.PORT=0)
;[42] ROUTINE TO CHECK EXISTENCE OF MULTIPLE PDP-11'S
SETZM F0.DL10 ;[42] INITIALIZE EXIST FLAG FOR FIRST DL10
SETZM F1.DL10 ;[42] INITIALIZE EXIST FLAG FOR SECOND DL10
SETZM N.DL10 ;[42] INITIALIZE CURRENT DL10 BEING TESTED
SETZM N.PORT ;[42] INITIALIZE COUNT OF EXISTING -11'S
MOVEM T4,PAGADR ;[42] SAVE T4 FOR CLEAR ROUTINE LATER
STRPR1: MOVEI T3,4B35 ;[42] INITIAL EXIST MASK-OFFSET 3 BITS FROM ORIGIN
SETZ T2, ;[42] NUMBER OF CURRENT PORT BEING TESTED
GSTS11 T4 ;[42] GET DL10 STATUS BITS
JUMPE T4,NODL10 ;[42] JUMP IF DL10 DOES NOT EXIST
STRPR2: LSH T3,3 ;[42] SET MASK TO APPROPRIATE -11 EXIST BIT
TRNE T4,(T3) ;[42] TEST FOR EXIST & SKIP IF DOESN'T
PUSHJ P,EXST11 ;[42] -11 EXISTS
CAIL T2,3 ;[42] SKIP IF NOT LAST PORT ON DL10
JRST DL2CHK ;[42] LAST PORT - GO ON TO CHECK IF SECOND DL10
ADDI T2,1 ;[42] INCREMENT COUNT OF PORTS TESTED
JRST STRPR2 ;[42] CONTINUE TESTING PORTS
EXST11: AOS N.PORT ;[42] INCREMENT COUNT OF EXISTING PORTS
MOVE T1,N.DL10 ;[42] DETERMINE ACTUAL PORTNO (0-7)
IMULI T1,4 ;[42] ADJUST TO ACTUAL PORTNO
ADD T1,T2 ;[42] PUT ACTUAL PORTNO IN T1
MOVE T5,N.PORT ;[42] STORE ACTUAL PORTNO
SUBI T5,1 ;[42] ADJUST T5 SO TABLE OFFSET CORRECT
MOVEM T1,NAMPOR(T5) ;[42] IN TABLE
POPJ P, ;[42] RETURN TO PORT CHECKING
DL2CHK: SKIPE T1,N.DL10 ;[42] CHECK IF THIS IS SECOND DL10
JRST STRPR3 ;[42] YES, ALREADY SECOND
SAVSTS: MOVE T1,GSTS. ;[42] NO, STILL FIRST
MOVEM T1,TSTS. ;[42] SAVE GSTS. WHILE USING LOCATION
MOVE T1,[DATAI DLC2,] ;[42] SET UP FOR SECOND DL10
MOVEM T1,GSTS. ;[42] AND SAVE
AOS N.DL10 ;[42] INCREMENT COUNT OF CURRENT DL10 TO 2
JRST STRPR1 ;[42] GO ON TO SECOND DL10 CHECK
NODL10: SKIPN T1,N.DL10 ;[42] SKIP IF NOT ZERO (I.E.,SECOND DL10)
JRST [SETOM F0.DL10 ;[42] HERE IF FIRST DL10
JRST SAVSTS] ;[42] SET NO DL10 FLAG & CONTINUE
SETOM F1.DL10 ;[42] HERE IF ALREADY SECOND DL10 SO
;[42] SET NODL10 FLAG HERE
STRPR3: MOVE T1,TSTS. ;[42] RESTORE ORGINAL STATUS INFO
MOVEM T1,GSTS. ;[42]
SKIPE T1,N.PORT ;[42] SKIP IF NO PDP-11'S EXIST
JRST STRPR4 ;[42] -11S EXIST ON SOME DL10
SETZ T1, ;[42] INITIALIZE AC FOR COMPARE
SKIPE T1,F0.DL10 ;[42] NO -11S EXIST ON FIRST DL10
TELLCR DL10 No. 1 non-existent ;[42] NO, DL NO. 1 DOESN'T
CAIN T1,0 ;[42] NO. 1 DOESN'T EXIST, SO SKIP
TELLCR No PDP-11s exist on DL10 No. 1 ;[42] EXISTS BUT NO -11S ON DL10 NO. 1
SETZ T1, ;[42] INITIALIZE AC FOR COMPARE
SKIPE T1,F1.DL10 ;[42] CHECK IF DL10 NO. 2 DOES
TELLCR DL10 No. 2 non-existent ;[42] NO, DL NO. 2 DOESN't
CAIN T1,0 ;[42] NO. 2 DOESN'T EXIST, SO SKIP
TELLCR No PDP-11s exist on dl10 no. 2 ;[42] EXISTS BUT NO -11S ON DL10 NO. 2
JRST EXITX ;[42]
STRPR4: MOVEI T1,1 ;[42] SEE IF JUST ONE -11 EXISTS
CAMN T1,N.PORT ;[42]
JRST STRPR6 ;[42] YES, JUST ONE -11
MOVEI T1,0 ;[42] NO, MORE THAN ONE -11
TELLCR PDP-11s exist on ports: ;[42]
STRPR5: MOVE T5,NAMPOR(T1) ;[42] OUTPUT PORTNO'S
ERRCH T5 ;[42]
ADDI T1,1 ;[42]
SOSE N.PORT ;[42] DECREMENT COUNT
JRST STRPR5 ;[42]
OUTSTR [ASCIZ\
\] ;[42] DONE: NOW PUT OUT CR-LF
USEROR PORT SWITCH REQUIRED ;[42] HERE WHEN ALL PORT NO'S OUTPUT
STRPR6: MOVE T1,A.PORT ;[42] THE ONE PDP-11 CASE
CAME T1,NAMPOR ;[42] CONTINUE IF DEFAULT IS ONLY EXIST
ERRORC PDP-11 only exists on port, T1 ;[42]
MOVE T4,PAGADR ;[42] RESTORE T4
STRTU2: STOP11 ;STOP THE PDP-11
MOVEI T3,^D100000 ;SET DEFENSIVE LOOP
STPLP: GSTS11 T2 ;GET -11 STATUS
TDNE T2,RN... ;SEE IF STOPPED YET
SOJGE T3,STPLP ;NO--TRY AGAIN
JUMPGE T3,.+2 ;SEE IF OK
ERROR PDP-11 won't stop
GTPI11 T3 ;GET PI-CHANNEL
ANDI T3,GETPIC ;MASK TO IT ALONE
CLRA11 ((T3)) ;CLEAR CONO
CLRB11 ;CLEAR DATAO
BASE11 ((T4)) ;SET BASE ADDRESS (INC. LOCKED LOCTN)
GSTS11 T1 ;GET DEVICE STATUS
TDC T1,UP... ;TEST FOR EXIST
TDCE T1,UP... ; AND RUN
ERROR PDP-11 absent or power off
GTPI11 ;GET PI-CHANNEL
ANDI T3,GETPIC ;MASK TO IT ALONE
ENBL11 ((T3)) ;ENABLE -11 PORT
STRT11 ;START -11
MOVE T1,[^D10000000] ;[36],[44] SET LOOP COUNT FOR PROTECTION
SKIPE WATFLG(RB) ;IF THE PDP-11 HAS WOKEN UP,
;IT WILL HAVE RESET THIS SWITCH
;OTHERWISE, WAIT FOR IT .... PRIMARILY
SOJGE T1,.-1 ;LOOP UNTIL OK OR DEAD
JUMPGE T1,.+2 ;OK
ERROR PDP-11 won't start--check HALT switch
RETURN
;ROUTINE TO CLEAR 11 UP TO C(A.CLR)-1
CLEAR: TELLCR Clearing PDP-11
PUSHJ P,CLRTRA ;CLEAR TRANSFER AREA
MOVEI P1,20 ;INITIALIZE STORE COUNTER
CLEARL: CAML P1,A.CLR ;SEE IF DONE YET
JRST CLEARD ;DONE--GO CLEAN UP
MOVEM P1,BLOADR(RB) ;TELL -11 WHAT TO CLEAR
MOVE T1,A.CLR ;GET END OF CLEAR
SUB T1,P1 ;COMPUTE DISTANCE TO GO
CAIL T1,20 ;SEE IF MORE THAN 10 WORDS
MOVEI T1,20 ;YES--JUST DO 10
ADD P1,T1 ;ADVANCE DISTANCE DONE
MOVEM T1,BLOCNT(RB) ;TELL -11 HOW MUCH
WAITON ;WAIT TO COMPLETE
SKIPN NXMADR(RB) ;SEE IF OUT OF CORE YET
JRST CLEARL ;LOOP FOR NEXT ONE
CLEARD: SETZM BLOADR(RB) ;AT END GO DO 0-17
MOVE T1,A.CLR ;GET END POINT
CAIL T1,20 ;SEE IF GT 17
MOVEI T1,20 ;YES--SET TO 17
MOVEM T1,BLOCNT(RB) ;TELL -11
WAITON ;DO IT
RETURN
;CLEAR DATA AREA IN TRANSFER BLOCK
CLRTRA: SETZM BLODAT(RB) ;CLEAR FIRST WORD
MOVSI T1,BLODAT(RB) ;POINT TO IT
HRRI T1,BLODAT+1(RB) ; AND NEXT ONE
BLT T1,BLODAT+7(RB) ;GO TO END
RETURN
;WAIT HERE FOR 11 TO ANSWER THAT IT HAS COMPLETED
WAITIN: MOVEI T1,ONES11
MOVEM T1,WATFLG(RB)
MOVE T1,[^D10000000] ;[44] PROTECT AGAINST DEAD 11
SKIPE WATFLG(RB)
SOJGE T1,.-1 ;LOOP UNTIL AWAKE
JUMPGE T1,.+2 ;OK
ERROR PDP-11 took too long in transfer loop
SETZM BLOCNT(RB) ;CLEAR COUNTER
SETZM BLOADR(RB) ;CLEAR ADDRESS
RETURN
;HERE WHEN ERROR AND TIME TO GIVE UP
EXITX: JSP T1,.+1 ;GET PC BITS
TLNE T1,(1B6) ;SEE IF I/O MODE
PUSHJ P,HALTIT ;YES--STOP -11
;HERE TO RETURN TO MONITOR
GOHOME: RESET ;GO RETURN TO MONITOR
HLLZM .JBINT## ;DEACTIVATE ^C INTERCEPT
EXIT 1,
EXIT
;ROUTINES TO STOP -11 AND CHECK FINAL STATUS
HALTIT: MOVEI T1,0 ;SET FOR HALT
STOPIT: MOVEM T1,BLOCNT(RB) ;PLANT HALT OR JMP IN LOADER LISTEN LOOP
AOS WATFLG(RB) ;TELL -11 ABOUT STARTING
ROT T1,^D71 ;WAIT ABOUT 20-30 US
ROT T1,^D71
ROT T1,^D71
GTPI11 T2 ;GET PI-CHANNEL
ANDI T2,GETPIC ;MASK TO IT ALONE
DSAB11 ((T2)) ;DISABLE -11
GSTS11 T1 ;GET FINAL STATUS
TDNE T1,OK... ;SEE IF OK
OUTSTR [ASCIZ \? NXM or parity error in -10 memory
\]
RETURN
SUBTTL COMMAND SCANNER
GETCOM: OUTSTR [ASCIZ /File: /] ;TELL USER WE ARE WAITING
COMLP: PUSHJ P,GETNAM ;GET A SIXBIT NAME
JRST .+2
COMFND: MOVEI T2,0 ;CLEAR NAME
MOVSI T4,-BRKLEN ;LOOK FOR BREAK
HLRZ T3,BRKTAB(T4) ;TRY NEXT BREAK
CAME T1,T3 ;SEE IF MATCH
AOBJN T4,.-2 ;LOOP UNTIL MATCH
HRRZ T3,BRKTAB(T4) ;GET DISPATCH ADDRESS
JRST (T3) ;JUMP TO HANDLE BREAK
BRKTAB: " ",,COMNOP ;SPACE IS A NO-OP
".",,COMEXT ;DOT IS EXTENSION
":",,COMDEV ;COLON IS DEVICE
"[",,COMDIR ;BRAKET IS DIRECTORY
"/",,COMSWT ;SLASH IS SWITCH
12,,SAVNAM ;RETURN AT END OF LINE, AFTER SAVING FILE NAME
32,,GOHOME ;IF ^Z
3,,GOHOME ;IF ^C
BRKLEN==.-BRKTAB
0,,COMERR ;ELSE, MUST BE ERROR
COMERR: USEROR Command error--type /H for help
COMNOP: PUSHJ P,SAVNAM ;STORE FILE NAME
JRST COMLP ;AND GO AROUND AGAIN
COMEXT: PUSHJ P,SAVNAM ;SAVE FILE NAME
PUSHJ P,GETNAM ;GET SIXBIT NAME
HLLOM T2,EXT ;SAVE EXT WITH FLAG FOR DOT
JRST COMFND ;AND GO AROUND AGAIN
COMDEV: MOVEM T2,DEV ;SAVE DEVICE
JRST COMLP ;GO AROUND AGAIN
COMDIR: PUSHJ P,SAVNAM ;SAVE FILE NAME
PUSHJ P,GETOCT ;GET OCTAL NOW
CAIN T1,"-" ;SEE IF DEFAULT
JUMPE T2,[PUSHJ P,GETCHR
JRST COMDIX]
HRLZ T2,T2 ;POSITION IT
SKIPN T2 ;SKIP IF SOMETHING THERE
GETPPN T2, ;NO--GET FROM SYSTEM
JFCL
HLLZM T2,DIRECT ;SAVE FOR LATER
CAIE T1,"," ;VERIFY COMMA
JRST COMERR ;NO--GIVE UP IN DISGUST
PUSHJ P,GETOCT ;GET PROGRAMMER
SKIPN T2 ;SKIP IF SOMETHING THERE
GETPPN T2, ;ELSE ASK MONITOR
JFCL
HRRM T2,DIRECT ;STORE FOR LOOKUP
CAIE T1,"," ;SEE IF SFD COMING
JRST COMDIX ;NO--GO FINISH UP
MOVEI T2,DIRPTH ;YES--SHIFT TO SFD
EXCH T2,DIRECT ; FORMAT
MOVEM T2,DIRPTH+2 ; ..
MOVSI T4,-5 ;MAX SFD COUNT
COMDIL: PUSHJ P,GETNAM ;GET SFD NAME
JUMPE T2,COMERR ;ERROR IF BLANK
MOVEM T2,DIRPTH+3(T4) ;STORE
CAIN T1,"," ;SEE IF MORE
AOBJN T4,COMDIL ;YES--GO GET UNLESS TOO MANY
COMDIX: CAIN T1,"]"
JRST COMLP
CAIN T1,12
JRST COMFND
JRST COMERR
SAVNAM: SKIPE T2 ;IF NAME,
MOVEM T2,NAME ; SAVE FOR LOOKUP
POPJ P, ;RETURN
;HERE WHEN SWITCH TO BE PROCESSED
COMSWT: PUSHJ P,SAVNAM ;SAVE FILE NAME
PUSHJ P,GETNAM ;GET SIXBIT WORD
MOVEI T3,0 ;PRESET MASK
MOVSI T4,770000 ;PRESET CHARACTER
TDNE T2,T4 ;IF CHARACTER,
IOR T3,T4 ; INCLUDE IN MASK
LSH T4,-6 ;MOVE OVER ONE
JUMPN T4,.-3 ;LOOP FOR WORD
SETO T4, ;PRESET SUCCESS COUNTER
MOVSI P1,-SWTLEN ;PRESET LOOP
SWTLOP: CAMN T2,SWTTAB(P1) ;SEE IF EXACT MATCH
JRST SWTWIN ;YES--WIN
MOVE P2,SWTTAB(P1) ;NO--GET WORD
XOR P2,T2 ;COMPARE WITH INPUT
TDNE P2,T3 ;LOOK THROUGH MASK
JRST .+3 ;NO--KEEP TRYING
AOS T4 ;COUNT MATCH
MOVE P3,P1 ;SAVE POINTER
AOBJN P1,SWTLOP ;SEE IF DONE YET
MOVE P1,P3 ;RESTORE WINNER
JUMPE T4,SWTWIN ;SEE IF JUST ONE MATCH
SKIPGE T4
USEROR Unknown switch--type /H for help
USEROR Ambiguous switch--type /H for help
SWTWIN: HLRZ T2,SWTVAL(P1) ;GET DEFAULT VALUE
PUSHJ P,SWTPRT ;[42] GO SEE IF WE ARE DEFAULTING PORTNO
CAIN T1,":" ;SEE IF VALUE TYPED IN
PUSHJ P,GETOCT ;YES--GET OCTAL NUMBER
HRRZ T3,SWTVAL(P1) ;GET ADDRESS OF SWITCH
JUMPE T3,HELP ;NONE--MUST BE /H
MOVEM T2,(T3) ;STORE ANSWER
JRST COMFND ;GO HANDLE BREAK
SWTPRT: MOVE T5,[SIXBIT/PORTNO/] ;[42] CHECK IF PORT SWITCH DEFAULT
CAME T5,SWTTAB(P1) ;[42] BEING PROCESSED
RETURN ;[42] NO, NOT PORTNO: CONTINUE
CAIN T1,":" ;[42] YES, PORTNO- NOW CHECK IF VALUE SUPPLIED
SETZM F.PORT ;[42] VALUE SUPPLIED SO TURN OFF DEFAULT FLAG
RETURN ;[42] CONTIUE PROCESSING SWITCH
SWTTAB: SIXBIT /CLEAR/
SIXBIT /DUMP/
SIXBIT /END/
SIXBIT /HELP/
SIXBIT /IMAGE/
SIXBIT /LOAD/
SIXBIT /PORTNO/
SIXBIT /START/
SIXBIT /NOLOG/
SWTLEN==.-SWTTAB
SWTVAL: V.CLR,,A.CLR ;DEFAULT,,LOCATION
V.DUMP,,A.DUMP
V.END,,A.END
0
0,,A.IMAG
0,,A.LOAD
0,,A.PORT
0,,A.STRT
0,,A.NLOG
;HERE IF /HELP
HELP: CAIN T1,12 ;SEE IF AT END OF LINE YET
JRST HELP1 ;YES--GO DO THE HELP
PUSHJ P,GETCHR ;NO--GET ANOTHER CHAR
JRST HELP ;AND LOOP
HELP1: MOVE 1,['BOOT11']
PUSHJ P,.HELPR##
JRST START
GETNAM: MOVE T3,[POINT 6,T2]
MOVEI T2,0 ;CLEAR NAME
GETNM1: PUSHJ P,GETCHR ;GET NEXT CHAR
CAIL T1,"A"+40 ;SEE IF LC
CAILE T1,"Z"+40
JRST .+2
SUBI T1,40 ;YES--MAKE UC
CAIL T1,"0" ;SEE IF BREAK
CAILE T1,"Z" ; ..
RETURN
CAILE T1,"9" ;OR OK
CAIL T1,"A"
JRST .+2
RETURN
SUBI T1,40 ;CONVERT TO SIXBIT
TLNE T3,770000 ;SEE IF OVERFLOW
IDPB T1,T3 ;STORE RESULT
JRST GETNM1 ;LOOP FOR MORE
GETOCT: MOVEI T2,0 ;CLEAR RESULT
GETOC1: PUSHJ P,GETCHR ;GET NEXT ODGIT
CAIL T1,"0" ;SEE IF
CAILE T1,"7" ; BREAK
RETURN
LSH T2,3 ;MULT BY 8
ADDI T2,-"0"(T1) ;INCLUDE ODGIT
JRST GETOC1 ;LOOP
GETCHR: INCHWL T1 ;GET NEXT CHARACTER
JUMPE T1,GETCHR ;LOOP IF NULL
CAIE T1,177 ;IF RUB
CAIN T1,15 ;OR CR
JRST GETCHR ;LOOP
CAIL T1,175 ;IF ALTERNATE ALT MODE
MOVEI T1,33 ; STANDARDIZE
CAIN T1,33 ;IF ESCAPE
MOVEI T1,12 ; MAKE INTO EOL
CAIE T1,13 ;IF VTAB
CAIN T1,14 ; OR FORM
MOVEI T1,12 ; MAKE INTO LF
CAIN T1,11 ;SEE IF TAB
MOVEI T1," " ;YES, CHANGE TO SPACE
RETURN
SUBTTL HEADER CONSTRUCTION SUBROUTINES
HEDTXT: POP P,T2 ;PRINT STRING, CALLED WITH PUSHJ
HRLI T2,440700 ;CHANGE PC TO BYTE POINTER
HEDTX2: ILDB T1,T2 ;GET NEXT BYTE
JUMPE T1,1(T2) ;RETURN ON 0 CHARACTER
PUSHJ P,HEDCHR ;PRINT CHARACTER
JRST HEDTX2 ;LOOP FOR MORE
HEDOCT: TDZA T3,T3 ;PRINT OCTAL NUMBER, CALLED BY PUSHJ
HEDDEC: MOVEI T3,2 ;PRINT DECIMAL NUM, CALLED BY PUSHJ
MOVE T4,T3 ;FOR DECIMAL NUMS, FORCE 2 DIGITS
HEDNUM: IDIVI T1,10(T3)
HRLM T1+1,(P)
SOSG T4 ;FORCE DIGITS
SKIPE T1
PUSHJ P,HEDNUM
HLRZ T1,(P)
HEDDIG: ADDI T1,"0" ;PRINT DIGIT
HEDCHR: IDPB T1,HEDPNT ;PRINT CHARACTER
POPJ P,
HED7: MOVEI T2,5 ;PRINT 5 ASCII CHARS, CALLED BY PUSHJ
HED7A: ROT T1,7 ;GET NEXT CHARACTER
TRNE T1,177 ;SKIP IF NULL
PUSHJ P,HEDCHR
SOJG T2,HED7A ;LOOP UNTIL 5 PRINTED
POPJ P,
SUBTTL DAEMON -- INTERFACE TO THE DAEMON ERROR-REPORTING ROUTINES
;SYSERR FUNCTIONS 202/203 (DUMP & LOAD)
;THE FORMAT OF THE SYSERR BLOCK IS:
; -2 .DMERR ;DAEMON ERROR REPORT FUNCTION CODE
; -1 "CODE" ;EITHER 202(LOAD) OR 203(DUMP)
; 0 TARGET ;POINTER TO THE NAME OF THE NODE LOADED/DUMPED
; +1 SERVER ;NAME OF THE NODE THAT LOADED/DUMPED THE OTHER
; +2 LINE ;NAME OF THE LINE LOADED/DUMPED
; +3 FILE ;POINTER TO THE FILE LOADED/DUMPED
; +4 RTN-CODE ;VALUE IS THE "NSP" RETURN CODE
; +5 PRG-NAME ;THE NAME OF THE PROGRAM DOING THE LOAD/DUMP
; +6 VALUE ;36 BITS OF "VALUE" RETURNED BY THE PROGRAM
ERRLOA: SKIPA T1,[XWD .ESNDL,LODFIL] ;HERE TO REPORT A DOWN LINE LOAD
ERRDMP: MOVE T1,[XWD .ESNUD,DMPFIL] ;HERE TO REPORT AN UP LINE DUMP
SKIPL A.NLOG ;IF "NOLOG" WAS REQUESTED
RETURN ; THEN DON'T LOG ANYTHING
PUSH P,T1 ;SAVE "XWD DAEMON-CODE,FILE-SPEC-ADDRESS"
;CLEAR THE ERROR BLOCK
SETZM ERRFZR ;CLEAR THE FIRST WORD OF THE ERROR REPORT BLOCK
MOVE T2,[XWD ERRFZR,ERRFZR+1] ;GET A BLT POINTER TO THE BLOCK
BLT T2,ERRLZR ; AND PROPAGATE THE CLEAR
;SET UP A BYTE POINTER TO THE "FREE SPACE" IN THE BLOCK
MOVE P1,[POINT 7,ERRFRE] ;P1 WILL ALWAYS HAVE A 7 BIT BYTE POINTER
HRROI T1,-ERRBLK(P1) ;T1 STARTS WITH A "SYSERR" POINTER.
;DAEMON FUNCTION CODE
MOVEI T2,.DMERR ;DAEMON ERROR REPORT
MOVEM T2,ERRFCN ;STORE THE FUNCTION CODE
;SYSERR FUNCTION CODE
HLRZ T2,(P) ;GET THE CODE OFF THE STACK
MOVEM T2,ERRCOD ; AND STORE IT IN THE BLOCK
;TARGET NODE NAME (WE DON'T KNOW WHAT IT IS...)
MOVEM T1,ERRTRG ;SAVE A POINTER TO THE TARGET NAME
MOVEI T1,[ASCIZ /Not Applicable/]
PUSHJ P,ERRASC ;WRITE THE "NAME"
PUSHJ P,ERRNPT ; AND CLOSE OFF THE FIELD.
;SERVER NODE (TRY SEVERAL WAYS TO GET OUR NAME AND RETURN THAT)
MOVEM T1,ERRSER ;SAVE A POINTER TO WHERE WE WILL PUT THE NAME
MOVSI T1,'CTY' ;ASK WHERE OUR "CTY" IS
WHERE T1, ; AND THAT SHOULD GIVE US OUR NODE NUMBER
JRST ERRLD1 ;IF NO NETWORKS, GO RETURN "SYSNAM" INSTEAD
PUSH P,T1 ;SAVE OUR NODE NUMBER FOR A BIT
MOVE T3,T1 ;COPY THE NODE NUMBER FOR THE NEXT CALL
MOVE T1,[XWD .NDRNN,T2] ;SET UP FOR A NODE. UUO
MOVEI T2,2 ; THAT WILL TRANSLATE THE
NODE. T1, ; NODE NUMBER INTO A SIXBIT NAME
JRST [POP P,(P) ;??? SHOULDN'T HAPPEN. MUST BE A DN60 ONLY SYS.
JRST ERRLD1] ;??? FIXUP STACK AND USE "SYSNAM" INSTEAD.
PUSHJ P,ERRSIX ;WRITE OUT THE SIXBIT NAME
MOVEI T1,"(" ;GET THE OPEN PARENTHESIS
PUSHJ P,ERRCHR ; AND WRITE THAT OUT.
POP P,T1 ;GET OUR NODE NUMBER BACK
PUSHJ P,ERROCT ; AND WRITE THAT
MOVEI T1,")" ;GET THE CLOSING PARENTHESIS
PUSHJ P,ERRCHR ; AND CLOSE OFF THE NODE(NUM) SPEC
JRST ERRLD4 ;GO TO COMMON CODE TO CLOSE OFF THE FIELD.
;HERE IF WE CAN'T GET OUR NODE NAME IN THE "NAME(NNM)" FORM. USE SYSNAM INSTEAD
ERRLD1: MOVEI T1,0 ;START WITH THE FIRST WORD OF "SYSNAM"
ERRLD2: MOVEI T2,.GTCNF ;THE NAME IS IN THE "CONFIGURATION TABLE"
HRLI T2,(T1) ; STARTING AT "%CNFG0"
GETTAB T2, ;GET THE NEXT WORD OF THE NAME
JRST [MOVEI T1,[ASCIZ /Couldn't read system's name./]
JRST ERRLD3] ;WE TRIED. WRITE THIS ERROR MSG INSTEAD.
MOVEM T2,SYSNAM(T1) ;STORE THE NEXT CHAR OF THE NAME
CAIE T1,4 ;IF WE HAVEN'T READ ALL OF THE NAMES YET,
AOJA T1,ERRLD2 ; THEN GO BACK AND GET THE NEXT ONE
MOVEI T1,SYSNAM ;GET THE ADDRESS OF THE SYSTEM NAME
ERRLD3: PUSHJ P,ERRASC ;WRITE THE SYSTEM NAME INTO THE DAEMON MSG
ERRLD4: PUSHJ P,ERRNPT ;GET A "NEW POINTER" FOR THE NEXT FIELD.
;LINE DESIGNATOR (CPU:N, DTE:M)
MOVEM T1,ERRSLD ;SAVE THE POINTER TO THE LINE SPEC
MOVEI T1,[ASCIZ /DL-10 Port:/]
PUSHJ P,ERRASC ;WRITE OUT THE NOISE PART
MOVE T1,A.PORT ;GET THE PORT NUMBER
PUSHJ P,ERRDEC ; AND WRITE OUT THE LAST FIELD.
PUSHJ P,ERRNPT ;GET A "NEW POINTER" TO THE NEXT FIELD
;FILE SPEC LOADED FROM OR DUMPED TO.
MOVEM T1,ERRFIL ;SAVE THE POINTER TO THE ASCII FILE SPEC
POP P,T3 ;GET THE ADDRESS OF THE FILE SPEC BLOCK
HRRZ T1,T3 ;COPY IT FOR ERRFSP
PUSHJ P,ERRFSP ;WRITE THE FILE SPEC INTO THE BLOCK
PUSHJ P,ERRNPT ; AND CLOSE OFF THIS FIELD.
;NSP "RETURN CODE"
MOVEI T2,1 ;"SUCCESS"
MOVEM T2,ERRRTN ;STORE THE CODE
;PROGRAM NAME (AND WHO RAN IT)
MOVEM T1,ERRPRG ;STORE A POINTER TO THE NAME STRING
PUSHJ P,ERRPGM ;GO WRITE OUT THE PROGRAM NAME
MOVEI T1,[ASCIZ / By:/] ;GET A "DELIMETER"
PUSHJ P,ERRASC ; AND WRITE THAT
PUSHJ P,ERRUNM ;NOW WRITE OUT THE USER'S NAME & PPN
PUSHJ P,ERRNPT ; AND CLOSE OFF THIS FIELD
;NOW THE 36 BITS OF "VALUE" FOR SYSERR TO TYPE OUT
MOVEI T2,0 ;JUST USE A
MOVEM T2,ERRVAL ; ZERO.
;NOW DO THE DAEMON UUO (RH(T1) HAS THE LENGTH OF THE BLOCK)
MOVSI T1,2(T1) ;GET THE LENGTH (PLUS 2) IN THE LH
HRRI T1,ERRFCN ;GET THE ADDRESS OF THE FUNCTION BLOCK
DAEMON T1, ;DO THE DAEMON UUO
JRST ERRDUF ;THE DAEMON UUO FAILED. GO PRINT AN ERROR
RETURN ;ALL DONE WITH THE REPORT.
;SUBROUTINES TO WRITE VARIOUS ITEMS INTO THE DAEMON ERROR-REPORT BLOCK
;ROUTINE TO FORCE THE BYTE POINTER IN P1 TO START ON THE NEXT WORD
ERRNPT: SETZ T1, ;GET A ZERO,
PUSHJ P,ERRCHR ; AND CLOSE OFF THIS FIELD
MOVEI P1,1(P1) ;GET THE ADDRESS OF THE NEXT WORD
HRLI P1,(POINT 7,0) ; AND COMPLETE THE BYTE POINTER
HRROI T1,-ERRBLK(P1) ;MAKE T1 BE A "SYSERR" POINTER TO THE STRING
SETZ P2, ;CLEAR THE COUNT
RETURN ; AND WE'RE DONE
;ROUTINE TO COPY AN ASCIZ STRING INTO THE BLOCK
ERRASC: PUSH P,T2 ;PRESERVE T2
HRLI T1,(POINT 7,0) ;MAKE THE ADDRESS A BYTE POINTER
ILDB T2,T1 ;GET THE FIRST BYTE
JUMPN T2,[IDPB T2,P1 ;STORE THE BYTE IN THE BLOCK
ILDB T2,T1 ;GET THE NEXT BYTE
AOJA P2,.] ;COUNT THE BYTE AND LOOP.
POP P,T2 ;RESTORE THE TEMP
RETURN ; AND WE'RE DONE
;ROUTINE TO OUTPUT THE SIXBIT STRING IN T1
ERRSIX: PUSH P,T2 ;SAVE A TEMP
PUSH P,T3 ; ..
MOVE T3,T1 ;COPY THE NAME INTO T3
MOVE T2,[POINT 6,T3] ;GET A BYTE POINTER TO THE SIXBIT STRING
ERRSI1: ILDB T1,T2 ;GET THE NEXT BYTE
JUMPE T1,RTN32 ;IF WE'RE DONE, FIXUP THE STACK AND RETURN
ADDI T1,"0"-'0' ;MAKE THE CHAR ASCII
PUSHJ P,ERRCHR ;WRITE THE CHAR
TLNE T2,770000 ;SEE IF WE'VE GOT ALL 6 BYTES
JRST ERRSI1 ;LOOP OVER ALL 6 BYTES
JRST RTN32 ;FIXUP THE STACK AND RETURN
;ROUTINE TO PUT THE CHAR IN "T1" INTO THE OUTPUT STRING
ERRCHR: IDPB T1,P1 ;STORE THE CHAR
AOS P2 ;COUNT THE CHAR
RETURN
;ROUTINES TO WRITE NUMBERS INTO THE FILE
;ROUTINE TO WRITE AN OCTAL NUMBER INTO THE OUTPUT BLOCK
ERROCT: PUSH P,T2 ;GET A TEMP
PUSH P,T3 ; ..
MOVEI T3,^D8 ;GET THE "BASE"
PUSHJ P,ERRPNT ;GO PRINT THE NUMBER
JRST RTN32 ;CLEAN UP AND RETURN
;ROUTINE TO WRITE A DECIMAL NUMBER INTO THE OUTPUT BLOCK
ERRDEC: PUSH P,T2 ;GET A TEMP
PUSH P,T2 ; ..
MOVEI T3,^D10 ;GET THE "BASE"
PUSHJ P,ERRPNT ;GO PRINT THE NUMBER
RTN32: POP P,T3 ;RESTORE T3
POP P,T2 ; AND T2
RETURN ;ALL DONE
;ROUTINE TO WRITE AN ARBITRARY NUMBER TO THE OUTPUT BLOCK
;T1 := NUMBER, T3 := THE BASE, T2 := SCRATCH
ERRPNT: IDIV T1,T3 ;GET THE NEXT DIGIT
HRLM T2,(P) ;SAVE THE REMAINDER
SKIPE T1 ;IF THERE IS MORE TO DO,
PUSHJ P,ERRPNT ; THEN GO DO IT
HLRZ T1,(P) ;GET THE DIGIT
ADDI T1,"0" ;MAKE IT ASCII
PUSHJ P,ERRCHR ;WRITE THE CHARACTER
RETURN ; AND WE'RE DONE.
;ROUTINE TO OUTPUT A PPN IN THE FORM "[P,PN]"
ERRPPN: PUSH P,T1 ;SAVE THE PPN
MOVEI T1,"[" ;GET THE OPEN SQUARE
PUSHJ P,ERRCHR ; AND PUT THAT IN THE MESSAGE
HLRZ T1,(P) ;GET THE "P"
PUSHJ P,ERROCT ; AND PRINT THAT IN OCTAL
MOVEI T1,"," ;GET THE SEPARATOR
PUSHJ P,ERRCHR ; OUT IT GOES
POP P,T1 ;GET THE PPN BACK
HRRZ T1,T1 ;GET JUST THE "PN"
PUSHJ P,ERROCT ; AND PRINT THAT
MOVEI T1,"]" ;GET THE CLOSING SQUARE
JRST ERRCHR ; PRINT THAT AND RETURN
;ROUTINE TO PRINT THE USER'S NAME AND PPN.
ERRUNM: PUSH P,T2 ;SAVE T2
PUSH P,T3 ; T3
PUSH P,T1 ; AND T1
PJOB T1, ;GET OUR JOB NUMBER
MOVSI T2,(T1) ;PUT IT IN THE "LH"
HRRI T2,.GTNM1 ;TABLE TO GET FIRST HALF OF THE USER'S NAME
GETTAB T2, ;GET THE FIRST HALF OF THE USERS NAME
SETZ T2, ;ZERO IF NOT AVAILABLE
MOVSI T3,(T1) ;GET THE JOB NUMBER AGAIN
HRRI T3,.GTNM2 ;TABLE WITH THE SECOND HALF OF THE USER'S NAME
GETTAB T3, ;GET THE SECOND HALF
SETZ T3, ;ZERO IF STILL NOT AVAILABLE
SKIPN T2 ;IF BOTH THE FIRST
JUMPE T3,ERRNU2 ; AND LAST ARE ZERO, DON'T HACK THE NAME
TLNN T2,770000 ;STRIP LEADING SPACES OFF OF THE NAME
JRST [LSHC T2,6 ;IF FIRST CHAR IS A SPACE, THROW IT AWAY
JRST .-1] ; AND GO CHECK THE NEXT ONE.
ERRNU1: LDB T1,[POINT 6,T2,5] ;GET THE FIRST CHARACTER
ADDI T1,"0"-'0' ;ASCII-IZE THE CHARACTER
PUSHJ P,ERRCHR ;OUTPUT THE CHARACTER
LSHC T2,6 ;SHIFT TO THE NEXT CHARACTER
JUMPN T2,ERRNU1 ; AND IF THERE ARE ANY MORE
JUMPN T3,ERRNU1 ; THEN OUTPUT THEM TOO.
ERRNU2: PJOB T1, ;GET OUR JOB NUMBER BACK
MOVSI T1,(T1) ; AND PUT IT IN THE LH
HRRI T1,.GTPPN ;WE WANT OUR PPN
GETTAB T1, ;GET OUR PPN
SETZ T1, ;???
PUSHJ P,ERRPPN ;OUTPUT THE PPN
POP P,T1 ;RESTORE T1
JRST RTN32 ;RESTORE T3 & T2 AND RETURN
;ROUTINE TO OUTPUT THE NAME OF THE PROGRAM.
ERRPGM: PUSH P,T2 ;SAVE T2
PUSH P,T3 ; AND T3
PJOB T3, ;GET OUR JOB NUMBER IN "T3"
MOVEI T1,.GTPRG ;GET THE PROGRAM
HRLI T1,(T3) ; FIRST
GETTAB T1, ;GETTAB THE PROGRAM NAME
JRST ERRPGX ;JUST RETURN 'BOOT11' IF WE FAIL
PUSHJ P,ERRSIX ;OUTPUT THE NAME IN SIXBIT
MOVEI T1,[ASCIZ / From: /]
PUSHJ P,ERRASC ;OUTPUT A "DELIMITER"
MOVEI T1,.GTRDV ;FIRST GET THE DEVICE THE JOB WAS
HRLI T1,(T3) ; RUN FROM.
GETTAB T1, ;GETTAB THE DEVICE.
JRST ERRPGX ;IF NO LUCK RETURN 'BOOT11'
PUSHJ P,ERRSIX ;OUTPUT THE NAME AS SIXBIT
MOVEI T1,":" ;GET THE COLON
PUSHJ P,ERRCHR ; AND OUTPUT THE DEVICE SEPARATOR
MOVEI T1,.GTRFN ;GET THE FILE NAME
HRLI T1,(T3) ; INDEXED BY OUR JOB NUMBER
GETTAB T1, ;GETTAB THE FILE NAME WE WERE RUN FROM
JRST ERRPGX ;.. RETURN 'BOOT11'
PUSHJ P,ERRSIX ;OUTPUT THE NAME AS SIXBIT
;? OUTPUT .EXT
MOVEI T1,"[" ;GET THE OPEN SQUARE
PUSHJ P,ERRCHR ; AND OUTPUT IT
MOVEI T1,.GTRDI ;GET THE DIRECTORY WE WERE RUN FROM
HRLI T1,(T3) ; INDEXED BY OUR
GETTAB T1, ; JOB NUMBER
JRST ERRPGX ;IF FAIL... RETURN 'BOOT11'
HRRZ T2,T1 ;SAVE THE "PN"
HLRZ T1,T1 ;GET THE "P"
PUSHJ P,ERROCT ;WRITE THE PROJECT
MOVEI T1,"," ;GET THE DELIMITER
PUSHJ P,ERRCHR ; AND WRITE IT
MOVE T1,T2 ;GET THE "PN"
PUSHJ P,ERROCT ;WRITE THE PROGRAMMER NUMBER.
;NOW READ THE SFD CHAIN
SETZ T2, ;START WITH A ZERO
ERRPG1: MOVEI T1,.GTRS0(T2) ;GET THE NEXT SFD TO LOOK FOR
HRLI T1,(T3) ; AND INDEX IT BY OUR JOB NUMBER
GETTAB T1, ;FETCH THE SFD
JRST ERRPG2 ;IF WE FAIL, SAY WE'RE "DONE" WITH THE SFD;S
JUMPE T1,ERRPG2 ; A ZERO ALSO TERMINATES THE LIST
PUSH P,T1 ;SAVE THE NAME FOR A BIT
MOVEI T1,"," ;GET THE COMMA
PUSHJ P,ERRCHR ; OUTPUT THE DELIMITER
POP P,T1 ;GET THE NAME BACK
PUSHJ P,ERRSIX ; AND OUTPUT IT IN SIXBIT
CAIG T2,4 ;QUIT IF WE'VE READ ALL 5
AOJA T2,ERRPG1 ;LOOP OVER ALL SFD'S
ERRPG2: MOVEI T1,"]" ;GET THE CLOSE SQUARE
PUSHJ P,ERRCHR ; AND WRITE IT OUT
JRST RTN32 ;CLEAN UP THE STACK AND EXIT
ERRPGX: MOVE T1,[SIXBIT /BOOT11/] ;IF ALL ELSE FAILS,
PUSHJ P,ERRSIX ; THEN OUTPUT 'BOOT11'
JRST RTN32 ;CLEAN UP THE STACK AND RETURN
;ROUTINE TO OUTPUT A FILE SPEC TO THE ERROR BLOCK
;CALL T1 := POINTER TO A FILE SPEC OF THE FORM
; +0 FILE NAME
; +1 EXT
; +2 DEVICE
; +3 RANDOM BITS (PATH.)
; +4 PPN
; +5 SFD #1
; +6 SFD #2
; ...
; 0
ERRFSP: PUSH P,T2 ;SAVE T2
PUSH P,T3 ; AND T3
MOVEI T3,(T1) ;GET THE POINTER INTO T3 (FOR SEMI PERMANENCE)
MOVE T1,ERFSDV(T3) ;GET THE DEVICE
PUSHJ P,ERRSIX ; AND WRITE THAT OUT IN SIXBUT
MOVEI T1,":" ;GET A COLON
PUSHJ P,ERRCHR ; AND WRITE THE SEPARATOR
MOVE T1,ERFSFN(T3) ;GET THE FILE NAME
PUSHJ P,ERRSIX ; AND WRITE IT IN SIXBIT
MOVEI T1,"." ;GET A DOT
PUSHJ P,ERRCHR ;WRITE THE SEPARATOR
MOVE T1,ERFSEX(T3) ;GET THE EXTENSION
PUSHJ P,ERRSIX ; AND WRITE THAT.
MOVEI T1,"[" ;GET THE OPEN SQUARE
PUSHJ P,ERRCHR ; WRITE THE START OF THE PATH SPEC
HLRZ T1,ERFSPN(T3) ;GET THE "P"
PUSHJ P,ERROCT ; WRITE THE PROJECT NUMBER IN OCTAL
MOVEI T1,"," ;GET A COMMA
PUSHJ P,ERRCHR ; AND USE IT TO SEPARATE THE P,PN
HRRZ T1,ERFSPN(T3) ;GET THE "PN"
PUSHJ P,ERROCT ; WRITE THE PROGRAMMER NUMBER IN OCTAL
MOVEI T2,ERFSSF(T3) ;GET THE ADDRESS OF THE SFD SPEC
SKIPE (T2) ; IF WE'RE NOT PAST THE END OF THE SPEC
JRST [MOVEI T1,"," ;GET AND OUTPUT
PUSHJ P,ERRCHR ; A SEPARATOR
MOVE T1,(T2) ;GET THE SFD NAME
PUSHJ P,ERRSIX ; AND OUTPUT IT IN SIXBIT
AOJA T2,.-1] ;LOOP OVER ALL SFD NAMES.
MOVEI T1,"]" ;GET THE CLOSING SQUARE
PUSHJ P,ERRCHR ; AND WRITE THAT
JRST RTN32 ;RESTORE THE AC'S AND RETURN
;ROUTINE TO TYPE OUT INFORMATION REGARDING A DAEMON UUO ERROR
ERRDUF: WARNCR DAEMON UUO error while trying to append to ERROR.SYS.
CAILE T1,0 ;NOW RANGE CHECK THE ERROR CODE
CAILE T1,DAEMLN-1 ; AND IF IT IS ONE WE DON'T KNOW ABOUT
JRST [WARN <Unknown error = >
PUSHJ P,TYPOCT
JRST TYPCRL] ;END THE LINE AND RETURN
WARN <Reason: >
OUTSTR @DAEERM(T1) ;PRINT THE ERROR
PUSHJ P,TYPCRL ;MAKE THINGS NEAT WITH A CLOSING CRLF
RETURN ; AND RETURN
DAEERM: [ASCIZ /Unknown DAEMON UUO error code = /]
[ASCIZ /Illegal function code was specified./]
[ASCIZ /Adderss check occured during UUO process./]
[ASCIZ /Incorrect number of arguments for UUO./]
[ASCIZ /Impossible error number 4./]
[ASCIZ /File cannot be written./]
[ASCIZ /Program does not have privileges required./]
[ASCIZ /Invalid FACT entry format./]
[ASCIZ /Invalid PATH specification for UUO./]
DAEMLN= .-DAEERM
;STANDARD ROUTINE TO PRINT STANDARD OCTAL NUMBERS WITH STANDARD AC USAGE
TYPOCT: IDIVI T1,^D8 ;EXTRACT LEADING OCTIT
JUMPE T1,TYPOC1 ;IF LAST ONE, LEAVE RECURSIVE LOOP
HRLM T2,(P) ;SAVE IT FOR LATER PRINTING
PUSHJ P,TYPOCT ;DO PRECEDING
HLRZ T2,(P) ;GET IT BACK
TYPOC1: ADDI T2,"0" ;ASCIIIZE
OUTCHR T2 ;REALLY WISH WE HAD BUFFERED IO...
RETURN
;ROUTINE TO PRINT SIXBIT NAMES
TYPSIX: PUSH P,T2 ;SAVE A TEMP
PUSH P,T3 ; ..
MOVE T3,T1 ;COPY THE NAME INTO T3
MOVE T2,[POINT 6,T3] ;GET A BYTE POINTER TO THE SIXBIT STRING
TYPSI1: ILDB T1,T2 ;GET THE NEXT BYTE
JUMPE T1,RTN32 ;IF WE'RE DONE, FIXUP THE STACK AND RETURN
ADDI T1,"0"-'0' ;MAKE THE CHAR ASCII
OUTCHR T1 ;TYPE THE CHARACTER
TLNE T2,770000 ;SEE IF WE'VE GOT ALL 6 BYTES
JRST TYPSI1 ;LOOP OVER ALL 6 BYTES
JRST RTN32 ;FIXUP THE STACK AND RETURN
;ROUTINE TO TYPE A CRLF
TYPCRL: OUTSTR [ASCIZ /
/]
RETURN
;ROUTINE TO TYPE OUT A FILE SPEC
TYPFIL: PUSH P,T2 ;SAVE A TEMP
PUSH P,T3 ; AND ANOTHER
MOVE T3,T1 ;PUT THE FILESPEC ADDR IN T3
MOVE T1,ERFSDV(T3) ;GET THE DEVICE
PUSHJ P,TYPSIX ; AND OUTPUT IT IN SIXBIT
OUTCHR [":"] ;TYPE A SEPARATING COLON
MOVE T1,ERFSFN(T3) ;GET THE FILENAME
PUSHJ P,TYPSIX ; AND OUTPUT IT IN SIXBIT
OUTCHR ["."] ;TYPE A SEPARATING PERIOD
MOVE T1,ERFSEX(T3) ;GET THE EXTENSION
PUSHJ P,TYPSIX ; AND OUTPUT THAT IN SIXBIT
OUTCHR ["["] ;OUTPUT THE OPEN SQUARE
HLRZ T1,ERFSPN(T3) ;GET THE "P"
PUSHJ P,TYPOCT ; AND PRINT THAT IN OCTAL
OUTCHR [","] ;SEPARATE THE P & PN WITH A COMMA
HRRZ T1,ERFSPN(T3) ;GET THE "PN"
PUSHJ P,TYPOCT ; AND PRINT THAT IN OCTAL
MOVEI T2,ERFSSF(T3) ;GET THE ADDRESS OF THE FIRST SFD
SKIPE (T2) ;HAVE WE DONE ALL THE SFD'S YET?
JRST [OUTCHR [","] ;OUTPUT THE SEPARATOR FOR THE NEXT SFD
MOVE T1,(T2) ;GET THE SFD NAME
PUSHJ P,TYPSIX ; AND TYPE IT IN SIXBIT
AOJA T2,.-1] ;LOOP OVER ALL SFD'S
OUTCHR ["]"] ;OUTPUT THE CLOSING SQUARE
JRST RTN32 ;CLEAN UP THE STACK AND WE'RE DONE
SUBTTL STORAGE
XLIST ;LITERALS
LIT
LIST
HEDPNT: BLOCK 1 ;POINTER FOR CONSTRUCTING HEADER
HEADER: BLOCK ^D20 ;BLOCK FOR HEADER
HEDEND:
CCINT: EXITX ;^C INTERCEPT BLOCK
1B34
CCINTP: Z
Z
FWAZER:! ;START OF AREA TO CLEAR
PDLST: BLOCK PDSIZ+1
DEV: BLOCK 1 ;DEVICE
NAME: BLOCK 1 ;FILE NAME
EXT: BLOCK 1 ;FILE EXTENSION,,-1 IF . SEEN
DIRECT: BLOCK 1 ;DIRECTORY
DIRPTH: BLOCK 9 ;SFD PATH
INHDR: BLOCK 3 ;INPUT HEADER
OUTHDR: BLOCK 3 ;OUTPUT HEADER
ADDRES: BLOCK 1
CHKSUM: BLOCK 1 ;RUNNING CHECKSUM
FIRZER: BLOCK 1 ;FIRST LOCATION OF ZEROS
LASZER: BLOCK 1 ;LAST ..
CORE.4: BLOCK 1 ;REAL CONTENTS OF 4/5
CORE.6: BLOCK 1 ;REAL CONTENTS OF 6/7
A.PORT: BLOCK 1 ;/PORTNO:P
N.PORT: BLOCK 1 ;[42] COUNTER OF EXISTING -11'S
N.DL10: BLOCK 1 ;[42] CURRENT DL10 BEING CHECKED
F0.DL10: BLOCK 1 ;[42] SET TO -1 IF NO DL10 NO. 1
F1.DL10: BLOCK 1 ;[42] SET TO -1 IF NO DL10 NO. 2
NAMPOR: BLOCK 8 ;[42] LIST OF EXISTING PORTS
PAGADR: BLOCK 1 ;[42] STORE INFO IN T4 WHILE CHECKING PORTS
GTPI.: BLOCK 1 ;READ PI CHANNEL
ENBL.: BLOCK 1 ;ENABLE PORT
DSAB.: BLOCK 1 ;DISABLE PORT
CLRA.: BLOCK 1 ;CLEAR -11
CLRB.: BLOCK 1 ;CLEAR -11
BASE.: BLOCK 1 ;SET BASE ADDRESS
STRT.: BLOCK 1 ;START -11
STOP.: BLOCK 1 ;STOP -11
GSTS.: BLOCK 1 ;GET STATUS
TSTS.: BLOCK 1 ;[42] STORE STATUS WHILE CHECKING PORTS
CLRB..: BLOCK 1 ;DATUM FOR CLEAR
STRT..: BLOCK 1 ;DATUM FOR START
STOP..: BLOCK 1 ;DATUM FOR STOP
UP...: BLOCK 1 ;EXIST AND POWER BITS
RN...: BLOCK 1 ;RUN BIT
OK...: BLOCK 1 ;ERROR BITS
;IMPURE AREA FOR DAEMON ERROR REPORTING
ERRWRD: BLOCK 1 ;LIST OF BITS DESCRIBING VARIOUS ERRORS
ERRFZR: ;FIRST WORD TO CLEAR WHEN STARTING TO
; LOG A LOAD/DUMP
ERRFCN: BLOCK 1 ;DAEMON FUNCTION CODE
ERRCOD: BLOCK 1 ;SYSERR ERROR TYPE CODE
ERRBLK: ;BLOCK OF DATA FOR SYSERR
ERRTRG: BLOCK 1 ;TARGET NODE
ERRSER: BLOCK 1 ;SERVER NODE
ERRSLD: BLOCK 1 ;SERVER LINE DESIGNATOR
ERRFIL: BLOCK 1 ;POINTER TO THE FILE SPEC
ERRRTN: BLOCK 1 ;NSP STYLE RETURN CODE
ERRPRG: BLOCK 1 ;POINTER TO THE PROG NAME AND USER
ERRVAL: BLOCK 1 ;36 BIT VALUE TO BE PRINTED BY SYSERR
ERRFRE: BLOCK 100 ;LOTS MORE ROOM FOR THE DATA.
SYSNAM: BLOCK 10 ;AREA TO STORE THE SYSTEM'S NAME INTO
ERRLZR==.-1 ;LAST WORD TO ZERO IN THE ERROR BLOCK
LODFIL: BLOCK ERFSLN ;FILESPEC FOR FILE THAT WAS LOADED
DMPFIL: BLOCK ERFSLN ;FILESPEC FOR FILE THAT WAS DUMPED
LWAZER==.-1 ;END OF AREA TO CLEAR
FWAONE:! ;START OF AREA TO PRESET TO -1
A.CLR: BLOCK 1 ;/CLEAR:N
A.DUMP: BLOCK 1 ;/DUMP:N
A.END: BLOCK 1 ;/END:N
A.IMAG: BLOCK 1 ;/IMAGE
A.LOAD: BLOCK 1 ;/LOAD:N
A.STRT: BLOCK 1 ;/START:N
A.NLOG: BLOCK 1 ;/NOLOG
F.PORT: BLOCK 1 ;[42] /PORTNO DEFAULT CHECK
LWAONE==.-1 ;END OF AREA TO PRESET TO -1
BASEAD: PHASE 0 ;CLEAN COPY OF -11 CODE
HALT ;HALT FOR THE KI10 TRAP IN THE DL10
;THIS CODE MADE AS FOLLOWS:
; (1) TAKE PAGE AFTER NEXT AS FILE "LOAD.P11"
; (2) TAKE THREE PAGES AFTER THAT AS "HACK11.CBL"
; (3) COMPILE WITH MACY11:
; .R MACY11
; *,LOAD=LOAD
; *^C
; (4) REMOVE TABS FROM LOAD.LST
; .R PIP
; *LOAD.LNT/W=LOAD.LST
; *^C
; (5) CONVERT TO MACRO-10:
; .EXECUTE HACK11
; (6) REMOVE TRAILING SPACES:
; .R PIP
; *LOAD.MAT/C=LOAD.MAC
; *^C
; (7) FILE "LOAD.MAT" IS THE NEXT PAGE.
EXP 010067,000170 ;MOV %0,BLODAT+0 ;SAVE AC'S IN CASE OF DUMP
EXP 010167,000166 ;MOV %1,BLODAT+2
EXP 010267,000164 ;MOV %2,BLODAT+4
EXP 010367,000162 ;MOV %3,BLODAT+6
EXP 010467,000160 ;MOV %4,BLODAT+10
EXP 010567,000156 ;MOV %5,BLODAT+12
EXP 010667,000154 ;MOV %6,BLODAT+14
EXP 013767,000004,000126;MOV @#4,BLOCNT ;SAVE CORE 4 FOR BUS TRAP
EXP 013767,000006,000122;MOV @#6,BLOADR ; ALSO CORE 6
EXP 010704 ;MOV %7,%4 ;GET THIS LOCATION
EXP 062704,000076 ;ADD #BUSS-THIS,%4 ;GET ABSOLUTE ADDRESS
EXP 010437,000004 ;MOV %4,@#4 ;STORE FOR BUSS TRAP
EXP 005067,000076 ;CLR WATFLG ;TELL -10 WE ARE DONE
EXP 005767,000072 ;TST WATFLG ;0 MEANS WAIT
EXP 001775 ;BEQ WAIT1 ;- MEANS DATA, + START
EXP 003035 ;BGT BLOCNT ;GO EXECUTE JMP OR HALT
EXP 016703,000070 ;MOV BLOADR,%3 ;GET CORE ADDRESS
EXP 010704 ;MOV %7,%4 ;GET THIS LOCATION
EXP 062704,000070 ;ADD #BLODAT-HERE,%4 ;GET ABSOLUTE ADDRESS
EXP 010406 ;MOV %4,%6 ;SET STACK FOR BUS TRAP
EXP 005037,000006 ;CLR @#6 ;CLEAR NEW FLAGS
EXP 016705,000046 ;MOV BLOCNT,%5 ;GET BYTE COUNT
EXP 003006 ;BGT COPY ;IF .GT., LOAD 11
EXP 005405 ;NEG %5 ;IF .LT., DUMP 11
EXP 010403 ;MOV %4,%3 ;INTERCHANGE SOURCE
EXP 016704,000036 ;MOV BLOADR,%4 ; AND DEST ADRS
EXP 005237,000006 ;INC @#6 ;FLAG INTERCHAGE FOR BUS TRAP
EXP 005305 ;DEC %5 ;LOOP MOVING BYTES ONE
EXP 002747 ;BLT WAITX ; AT A TIME
EXP 112423 ;MOVB (%4)+,(%3)+ ;COPY ONE BYTE
EXP 000774 ;BR COPY ;LOOP UNTIL DONE
EXP 010367,000012 ;MOV %3,NXMADR ;SAVE ADDRESS IN ERROR
EXP 103342 ;BCC WAITX ;TELL -10 WE ARE DONE
EXP 010467,000004 ;MOV %4,NXMADR ;IF DUMP, SAVE ADDRESS
EXP 000737 ;BR WAITX ;THEN TELL -10
WATFLG: EXP 177777 ;.WORD 177777 ;0=WAIT, -=XFER, +=START
NXMADR: BLOCK 01 ;.BLKW 1 ;ADDRESS OF ERROR IF ANY
BLOCNT: BLOCK 01 ;.BLKW 1 ;BYTE COUNT
BLOADR: BLOCK 01 ;.BLKW 1 ;11 STARTING ADDRESS
BLODAT: BLOCK 10 ;.BLKW 10 ;DATA .....
DEPHASE ;END OF -11 AREA
LEN11==.-BASEAD
WINDOW==<<LEN11+77>/100>*1K-1 ;ALLOW FOR BOTH 1K AND 8K OPTIONS
REPEAT 0,< ;FILE LOAD.P11
.TITLE LOAD
.ABS
.=2
;**** START OF RESULTING CODE
BEGIN: MOV %0,BLODAT+0 ;SAVE AC'S IN CASE OF DUMP
MOV %1,BLODAT+2
MOV %2,BLODAT+4
MOV %3,BLODAT+6
MOV %4,BLODAT+10
MOV %5,BLODAT+12
MOV %6,BLODAT+14
MOV @#4,BLOCNT ;SAVE CORE 4 FOR BUS TRAP
MOV @#6,BLOADR ; ALSO CORE 6
MOV %7,%4 ;GET THIS LOCATION
THIS: ADD #BUSS-THIS,%4 ;GET ABSOLUTE ADDRESS
MOV %4,@#4 ;STORE FOR BUSS TRAP
WAITX: CLR WATFLG ;TELL -10 WE ARE DONE
WAIT1: TST WATFLG ;0 MEANS WAIT
BEQ WAIT1 ;- MEANS DATA, + START
BGT BLOCNT ;GO EXECUTE JMP OR HALT
MOV BLOADR,%3 ;GET CORE ADDRESS
MOV %7,%4 ;GET THIS LOCATION
HERE: ADD #BLODAT-HERE,%4 ;GET ABSOLUTE ADDRESS
MOV %4,%6 ;SET STACK FOR BUS TRAP
CLR @#6 ;CLEAR NEW FLAGS
MOV BLOCNT,%5 ;GET BYTE COUNT
BGT COPY ;IF .GT., LOAD 11
NEG %5 ;IF .LT., DUMP 11
MOV %4,%3 ;INTERCHANGE SOURCE
MOV BLOADR,%4 ; AND DEST ADRS
INC @#6 ;FLAG INTERCHAGE FOR BUS TRAP
COPY: DEC %5 ;LOOP MOVING BYTES ONE
BLT WAITX ; AT A TIME
MOVB (%4)+,(%3)+ ;COPY ONE BYTE
BR COPY ;LOOP UNTIL DONE
BUSS: MOV %3,NXMADR ;SAVE ADDRESS IN ERROR
BCC WAITX ;TELL -10 WE ARE DONE
MOV %4,NXMADR ;IF DUMP, SAVE ADDRESS
BR WAITX ;THEN TELL -10
WATFLG: .WORD 177777 ;0=WAIT, -=XFER, +=START
NXMADR: .BLKW 1 ;ADDRESS OF ERROR IF ANY
BLOCNT: .BLKW 1 ;BYTE COUNT
BLOADR: .BLKW 1 ;11 STARTING ADDRESS
BLODAT: .BLKW 10 ;DATA .....
;**** END OF RESULTING CODE
.END BEGIN
> ;END OF FILE LOAD.P11
SUBTTL FILE HACK11.CBL
REPEAT 0,< ;FILE HACK11.CBL
IDENTIFICATION DIVISION.
PROGRAM-ID. HACK11 TO CONVERT MACY11 LISTING TO MACRO10 INPUT.
ADDRESS MUST BE SIX CHARS TO APPEAR IN -10.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-ELEVEN, ASSIGN TO DSK, RECORDING MODE ASCII.
SELECT OUT-TEN, ASSIGN TO DSK, RECORDING MODE ASCII.
DATA DIVISION.
FILE SECTION.
FD IN-ELEVEN, VALUE IDENTIFICATION "LOAD LNT".
01 DATA-IN.
02 FILLER PIC X(16).
02 DATA-1 PIC X(6).
02 FILLER PIC XX.
02 DATA-2 PIC X(6).
02 FILLER PIC XX.
02 DATA-3 PIC X(6).
02 FILLER PIC XX.
02 ADDR PIC X(6).
02 TEN-ADDR-FLAG PIC X.
02 FILLER PIC X.
02 REST-OF-LINE PIC X(53).
02 TEST-LINE REDEFINES REST-OF-LINE.
03 OP-CODE PIC X(5).
03 FILLER PIC X(3).
03 WIDTH PIC X(8).
03 REST-OF-FILL PIC X(37).
02 OVERFLOW-AREA PIC X(20).
FD OUT-TEN, VALUE IDENTIFICATION "LOAD MAC".
01 DATA-OUT.
02 ADDR PIC X(6).
02 FIL-1 PIC XX.
02 FIL-2 PIC XXX.
02 FILLER PIC X.
02 DATA-1 PIC X(6).
02 FIL-3 PIC X.
02 DATA-2 PIC X(6).
02 FIL-4 PIC X.
02 DATA-3 PIC X(6).
02 FIL-5 PIC X.
02 REST-OF-LINE PIC X(53).
01 BLOCK-OUT.
02 ADDR PIC X(6).
02 FIL-D1 PIC XX.
02 FIL-D2 PIC X(8).
02 WIDTH-OUT PIC X(8).
02 FILLER PIC X(8).
02 FIL-5 PIC X.
02 REST-OF-LINE PIC X(53).
WORKING-STORAGE SECTION.
01 SKIP-REC.
02 FILLER PIC X(72).
02 SKIP-FIELD PIC X(5).
02 FILLER PIC X(44).
01 DATA-TO-FILL-WITH.
02 FIL-2 PIC X(3) VALUE "EXP".
02 FIL-5 PIC X VALUE ";".
PROCEDURE DIVISION.
START-RUN.
OPEN INPUT IN-ELEVEN. OPEN OUTPUT OUT-TEN.
FIND-DATA.
READ IN-ELEVEN RECORD INTO SKIP-REC AT END GO TO NOT-FOUND.
IF SKIP-FIELD NOT= ";****" GO TO FIND-DATA.
IF OP-CODE = ".BLKW" GO TO BLOCK.
GOT-DATA.
READ IN-ELEVEN RECORD INTO SKIP-REC AT END GO TO NOT-FOUND.
IF SKIP-FIELD = ";****" GO TO ALL-DONE.
IF OVERFLOW-AREA NOT = SPACES DISPLAY "% COMMENTS TRUNCATED: "
OVERFLOW-AREA.
IF OP-CODE = ".BLKW" GO TO BLOCK.
MOVE SPACES TO DATA-OUT.
IF OP-CODE = SPACES GO TO WRITE-DATA.
MOVE CORRESPONDING DATA-TO-FILL-WITH TO DATA-OUT.
MOVE CORRESPONDING DATA-IN TO DATA-OUT.
IF TEN-ADDR-FLAG = ":" MOVE ": " TO FIL-1
ELSE MOVE SPACES TO ADDR IN DATA-OUT.
IF DATA-2 IN DATA-IN NOT= SPACES MOVE "," TO FIL-3.
IF DATA-3 IN DATA-IN NOT= SPACES MOVE "," TO FIL-4.
WRITE-DATA.
WRITE DATA-OUT.
GO TO GOT-DATA.
BLOCK.
MOVE SPACES TO BLOCK-OUT.
MOVE CORRESPONDING DATA-TO-FILL-WITH TO DATA-OUT.
MOVE CORRESPONDING DATA-IN TO DATA-OUT.
MOVE "BLOCK" TO FIL-D2.
IF ADDR IN DATA-IN NOT= SPACES MOVE ": " TO FIL-D1.
WRITE BLOCK-OUT.
GO TO GOT-DATA.
NOT-FOUND.
DISPLAY "? Error--;**** not found".
ALL-DONE.
CLOSE IN-ELEVEN. CLOSE OUT-TEN.
STOP RUN.
> ;END OF HACK11.CBL
END START