1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-04-18 16:17:49 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

2132 lines
67 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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