mirror of
https://github.com/PDP-10/stacken.git
synced 2026-04-18 16:17:49 +00:00
2132 lines
67 KiB
Plaintext
2132 lines
67 KiB
Plaintext
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
|