1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-26 10:12:37 +00:00
Files
PDP-10.its/src/mrc/ten50.22
2018-02-13 09:34:56 +01:00

7891 lines
226 KiB
Plaintext
Raw 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 TEN50
;ACCUMULATOR ASSIGNMENTS
IOS=0 ;I/O DEVICE STATUS WORD
TAC=1 ;TEMPORARY, CLEARLY A TACKY MONITOR
TAC1=2 ;TEMPORARY
PDP=3 ;PUSH DOWN POINTER
ITEM=4 ;BUFFER ITEM COUNT
DAT=5 ;TTY INPUT BUFFER POINTER
JBUF==DAT ;ADDRESS OF 3 WORD BUFFER HEADER IN USER AREA
DDB=6 ;RH = ADDRESS OF CURRENT DEVICE DATA BLOCK
PROG=7
TEM=10 ;TEMPORARY
DSER=11
BUFPNT=12 ;USED AS TEMPORARY AC IN COMCON
UCHN=BUFPNT
BUFWRD=13 ;USED AS TEMP AC IN COMCON
UUO=14 ;USED AS TEMP AC IN COMCON
AC1=15 ;USED AS TEMP AC IN COMCON
AC2=16 ;USED AS TEMP AC IN COMCON
AC3=17
;10/50 SYSTEM UUO DEFINITIONS
CALLI==47000,,
OPEN==50000,,
RELEAS==71000,,
LOOKUP==76000,,
ENTER==77000,,
;MACRO TO ASSEMBLE A BYTE POINTER DEC-STYLE
DEFINE POINT ?S,ADDR,B=-1
<<<<35.-.RADIX 10.,B>&77>_30.\<<.RADIX 10.,S>&77>_24.> ADDR>TERMIN
;DEVNAM DEVCHR DEVIOS DEVSER DRL DCL DCLO CLSOUT CLSIN DOU DIN DEN DLK DDO DDI DSO DSI DRN DCLI DEVMOD ASSCON ASSPRG DVOUT DVIN DVDIR DVTTY DVAVAL DVLNG TTYUSE TTYATC DVLPT DVDSK DEVLOG DEVBUF DEVIAD DEVADR DEVOAD DEVPTR DEVCHN ITSNAM ITSIOF DEVCTR DEVFIL DEVEXT DEVPPN
;** S.MAC **
;DEVICE DATA BLOCK NAMES
DEVNAM==0 ;NAME IN SIXBIT ASCII
; C(LH)=DEVICE MNEMONIC
; C(RH)=DEVICE NUMBER, LEFT JUSTIFIED
DEVCHR==1 ;CHARACTERISTIC
; LH = # FSIZ CHUNKS NECESSARY TO MAKE NEW DDB
; (FOR PROTOTYPE DDB'S ONLY)
; BITS 24-35=BUFFER SIZE
DEVIOS==2 ;STATUS WORD
DEVSER==3 ; C(LH)=NEXT DDB IN CHAIN
; C(RH)=ADDRESS OF DEVICE SERVICE DISPATCH TABLE
;DEVICE SERVICE DISPATCH TABLE ASSIGNMENTS
DRL==0 ;RELEASE
DCL==1 ;CLOSE
DCLO==DCL ;CLOSE OUTPUT
;IMMEDIATE PART OF CLOSE UUO
CLSOUT==1 ;INHIBIT CLOSING OUTPUT
CLSIN==2 ;INHIBIT CLOSING INPUT
DOU==2 ;OUTPUT
DIN==3 ;INPUT. SHORT DISPATCH TABLE
DEN==4 ;ENTER
DLK==5 ;LOOKUP
DDO==6 ;DUMP MODE OUTPUT
DDI==7 ;DUMP MODE INPUT
DSO==10 ;SETO
DSI==11 ;SETI
DRN==13 ;RENAME
DCLI==14 ;CLOSE INPUT
;END OF LONG DISPATCH TABLE
DEVMOD==4
;RIGHT HALF DEVICE CHARACTERISTIC WORD (DEVCHR UUO)
ASSCON==400000 ;ASSIGNED BY CONCOLE ("ASSIGN" COMMAND)
ASSPRG==200000 ;ASSIGNED BY PROGRAM (INIT UUO)
;LEFT HALF DEVICE CHARACTERISTICS (DEVCHR UUO)
DVOUT==1 ;OUTPUT DEVICE
DVIN==2 ;INPUT DEVICE
DVDIR==4 ;DEVICE HAS A DIRECTORY
DVTTY==10 ;A TTY
DVAVAL==40 ;1 IF DEVICE IS AVAILABLE TO THIS JOB.
; SET BY DEVCHR UUO
DVLNG==1000 ;DEVICE HAS LONG DISPATCH TABLE.
; (OTHER UUO'S BESIDES INPUT, OUTPUT, CLOSE, RELEASE)
TTYUSE==10000 ;TTY IN USE
TTYATC==20000 ;TTY ATTACHED TO JOB (ONLY TRUE FOR CONSOLE)
DVLPT==40000 ;DEVICE IS AN LPT (CARRIAGE CONTROL IN FORTRAN)
DVDSK==200000 ;A DISK
DEVLOG==5 ;LOGICAL NAME
DEVBUF==6 ;
DEVIAD==7 ; C(RH)=RELATIVE ADDRESS OF INPUT BUFFER
; THE SERVICE ROUTINE IS FILLING
DEVADR==DEVIAD ;
DEVOAD==10 ;C(RH)=RELATIVE ADDRESS OF OUTPUT BUFFER THE
; SERVICE ROUTINE IS EMPTYING
DEVPTR==DEVOAD
DEVCHN==11 ;KEEPS I.T.S.-ASSOCIATED CHANNELS
; BITS 0-3: INPUT-ASSOCIATED CHANNEL
; (BYTE POINTER = PDEVI)
; BITS 4-7: OUTPUT-ASSOCIATED CHANNEL
; (BYTE POINTER = PDEVO)
ITSNAM==12 ;I.T.S. NAME AND .OPEN MODE
ITSIOF==1 ;DENOTES INPUT (=0) OR OUTPUT (=1) IN .OPEN'S
DEVCTR==13
;FOR LONG DISPATCH TABLE DEVICES ONLY:
DEVFIL==13
DEVEXT==14
DEVPPN==15
;A AL I IB B SD DR D IOWC IOCON IOACT IODEND IOBKTL IODTER IODERR IOIMPM IOW IOBEG IOFST IOEND
;** S.MAC **
;I/O STATUS WORD ASSIGNMENTS
;DATA MODES: BITS 32-35 (BYTE POINTER=PIOMOD)
A==0 ;ASCII
AL==1 ;ASCII LINE
I==10 ;IMAGE
IB==13 ;IMAGE BINARY
B==14 ;BINARY
SD==15 ;USED TO SIGNAL LOWEST DUMP MODE
DR==16 ;DUMP BY RECORDS
D==17 ;DUMP ACROSS RECORDS
;RIGHT HALF (USER)
IOWC==20 ;DON'T COMPUTE WORD COUNT
IOCON==40 ;CONTINUOUS (CONT=0)
; IN CONTINUOUS MODE WE WILL FILL UP FORWARD
; INPUT BUFFERS
IOACT==10000 ;DEVICE ACTIVE (ONLY USED BY UUOCON TO
; CLEAR BIT DURING SETSTS)
IODEND==20000 ;DATA END ENCOUNTERED
IOBKTL==40000 ;BLOCK TOO LARGE
IODTER==100000 ;DATA ERROR (CHECKSUM OR PARITY)
IODERR==200000 ;HARD DEVICE ERROR (OTHER THAN CHECKSUM OR PARITY)
IOIMPM==400000 ;IMPROPER MODE
;LEFT HALF (SYSTEM)
IOW==1 ;I/O WAIT
IOBEG==2
IOFST==4
IOEND==40 ;SERVICE ROUTINE HAS TRANSMITTED LAST DATA
;REST OF BITS IN LH ARE DEVICE DEPENDENT EXCEPT BIT 14 (=10)
;USRMOD INITB IBUFB OBUFB LOOKB ENTRB INPB OUTPB ICLOSB OCLOSB INBFB OUTBFB SYSDEV RENMB DSKRLB FNFERR IPPERR FBMERR AEFERR NLEERR NSFERR NECERR NSDERR JBFADR JBFPTR JBFCTR IOUSE RUN JERR
;** S.MAC **
;HARDWARE BITS
USRMOD==10000 ;LH PC WORD, MACHINE WAS IN USER MODE WHEN PC WAS STORED
;LEFT HALF USRJDA (JOB DEVICE ASSIGNMENTS)
; UUO'S FOR THIS CHANNEL SINCE LAST INIT
INITB==400000 ;INIT
IBUFB==200000 ;INIT W/I.BUFFER SPECIFIED
OBUFB==100000 ;INIT W/O.BUFFER SPECIFIED
LOOKB==40000 ;LOOKUP
ENTRB==20000 ;ENTER
INPB==10000 ;INPUT
OUTPB==4000 ;OUTPUT
ICLOSB==2000 ;INPUT CLOSE
OCLOSB==1000 ;OUTPUT CLOSE
INBFB==400 ;INBUF
OUTBFB==200 ;OUTBUF
SYSDEV==100 ;THIS DEVICE IS THE SYSTEM DEVICE
RENMB==40 ;RENAME UUO
DSKRLB==20 ;TO DISTINGUISH RESET UUO FROM RELEASE
;ERROR CORES RETURNED TO USERS ON LOOKUP AND ENTER AND RENAMES
; IN RH OF 2ND WORD OF 4 WORD ARGUMENT BLOCK
;THE SAME ERROR CODES ARE RETURNED IN RUN UUO
FNFERR==0 ;FILE NOT FOUND OR 0 FILE NAME
IPPERR==1 ;INCORRECT PROJECT-PROGRAMMER NUMBERS
FBMERR==3 ;FILE BEING MODIFIED
AEFERR==4 ;ALREADY EXISTING FILE
NLEERR==5 ;NEITHER LOOKUP OR ENTER (RENAME ONLY)
NSFERR==7 ;NOT A SAVE FILE (RUN UUO ONLY)
NECERR==10 ;NOT ENOUGH CORE (RUN UUO ONLY)
NSDERR==12 ;NO SUCH DEVICE (RUN UUO ONLY)
;JOB BUFFER AREA HEADER
JBFADR==0 ;BIT 0=1 IF THIS BUFFER RING HAS NEVER BEEN
; REFERENCED FROM THE USER'S PROGRAM BY
; AN INPUT OR OUTPUT COMMAND.
; BITS 1-17=UNUSED
; BITS 18-35=CURRENT BUFFER ADDRESS
JBFPTR==1 ;BYTE POINTER TO NEXT BYTE-1
JBFCTR==2 ;POSITIVE ITEM COUNT
;JOB BUFFER HEADER
IOUSE==400000 ;1 IF BUFFER IS FULL
; 0 IF BUFFER IS EMPTY
; BITS 1-17=BUFFER SIZE
; BITS 18-35=NEXT BUFFER ADDRESS
;JOB STATUS WORD (JBTSTS)
RUN==400000 ;USER WANTS JOB TO RUN
JERR==20000 ;A MONITOR DETECTED ERROR HAS OCCURRED
; JOB CANNOT CONTINUE
;DSDDB ITSNPT
;** DSKSER.MAC **
;DSK DDB
DSDDB: SIXBIT IDSKI
XWD DSKCOR 201 ;BUFFER SIZE IN 24-35
0 ;DEVIOS
DSKDSP ;DEVSER: LH= ADR. OF NEXT DDB
; RH = ADR. OF DISPATCH TABLE
XWD DVOUT+DVIN+DVDIR+DVDSK+DVLNG 154403 ;DEVMOD
0 ;LOGICAL NAME
0 ;DEVBUF: LH = ADR. OF O/P BUF. HDR.
; RH = ADR. OF I/P BUF. HDR.
0 ;DEVIAD - REL. ADR. OF INPUT BUFFER BEING FILLED
0 ;DEVOAD
0 ;DEVCHN : 0-3 = ITS INPUT CHANNEL
; 4-7 = ITS OUTPUT CHANNEL
IBMDE,,'DSK ;ITSNAM : 8-17 = MODE FOR .OPEN (=IMAGE, BLOCK)
; 18-35 = ITS DEVICE NAME FOR .OPEN
DSLEN==.-DSDDB ;= LENGTH OF INITIAL NON-ZERO SEGMENT OF DSDDB
;DEVCTR
0 ;DEVFIL - FILENAME
0 ;DEVEXT - EXTENSION
0 ;DEVPPN
DEVCNT==.-DSDDB
0 ;RH = COUNT OF BLOCKS IN FILE
SETCNT==.-DSDDB
0 ;RH = USETO, USETI COUNTER
PTR1==.-DSDDB
LOC DSDDB+DSLEN ;RELOCATE OURSELVES BACKWARDS OVER TRAILING
; ZERO FRAGMENT OF DSDDB
ITSNPT: POINT 28,ITSNAM(DDB),35, ;POINTER TO ITS NAME AND MODE
;DSKDSP REASSI SETUWP REMAP UGTSEG DFDMPO DFDMPI DFSET
;** DSKSER.MAC **
;PARAMETERS ASSOCIATED WITH DISK SERVICE:
DRNAM==0 ;NAME IS IN FIRST WORD OF DIR. ENTRY
DREXT==1 ;EXT. IS IN SECOND WORD OF DIR. ENTRY
DRPROT==2 ;PROT, DATE, TIME IN THIRD WORD
DRSIZ==3 ;SIZE & FORWARD LINK IN FOURTH WORD
BLKP2==7 ; # OF BITS TO SHIFT TO CONVERT
;BETWEEN # BLOCKS AND # WORDS
BLKSIZ==200 ; # 0F WORDS/BLOCK
STDPRT==055 ;STANDARD PROTECTION KEY (I.T.S. << C.I.A.)
;HOWEVER, YOU CAN'T WRITE IN ANOTHER LUSER'S
;DIR ANYWAY, SO 055 IS BETTER THAN 000.
;ERROR CODES FOR LOOKUP, ENTER AND/OR RENAME
NOTINU==0 ;NO SUCH FILE IN UFD
NOTINM==1 ;NO SUCH UFD IN MFD
PROTF==2 ;FILE PROTECTED FROM THIS OPERATION ( E+1 )
NORITE==3 ;FILE BEING WRITTEN
RENFAL==4 ;TRIED TO RENAME TO EXISTING NAME
NOFIL.==5 ;TRIED TO RENAME WITH NO FILE SELECTED
;DISK DISPATCH TABLE
DSKDSP: JRST DFREL ;RELEASE
JRST DFCLSO ;CLOSE OUTPUT
JRST DFOUT ;OUTPUT
JRST DFIN ;INPUT
JRST DFENTR ;ENTER
JRST DFLOOK ;LOOKUP
JRST DFDMPO ;DUMP OUTPUT
JRST DFDMPI ;DUMP INPUT
JRST DFSET ;USETO
JRST DFSET ;USETI
POPJ PDP, ;UGETF
JRST DFREN ;RENAME
JRST DFCLSI ;CLOSE INPUT
POPJ PDP, ;UTPCLR
POPJ PDP, ;MTAPE
REASSI:
SETUWP:
REMAP:
UGTSEG:
DFDMPO:
DFDMPI:
DFSET: JSP TAC,ERRPTU
ASCIZ /Unimplemented UUO/
MOVE TAC1,UUO0
SOJA TAC1,PCPNT
;DFENTR ENTCK DFERR6 DFERR5
;** DSKSER.MAC **
;ENTER UUO
DFENTR: PUSHJ PDP,GETWDU ;NULL FILENAME?
JUMPE TAC,DFER12 ;IF SO, ERROR
TLNE DDB,LOOKB ;NO, HAS LOOKUP BEEN DONE?
JRST DFENT5 ;YES, ERROR FOR NOW - UPDATE MODE
;NOT IMPLEMENTED YET
MOVEM TAC,DEVFIL(DDB) ;STORE FILENAME IN DDB
PUSHJ PDP,GETWD1 ;GET EXT.
TLNN TAC,-1 ; NULL EXTENSIONS BEING ILLEGAL ON ITS,
JRST DFER12 ; WE COP OUT WITH ILLEGAL NAME
HLLZM TAC,DEVEXT(DDB) ;STORE IN DDB
HRRI UUO,2(UUO) ;GET SPECIFIED PPN
PUSHJ PDP,GETWDU
PUSHJ PDP,PPTOSN ;CONVERT TO SNAME
HRRI UUO,-3(UUO) ;RESET ACCUMULATOR "UUO"
TLNE DDB,SYSDEV ;IS THIS SYSTEM DEVICE?
MOVE TAC,SYSPP ;YES, THEN GET SNAME OF "SYS"
CAME TAC,SNAME ;IS IT HIS SNAME?
JRST DFERR5 ;NO, ERROR FOR TRYING TO WRITE INTO
;ANOTHER AREA
MOVEM TAC,DEVPPN(DDB) ;YES, STORE IN DDB
MOVE TAC,DEVFIL(DDB) ;GET FILENAME
MOVE TAC1,DEVEXT(DDB) ;AND EXT.
SKIPA AC1,USRHCU ;GET HGHEST CHAN. IN USE AND SEE IF THIS FILE
;IS BEING WRITTEN ON ANOTHER CHANNEL
ENTCK: SOJL AC1,DFENT1 ;OK IF NOT BEING WRITTEN NOW
SKIPE AC2,USRJDA(AC1) ;IS THIS CHAN. IN USE?
TLNN AC2,ENTRB ;YES, HAS AN ENTER BEEN DONE ON IT?
JRST ENTCK ;NO, LOOP
CAMN TAC,DEVFIL(AC2) ;YES, WAS IT DONE ON THIS FILE?
CAME TAC1,DEVEXT(AC2)
JRST ENTCK ;NO, LOOP
DFERR6: MOVEI TAC1,NORITE ;ERROR - FILE BEING WRITTEN NOW!!
JRST DFERRY
DFERR5: MOVEI TAC1,PROTF ;TELL HIM PROTECTION ERROR
JRST DFERRY
;DFENT1 DFENT2 MKFNNM DFENT5 NOCHNE SETENT
;** DSKSER.MAC **
DFENT1: LDB TAC,PDEVO ;GET ITS O/P CHANNEL
JUMPN TAC,.+4 ;MOVE ON IF ALREADY ONE
PUSHJ PDP,GTFCHN ;NOT YET, GET ONE
JRST NOCHNE ;NONE AVAILABLE - ERROR
DPB TAC,PDEVO ;OK, STORE IT
PUSHJ PDP,GTTIME ;GET CURRENT TIME
IDIVI TAC,JIFMIN ;FORM MINUTES PAST MIDNITE
DPB TAC,[POINT 11,DEVCHN(DDB),23,] ;STORE IN DDB
PUSHJ PDP,GTDATE ;GET TODAY'S DATE
DPB TAC,[POINT 12,DEVCHN(DDB),35,] ;STORE IN DDB
LDB AC2,PDEVO ;GET CHANNEL #
PUSHJ PDP,SETENT ;SET UP A .OPEN FOR OUTPUT INSTR.
XCT TAC ;DO THE .OPEN
JRST DFERR6 ;FAILURE, ASSUME FILE BEING WRITTEN
SETZM DEVCNT(DDB) ;INITIALIZE LENGTH
DFENT2: MOVEI TAC,1 ;INITALIZE SETCNT
MOVEM TAC,SETCNT(DDB)
JRST CPOPJ1 ;SKIP RETURN
;THIS LITTLE ROUTINE TAKES THE CONTENTS OF AC2 AS AN I.T.S.
;CHANNEL # AND RETURNS WITH THE SIXBIT OF THE CHANNEL IN AC2 AND
;SIXBIT/TMP/ IN AC3. HENCE, AC2 & AC3 REPRESENT A UNIQUE FILENAME.
MKFNNM: IDIVI AC2,10
ROT AC3,-6
LSHC AC2,30.
ADD AC2,[SIXBIT/000UFD/]
MOVSI AC3,'TMP ;USE SIXBIT/TMP/ AS NAME2
POPJ PDP, ;RETURN WITH AC2 & AC3 SET UP
DFENT5: JSP TAC,ERRPTU
ASCIZ *Update mode not implemented*
JRST EXCALP
NOCHNE: JSP TAC,ERRPTU
ASCIZ *Channel overflow*
JRST EXCALP
SETENT: MOVEI TAC,(AC2) ;MAKE COPY OF CHAN. #
PUSHJ PDP,MKFNNM ;MAKE FUNNY NAME "UNAME ITS.CHN.#"
LDB AC1,ITSNPT ;SET UP ITS DEVICE NAME
TLO AC1,ITSIOF ;SET FOR OUTPUT
IORI TAC,<41>_4+<AC1>_13. ;SET UP .OPEN INSTR.
ROT TAC,-13. ;POSITION IT
POPJ PDP, ;RETURN
;DFLOOK
;** DSKSER.MAC **
;LOOKUP UUO
DFLOOK: PUSHJ PDP,GETWDU ;GET THE FILE NAME
JUMPE TAC,DFER12 ;ERROR IF NULL
MOVEM TAC,DEVFIL(DDB) ;NOT NULL, STORE IN DDB
PUSHJ PDP,GETWD1 ;GET EXTENSION
TLNN TAC,-1 ; NULL EXTENSIONS ARE ILLEGAL ON ITS
JRST DFER12 ; SO COP OUT WITH ILLEGAL NAME
HLLZM TAC,DEVEXT(DDB) ;STORE IN DDB
HRRI UUO,2(UUO) ;GET PPN
PUSHJ PDP,GETWDU
PUSHJ PDP,PPTOSN ;CONVERT TO SNAME
TLNE DDB,SYSDEV ;IS THIS DEVICE SYS ?
MOVE TAC,SYSPP ;YES, THEN GET SNAME OF "SYS"
MOVEM TAC,DEVPPN(DDB) ;STORE IN DDB
HRRI UUO,-3(UUO) ;RESTORE UUO
HLRZ TAC1,DEVEXT(DDB) ;GET EXT. INTO RH
CAIN TAC1,(SIXBIT /UFD/) ;IS IT "UFD" ?
CAME TAC,SYSPP ;YES, IS THIS SYS PPN?
JRST NOTUFD ;NO, ORDINARY FILE
LDB TAC,PDEVI ;YES, GET ITS INPUT CHANNEL
JUMPN TAC,.+4 ;MOVE ON IF ALREADY HAVE ONE
PUSHJ PDP,GTFCHN ;NO, GET ONE
JRST NOCHNE ;ERROR - NONE AVAILABLE
DPB TAC,PDEVI ;OK, STORE IT
MOVEI AC2,(TAC) ;GET CHAN. # INTO AC2
PUSHJ PDP,SETENT ;SET UP .OPEN FOR OUTPUT ON FUNNY NAME
XCT TAC ;DO IT!
JRST DFERR6 ;SHOULDN'T HAPPEN, BUT FILE IS BEING WRITTEN NOW
MOVE TAC,DEVFIL(DDB) ;GET SPECIFIED PPN
PUSHJ PDP,PPTOSN ;CONVERT TO SNAME
MOVEI TAC1,RDUFD ;SET UP ADR. FOR RFD
SETZM DEVCNT(DDB) ;INITIALIZE LENGTH OF FILE
PUSHJ PDP,RFD ;START READING THE UFD AND WRITING
;A 10/50 - LOOKING COPY FOR HIM TO READ
JRST DFERR7 ;NO SUCH UFD - PASS IT ON TO HIM
MOVE TAC1,DEVCNT(DDB) ;GET # OF WORDS IN UFD.
ANDI TAC1,177 ;ISOLATE THE # LEFT TO BE WRITTEN OUT
MOVNI TAC1,(TAC1) ;NEGATE IT
MOVSI TAC1,(TAC1) ;PUT IN LH IN PREPARATION FOR .IOT
TLNE TAC1,777777 ;ARE THERE ANY WORDS LEFT TO BE WRITTEN?
PUSHJ PDP,RDUFD1 ;YES, DO SO
LDB TAC,PDEVI ;ALL FINISHED - GET CHAN. #
PUSHJ PDP,ITSCL1 ;AND CLOSE IT
LDB AC2,PDEVI ;GET CHAN. # AGAIN
PUSHJ PDP,SETENT ;AND SET UP TO READ WHAT WE JUST WROTE
TLZ AC1,ITSIOF ;WE WANT TO READ IT, REMEMBER!
XCT TAC ;OK, .OPEN IT FOR READING
JRST DFERR6 ;BULL SHIT! - BUT COP OUT BY SAYING
;THAT FILE IS BEING WRITTEN
;ENDUFD RDUFD RDUFD1
;** DSKSER.MAC **
ENDUFD: PUSHJ PDP,GTDATE ;GET TODAY'S DATE AS ACCESS DATE
HRLI TAC,(SIXBIT /UFD/) ;AND PROPER EXT.
MOVEM TAC,FILNM1 ;STORE FOR RETURN TO USER
MOVEI TAC,10000 ;CAUSE VERY EARLY DATE AND TIME OF CREATION
MOVEM TAC,FILNM2 ;BECAUSE IT WOULD LOOK PRETTY SILLY
;IF THE UFD WAS NEWER THAN SOME OF ITS FILES!!
MOVNS TAC,DEVCNT(DDB) ;NEGATE SIZE
HRLZM TAC,FILNM3 ;AND STORE A COPY FOR USER
JRST LEXIS1 ;GIVE IT ALL TO HIM AND RETURN
RDUFD: MOVEI TAC1,2 ;INCREASE # OF WORDS IN UFD BY 2
ADDB TAC1,DEVCNT(DDB) ;AND GET A COPY OF RESULT
CAIE TAC1,200 ;DEFENSIVE!!!
ANDI TAC1,177 ;ISOLATE BLOCK RESIDUE
MOVE TAC,FILNAM ;STORE FILENAME AND EXT. IN BUFFER TO
MOVEM TAC,MONBUF-2(TAC1) ;BE OUTPUT WHEN FULL, AND
MOVE TAC,FILNM1 ;ALSO AT END IF NECESSARY
MOVEM TAC,MONBUF-1(TAC1)
TRNE TAC1,177 ;IS MONITOR BUFFER FULL OF UFD GOODS?
POPJ PDP, ;NO, BACK FOR MORE
MOVSI TAC1,-200 ;YES, SET UP TO OUTPUT FULL BLOCK
RDUFD1: HRRI TAC1,MONBUF ;PUT ADR. OF BUFFER INTO .IOT POINTER
LDB TAC,PDEVI ;GET CHAN. #
IORI TAC,<40_4>+<TAC1_13.> ;MAKE .IOT INSTRUCTION
ROT TAC,-13. ;POSITION IT
XCT TAC ;SEND THE BUFFER ( OR PART OF IT IF END )
POPJ PDP, ;RETURN
;NOTUFD DFERR4 DFERR7 DFER12 DFERRY DFER10 DFER11 LEXIST RHEQ1 LEXIS1 LEXIS2
;** DSKSER.MAC **
NOTUFD: MOVEI TAC1,LEXIST ;SET UP ADR. OF ROUTINE
PUSHJ PDP,RFD ;READ FILE DIRECTORY ( SNAME IN TAC )
DFERR4: SKIPA TAC1,RHEQ1 ;NOT IN MFD (ERROR CODE = 1)
DFERR7: MOVEI TAC1,NOTINU ;FILE NOT IN UFD (ERROR CODE = 0)
DFER12: ;ZERO FILENAME SPECIFIED - TAC = 0
DFERRY: PUSHJ PDP,GETWD1 ;GET E+1
HRRI TAC,(TAC1) ;PUT ERROR CODE IN
JRST STOTAC ;STORE IT BACK
;AND GIVE ERROR RETURN
DFER10: SKIPA TAC1,RHEQ4 ;RENAME TO EXISTING NAME (ERROR CODE = 4)
DFER11: MOVEI TAC1,5 ;ATTEMPT TO RENAME WITHOUT PREVIOUS LOOKUP OR ENTER
JRST DFERRY
LEXIST: MOVE TAC,FILNAM ;IS THIS THE FILE WE WANT?
HLLZ TAC1,FILNM1
CAMN TAC,DEVFIL(DDB)
CAME TAC1,DEVEXT(DDB)
RHEQ1: POPJ PDP,1 ;NO, RETURN FOR ANOTHER
SUB PDP,[XWD RFDSTK RFDSTK] ;YES, FIX PDP
HLRZ TAC,FILNM3 ;GET FILE'S SIZE
MOVEM TAC,DEVCNT(DDB) ;STORE IN DDB
LDB TAC,PDEVI ;GET ITS CHAN. #
JUMPN TAC,.+4 ;IF WE ALREADY HAVE ONE, MOVE ON
PUSHJ PDP,GTFCHN ;NO, GET ONE
JRST NOCHNE ;ERROR - NONE AVAILABLE
DPB TAC,PDEVI ;OK, STORE IN DDB
MOVSI TAC1,ITSIOF ;SET UP FOR INPUT
ANDCAM TAC1,ITSNAM(DDB)
ROT TAC,-13. ;POSITION CHAN. #
IOR TAC,[.OPEN 0,ITSNAM(DDB)] ;SET UP .OPEN INSTR.
MOVE AC1,DEVPPN(DDB) ;GET THE SNAME WE WANT THE FILE FROM
CAME AC1,SNAME ;IS IT HIS OWN FILE WE WANT?
.SUSET [.SSNAME,,AC1] ;NO, SET CURRENT SNAME TO THIS ONE
;TEMPORARILY - WE WILL CHANGE IT BACK
;IN A JIFFY.
XCT TAC ;DO THE .OPEN
JRST LEXIS2 ;FAILURE, ASSUME FILE NOT FOUND - BUT
;DON'T FORGET TO CHANGE SNAME BACK
;IF NECESSARY
CAME AC1,SNAME ;OK, IF WE CHANGED THE SNAME,
.SUSET [.SSNAME,,SNAME] ;CHANGE IT BACK
LEXIS1: MOVE TAC,FILNM1 ;SEND THREE NEW WORDS TO USER
PUSHJ PDP,STOTC1
MOVE TAC,FILNM2
PUSHJ PDP,STOTC1
MOVE TAC,FILNM3
PUSHJ PDP,STOTC1
JRST DFENT2 ;INITIALIZE SETCNT AND GIVE OK RETURN
LEXIS2: CAME AC1,SNAME ;DID WE CHANGE THE SNAME?
.SUSET [.SSNAME,,SNAME] ;YES, CHANGE IT BACK
JRST DFERR7 ;NOW GIVE ERROR RETURN
;DFREN RHEQ4 DFRENX
;** DSKSER.MAC ** RENAME UUO
DFREN: PUSHJ PDP,DFRENX
RHEQ4: POPJ PDP,4
JRST CPOPJ1
DFRENX: SKIPN DEVFIL(DDB) ;IS THERE AN OLD FILE?
JRST DFER11 ;NO, UNDEFINED FILE ERROR
MOVE TAC,DEVPPN(DDB) ;YES, GET THE UFD
CAME TAC,SNAME ;IS IT HIS?
JRST DFERR5 ;NO, PROTECTION FAILURE!
PUSHJ PDP,GETWDU ;GET SPECIFIED FILENAME
JUMPE TAC,DFREN7 ;TRYING TO DELETE IF ZERO
MOVE AC1,TAC ;NOT ZERO, SAVE IT IN AC1
PUSHJ PDP,GETWD1 ;GET EXT.
HRR TAC,DEVEXT(DDB) ;CAUSE RIGHT HALVES TO MATCH AND GET FUNNY.
CAMN AC1,DEVFIL(DDB) ;SAME FILENAME?
CAME TAC,DEVEXT(DDB) ;YES, SAME EXT?
JRST .+2 ;NO, SEE ABOUT RENAMING
JRST CPOPJ1 ;YES, GOOD RETURN BECAUSE ONLY TRYING
;TO CHANGE PROTECTION
EXCH AC1,DEVFIL(DDB) ;SWAP NAMES TEMPORARILY
EXCH TAC,DEVEXT(DDB)
MOVEM AC1,FRENAM+1 ;STORE FOR POSSIBLE RENAME
MOVEM TAC,FRENAM+2
PUSHJ PDP,FNDFIL ;SEE IF NEW FILE ALREADY EXISTS
JUMPN AC1,DFRNX3 ;SWAP NAMES BACK & GIVE ERROR IF IT DOES
TLNE DDB,ENTRB ;OK, ARE WE WRITING?
JRST DFRNX4 ;NO, HANDLE DIFFERENTLY
PUSH PDP,DDB ;SAVE DDB
MOVEI DDB,FRENAM+1-DEVFIL ;MAKE DDB POINT TO OLD NAMES
PUSHJ PDP,FNDFIL ;FIND FILE
POP PDP,DDB ;RESTORE DDB
JUMPE AC1,DFRNX5 ;IF NOT THERE, HE MUST HAVE DELETED
;IT ON ANOTHER CHANNEL.
MOVE TAC,DEVFIL(DDB) ;GET NEW FILENAME
MOVE TAC1,DEVEXT(DDB) ;AND EXT.
MOVEM TAC,FRENAM+3 ;STORE FOR RENAME
MOVEM TAC1,FRENAM+4
.FDELE FRENAM ;CHANGE THE NAMES
JRST DFRNX3 ;ERROR, ASSUME NEW FILE SNUCK INTO EXISTENCE
HLLM TAC1,DREXT(AC1) ;OK, STORE NEW EXT. IN DIR. ENTRY
MOVE TAC,FRENAM+3 ;GET NEW NAME
MOVEM TAC,DRNAM(AC1) ;STORE IT IN DIR. ENTRY ALSO
AOS (PDP) ;CAUSE THERE TO BE SKIP RETURN
JRST DFCLSI ;FROM CLOSING INPUT
;DFRNX5 DFRNX3 DFRNX4 DFREN7
;** DSKSER.MAC **
DFRNX5: SKIPA AC1,[DFERR7] ;LOAD ADR. OF ERROR
DFRNX3: MOVEI AC1,DFER10 ;LOAD ADR. OF ERROR
MOVE TAC,FRENAM+1 ;GET ORIGINAL NAME BACK
MOVEM TAC,DEVFIL(DDB)
HLLZ TAC,FRENAM+2 ;EXT. ALSO
MOVEM TAC,DEVEXT(DDB)
JRST (AC1) ;AND GIVE CORRECT ERROR RETURN
DFRNX4: AOS (PDP) ;CAUSE SUCCESSFUL RETURN
JRST DFCLSO ;FROM CLOSING OUTPUT
DFREN7: PUSHJ PDP,DEL.IT ;DELETE THE FILE HE WAS READING OR WRITING
TLZ DDB,LOOKB+ENTRB ;CLEAR FACT THAT HE WAS READING OR WRITING
;SINCE HE JUST DELETED IT
AOBJN PDP,UINIT5 ;GIVE SUCCESSFUL RETURN
;*** NOTE: THIS IS POTENTIALLY RISKY IF THIS OCCURS
;WHEN WE ARE NEAR END OF STACK!!!*****
;DFCLSO DFCL2 DFCL2A
;** DSKSER.MAC **
;CLOSE UUO
;CLOSE AN OUTPUT FILE
DFCLSO: TLNN DDB,ENTRB ;ENTER DONE YET?
POPJ PDP, ;NO, FORGET IT
LDB TAC,PIOMOD ;IS IT DUMP MODE?
CAIGE TAC,DR
TLNE DDB,DSKRLB ;NO, IS RESET UUO IN PROGRESS?
JRST DFCL2 ;YES TO EITHER QUESTION
HLRZ TAC,DEVBUF(DDB) ;NO, GET ADR. OF OUTPUT
;BUFFER HEADER BLOCK
.UMOVE TAC1,(TAC) ;GET FIRST WORD - VIRGIN BUFFERS??
; TAC1 POINTS TO CURRENT BUFFER
JUMPLE TAC1,DFCL2 ;YES, DON'T OUTPUT
ADDI TAC,1 ;POINT TAC AT OUTPUT BYTE POINTER
ADDI TAC1,1 ;POINT TAC1 AT WORD COUNT OF BUFFER
; THE WORD COUNT JUST PRECEDES DATA WORDS
.UMOVE AC1,(TAC) ;GET OUTPUT BYTE POINTER
MOVEI AC1,(AC1) ;ISOLATE RH
JUMPE AC1,.+2 ;DON'T CALCULATE WORD COUNT IF BYTE
;POINTER NOT SET UP
SUBI AC1,(TAC1) ;CALCULATE # WORDS USER FILLED
TRNE IOS,IOWC ;IS USER KEEPING OWN COUNT?
.UMOVE AC1,(TAC1) ;YES, USE HIS COUNT INSTEAD
MOVEI AC1,(AC1) ;ISOLATE RH
JUMPE AC1,DFCL2 ;IF COUNT = 0, DON'T OUTPUT
;0-WORD FINAL BLOCK
PUSHJ PDP,OUT ;GO WRITE LAST PARTIAL BLOCK
DFCL2: TLZ DDB,ENTRB ;TURN THIS OFF NOW
;CHECK FOR UPDATE MODE HERE ********
TLNE DDB,DSKRLB ;IS RESET UUO IN PROGRESS?
JRST DFC16A ;YES
PUSHJ PDP,DEL.IT ;NO, DELETE FILE WITH THIS
;NAME AND EXT.
HRRE TAC,DEVCNT(DDB) ;GET SIZE OF FILE
MOVN TAC,TAC
HLLZ TAC,DEVEXT(DDB) ;FORM COMPLETE SECOND NAME
MOVEM TAC,FOPRNM+4 ;STORE FOR .FDELE (RENAME)
MOVEM TAC,DEVEXT(DDB) ;ALSO STORE IN DDB SO THAT A SEQUENCE OF
; ENTER/CLOSE/RENAME WORKS. RENAME EXPECTS COMPLETE FILE NAME IN DEVFIL/
; DEVEXT.
LDB TAC,PDEVO ;GET CHANNEL #
MOVEM TAC,FOPRNM+2
MOVE TAC,DEVFIL(DDB) ;GET FIRST NAME
MOVEM TAC,FOPRNM+3
DFCL2A: .FDELE FOPRNM ;DO A RENAME WHILE WRITING
JRST CLSFAL ;FAILURE - COINCIDENTAL, BUT HE MUST HAVE
;SNUCK IN A FILE OF EXACTLY THE SAME NAME.
;WE WILL DELETE IT AND TRY AGAIN, BECAUSE
;WE ARE SUPPOSED TO SUPERCEDE
;ITSCLO ITSCL1 DFC16A
;** DSKSER.MAC **
MOVEI AC1,1 ;OK, GET A CHUNK FOR NEW DIR. ENTRY
PUSHJ PDP,GTF
HRRE TAC,DEVCNT(DDB) ;GET SIZE OF FILE
MOVN TAC,TAC
MOVSI TAC,(TAC)
HRR TAC,DIRLST ;AND LINK NEW CHUNK INTO CHAIN
HRRM AC1,DIRLST
MOVEM TAC,DRSIZ(AC1)
PUSHJ PDP,GTDATE ;GET TODAY'S DATE FOR ACCESS DATE
HLL TAC,DEVEXT(DDB) ;ALSO EXT.
MOVEM TAC,DREXT(AC1) ;STORE IN DIR. ENTRY
MOVEM TAC,DRPROT(AC1) ;STORE AS CREATION DATE ALSO -
;REST OF WORD GETS FILLED IN
;CORRECTLY BELOW
PUSHJ PDP,GTTIME ;GET # JIFFIES PAST MIDNITE
IDIVI TAC,JIFMIN ;FORM # MINUTES
DPB TAC,[POINT 11,DRPROT(AC1),23,] ;STORE
LDB TAC,PIOMOD ;GET DATA MODE OF INIT
IORI TAC,<STDPRT>_4 ;PUT IN STD. PROTECTION KEY
DPB TAC,[POINT 13,DRPROT(AC1),12,] ;STORE IN DIR. ENTRY
MOVE TAC,DEVFIL(DDB) ;DON'T FORGET FILENAME
MOVEM TAC,DRNAM(AC1)
ITSCLO: LDB TAC,PDEVO ;GET CHAN. #
ITSCL1: ROT TAC,-13. ;POSITION IT
IOR TAC,[.CLOSE 0,] ;MAKE A .CLOSE INSTR.
XCT TAC ;DO IT!
POPJ PDP, ;RETURN
DFC16A: PUSHJ PDP,ITSCLO ;CLOSE THE OUTPUT CHANNEL
LDB AC2,PDEVO ;GET THAT CHANNEL #
PUSHJ PDP,MKFNNM ;MAKE "FUNNY NAME" OUT OF IT
MOVEM AC2,FRENAM+1 ;STORE NAME1 FOR DELETE
MOVEM AC3,FRENAM+2 ;NAME2 ALSO
SETZM FRENAM+3 ;CAUSE IT TO BE DELETED
.FDELE FRENAM ;DO SO.
POPJ PDP, ;RETURN ANYWAY
POPJ PDP, ;RETURN
;CLSFAL FNDFIL FNDF.1 DEL.IT
;** DSKSER.MAC **
CLSFAL: MOVEM TAC,FRENAM+1 ;STORE NAME1 TO BE DELETED
MOVE TAC,FOPRNM+4 ;GET NAME2 FROM RENAME
MOVEM TAC,FRENAM+2 ;STORE FOR DELETE
.FDELE FRENAM ;DELETE IT
JFCL ;SO WHAT!
JRST DFCL2A ;TRY RENAME AGAIN
;HERE TO DELETE ALL FILES WHOSE NAME & EXT. MATCH
;THOSE IN DDB POINTED TO IN DDB.
FNDFIL: MOVEI AC1,DIRLST-FSIZ+1 ;INITIALIZE LOOP
MOVE TAC,DEVFIL(DDB) ;GET NAME
HLRZ AC3,DEVEXT(DDB) ;AND EXTENSION
FNDF.1: MOVEI AC2,(AC1) ;COPY POINTER
HRRZ AC1,DRSIZ(AC1) ;POINT TO NEXT ENTRY
JUMPE AC1,CPOPJ ;ZERO DENOTES END - RETURN
HLRZ TAC1,DREXT(AC1) ;GET EXT.
CAMN TAC,DRNAM(AC1) ;MATCH?
CAIE TAC1,(AC3)
JRST FNDF.1 ;NO, CONTINUE
POPJ PDP, ;YES, RETURN WITH AC1 POINTING TO DIR. ENTRY
;AND TAC & TAC1 CONTAINING NAME AND EXT.
DEL.IT: PUSHJ PDP,FNDFIL ;FIND THE FILE
JUMPE AC1,CPOPJ ;NULL INDICATES NON-EXISTENT
MOVEM TAC,FRENAM+1 ;YES, STORE NAME1 FOR DELETE
HLRZ TAC,DRSIZ(AC1) ;GET SIZE
HRLZ TAC,TAC1 ;SET UP NAME2
MOVEM TAC,FRENAM+2 ;STORE IT
HRRZ TAC,DRSIZ(AC1) ;GET ADR. OF NEXT ENTRY
HRRM TAC,DRSIZ(AC2) ;LINK PREVIOUS TO IT - I.E., UNLINK THIS ONE
SETZM FRENAM+3 ;CAUSE DELETION
MOVEI AC2,(AC1)
MOVEI AC1,1
PUSHJ PDP,RTF
.FDELE FRENAM ;DELETE FILE
JFCL
POPJ PDP, ;RETURN
;DFCLSI DFCL21 DFCL23 DFCL30
;** DSKSER.MAC **
;CLOSE AN INPUT FILE
;IF IT HAS BEEN BOTH "LOOKUP" AND "INPUT", THEN UPDATE THE
;ACCESS DATE. INITIALLY, BECAUSE WE DO .OPEN WHEN WE PERFORM
;THE LOOKUP, WE MUST UPDATE THE ACCESS DATE EVEN THOUGH NO
;INPUT WAS DONE. IF THE FILE BEING CLOSED IS IN OUR USER'S
;AREA, THEN UPDATE THE ACCESS DATE IN THE DIR. ENTRY. IF IT
;BELONGS TO ANOTHER USER, AND THAT USER'S UFD IS IN TOP 1K,
;ERASE THE FACT THAT WE HAVE IT UP THERE. ALTERNATIVELY,
;WE WOULD LIKE TO UPDATE THE ACCESS DATE IN THE UFD IN THE TOP 1K.
DFCLSI: TLZN DDB,LOOKB ;ANY REASON TO BOTHER?
POPJ PDP, ;NO, RETURN
DFCL21:
DFCL23:
; TLZN DDB,INPB ;HAS AN INPUT BEEN DONE?
; POPJ PDP, ;NO, RETURN
MOVE TAC,DEVPPN(DDB) ;YES, GET PPN OF THIS FILE
PUSHJ PDP,PPTOSN ;CONVERT TO SNAME
CAME TAC,SNAME ;IS IT THIS USER'S?
JRST DFCL30 ;NO, NOT IN GOOD FORM; FIX ANOTHER WAY.
PUSHJ PDP,FNDFIL ;YES, POINT TO DIR. ENTRY
JUMPE AC1,CPOPJ ;NOT THERE ANY LONGER, OH WELL.....
PUSHJ PDP,GTDATE ;GET TODAY'S DATE
DPB TAC,[POINT 12,DREXT(AC1),35,] ;STORE IN DIR. ENTRY
POPJ PDP, ;RETURN
DFCL30: HRRZ AC1,HLADR ;GET ADR. OF BEGIN OF UFD
JUMPE AC1,CPOPJ ;IF NONE, RETURN
MOVE TAC,UDNAME(AC1) ;GET THE OWNER'S SNAME
CAMN TAC,DEVPPN(DDB) ;IS IT HIS FILE BEING CLOSED?
SETZM UDNAME(AC1) ;YES, ERASE THE FACT THAT HE IS IN.
POPJ PDP, ;RETURN
;DFREL
;** DSKSER.MAC **
;RELEASE UUO
DFREL: TLO DDB,DSKRLB ;NOTE THAT RELEASE (VIA RESET UUO)
;IS IN PROGRESS
PUSHJ PDP,DFCLSI ;CLOSE INPUT FIRST
PUSHJ PDP,DFCLSO ;THEN CLOSE OUTPUT
TLZ DDB,DSKRLB ;CLEAR RELEASE MARKER
POPJ PDP, ;RETURN
;DFIN DFIN1 DFIN1E DFERR2
;** DSKSER.MAC **
;INPUT UUO
DFIN: TLNN DDB,LOOKB ;FILE OPRN?
JRST DFERR2 ;NO, UNDEFINED FILE
DFIN1: TLNE IOS,IOEND ;ANY MORE INPUT?
POPJ PDP, ;NO, LEAVE
HRRE AC1,DEVCNT(DDB) ;GET SIZE OF FILE WE ARE READING
JUMPLE AC1,.+2 ;IF # OF BLOCKS,
LSH AC1,BLKP2 ;MAKE # OF WORDS
MOVM AC1,AC1 ;MAKE POS. # WORDS REGARDLESS
MOVE AC2,SETCNT(DDB) ;GET BLOCK # TO READ NEXT
SUBI AC2,1 ;FORM MINIMUM # WORDS NEEDED IN FILE TO BE
LSH AC2,BLKP2 ;ABLE TO READ THIS BLOCK
SUB AC2,AC1 ;IF PAST END OF FILE,
JUMPGE AC2,DFIN1E ;SET END AND RETURN
CAMGE AC2,[-BLKSIZ] ;IS THIS THE LAST READ?
MOVNI AC2,BLKSIZ ;NO, ONLY READ A MAX. OF ONE DEC 10/50 BLOCK
HRLZI AC2,(AC2) ;SET UP POINTER WORD FOR .IOT
HRRI AC2,MONBUF+1
LDB TAC1,PDEVI ;GET CHAN. #
IORI TAC1,<40_4>+<AC2_13.> ;SET UP .IOT
ROT TAC1,-13. ;POSITION IT
PUSH PDP,AC2 ;SAVE .IOT POINTER WORD
XCT TAC1 ;DO IT!
POP PDP,TAC1 ;RESTORE PREVIOUS POINTER WORD
HLRE TAC1,TAC1 ;GET LH ( COUNT )
HLRE AC2,AC2 ;GET POST FACTO COUNT
SUB AC2,TAC1 ;GET # WORDS TRANSFERRED IN
JUMPE AC2,DFIN1E ;END IF NOTHING READ
HRRZ TAC1,DEVIAD(DDB) ;GET ADR. OF CURRENT BUFFER
.UMOVE AC1,1(TAC1) ;GET WORD WHICH HOLDS WORD COUNT
HRRI AC1,(AC2) ;PUT THIS WORD COUNT IN IT
MOVEM AC1,MONBUF ;STORE FOR TRANSFER INTO BUFFER
MOVEI TAC1,1(TAC1) ;POINT TO FIRST DATA WORD OF BUFFER
HRLI TAC1,MONBUF ;SET UP TO GIVE USER HIS BUFFER
ADDI AC1,(TAC1) ;POINT TO LAST LOC. IN BUFFER TO BE FILLED
.UBLTO TAC1,(AC1) ;OFF IT GOES!
AOS SETCNT(DDB) ;NEXT BLOCK #
CAIE AC2,BLKSIZ ;DID WE JUST READ A FULL 10/50 BLOCK?
PUSHJ PDP,DFIN1E ;NO, SET END
PUSHJ PDP,ADVBFF ;YES, ANY MORE EMPTY BUFFERS?
POPJ PDP, ;NO, RETURN
JRST DFIN1 ;YES, SEE ABOUT FILLING ANOTHER WHILE WE ARE HERE
DFIN1E: TLO IOS,IOEND ;SET END
MOVEM IOS,DEVIOS(DDB)
POPJ PDP, ;RETURN
DFERR2: MOVEI IOS,IOIMPM
IORB IOS,DEVIOS(DDB)
POPJ PDP,
;DFOUT DFOUT1
;** DSKSER.MAC **
;OUTPUT UUO
DFOUT: TLNN DDB,ENTRB ;FILE OPEN?
JRST DFERR2 ;NO, UNDEFINED FILE
DFOUT1: HRLZ TAC1,DEVOAD(DDB) ;GET ADR. OF BUFFER IN USER AREA
HRRI TAC1,MONBUF+1 ;SET UP DESTINATION ( +1 WHICH GOES AWAY BELOW )
ADDI TAC1,777777 ;DECREASE RH BY 1 AND INCREASE LH BY 1
.UBLTI TAC1,MONBUF+BLKSIZ ;GET THE ENTIRE BUFFER
HRRZ TAC1,MONBUF ;GET WORD COUNT
PUSHJ PDP,UPDEVC ;UPDATE DEVCNT
AOS SETCNT(DDB) ;INCREMENT BLOCK #
MOVE TAC1,[XWD -200 MONBUF+1] ;SET UP .IOT
LDB TAC,PDEVO ;GET OUTPUT CHAN. #
IORI TAC,<40_4>+<TAC1_13.>
ROT TAC,-13. ;POSITION THE .IOT INSTRUCTION
XCT TAC ;DO IT!
PUSHJ PDP,ADVBFE ;ANY MORE OUTPUT TO DO?
POPJ PDP, ;NO, RETURN
JRST DFOUT1 ;YES, DO ANOTHER BUFFER
;CLRDDB CLDDB1 SETDDB SETDD0
;** DSKSER.MAC **
;CLEAR OUT DDB AT RELEASE TIME
; COULD BE A TTY DDB OR A DSK DDB (SIZE IS INCLUDED IN LH OF DEVCHR)
CLRDDB: MOVEI AC2,DSKDDB ;POINT TO PROTOTYPE
CLDDB1: MOVEI AC1,(AC2) ;MAKE COPY OF POINTER
HLRZ AC2,DEVSER(AC1) ;GET LINK TO NEXT DDB
JUMPE AC2,CPOPJ ;0 MEANS END
CAIE AC2,(DDB) ;IS THIS THE ONE?
JRST CLDDB1 ;NO, TRY NEXT
MOVE TAC,DEVSER(AC2) ;YES, GET LINK OF NEXT DDB
HLLM TAC,DEVSER(AC1) ;STORE IN PREVIOUS
HLRZ AC1,DEVCHR(DDB) ;SET UP # CHUNKS TO RETURN
JRST RTF ;RETURN THEM AND RETURN
;BUILD A DSK DDB
SETDDB: PUSH PDP,TAC ;SAVE THIS AC
MOVE TAC,DEVMOD(DDB)
TRNE TAC,ASSPRG ;HAS INIT BEEN DONE YET?
JRST SETDD0 ;YES, COPY PROTOTYPE
MOVEI TAC,(DDB) ;NO, GET ADR. OF DDB
CAIE TAC,DSKDDB ;IS IT PROTOTYPE?
JRST TPOPJ ;NO, THEN WE ALREADY HAVE A COPY OF IT - RETURN
SETDD0: MOVEI AC1,DSKCOR ;GET FREE CORE FOR DSK DDB
PUSHJ PDP,GTF
HRRI DDB,(AC1) ;POINT DDB AT NEW CORE (DDB)
HRLI AC1,DSKDDB ;XWD SOURCE DESTINATION
BLT AC1,DSLEN-1(DDB) ;COPY PROTOTYPE UNTIL THAT POINT WHERE
; REST OF DDB IS ZERO
SETZM DSLEN(DDB) ;THEN ZERO THE REST
HRLZI AC1,DSLEN(DDB)
HRRI AC1,DSLEN+1(DDB)
BLT AC1,PTR1-1(DDB)
HRLM DDB,DEVSER+DSKDDB ;LINK IN NEW DDB
JRST TPOPJ ;RESTORE TAC AND RETURN
;UPDEVC UPDVC1 UPDVC2
;** DSKSER.MAC **
;UPDATE DEVCNT IF NECESSARY.
;DEVCNT HAS SIZE OF FILE IN RH ( IN WORDS IF POSITIVE, BLOCK
;COUNT IF NEGATIVE)
;ENTER WITH SIZE OF CURRENT BLOCK IN TAC1
UPDEVC: HRRZ TAC,SETCNT(DDB) ;CONVERT CURRENT RELATIVE
SUBI TAC,1 ;BLOCK # TO WORDS
LSH TAC,BLKP2
ADD TAC,TAC1 ;ADD IN THESE ADDITIONAL WORDS
HRRZ TAC1,DEVCNT(DDB) ;PICK UP PREVIOUS MAXIMUM
TRNE TAC1,400000 ;FILE SIZE FOR COMPARISON
JRST UPDVC2 ;IF > 2**17, COMPARE NEG. BLOCK COUNTS
TLNN TAC,-1 ;NO, IS NEW SIZE > 2**17 WORDS?
TRNE TAC,400000
JRST UPDVC1 ;YES, SAVE NEG. BLOCK COUNT
CAILE TAC,(TAC1) ;NO, COMPARE POSITIVE WORD COUNTS
HRRM TAC,DEVCNT(DDB) ;UPDATE MAX. FILE SIZE ONLY
;IF PREVIOUS MAX. EXCEEDED
POPJ PDP, ;AND RETURN
UPDVC1: IORI TAC1,-1 ;SET PREV. MAX. AS ONLY ONE BLOCK
;(FORCING CURRENT BLOCK COUNT TO BE STORED)
UPDVC2: ADDI TAC,BLKSIZ-1 ;CONVERT POS. WORD COUNT
LSH TAC,-BLKP2 ;TO NEG. BLOCK COUNT
MOVN TAC,TAC
TRON TAC,400000 ;MORE THAN 2**17 BLOCKS IN FILE NOW?
TROA IOS,IOBKTL ;YES, ABSURDITY!! STORE BLOCK COUNT MOD 2**17
CAILE TAC1,(TAC) ;NO, COMPARE PREVIOUS MAX. WITH PRESENT SIZE
HRRM TAC,DEVCNT(DDB) ;STORE NEW MAX. FILE SIZE ONLY IF
;PREV. MAX. EXCEEDED
POPJ PDP, ;RETURN
;GTF GTF0 GTF1 GTF2 GTWIN
;** UUOCON.MAC **
;ENTER WITH # OF CONTIGUOUS "FSIZ"-WORD CHUNKS DESIRED IN AC1.
;RETURN WITH ADR. OF FIRST WORD OF BLOCK IN AC1.
;AC'S AC1, AC2, AND AC3 ARE USED AND CLOBBERED
GTF: PUSH PDP,AC1 ;SAVE # DESIRED
GTF0: MOVEI AC2,FREEPT-FSIZ+1 ;SAVE INITIAL POINTER
PUSH PDP,AC2
HRRZ AC3,FREEPT ;GET ADR. OF FIRST CHUNK
GTF1: JUMPE AC3,GTFAIL ;IF END, NOT ENUF!
MOVEM AC2,(PDP) ;SAVE PTR. TO FIRST CHUNK
MOVE AC1,-1(PDP) ;GET # DESIRED
MOVEI AC2,(AC3) ;COPY ADR. OF CURRENT CHUNK
GTF2: SOJLE AC1,GTWIN ;FOUND ENOUGH? - YES!
HRRZ AC3,FSIZ-1(AC2) ;NO, GET NEXT
CAIE AC3,FSIZ(AC2) ;CONTIGUOUS?
JRST GTF1 ;NO, MOVE ON
MOVEI AC2,(AC3) ;YES, MAKE IT LAST SO FAR
JRST GTF2 ;AND CONTINUE
GTWIN: POP PDP,AC2 ;GET PTR. TO FIRST CHUNK
HRRZ AC1,FSIZ-1(AC2) ;PUT ADR. OF FIRST CHUNK INTO T
MOVE AC3,(PDP) ;REDUCE FRENUM BY AMT. WE ARE GIVING HIM
SUB AC3,FRENUM
MOVNM AC3,FRENUM
POP PDP,AC3 ;GET # CHUNKS WE ARE GIVING HIM
IMULI AC3,FSIZ ;FORM # OF WORDS BEING RETURNED
ADDI AC3,-1(AC1) ;FORM ADR. OF LAST WORD OF BLOCK
HRRZ AC3,(AC3) ;UNLINK THIS BLOCK
HRRM AC3,FSIZ-1(AC2)
POPJ PDP, ;RETURN TO USER WITH ADR. OF BLK IN T.
;GTFAIL GTFAL0 GTFAL1 ADD1K ADD1K1
;** UUOCON.MAC **
;HERE WHEN NOT ENOUGH CONTIGUOUS CHUNKS.
;IF # DESIRED IS AVAILABLE BUT NOT CONTIGUOUS AT THE MOMENAC1, "GCOL"
;IS CALLED TO COMPACTIFY.
;IF NOT, "ADD1K" IS CALLED TO APPEND ONE MORE K OF CORE ABOVE
;CURRENT TOP OF FREE CORE.
GTFAIL: MOVE AC1,-1(PDP) ;PICK UP # HE WANTS
CAMLE AC1,FRENUM ;IS IT WORTHWHILE TO COMPACTIFY?
JRST GTFAL1 ;NO, JUST GET ANOTHER K OF CORE
PUSHJ PDP,GCOL ;YES, DO SO
GTFAL0: POP PDP,AC1 ;NOW, TRY FOR THE DESIRED #
JRST GTF0
GTFAL1: PUSHJ PDP,ADD1K ;GET 1K MORE FOR FREE CORE AREA
JRST GTFAL0 ;RETURN FOR ANOTHER TRY
;CALL HERE TO GET 1 MORE K OF CORE FOR FREE CORE AREA.
;IF A UFD OCCUPIES TOP K, IT IS MOVED UP. THE ADDITIONAL
;K OF CORE IS ADDED TO THE FREE LIST.
;AC'S AC1, AC2, AND AC3 ARE CLOBBERED.
ADD1K: MOVS AC1,HLADR ;GET ADR. OF TOP OF FREE CORE
HRRI AC1,4000(AC1) ;MAKE IT 1 MORE
TLZE AC1,777777 ;IS THERE A UFD?
MOVEI AC1,2000(AC1) ;YES, ACCOUNT FOR IT
LSH AC1,-10. ;FORM # K WE WANT
.CORE (AC1) ;GET IT!
JRST SYSERR ;*** COULDN'T GET ANOTHER K!! ***
HRRZ AC1,HLADR ;GET ADR. OF UFD.
JUMPE AC1,ADD1K1 ;NO UFD, MOVE ON
HRLI AC1,(AC1) ;PREPARE TO MOVE UFD TO NEW K
ADDI AC1,2000 ;FORM NEW BEGIN ADR. FOR UFD
HRRM AC1,HLADR ;STORE IT
MOVEI AC2,1777(AC1) ;SET UP FINAL "TO ADR."
BLT AC1,(AC2) ;MOVE THE UFD UP!
ADD1K1: HLRZ AC3,HLADR ;GET OLD TOP OF FREE CORE
MOVEI AC1,2000(AC3) ;FORM MAX. OF NEW TOP
IORI AC1,1777
SUBI AC1,(AC3) ;FORM # WORDS AVAILABLE FOR FREE CHUNKS
IDIVI AC1,FSIZ ;FORM # CHUNKS
MOVEI AC2,FSIZ ;FORM NEW TOP OF FREE CORE
IMULI AC2,(AC1)
ADDI AC2,(AC3)
HRLM AC2,HLADR ;STORE IT
MOVEI AC2,1(AC3) ;SET UP ADR. OF FIRST NEW CHUNK
JRST RTF0 ;PLACE NEW CHUNKS AT END OF LIST
;AND RETURN
;RTF RTF9
;** UUOCON.MAC **
;CALL HERE TO RETURN # OF CONTIGUOUS FREE CHUNKS IN AC1 STARTING AT ADR.
;IN AC2.
;ATTEMPT WILL BE MADE TO GIVE 1K BACK TO ITS IF POSSIBLE. ALL EXCEPT
;"GCOL" SHOULD CALL HERE. ( "GCOL" CALLS RTF0. )
RTF: PUSHJ PDP,RTF0 ;RETURN THE CHUNKS
MOVE AC2,FRENUM ;GET TOTAL # FREE CHUNKS
CAIG AC2,2000/FSIZ+MINFRE;CAN WE AFFORD TO
;GIVE 1K BACK TO ITS ?
POPJ PDP, ;NO, RETURN
PUSH PDP,AC1 ;YES, SAVE # CHUNKS JUST RETURNED
PUSHJ PDP,GCOL ;GARBAGE COLLECT SO THAT FREE CHUNKS
;WILL FLOAT TO TOP
SUBI AC1,2000/FSIZ ;REDUCE # FREE CHUNKS
MOVEM AC1,FRENUM
MOVS AC1,HLADR ;GET HIGH ADR. INTO RH
SUBI AC1,2000 ;REDUCE BY 1K
IORI AC1,1777
MOVEI AC2,1(AC1) ;REDUCE TO ACCOUNT FOR FSIZ OFFSET
SUB AC2,FREEPT
IDIVI AC2,FSIZ
SUBI AC1,(AC3)
HRLM AC1,HLADR ;AND STORE NEW VALUE
TLNN AC1,777777 ;IS THERE A UFD IN CORE NOW?
JRST RTF9 ;NO, MOVE ON
HLRZ AC2,AC1 ;YES, MOVE IT DOWN 1K
HRLI AC2,-2000(AC2)
HLRM AC2,HLADR ;FIX PTR. TO UFD
MOVEI AC1,-1(AC2)
MOVS AC2,AC2
BLT AC2,(AC1)
RTF9: ADDI AC1,2000 ;GIVE BACK 1K NOW
LSH AC1,-10.
.CORE (AC1)
JRST SYSERR ;NOT SUPPOSED TO BE UNGRATEFUL!!
POP PDP,AC1 ;RESTORE AC1.
POPJ PDP, ;AND RETURN
;RTF0 RTF1 RTF2 RTF3
;** UUOCON.MAC **
;ENTER WITH # OF CHUNKS TO RETURN IN AC1, AND ADR. OF FIRST CHUNK IN AC2.
;RETURNS WITH # CHUNKS RETURNED STILL IN AC1, BUT AC2 IS CLOBBERED.
;*** AC1 MUST BE GREATER THAN 0!! ***
RTF0: PUSH PDP,AC1 ;SAVE # CHUNKS BEING RETURNED
PUSH PDP,AC1 ;SAVE ANOTHER COPY FOR COUNTER
PUSH PDP,AC2 ;SAVE ADR. OF BLOCK
MOVEI AC2,FREEPT-FSIZ+1 ;GET ADR. OF FIRST PTR.
RTF1: MOVEI AC1,(AC2) ;COPY ADR. OF PTR.
HRRZ AC2,FSIZ-1(AC1) ;GET ADR. NEXT CHUNK
CAMG AC2,(PDP) ;GREATER THAN BLOCK BEING RETURNED?
JUMPN AC2,RTF1 ;NO, BUT IS IT END? - NO, CONTINUE
EXCH AC2,(PDP) ;YES, GET ADR. OF BLOCK AND SAVE CURRENT
HRRM AC2,FSIZ-1(AC1) ;NEXT CHUNK. LINK BLOCK INTO CHAIN
RTF2: SOSG -1(PDP) ;ANY CHUNKS LEFT TO RETURN?
JRST RTF3 ;NO, FINISH UP
ADDI AC2,FSIZ ;YES, GIVE ANOTHER CHUNK
HRRM AC2,-1(AC2) ;BACK CONTIGUOUSLY
JRST RTF2 ;CONTINUE
RTF3: POP PDP,AC1 ;GET ADR. OF NEXT CHUNK
HRRM AC1,FSIZ-1(AC2) ;LINK IT IN
POP PDP,AC1 ;RESTORE STACK
POP PDP,AC1 ;RESTORE # CHUNKS RETURNED
ADDM AC1,FRENUM ;ADD TO TOTAL # FREE CHUNKS
POPJ PDP, ;RETURN
;GCOL GCOL0 GCOL1 GCOL2 GCOL21 GCOL3 GCOL4 GCOL5 GCOL6 GCOL7
;** UUOCON.MAC **
;CALL HERE TO COMPACTIFY ALL CHUNKS IN USE AND CAUSE ALL FREE CHUNKS
;TO FLOAT TO TOP OF FREE CORE AREA. AC'S AC1, AC2, AND AC3 ARE CLOBBERED.
GCOL: HLRZ AC1,HLADR ;GET ADR. OF TOP OF FREE CORE AREA
PUSH PDP,AC1 ;AND SAVE
GCOL0: HRRZ AC1,FREEPT ;GET FIRST FREE CHUNK ADR.
JUMPE AC1,GCOL7 ;IF END, FINISH UP
GCOL1: MOVEI AC2,(AC1) ;PUT ADR. INTO AC2.
HRRZ AC1,FSIZ-1(AC2) ;GET ADR. OF NEXT CHUNK
CAIN AC1,FSIZ(AC2) ;CONTIGUOUS?
JRST GCOL1 ;YES, CONTINUE
;NO, MAKE THIS CHUNK THE FIRST FREE AND
EXCH AC1,FREEPT ;GET ADR. OF CURRENT "FIRST FREE"
HRL AC1,AC1 ;GET COPY OF THE ADR. INTO LH, ALSO
SUBI AC2,-FSIZ(AC1) ;FORM # CONTIGUOUS FREE WORDS
PUSH PDP,AC2 ;SAVE THIS #
MOVEI AC3,DEVLST-DEVSER ;SET UP PTR. TO FIRST DDB PTR.
GCOL2: MOVEI AC2,(AC3) ;PUT ADR. INTO AC2.
HLRZ AC3,DEVSER(AC2) ;GET ADR. OF NEXT DDB.
JUMPE AC3,GCOL21 ;IF END, MOVE ON
CAIG AC3,(AC1) ;IS THIS DDB ABOVE LOWEST FREE CORE?
JRST GCOL2 ;NO
SUB AC3,(PDP) ;YES, CORRECT PTR. TO WHERE DDB WILL BE
HRLM AC3,DEVSER(AC2)
ADD AC3,(PDP) ;NOW RESET THE DDB PTR.
JRST GCOL2 ;CONTINUE
GCOL21: MOVEI AC2,FREEPT-FSIZ+1 ;SET UP PTR. TO FREE CORE PTR.
GCOL3: HRRZ AC3,FSIZ-1(AC2) ;GET ADR. OF NEXT FREE CHUNK
JUMPE AC3,GCOL4 ;IF END, MOVE ON
SUB AC3,(PDP) ;CORRECT PTR. TO ACCOUNT FOR SHUFFLE
HRRM AC3,FSIZ-1(AC2)
ADD AC3,(PDP)
MOVEI AC2,(AC3) ;PUT PTR. INTO AC2.
JRST GCOL3 ;AND CONTINUE
GCOL4: MOVEI AC3,DIRLST-FSIZ+1 ;GET PTR. TO FIRST DIRECTORY
;ENTRY PTR.
GCOL5: MOVEI AC2,(AC3) ;COPY PTR. INTO AC2
HRRZ AC3,FSIZ-1(AC2) ;GET ADR. OF NEXT DIR. ENTRY
JUMPE AC3,GCOL6 ;IF END, MOVE ON
CAIG AC3,(AC1) ;WILL THIS ENTRY BE MOVED?
JRST GCOL5 ;NO
SUB AC3,(PDP) ;YES, CORRECT THE PTR.
HRRM AC3,FSIZ-1(AC2)
ADD AC3,(PDP)
JRST GCOL5 ;CONTINUE
GCOL6: POP PDP,AC2 ;GET # OF CONTIGUOUS WORDS
ADDI AC1,(AC2) ;SET UP TO TRANSFER DOWN
MOVS AC1,AC1
EXCH AC2,(PDP) ;UPDATE ADR. OF TOP OF FREE CORE
SUBB AC2,(PDP) ;AND USE AS LAST "TO ADR." IN BLT
BLT AC1,(AC2) ;MOVE SOME CORE DOWN
JRST GCOL0 ;DO FOR NEXT CONTIGUOUS CHUNKS
GCOL7: EXCH AC1,FRENUM ;GET # FREE CHUNKS AND ZERO IN
;PREPARATION FOR CALL TO "RTF0".
POP PDP,AC2 ;GET ADR. OF FIRST CHUNK TO BE RETURNED
JRST RTF0 ;GIVE BACK THE FREE CHUNKS WHICH ARE NOW
;CONTIGUOUS AND JUST BELOW THE UFD
;(IF ANY)
;DOXUUO UUOUSR UUOSY1 ILEGAL DISP0 DISP2 USRXT1 USRXIT
;** UUOCON.MAC **
;HERE TO DO AN EXEC UUO
DOXUUO: ADDI UCHN,1 ;INCREMENT RETURN ADR. PAST UUO
TLZ UCHN,USRMOD ;BE SURE USER MODE IS OFF
MOVEM UCHN,UUO0 ;STORE PC IN UUO0
MOVE UUO,@-1(UCHN) ;GET THE UUO ITSELF
HRRZS USRPD1 ;BE SURE USER MODE BIT IS OFF IN USRPD1!!
JRST UUOSY1 ;GO DO THE EXEC UUO
;HERE ON UUO FROM USER
UUOUSR: MOVE UUO,FORTY ;GET THE UUO
MOVE PDP,UPDP ;INIT THE PUSH-DOWN POINTER
UUOSY1: PUSH PDP,UUO0 ;SAVE RETURN ADR. ON STACK
TLNN UUO,740000 ;GREATER THAN 40?
ILEGAL: JRST UUOERR ;NO, 0-37 ILLEGAL!
HLRZ TAC1,UUO ; FETCH THE INSTRUCTION
CAIN TAC1,(PORTAL) ; WAS IT A PORTAL?
JRST [HRRM UUO,(PDP) ; YES, FAKE DOING A JRST
JRST USRXIT] ; AND DISMISS THE "uUO"
LDB TAC1,[POINT 9,UUO,8,] ;GET UUO OP CODE
CAIL TAC1,100 ;GREATER OR EQUAL TO 100 ?
JRST ILLINS ;YES, BAD INSTRUCTION
LDB UCHN,PUUOAC ;GET AC FIELD
SKIPE DDB,USRJDA(UCHN) ;ADR. OF DDB.
CAMLE UCHN,USRHCU ;IS CHAN. LESS OR EQUAL TO HIGHEST USED?
JRST NOCHAN ;CHANNEL NOT ASSIGNED - CHECK IT OUT
MOVE IOS,DEVIOS(DDB) ;GET DDB STATUS
MOVE DSER,DEVSER(DDB) ;AND ADR. OF I/O SERVICE DISP.
CAIL TAC1,LNGUUO ;IS THIS LONG DISP. TABLE UUO ?
JRST DISP1 ;YES
DISP0: ROT TAC1,-1 ;NO, GET DISPATCH TABLE ENTRY
MOVE DAT,UUOTAB-20(TAC1)
DISP2: JUMPL TAC1,.+2 ;ODD USES RH
MOVS DAT,DAT ;EVEN USES LH
HLL DAT,(PDP) ;PICK UP FLAGS OF PC ON STACK
TLNN DAT,USRMOD ;IS IT UUO FROM EXEC?
JRST (DAT) ;YES, RETURN ADR. IS ALREADY THERE.
PUSHJ PDP,(DAT) ;NO, DO THE UUO FOR THE USER
JRST .+2 ;NON-SKIP RETURN TO USER
USRXT1: AOS (PDP) ;SKIP RETURN TO USER
USRXIT: SKIPL JBTSTS ;HAS A "CALLI 1,12" OR A "HALT"
;BEEN EXECUTED? OR, HAS A PRE-STORED
;^C BEEN FOUND?
PUSHJ PDP,USCHED ;YES, WAIT UNTIL USER CONTINUES
;OR DOES SOMETHING ELSE.
POP PDP,UUO0 ;GET USER RETURN ADR.
.USET UPRGO,[.SUPC,,UUO0] ;SET UP THE INFERIOR'S PC
.USET UPRGO,[.SUSTP,,[0]] ;AND ALLOW HIM TO RUN AGAIN
JRST URETRN ;AND RETURN
;NOCHAN DISP1
;** UUOCON.MAC **
NOCHAN: CAIGE TAC1,IOUUO ;IS THIS AN I/O UUO ?
JRST DISP0 ;NO, GO DISPATCH
CAIE TAC1,70 ;YES, BUT "CLOSE" AND
CAIN TAC1,71 ;"RELEASE" ARE ALWAYS LEGAL
JRST USRXIT
JRST IOIERR ;OTHERS ARE ILLEGAL - PRINT
;"I/O TO UNASSIGNED CHANNEL"
DISP1: MOVE TAC,DEVMOD(DDB) ;DOES THIS DEVICE
TLNE TAC,DVLNG ;HAVE A LONG DISPATCH TABLE?
JRST DISP0 ;YES, DISPATCH
CAIGE TAC1,76 ;NO, IS IT "LOOKUP" OR "ENTER" ?
JRST USRXIT ;NO, NON-SKIP RETURN TO USER
JRST USRXT1 ;YES, SKIP RETURN TO USER
;UUOTAB
;** UUOCON.MAC **
;TABLE OF UUO DISPATCH ADDRESSES
;IN FORMAT:
;
; XWD 40,41
; XWD 42,43
; .
; .
; XWD 76,77
UUOTAB: XWD UCALL UINIT ;(40,41) CALL,INIT
XWD UUOERR UUOERR ;(42,43) FOR FUTURE EXPANSION
XWD UUOERR UUOERR ;(44,45) "
XWD UUOERR UCALLI ;(46,47) CALLI
XWD UOPEN TTYUUO ;(50,51) OPEN,TTYUUO
XWD ILEGAL ILEGAL ;(52,53) FOR DEC EXPANSION
XWD ILEGAL URENAM ;(54,55) RENAME
IOUUO==55 ;LOWEST I/O UUO (RENAME)
XWD TIN TOUT ;(56,57) IN,OUT
XWD SETIOS USTATO ;(60,61) SETSTS,STATO
XWD USTATS USTATZ ;(62,63) GETSTS,STATZ
XWD UINBF UOUTBF ;(64,65) INBUF,OUTBUF
XWD IN UOUT ;(66,67) INPUT,OUTPUT
XWD CLOSE1 RELEA1 ;(70,71) CLOSE,RELEASE
LNGUUO==72 ;LOWEST LONG DISPATCH TABLE UUO
XWD CPOPJ CPOPJ ;(72,73) MTAPE,GETF
XWD UDSI UDSO ;(74,75) USETI,USETO
XWD UDLK UDEN ;(76,77) LOOKUP,ENTER
;CNAMES NAMES
;** UUOCON.MAC **
;CALL UUO DISPATCH TABLE
;NEW UUO'S MUST BE ADDED AT THE END SINCE CALLI DEPENDS ON
;POSITION IN TABLE.
DEFINE CNAMES
X LIGHTS,LIGHTS ;( -1 ) DISPLAY AC ON CONSOLE SWITCHES
TERMIN
DEFINE NAMES
X RESET,RESET ;( 0 ) RESET I/O
X DDTIN,DDTIN ;( 1 ) GET DDT CHAR.
X SETDDT,SETDDT ;( 2 ) SET DDT LOC. IN PROTECTED AREA
X DDTOUT,DDTOUT ;( 3 ) SEND DDT CHAR.
X DEVCHR,DVCHR ;( 4 ) DEVICE CHARACTERISTICS
X DDTGT,CPOPJ ;( 5 ) GET DDT MODE ** NO-OP **
X GETCHR,DVCHR ;( 6 ) DEVICE CHARACTERISTICS *SAME AS 4*
X DDTRL,CPOPJ ;( 7 ) RELEASE DDT MODE ** NO-OP **
X WAIT,CPOPJ ;( 10 ) WAIT TILL DEVICE INACTIVE
X CORE,CORUUO ;( 11 ) CORE UUO
X EXIT,EXIT ;( 12 ) EXIT
X UTPCLR,CPOPJ ;( 13 ) CLEAR DECTAPE DIR. ** NO-OP **
X DATE,DATE ;( 14 ) GET DATE
X LOGIN,ULOGIN ;( 15 ) LOGIN
X APRENB,APRENB ;( 16 ) ENABLE APR FOR TRAPPING
X LOGOUT,LOGOUT ;( 17 ) LOGOUT
X SWITCH,SWITCH ;( 20 ) READ DATA SWITCHES
X REASSIGN,REASSIGN ;( 21 ) REASSIGN DEVICE TO ANOTHER JOB ** NO-OP **
X TIMER,TIMER ;( 22 ) RETURN JIFFY CLOCK TIME
X MSTIME,MSTIME ;( 23 ) RETURN MILLISEC. CLOCK TIME
X GETPPN,GETPPN ;( 24 ) RETURN PROJ.-PROG. #
X TRPSET,UUOERR ;( 25 ) SET PI TRAP ** ERROR **
X TRPJEN,UUOERR ;( 26 ) DISMISS TO EXEC. ** ERROR **
X RUNTIM,JOBTIM ;( 27 ) RETURN TOTAL JOB RUNNING TIME
X PJOB,JOBNO ;( 30 ) RETURN JOB #
X SLEEP,SLEEP ;( 31 ) SLEEP FOR N SECONDS
X SETPOV,SETPOV ;( 32 ) SET PUSHDOWN OVERFLOW TRAP
X PEEK,CPOPJ ;( 33 ) ALWAYS ERROR RETURN
X GETLIN,GETLN ;( 34 ) GET TTY LINE #
X RUN,URUN ;( 35 ) RUN DEV:FILE
X SETUWP,SETUWP ;( 36 ) SET OR CLEAR USER MODE WRITE PROTECT
X REMAP,REMAP ;( 37 ) REMAP TOP OF LOW SEG. INTO HIGH SEG.
X GETSEG,UGTSEG ;( 40 ) GET HIGH SEGMENT
X GETTAB,GETTAB ;( 41 ) GET CONTENTS OF A MONITOR TABLE ENTRY
X SPY,CPOPJ ;( 42 ) SPY ** ERROR **
X SETNAM,SETNAM ;( 43 ) SET NAME OF THIS PROGRAM
X TMPCOR,CPOPJ ;( 44 ) TEMPORARY CORE STORAGE
TERMIN
;UCLTAB CUSTAB UCLJMP
;** UUOCON.MAC **
;GENERATE SIXBIT TABLE OF UUO NAMES
DEFINE X A,B
SIXBIT /A/
TERMIN
;GENERATE D.E.C. TABLE
UCLTAB: NAMES
UCLLEN==.-UCLTAB
;GENERATE DISPATCH TABLES
DEFINE X A,B
ZZ==ZZ+1
TERMIN
DEFINE XX C
CPOPJ,,C
TERMIN
ZZ==0
;COUNT # OF CUSTOMER DEFINED CALL'S
CNAMES
CCLLEN==:ZZ
DEFINE X A,B
IFE ZZ&1,[
DEFINE XX C
B,,C
TERMIN
]
IFN ZZ&1,XX B
ZZ==ZZ+1
TERMIN
;GENERATE CUSTOMER TABLE
CUSTAB: CNAMES
ZZ==0
;GENERATE D.E.C. TABLE
UCLJMP: NAMES
IFN ZZ&1,XX CPOPJ
;UCALL UCALLI
;** UUOCON.MAC **
;CALL D,[SIXBIT /NAME/]
;WHERE NAME IS THE NAME OF A SYSTEM ROUTINE.
;IF NO SYSTEM ROUTINE WITH THE SPECIFIED NAME IS FOUND,
;THIS ROUTINE EXITS TO UUOERR.
;
;CONTENTS OF USER AC PLACED IN TAC, UUO SET TO POINT
;TO USER AC, ITEM SET TO JOB # ( 0 )
UCALL: PUSHJ PDP,GETWDU ;SET TAC FROM CONTENTS OF EFFECTIVE
;ADDRESS OF UUO FROM EITHER HIGH OR LOW SEG
MOVSI TAC1,-UCLLEN
CAME TAC,UCLTAB(TAC1) ;SEARCH SYSTEM ROUTINE NAME TABLE
AOBJN TAC1,.-1
JUMPG TAC1,UUOERR ;ERROR IF NOT FOUND
HRRI UUO,(TAC1) ;STORE INDEX IN UUO, JUST AS IF USER HAD
;DONE CALLI UUO
;CALLI UUO - CALL IMMEDIATE
;
; CALLI D,E
; WHERE E IS RELATIVE INDEX IN CALL TABLE
UCALLI: HRRE TAC1,UUO ;GET CALLI # ( POS. = D.E.C., NEG. = CUST. )
CAML TAC1,[-CCLLEN] ;MORE NEG. THAN CUST. ?
CAIL TAC1,UCLLEN ;OR MORE POS. THAN D.E.C. ?
POPJ PDP, ;YES, RETURN TO TREAT AS NO-OP
MOVE UUO,(PDP) ;ARE WE DOING AN EXEC UUO ?
TLNE UUO,USRMOD
POP PDP,TAC ;NO - MUST BE A USER UUO. TAKE ONE ELEMENT OFF STACK.
MOVEI UUO,(UCHN) ;UUO AC FIELD
PUSHJ PDP,GETWDU ;PICK UP CONTENTS OF AC
ROT TAC1,-1 ;DIVIDE BY 2, SAVING REMAINDER
MOVE DAT,UCLJMP(TAC1) ;GET DISPATCH TABLE ENTRY
JRST DISP2 ;GO DISPATCH
;EXIT MONRET SETPOV ULOGIN LOGOUT RESET
;** UUOCON.MAC **
;EXIT UUO ROUTINE
;IF AC FIELD = 0, PRINT
; Exit
; ^C
; .
;CONTINUE WILL NOT WORK
;
;IF AC FIELD IS NON-ZERO, ONLY PRINT " . "
;DO NOT RELEASE DEVICES; CONTINUE WILL WORK.
EXIT: JUMPN UCHN,MONRET ;IS AC FIELD NON-ZERO ?
PUSHJ PDP,IORELS ;NO, RELEASE ALL DEVICES
PUSHJ PDP,TTYFUW ;FIND TTY FOR CURRENT JOB, SET ITEM TO JOB #,
;DAT TO OUTPUT BYTE PTR., DDB TO TTY DDB.
JSP TAC,PHOLD ;MOVE "EXIT" TO OUTPUT BUFFER, STOP JOB,
;START TTY, AND PREVENT "CONTINUE" FROM WORKING
ASCIZ /
Exit/
;EXIT UUO FOR NON-ZERO AC FIELD
;RETURN TTY TO MONITOR MODE, STOP JOB, DON'T RELEASE DEVICES.
;ALLOW "CONTINUE" TO RETURN TO THE LOC. AFTER THE EXIT UUO.
MONRET: PUSHJ PDP,TTYFUW ;FIND TTY, ETC.
PUSHJ PDP,PRCRCC ;PRINT CRLF ^C CRLF
PUSHJ PDP,PRPER ;AND PERIOD
PUSHJ PDP,TTYSTC
JRST STOP1 ;START TTY IN MONITOR MODE AND STOP JOB
;SET PUSHDOWN OVERFLOW TRAP - "SETPOV"
SETPOV: .UMOVM TAC,JOBAPR ;GIVE A COPY TO USER
MOVEI TAC,1_19.
JRST APRENB ;SET TRAP LOC.
;LOGOUT UUO ROUTINE
ULOGIN: .SUSET [.RUNAME,,TAC] ;GET USER NAME
HLLOS TAC
AOJN TAC,UUOERR ;ILLEGAL UUO IF LOGGED IN
.VALUE [ASCIZ/:PROCED :ATTACH /]
.SUSET [.SSNAME,,TAC1]
.UCLOSE UPRGO, ;FREE CURRENT INFERIOR
.CALL [SETZ ? SIXBIT/LOGIN/ ? SETZ TAC1]
JRST UUOERR ;YOU LOSE
JRST GO ;SUCCESS RETURN
LOGOUT: PUSHJ PDP,INLMES
ASCII/Kjob
./
.LOGOUT 1, ;LOG OUT
;RESET UUO ROUTINE
RESET:
PUSHJ PDP,IOKILL ;RELEASE ALL DEVICES
MOVSI TAC,777777-USRMOD ;CLEAR ALL UUO PC FLAGS IN LH,
;EXCEPT FOR USER MODE
ANDCAM TAC,USRPD1 ;LEAVE USER MODE OFF ALSO, IF RESET FROM "SIM"
;FALL INTO APRENB WITH RH OF TAC=0
;SO THAT ALL APR INTERRUPTS WILL BE DISABLED
;APRENB
;** UUOCON.MAC **
;ROUTINE TO SET UP APR FOR USER TRAPPING
;
; 1B18 REPETITIVE ENABLE
; 1B19 PUSHDOWN OVERFLOW
; 1B22 ILLEGAL MEMORY
; 1B23 NON-EXISTENT MEMORY
; 1B26 CLOCK
; 1B29 FLOATING POINT OVERFLOW
; 1B32 ARITHMETIC OVERFLOW
APRENB: TRZ TAC,1_23.+1_26. ;THESE TWO BITS ARE ILLEGAL BECAUSE
;NON-EX. MEM. DOESN'T APPLY & CLOCK
;IS UNIMPLEMENTABLE
HRRM TAC,ITSENB ;SET RH OF OUR LOC.
JRST SETAPR ;FINISH UP
;LIGHTS SWITCH JOBNO DATE GTJBTM JOBTIM MSTIME SLEEP GETWD1 GETWDU LCPOPJ RMPERR GTWDU1 TIMER STOTC1 STOTAC STO1TC
;** UUOCON.MAC **
;SHOW C(TAC) IN THE LIGHTS
LIGHTS:;DATAO 4,TAC ;DISPLAY TAC IN LIGHTS
POPJ PDP, ;RETURN
;RETURN CONTENTS OF CONSOLE SWITCHES
SWITCH: DATAI TAC ;GET CONTENTS OF SWITCHES
JRST STOTAC ;GIVE IT TO USER
;RETURN JOB # TO USER
JOBNO: SKIPA TAC,JOB
;RETURN THE DATE TO THE USER
DATE: PUSHJ PDP,GTDATE ;GET TODAY'S DATE IN DEC 12-BIT FORMAT
JRST STOTAC ;GIVE IT TO USER IN SPECIFIED AC
;RETURN JOB RUNNING TIME IN MILLISECONDS
GTJBTM: .SUSET [.RRUNT,,TAC]
ADD TAC,TRTPI ;ADD IN RUN TIME FOR PAST INFERIORS
SKIPE TAC1,JBTADR ;IS THERE AN INFERIOR ?
.USET UPRGO,[.RRUNT,,TAC1] ;YES - READ ITS ACCUMULATED TIME
ADD TAC,TAC1 ;ADD IT IN (OR ZERO IF NO INFERIOR EXISTS)
FSC TAC,233 ;FLOAT TOTAL
FMPR TAC,[.OP FDVR 4.069 1.0^3] ;CONVERT TO MILLISECONDS
FADR TAC,[0.5] ;ROUND TO NEAREST MILLISECOND
UFA TAC,[233000,,0] ;FIX RESEULT, LEAVE ANSWER IN AC(TAC1)
LDB TAC,[POINT 27,TAC1,35,] ;COLLECT BOTTOM 27. BITS OF TAC1
POPJ PDP, ;RETURN WITH # MILLISECONDS IN TAC
;RUNTIM CALLI
JOBTIM: PUSHJ PDP,GTJBTM ;GET JOB RUNNING TIME IN MILLISECONDS
JRST STOTAC ;RETURN THAT TO USER
;RETURN TIME OF DAY IN MILLISECONDS
MSTIME: PUSHJ PDP,GTTIME ;GET # JIFFIES PAST MIDNIGHT
IMULI TAC,1000.
IDIVI TAC,JIFSEC
JRST STOTAC
;PUT JOB TO SLEEP FOR N SECONDS
SLEEP: IMULI TAC,30. ;FORM # OF 1/30 SECONDS
CAILE TAC,68.*30. ;LARGER THAN D.E.C. MAXIMUM ?
MOVEI TAC,1 ;YES, JUST A SHORT SNOOZE!!
.SLEEP TAC,
POPJ PDP, ;WE HAVE AWOKEN, RETURN
;ROUTINE TO GET WORD FROM USER AREA AT UUO LEVEL
;RETURN ONLY IF ADR. OK; WORD IN TAC
;UPON ENTERING, ADR. OF DESIRED WORD IS IN UUO.
GETWD1: HRRI UUO,1(UUO) ;INCREMENT ADR.
GETWDU: MOVE TAC,USRPD1 ;IS IT USER MODE?
TLNN TAC,USRMOD
JRST GTWDU1 ;NO, GET WORD FROM OUR CORE
PUSHJ PDP,GETWRD ;CHECK LEGALITY AND GET WORD
JRST UUOERR ;ADR. OUT OF BOUNDS
LCPOPJ:
RMPERR: POPJ PDP, ;OK, TAC HAS DESIRED WORD
GTWDU1: MOVE TAC,(UUO) ;GET WORD FROM OUR CORE
POPJ PDP, ;RETURN
;RETURN TIME OF DAY IN JIFFIES
TIMER: PUSHJ PDP,GTTIME ;GET # JIFFIES PAST MIDNIGHT
JRST STOTAC ;AND GO TO STOTAC
;ROUTINE TO STORE CONTENTS OF TAC IN USER AREA AS SPECIFIED BY UUO
STOTC1: HRRI UUO,1(UUO) ;INCREMENT UUO BEFORE DOING STOTAC
STOTAC: MOVE AC1,USRPD1 ;ARE WE IN USER MODE?
TLNN AC1,USRMOD
JRST STO1TC ;NO, PUT THE WORD IN OUR CORE
HRRZ AC1,UUO ;YES, GET ADR.
PUSHJ PDP,UADCK1 ;IS IT IN BOUNDS?
.UMOVM TAC,(UUO) ;YES, STORE IT IN USER'S CORE
POPJ PDP, ;RETURN
STO1TC: MOVEM TAC,(UUO) ;STORE WORD IN OUR CORE
POPJ PDP, ;AND RETURN
;DVCHR GETPPN RTZER SETDDT GETLN SETNAM
;** UUOCON.MAC **
;RETURN DEVICE CHARACTERISTICS
DVCHR: PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE
JRST RTZER ;NOT A DEVICE, RETURN ZERO
MOVE TAC,DEVMOD(DDB) ;FOUND, GET DEVMOD
TLO TAC,DVAVAL ;AND TELL HIM DEVICE IS AVAILABLE TO HIM
JRST STOTAC
;RETURN PROJECT-PROGRAMMER # IN SPECIFIED AC
GETPPN: SKIPA TAC,PRJPRG ;GET HIS PPN
RTZER: SETZ TAC, ;RETURN ZERO TO USER
JRST STOTAC
;SET DDT START ADR. FOR "DDT" COMMAND
SETDDT: MOVEM TAC,USRDDT ;STORE IN OUR COPY
.UMOVM TAC,JOBDDT ;GIVE HIM A COPY, TOO.
POPJ PDP, ;RETURN
GETLN: PUSHJ PDP,TTYFND ;FIND USER'S TTY
MOVE TAC,DEVNAM(DDB) ;GET NAME
JRST STOTAC ;GIVE IT TO USER
SETNAM: MOVEM TAC,JBTPRG ;STORE PROGRAM NAME
PUSHJ PDP,SPRGNM ;CHANGE NAME OF CURRENT INFERIOR TO
; REFLECT RESULT OF UUO.
POPJ PDP, ;RETURN
;GETTAB GTTBL
;** UUOCON.MAC **
;GETTAB UUO
;
;UUO TO RETURN CONTENTS OF A MONITOR JOB TABLE
;CALL: HRROI AC,TABLE NUMBER
; HRLI AC,JOB NUMBER (OPTIONAL)
; CALLI AC,41
; ERROR RETURN (AC PRESERVED) - IF LH NOT NEG. OR = THIS JOB #
; NORMAL RETURN - AC=0 IF TABLE UNDEFINED
GETTAB: HLRZ ITEM,TAC ;GET USER SUPPLIED JOB NUMBER
CAME ITEM,JOB ;IT MUST BE EITHER HIS JOB #
SKIPGE TAC ;OR NEGATIVE
TLZA TAC,-1 ;OK, CLEAR LH
POPJ PDP, ;NO, GIVE ERROR RETURN WITH AC UNCHANGED
CAILE TAC,MXGTB ;IT MUST BE A TABLE WE ARE CONCERNED WITH
TDZA TAC,TAC ;NO, RETURN WITH HIS AC ZEROED
XCT GTTBL(TAC) ;OK, DO THE RIGHT THING
AOS (PDP) ;GIVE GOOD RETURN
JRST STOTAC ;WITH AC FILLED
GTTBL: MOVE TAC,JBTSTS ;GIVE HIM HIS JOB STATUS
MOVE TAC,JBTADR ;GIVE HIM RELOC. & PROT. DATA
MOVE TAC,PRJPRG ;HIS PPN
MOVE TAC,JBTPRG ;HIS PROGRAM NAME
PUSHJ PDP,GTJBTM ;HIS JOB'S TOTAL RUNNING TIME
MXGTB==.-GTTBL
;UOPEN UINIT UINIT0 UINITA
;** UUOCON.MAC **
;OPEN UUO - PERFORMS SAME OPERATION AS INIT
;CALLING SEQUENCE:
; OPEN D,ADR
; ERROR RETURN
; DEVICE INITED
;LH(ADR) = 0 , RH(ADR) = DATA MODE
;C(ADR+1) = SIXBIT /DEVICE NAME/
;LH(ADR+2) = OUTPUT BUFFER HEADER ADR.
;RH(ADR+2) = INPUT " " "
UOPEN: PUSHJ PDP,GETWDU ;SET TAC TO MODE
AOJA UUO,UINIT0 ;MAKE UUO POINT TO ARG+1
;AND FINISH OPEN
;INIT UUO
;
; INIT D,MODE
; SIXBIT /DEVICE NAME/
; XWD OBUF,IBUF
; ERROR RETURN
; DEVICE INITED
UINIT: MOVEI TAC,(UUO) ;SAVE STATUS BITS IN TAC
HRR UUO,-1(PDP) ;SET UUO TO ADR+1 OF ARGS.
AOS -1(PDP) ;SET RETURN TO SKIP THE 2 ARGS.
AOS -1(PDP)
UINIT0: PUSH PDP,UUO ;SAVE ADR+1 OF USER ARGS.
PUSH PDP,TAC ;SAVE I/O STATUS BITS
SKIPE DDB,USRJDA(UCHN) ;IS A DEVICE ALREADY ASSIGNED
;TO THIS CHANNEL?
CAMLE UCHN,USRHCU ;YES, IS CHAN. # <= HIGHEST IN USE?
JRST UINITA ;NO, NO PREVIOUS DEVICE TO RELEASE
PUSHJ PDP,RELEA0 ;YES, RELEASE PREV. DEVICE ON THIS CHAN
UINITA: MOVE UUO,-1(PDP) ;RESTORE UUO
PUSHJ PDP,GETWDU ;C(TAC) = DEVICE NAME
;IF NOT IN BOUNDS, ERROR
PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE NAME (SET SYSDEV BIT
;IN LH OF DDB IF THIS IS "SYS")
JRST UINITE ;NO SUCH DEVICE
MOVE UUO,(PDP) ;RESTORE USER'S MODE SETTING
PUSHJ PDP,CHKMOD ;CHECK FOR LEGAL MODE; IF ERROR,
;DON'T RETURN
;UINIT1 UINITB UINITL UINITC
;** UUOCON.MAC **
UINIT1:
;CODE TO GO HERE IF DTA'S BECOME A REALITY IN "SIM"
UINITB: MOVEI TAC1,ASSPRG ;ASSIGN DEVICE BY PROGRAM.
PUSHJ PDP,ASSASG
JRST UINIT6 ;NOT AVAILABLE - ERROR RETURN
POP PDP,UUO ;RESTORE USER'S MODE
LDB UCHN,[POINT 4,(PDP),12,] ;RESTORE CHANNEL # - CLOBBERED
;IF ASSASG CALLS GTF
PUSHJ PDP,SETIOS ;SET DDB IOS STATUS WORD FROM
;RIGHT HALF OF UUO
MOVSI IOS,IOBEG ;SET IOBEG
IORB IOS,DEVIOS(DDB)
UINITL: CAMG UCHN,USRHCU ;IS THIS CHAN. > HIGHEST IN USE?
JRST UINITC ;NO
AOS TAC,USRHCU ;YES, BUMP HIGHEST SO FAR
.UMOVM TAC,JOBHCU
SETZB UUO,USRJDA(TAC) ;AND CLEAR IT OUT
.UMOVM UUO,JOBJDA(TAC)
JRST UINITL ;AND KEEP LOOKING
UINITC: TLO DDB,INITB+ICLOSB+OCLOSB ;SET INIT
;UUO BIT AND PREVENT SUPERFLUOUS
;CALLS TO CLOSE
AOS UUO,(PDP) ;ADVANCE TO THIRD ARG.
PUSHJ PDP,GETWDU ;C(TAC) = BUFFER HEADER ADR.
HLRZ TAC1,TAC ;GET OUTPUT BUFFER HEADER ADR.
JUMPE TAC1,UINIT4 ;WAS ONE SPECIFIED?
HRLM TAC1,DEVBUF(DDB) ;YES, SET DDB
TLO DDB,OBUFB ;NOTE OUTPUT BUFFER SPECIFIED
PUSHJ PDP,UINITZ ;INITIALIZE OUTPUT BUFFER HEADER
;UINIT4 UINIT5 UINIT6 UINITE
;** UUOCON.MAC **
UINIT4: PUSHJ PDP,GETWDU ;GET THE CONTENTS OF ARG. 3 AGAIN
HRRZ TAC1,TAC ;GET INPUT BUFFER HEADER ADR.
JUMPE TAC1,UINIT5 ;WAS ONE SPECIFIED?
HRRM TAC,DEVBUF(DDB) ;YES, SET DDB
TLO DDB,IBUFB ;NOTE INPUT BUFFER SPECIFIED
MOVSI IOS,IOEND ;CLEAR EOF FLAG
ANDCAB IOS,DEVIOS(DDB)
PUSHJ PDP,UINITZ ;INITIALIZE INPUT BUFFER HEADER
UINIT5: MOVEM DDB,USRJDA(UCHN) ;STORE UUO BITS AND DDB ADR.
.UMOVM DDB,JOBJDA(UCHN)
JRST TPOPJ1 ;GIVE GOOD RETURN
UINIT6:
;CODE TO BE ADDED HERE FOR DTA'S (IN FUTURE MAYBE)
UINITE: POP PDP,TAC ;RESTORE STACK
JRST TPOPJ ;AND GIVE ERROR RETURN
;UINITZ UINERR
;** UUOCON.MAC **
UINITZ: MOVEI AC1,2(TAC1) ;IS ADR. OF 3RD WORD IN BOUNDS?
PUSHJ PDP,UADRCK
SETZ AC1, ;YES, ZAP 1ST & 3RD WORDS
.UMOVM AC1,(TAC1)
.UMOVM AC1,2(TAC1)
PUSHJ PDP,SETBYT ;SET BYTE SIZE FROM IOS
.UMOVE AC1,1(TAC1) ;GET 2ND WORD
HRRI TAC,(AC1) ;USE RH
.UMOVM TAC,1(TAC1) ;STORE BYTE SIZE AND RH
POPJ PDP, ;RETURN
;HERE WHEN WE GET ONLY PART WAY THROUGH INIT'ING A DEVICE
UINERR: PUSHJ PDP,RELEA0 ;RELEASE DEVICE
JRST TPOPJ ;GIVE ERROR RETURN
;UDEN UDLK DLKDEN UDLKC
;** UUOCON.MAC **
;ENTER UUO - HERE ONLY IF DEVICE HAS LONG DISPATCH TABLE
UDEN: MOVEI TAC,CLSIN
TLNN DDB,OCLOSB ;FILE OPEN?
PUSHJ PDP,UDLKC ;YES, CLOSE IT (OCLOSB_1)
TLO IOS,IOBEG
ANDCMI IOS,776000
MOVEM IOS,DEVIOS(DDB)
HLLM DDB,USRJDA(UCHN) ;STORE UUO BITS
.UMOVE TAC,JOBJDA(UCHN) ;AND GIVE HIM A COPY
HLL TAC,DDB
.UMOVM TAC,JOBJDA(UCHN)
PUSHJ PDP,DEN(DSER) ;ATTEMPT AN ENTER
POPJ PDP, ;FAILURE, RETURN
TLZ DDB,OCLOSB
TLO DDB,ENTRB ;NOTE SUCCESSFUL ENTER
JRST DLKDEN ;STORE THE PROGRESS BITS
;LOOKUP UUO - LONG DISPATCH DEVICES ONLY
UDLK: MOVEI TAC,CLSOUT ;INHIBIT OUTPUT CLOSE BIT
TLNN DDB,ICLOSB ;FILE OPEN?
PUSHJ PDP,UDLKC ;YES, CLOSE IT (ICLOSB_1)
TDZ IOS,[XWD IOEND 776000]
MOVEM IOS,DEVIOS(DDB)
HLLM DDB,USRJDA(UCHN) ;STORE UUO BITS
.UMOVE TAC,JOBJDA(UCHN) ;STORE A COPY FOR HIM
HLL TAC,DDB
.UMOVM TAC,JOBJDA(UCHN)
PUSHJ PDP,DLK(DSER) ;DO THE LOOKUP
POPJ PDP, ;FAILURE!
TLZ DDB,ICLOSB
TLO DDB,LOOKB ;NOTE SUCCESSFUL LOOKUP
DLKDEN: LDB TAC,PUUOAC ;GET CHANNEL #
PUSH PDP,ITEM ;SAVE AN AC
HLLM DDB,USRJDA(TAC) ;STORE UUO PROGRESS BITS
.UMOVE ITEM,JOBJDA(TAC) ;COPY FOR OUR USER
HLL ITEM,DDB
.UMOVM TAC,JOBJDA(TAC)
JRST IPOPJ1 ;RESTORE ITEM AND RETURN
UDLKC: PUSH PDP,UUO
HRRI UUO,(TAC)
PUSHJ PDP,CLOSE1
POP PDP,UUO
POPJ PDP,
;UOUTBF UOBF1 UINBF
;** UUOCON.MAC **
;DO "INBUF" AND "OUTBUF" HERE
UOUTBF: TLO DDB,OUTBFB ;NOTE OUTBUF UUO
PUSH PDP,BUFPNT ;SAVE BUFPNT
PUSHJ PDP,BUFCLC ;SET UP BUFFER RING
HLRZ TAC,DEVBUF(DDB) ;GET ADR. OF OUTPUT BUFFER HEADER
HRRM BUFPNT,DEVOAD(DDB) ;STORE ADR. OF FIRST BUFFER IN RING
UOBF1: .UMOVM BUFPNT,(TAC) ;POINT HEADER AT FIRST BUFFER IN RING
LDB TAC,PUUOAC
MOVEM DDB,USRJDA(TAC)
.UMOVM DDB,JOBJDA(TAC)
POP PDP,BUFPNT ;RESTORE BUFPNT
POPJ PDP, ;RETURN FROM UUO
UINBF: TLO DDB,INBFB ;NOTE INBUF UUO
PUSH PDP,BUFPNT ;SAVE BUFPNT
PUSHJ PDP,BUFCLC ;SET UP RING
HRRM BUFPNT,DEVIAD(DDB) ;POINT TO FIRST BUFFER
HRRZ TAC,DEVBUF(DDB) ;GET ADR. OF INPUT HEADER
JRST UOBF1 ;FINISH UP
;BUFCLC
;** UUOCON.MAC **
;ROUTINE TO SET UP N-RING BUFFER IN USER AREA
BUFCLC: PUSH PDP,BUFWRD ;SAVE BUFWRD
LDB TAC,[XWD 1400+DDB DEVCHR] ;GET THE BUFFER SIZE
.UMOVE BUFPNT,JOBFF ;GET FIRST FREE + 1
MOVEI BUFPNT,1(BUFPNT)
MOVEI BUFWRD,(BUFPNT)
HRL BUFWRD,TAC ;BUFWRD = BUFFER SIZE , FIRST FREE + 1
ADDI TAC,2 ;BUF. SIZE + 2
MOVEI TAC1,(UUO) ;GET # BUFFERS DESIRED
MOVEI AC1,(TAC) ;BUF. SIZE + 2
IMULI AC1,(TAC1) ;TIMES # BUFFERS
ADDI AC1,(BUFWRD)
MOVEI AC1,(AC1) ;FORM LAST ADR. NEEDED
CAMG AC1,USRREL ;DOES HE HAVE ENOUGH CORE?
JRST BUFC1 ;YES, MOVE ON
;NO, EXPAND USER'S CORE
PUSH PDP,TAC ;SAVE BUNCH OF AC'S
PUSH PDP,UUO
PUSH PDP,TAC1 ;** ALL MAY NOT NEED TO BE SAVED **
PUSH PDP,BUFPNT
PUSH PDP,BUFWRD
PUSH PDP,DDB
PUSH PDP,DSER
SETZ ITEM, ;SET JOB #
MOVE TAC,AC1 ;ARGUMENT GOES IN AC(TAC)
MOVEI UUO,UUO ;FOR "STOTAC"
PUSHJ PDP,CORUUO ;TRY TO GET THE CORE
JFCL ;CAN'T GET IT - ADR. CHECK WILL CATCH IT
POP PDP,DSER
POP PDP,DDB
POP PDP,BUFWRD
POP PDP,BUFPNT
POP PDP,TAC1
POP PDP,UUO
POP PDP,TAC
;BUFC1
;** UUOCON.MAC **
BUFC1: ADDI BUFWRD,(TAC)
MOVEI AC1,(BUFPNT) ;IS LAST ADR. IN BOUNDS?
PUSHJ PDP,UADRCK
.UMOVM BUFWRD,(BUFPNT) ;YES, SET UP THIS HEADER
MOVEI BUFPNT,(BUFWRD)
SOJG TAC1,BUFC1 ;LINK ALL BUFFERS
.UMOVE AC1,JOBFF
HRRI BUFWRD,1(AC1) ;DO NOT DESTROY LH OF AC(BURWRD) (=BUFFER SIZE)
MOVEI AC1,-2(BUFPNT) ;CHECK LAST ADR. OF HEADER
PUSHJ PDP,UADRCK
SUBI BUFPNT,(TAC)
.UMOVM BUFWRD,(BUFPNT) ;LINK LAST BUFFER TO FIRST
.UMOVE AC1,JOBFF
ADDI BUFPNT,-1(TAC)
HRRI AC1,(BUFPNT)
.UMOVM AC1,JOBFF
MOVEI BUFPNT,(BUFWRD) ;BUFPNT = IOUSE , ADR. FIRST BUFFER
HRLI BUFPNT,IOUSE
POP PDP,BUFWRD ;RESTORE BUFWRD
POPJ PDP, ;RETURN
;BUFCLR
;** UUOCON.MAC **
;ROUTINE TO CLEAR I/O BUFFER IN USER AREA
;CALLED AT UUO LEVEL
;CALL: HRRZ TAC,REL. ADR. OF 2ND WORD OF USER BUFFER
; PUSHJ PDP,BUFCLR
; ERROR RETURN - MEMORY EXCEEDED
; EXIT RETURN HERE IF MEMORY NOT EXCEEDED
;CLEARS THE WORD COUNT AND DATA AREA OF THE BUFFER WHOSE ADR.
;IS IN TAC 18-35.
BUFCLR: PUSHJ PDP,IADRCK ;IN BOUNDS?
POPJ PDP, ;NO, ERROR RETURN
PUSH PDP,TAC ;SAVE FIRST BUFFER ADR.
.UMOVE TAC1,(TAC) ;GET SIZE (18-35) INTO RH TAC1
HLRZ TAC1,TAC1
ANDCMI TAC1,400000
ADDI TAC,(TAC1) ;LAST ADR.=2ND ADR. + SIZE
PUSHJ PDP,IADRCK ;LAST ADR. IN BOUNDS?
JRST TPOPJ ;NO, ERROR RETURN
PUSHJ PDP,CLRMBF ;CLEAR MONBUF...MONBUF+MBFSIZ-1
POP PDP,TAC1 ;RESTORE FIRST ADR.
ADDI TAC1,1 ;BEGIN CLEARING BUFFER AT WORD COUNT
; I.E. AT 3RD WORD OF BUFFER
HRLI TAC1,MONBUF ;ZERO BUFFER BY SENDING ENOUGH ZEROS
;FROM MONBUF
.UBLTO TAC1,(TAC) ;CLEAR BUFFER
JRST CPOPJ1 ;SUCCESSFUL RETURN
;ITMSET ITMCNT ITMCT1 SETIOS CHKMOD
;** UUOCON.MAC **
;ROUTINE TO RETURN # OF ITEMS IN BUFFER
;CALL: PUSHJ PDP,ITMSET
; EXIT ALWAYS RETURN HERE
;SETS AC ITEM = (BUFFER SIZE - 1)*[WORD LENGTH/BYTE SIZE]
;CALL: PUSHJ PDP,ITMCNT
; EXIT ALWAYS RETURNS HERE
;SETS AC ITEM = C(ITEM)*[WORD LENGTH/BYTE SIZE]
;CALL: PUSHJ PDP,ITMCT1
; EXIT ALWAYS RETURNS HERE
;SETS AC ITEM = C(ITEM)*[WORD LENGTH/C(TAC1)]
ITMSET: .UMOVE ITEM,@DEVADR(DDB) ;GET HEADER WORD
ASH ITEM,-18. ;GET BITS 1-17 INTO RH
MOVEI ITEM,-1(ITEM) ;GET BUFFER SIZE - 1
ITMCNT: LDB TAC1,[POINT 6,DEVPTR(DDB),11,] ;TAC1 = BYTE SIZE
ITMCT1: MOVEI TAC,36. ;ITEM = C(ITEM)*[WORD LENGTH/C(TAC1)]
IDIVI TAC,(TAC1)
IMULI ITEM,(TAC)
POPJ PDP, ;RETURN
;ROUTINE TO SET DEVICE STATUS WORD FROM UUO
SETIOS: PUSHJ PDP,CHKMOD ;CHECK FOR LEGAL MODE, IF NOT RIGHT,
;DON'T RETURN
ANDCMI UUO,IOACT ;LET USER SET ALL EXCEPT IOACT
HRRM UUO,DEVIOS(DDB)
POPJ PDP,
;CHECK FOR LEGAL MODE FOR A DEVICE
CHKMOD: LDB TAC1,[POINT 4,UUO,35,] ;GET DEVICE DATA MODE
MOVEI TAC,1 ;CHECK FOR LEGALITY
LSH TAC,(TAC1)
TDNN TAC,DEVMOD(DDB)
JRST ILLMOD ;ILLEGAL DATA MODE
POPJ PDP, ;OK
;IOSETC
;** UUOCON.MAC **
;IOSETC
;CALLING SEQUENCE:
; PUSHJ PDP,IOSETC
; EXIT ;ALWAYS RETURN HERE
;SETS JBFPTR18-35:=C(TAC1 18-35)
; JBFCTR:=C(ITEM)*[WORD LENGTH/BYTE SIZE]
;WHERE WORD LENGTH:= 36 DECIMAL
; BYTE SIZE:=C(JBFPTR 6-11)
; [X]:= INTEGER PART OF X
IOSETC: ADDI JBUF,1 ;JBFPTR 12-18:=0
.UMOVE TAC,(JBUF) ;JBFPTR 18-35:=C(TAC1 18-35)+1
TLZ TAC,770000
HRRI TAC,1(TAC1)
.UMOVM TAC,(JBUF)
LDB TAC1,[POINT 6,TAC,11,] ;TAC1:= BYTE SIZE
PUSHJ PDP,ITMCT1 ;JBFCTR:=C(ITEM)*[36/BYTE SIZE]
ADDI JBUF,1 ;POINT TO BYTE COUNT
;THIS INSTR. CAN BE REMOVED IF IT IS NOT NECESSARY TO RETURN
;WITH JBUF POINTING TO BYTE COUNT. - IF IT IS REMOVED,
;THE FOLLOWING INSTR. SHOULD BE: .UMOVM ITEM,1(JBUF)
.UMOVM ITEM,(JBUF) ;STORE THE BYTE COUNT IN 3RD WORD
POPJ PDP, ;RETURN
;NEWBF1 NEWBUF SETBYT
;** UUOCON.MAC **
;SET UP BYTE POINTER AND ITEM COUNT
;CALL: PUSHJ PDP,NEWBUF
; ADR. CHECK WHEN SETTING UP BUFFER
; OK RETURN
NEWBF1:
NEWBUF: HRRZ TAC,DEVADR(DDB) ;TAC = INPUT BUF. HDR. ADR.
PUSHJ PDP,BUFCLR ;CLEAR INPUT BUFFER
POPJ PDP, ;ADR. CHECK, PASS IT ON
;**********THE ENCLOSED CODE MAY NOT BE NEEDED!**********
MOVSI TAC,7737
AND TAC,DEVPTR(DDB) ;DEVPTR 0-5 = 0, 12 = 0
HRR TAC,DEVADR(DDB) ;DEVPTR 18-35 = C(DEVADR 18-35)
ADDI TAC,1 ; + 1
MOVEM TAC,DEVPTR(DDB)
PUSHJ PDP,ITMSET ;SET # ITEMS IN BUFFER
MOVEM ITEM,DEVCTR(DDB) ;DEVCTR = ITEM COUNT
JRST CPOPJ1 ;SKIP RETURN (OK)
;ROUTINE TO SET UP BYTE POINTER ACCORDING TO DATA MODE
;CALL: PUSHJ PDP,SETBYT
; ALWAYS RETURNS HERE
;SETS: TAC 0-5 = 0
; TAC 6-11 = S
; TAC 12-17 = 0
;WHERE S=36 IF DATA MODE (IOS 32-35) IS BINARY (B), IMAGE (I),
;IMAGE BINARY (IB), OR DUMP (SD,D,DR)
;S=7 IF DATA MODE IS ASCII (A) OR ASCII LINE (AL).
SETBYT: HRLI TAC,700 ;ASSUME ASCII TO START
TRNE IOS,14 ;CORRECT ASSUMPTION ?
HRLI TAC,4400 ;NO, 10 OR GREATER ::= S=36.
POPJ PDP, ;RETURN
;URENAM UDSO UDSI
;** UUOCON.MAC **
;RENAME UUO - HERE ON SHORT DISPATCH TABLE DEVICES TOO
URENAM: MOVE TAC,DEVMOD(DDB) ;DOES THIS DEVICE HAVE LONG
;DISPATCH TABLE?
TLNN TAC,DVLNG
JRST CPOPJ1 ;NO, GIVE SKIP RETURN TO USER
JRST DRN(DSER) ;YES, DISPATCH TO SERVICE ROUTINE
;SETO UUO - SET NEXT OUTPUT BLOCK NUMBER
UDSO: JRST DSO(DSER)
;SETI UUO - SET NEXT INPUT BLOCK NUMBER
UDSI: JRST DSI(DSER)
;IN IN1 INPT0C INPT2 INPT0A
;** UUOCON.MAC **
;HERE ON INPUT UUO
IN: TLO DDB,INPB
TLZ DDB,ICLOSB
.UMOVE TAC,JOBJDA(UCHN) ;BIT SETTINGS INTO LH OF JDA LOC
HLL TAC,DDB
.UMOVM TAC,JOBJDA(UCHN)
HLLM DDB,USRJDA(UCHN) ;OUR COPY ALSO
LDB TAC,PIOMOD ;GET I/O MODE
CAIL TAC,SD ;IS IT DUMP?
JRST INDMP ;YES
IN1: HRRZ JBUF,DEVBUF(DDB) ;NO, GET ADR. OF BUFFER HDR.
MOVSI TAC,IOUSE ;SET UP "USE BIT"
MOVEI AC1,2(JBUF) ;CHECK BUFFER HDR. FOR IN BOUNDS
PUSHJ PDP,UADRCK
MOVE IOS,DEVIOS(DDB) ;SET UP I/O STATUS AGAIN BECAUSE
;IOS IS CLOBBERED BY AUTO. CORE
;EXPANSION ON IMPLICIT INBUF ON
;FIRST INPUT
.UMOVE TAC1,(JBUF) ;GET FIRST WORD OF HEADER
JUMPLE TAC1,INPUTF ;SET UP BUFFER IF NECESSARY AND
;DO FIRST I/O
MOVEI AC1,(TAC1) ;OTHERWISE, CHECK ADR.
PUSHJ PDP,UADRCK
MOVE IOS,DEVIOS(DDB)
.UMOVE AC1,(TAC1) ;CURRENT BUFFER
JUMPGE AC1,INPT1 ;MOVE ON IF FREE (IOUSE=0)
ANDCAB TAC,AC1 ;NOT FREE - CLEAR USE BIT AND GET
;POINTER TO NEXT BUFFER
.UMOVM AC1,(TAC1)
HLL TAC,TAC1 ;SET WORD1 IN 3-WORD HEADER TO
.UMOVM TAC,(JBUF) ;POINT TO NEXT BUFFER
MOVEI AC1,(TAC) ;AND CHECK ITS ADR.
PUSHJ PDP,UADRCK
MOVE AC1,DEVMOD(DDB) ;GET DEVICE CHAR. WORD
TLNN AC1,DVTTY ;IS IT A TTY?
.UMOVE TAC,(TAC) ;NO, GET POINTER 1 BUFFER AHEAD OF NEXT BUFFER
MOVEI AC1,(TAC) ;SEE IF USER HAS CLOBBERED POINTER
PUSHJ PDP,UADRCK
.UMOVE AC1,(TAC) ;IS THE USE BIT SET?
JUMPL AC1,INPT0C
PUSHJ PDP,CALIN ;NO, HAVE SERVICE ROUTINE FILL EMPTY BUFFER
INPT0C: .UMOVE TAC1,(TAC1) ;GET USE BIT FOR NEXT BUFFER
INPT2:
INPT0A: .UMOVE AC1,(TAC1)
JUMPGE AC1,INEOF ;IF NOT FILLED YET, MUST BE EOF OR ERROR
;INPUT2 INEOF INPUTF INPT1 INPUT3 INDMP CALIN
;** UUOCON.MAC **
INPUT2: .UMOVE ITEM,1(TAC1) ;GET WORD COUNT
MOVEI ITEM,(ITEM) ;RIGHT HALF ONLY
JRST IOSETC ;SET ITEM COUNT AND BYTE POINTER AND RETURN TO USER
INEOF: TDNN IOS,[XWD IOEND IODERR+IOBKTL+IODTER+IOIMPM]
;IS EOF OR ERROR BIT SET BY SERVICE ROUTINE
JSP DAT,UUOERR ;NO, MONITOR ERROR AT UUO LEVEL
TLNE IOS,IOEND ;IS THIS EOF?
IORI IOS,IODEND ;YES, SET EOF BIT FOR USER
IORM IOS,DEVIOS(DDB)
POPJ PDP, ;RETURN
;HERE ON FIRST INPUT AFTER INIT, INIT & LOOKUP, OR INIT & LOOKUP & INPUT
INPUTF: ANDCAB TAC,TAC1 ;MARK THAT BUFFERS HAVE BEEN REFERENCED
.UMOVM TAC,(JBUF) ;BY CLEARING SIGN BIT OF FIRST WORD IN 3-WORD
;BUFFER HEADER
JUMPE TAC,INPUT3 ;HAS A RING BEEN SET UP YET?
HRRZ AC1,TAC1 ;YES, ADR. CHECK FIRST USER BUFFER
PUSHJ PDP,UADRCK
.UMOVE AC1,(TAC1) ;IS USE BIT SET IN FIRST USER INPUT BUFFER?
; THIS CAN HAPPEN IF TTY AND USER HAS TYPED IN
; A LINE AFTER INBUF BUT BEFORE FIRST INPUT UUO
JUMPLE AC1,INPUT2 ;YES, DO NOT CALL SERVICE ROUTINE (SCNSRF) SINCE
;USER BUFFER ALREADY HAS DATA
HRRM TAC,DEVIAD(DDB) ;NO, STORE ADR. OF 2ND WORD OF BUFFER
;FOR SERVICE ROUTINE
INPT1: PUSHJ PDP,CALIN ;FILL BUFFER
JRST INPT2
INPUT3: HRRI UUO,2 ;BUFFERS NOT SET UP YET - SET UP 2
PUSHJ PDP,UINBF
ANDCMI UUO,-1 ;CLEAR RIGHT HALF
JRST IN1
INDMP: JRST DDI(DSER) ;CALL SERVICE ROUTINE AND RETURN
CALIN: TLNE IOS,IOEND
POPJ PDP,
PUSH PDP,TAC1
PUSH PDP,JBUF
HRRZ AC1,DEVIAD(DDB) ;IS FIRST ADR. ABOVE JOB DATA AREA?
CAIG AC1,JOBPFI
JRST ADRERR ;NO, PRINT ERROR AND STOP JOB
.UMOVE AC2,(AC1) ;GET LENGTH OF BUFFER
LDB AC2,[POINT 17,AC2,17,] ;AND IGNORE USE BIT
ADDI AC1,(AC2)
CAMLE AC1,USRREL ;IS LAST ADR. IN BOUNDS?
JRST ADRERR ;NO, STOP JOB AND PRINT ERROR MESSAGE
PUSHJ PDP,DIN(DSER) ;YES, DISPATCH TO SERVICE ROUTINE
POP PDP,JBUF
POP PDP,TAC1
POPJ PDP,
;UOUT OUT OUT2 OUTF OUTF1 OUTS OUTDMP
;** UUOCON.MAC **
;HERE ON OUTPUT UUO
UOUT: TLO DDB,OUTPB ;SET OUTPUT UUO BIT
TLZ DDB,OCLOSB ;CLEAR CLOSE OUTPUT BIT
;HERE FROM SERVICE ROUTINES ON CLOSE UUO
OUT: .UMOVE TAC,JOBJDA(UCHN) ;GET JDA WORD
HLL TAC,DDB ;PUT IN LH BIT SETTINGS
.UMOVM TAC,JOBJDA(UCHN) ;STORE BACK
HLLM DDB,USRJDA(UCHN) ;MAKE COPY FOR US ALSO
LDB TAC,PIOMOD ;GET DATA MODE
CAIL TAC,SD ;DUMP MODE?
JRST OUTDMP ;YES
PUSHJ PDP,OUTA ;NO, CHECK FOR NON-ZERO ADR.
;(USER CHANGING RING)
HLRZ JBUF,DEVBUF(DDB) ;REL. ADR. OF O/P BUFFER HEADER
MOVEI AC1,2(JBUF) ;CHECK END OF 3-WORD HEADER
PUSHJ PDP,UADRCK
.UMOVE TAC1,(JBUF) ;GET FIRST WORD OF BUFFER HEADER
JUMPLE TAC1,OUTF ;RING NOT SET UP, OR FIRST
;REFERENCE TO RING
.UMOVE TAC,1(JBUF) ;GET RH OF BYTE POINTER
ANDI TAC,777777
JUMPE TAC,.+2
SUBI TAC,1(TAC1) ;DISTANCE FILLED BY USER
TRNE IOS,IOWC ;DOES USER WANT SYSTEM TO COMPUTE
;WORD COUNT FROM BYTE POINTER
JRST OUT2 ;NO
MOVEI AC1,1(TAC1) ;YES, PROCEED ONLY IF ADR. OF
;WORD COUNT IS IN BOUNDS
ADDI AC1,(TAC) ;FORM REL. ADR. OF LAST WORD TO OUTPUT
PUSHJ PDP,UADRCK
.UMOVE AC1,1(TAC1) ;GET THIRD WORD OF BUFFER
HRRI AC1,(TAC) ;PUT WORD COUNT IN
.UMOVM AC1,1(TAC1) ;STORE BACK
OUT2: .UMOVE TAC,(TAC1) ;GET 2ND WORD IN BUFFER
TLO TAC,IOUSE ;SET USE BIT
.UMOVM TAC,(TAC1) ;STORE BACK
.UMOVE IOS,(JBUF) ;GET FIRST WORD IN HEADER
;(POINTER TO CURRENT BUFFER)
HRRI IOS,(TAC) ;ADVANCE CURRENT BUFFER ADR.
.UMOVM IOS,(JBUF)
MOVE IOS,DEVIOS(DDB) ;GET STATUS WORD
PUSHJ PDP,DOU(DSER) ;DO OUTPUT
HLRZ JBUF,DEVBUF(DDB) ;REL. ADR. OF BUFFER HEADER
.UMOVE TAC1,(JBUF) ;REL. ADR. OF SECOND WORD OF BUFFER
MOVEI AC1,(TAC1)
PUSHJ PDP,UADRCK
.UMOVE TAC,1(JBUF)
ANDCMI TAC,777777
.UMOVM TAC,1(JBUF)
JRST OUTS ;RETURN TO USER
OUTF: JUMPL TAC1,OUTF1
HRRI UUO,2 ;SET UP TWO-BUFFER RING
PUSHJ PDP,UOUTBF ;IF NONE SET UP YET
HLRZ JBUF,DEVBUF(DDB) ;RESET JBUF (GETS CLOBBERED)
OUTF1: .UMOVE TAC,(JBUF) ;CLEAR USE BIT
TLZ TAC,IOUSE
.UMOVM TAC,(JBUF)
HRRM TAC,DEVOAD(DDB)
OUTS: .UMOVE TAC,(JBUF) ;CLEAR NEXT OUTPUT BUFFER
ANDI TAC,777777
PUSHJ PDP,BUFCLR
JRST ADRERR ;ADR. CHECK
.UMOVE TAC1,(JBUF)
.UMOVE ITEM,(TAC1)
LDB ITEM,[POINT 17,ITEM,17,]
SOJA ITEM,IOSETC
OUTDMP: JRST DDO(DSER) ;DO DUMP OUTPUT AND RETURN TO USER
;OUTA
;** UUOCON.MAC **
OUTA: TRNN UUO,777774 ;IS BUFFER ADR.SPECIFIED?
POPJ PDP, ;NO
HLRZ JBUF,DEVBUF(DDB)
.UMOVE TAC,(JBUF)
HRRI TAC,(UUO)
HRRM UUO,DEVOAD(DDB)
TLZ TAC,IOUSE
.UMOVM TAC,(JBUF)
POPJ PDP,
;RELEA0 RELEA1 RELEA2 RELEA3 RELEA5 RELEA4 RELE4A RELEA9 RELEA7 RELEA6
;** UUOCON.MAC **
;RELEASE A DEVICE
RELEA0:
RELEA1:
RELEA2:
RELEA3: ANDCMI UUO,-1 ;CLOSE BOTH INPUT AND OUTPUT
PUSHJ PDP,CLOSE1
; PUSHJ PDP,WAIT1 ;**** THIS PROBABLY ISN'T NEEDED ***
RELEA5: PUSHJ PDP,DRL(DSER) ;DO DEVICE-DEPENDENT STUFF
MOVEI IOS,IOACT ;CLEAR I/O ACTIVE BIT
ANDCAB IOS,DEVIOS(DDB) ;AND SET IOS
;*** CODE NEEDED IF WE IMPLEMENT DTA'S ***
SETZB DAT,USRJDA(UCHN) ;CLEAR DEVICE ASSIGNMENT
.UMOVM DAT,JOBJDA(UCHN)
MOVE TAC,USRHCU ;THE COLLOWING CODE PERFORMS 2 FUNCTIONS.
; (1) REDUCES USRHCU TO PROPER VALUE IF WE HAVE JUST RELEASED
; HIGHEST USER CHANNEL ASSIGNED. (2) CHECKS IF DEVICE
; CURRENTLY INITED ON ANOTHER CHANNEL, E.G. THE TTY.
RELEA4: HRRZ TAC1,USRJDA(TAC)
JUMPN DAT,RELE4A
MOVEI DAT,(TAC1)
MOVEM TAC,USRHCU
RELE4A: CAIE TAC1,(DDB)
SOJGE TAC,RELEA4
MOVE TAC1,USRHCU
.UMOVM TAC1,JOBHCU
JUMPGE TAC,CPOPJ ;JUMP IF WE FOUND A MATCH TO DDB
; IN ONE OF THE USER'S JDA ENTRIES
HLLZS DEVIAD(DDB) ;CLEAR INPUT AND
HLLZS DEVOAD(DDB) ;OUTPUT BUFFER ADDRESSES
;CALLED HERE FROM "ESTOP"
RELEA9:
RELEA7: LDB TAC,PDEVI ;GET ITS CHANNEL # THIS ONE IS USING
CAIL TAC,FFITSC ;IS IT TO BE RETURNED?
PUSHJ PDP,RTFCHN ;YES, RETURN THE CHANNEL
DPB TAC,PDEVI ;COPY BACK OR CLEAR FIELD IN THE DDB.
LDB TAC,PDEVO ;GET ITS OUTPUT CHANNEL
CAIL TAC,FFITSC ;SHOULD WE RETURN IT?
PUSHJ PDP,RTFCHN ;YES, RETURN IT.
DPB TAC,PDEVO ;EITHER COPY BACK OR ZERO FIELD IN DDB
MOVEI TAC1,ASSPRG ;CLEAR "ASSIGNED BY PROG." BIT
;CALLED HERE FROM "DEASSIGN"
RELEA6: ANDCAB TAC1,DEVMOD(DDB)
TRNE TAC1,ASSCON+ASSPRG ;YES, CAN WE RETURN THE DDB?
POPJ PDP, ;NO, RETURN
;YES - WE WILL RETURN DDB IF IT'S FOUND AFTER DSKDDB IN THE
; CHAIN OF DDB'S. NOTE THAT THE DDB'S FOUND BEFORE AND
; INCLUDING DSKDDB ARE PROTECTED FROM DELETION.
PUSH PDP,ITEM ;SAVE ITEM
PUSHJ PDP,CLRDDB ;RETURN DISK OR TTYNM DDB TO FREE STORAGE
JRST IPOPJ ;RESTORE ITEM AND RETURN
;USTATO USTATS USTATZ
;** UUOCON.MAC **
;STATUS UUOS
;CALL: STATO D,MASK
; EXIT1 ALL SELECTED BITS ARE 0
; EXIT2 SOME SELECTED BITS ARE 1
;TEST BITS OF I/O STATUS WORD OF DEVICE ON USER'S CHANNEL D WHICH
;ARE SELECTED BY MASK.
USTATO: TRNE IOS,(UUO) ;SKIP RETURN IF ANY INDICATED BITS ARE 1
AOS (PDP)
POPJ PDP,
;CALL: STATUS D,ADR
; EXIT ALWAYS RETURN HERE
;STORES I/O STATUS WORD OF DEVICE ON CHANNEL D IN LOC. ADR.
USTATS: HRRZ TAC,IOS ;GET USER HALF OF IOS
JRST STOTAC ;ADR. CHECK AND STORE IN USER AREA
;CALL: STATZ D,MASK
; EXIT1 SOME SELECTED BITS ARE 1
; EXIT2 ALL SELECTED BITS ARE 0
;TST BITS OF I/O STATUS WORD OF DEVICE ON USER CHANNEL D WHICH
;ARE SELECTED BY MASK.
USTATZ: TRNN IOS,(UUO) ;SKIP RET. IF ALL INDICATED BITS ARE 0.
AOS (PDP)
POPJ PDP,
;TIN TOUT
;** UUOCON.MAC **
;IN UUO - LIKE INPUT, BUT SKIPS IF EOF OR ERRORS
TIN: PUSHJ PDP,IN ;DO INPUT UUO
TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM+IODEND
AOS (PDP)
POPJ PDP,
;OUT UUO - LIKE OUTPUT, BUT SKIPS IF ERRORS
TOUT: PUSHJ PDP,UOUT ;DO OUTPUT UUO
TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM
AOS (PDP)
POPJ PDP,
;ADVBFE ADVBE1
;** UUOCON.MAC **
;ROUTINE TO ADVANCE OUTPUT BUFFER
;CALL: PUSHJ PDP,ADVBFE
; EXIT1 NEXT BUFFER EMPTY
; EXIT2 NEXT BUFFER FULL
ADVBFE: HRRZ TAC1,DEVOAD(DDB) ;ADR. OF 2ND WORD OF LAST BUF.
JUMPE TAC1,CPOPJ ;RETURN IF CLEARED BY RELEASE
.UMOVM IOS,-1(TAC1) ;NO, STORE STATUS IN FIRST WORD
.UMOVE TAC,(TAC1) ;GET 2ND WORD
TLZ TAC,IOUSE ;CLEAR IOUSE
.UMOVM TAC,(TAC1) ;STORE BACK
MOVEI TAC,(TAC) ;ISOLATE NEXT BUFFER ADR. IN RH.
CAILE TAC,JOBPFI ;IS IT IN PROTECTED PART OF JOBDAT?
CAML TAC,USRREL ;NO, IS IT ABOVE HIS AREA?
POPJ PDP, ;YES, DON'T STORE NEXT ADR., BUT
;CATCH THE ERROR LATER
HRRM TAC,DEVOAD(DDB) ;NOW, STORE NEXT BUFFER ADR.
;ENTER HERE FROM SCNSER TO CHECK IF NEXT BUFFER FULL OF DATA YET
ADVBE1: .UMOVE TAC,@DEVOAD(DDB) ;IS IOUSE = 0?
JUMPGE TAC,CPOPJ ;IF SO, EXIT1, BUFFER IS EMPTY
JRST ADVBF1 ;IF NOT, GO SEE IF USER TYPED ^C.
;ADVBFF ADVBF1
;** UUOCON.MAC **
;ROUTINE TO ADVANCE INPUT BUFFER
;CALL: PUSHJ PDP,ADVBFF
; EXIT1 ;NEXT BUFFER FULL
; EXIT2 ;NEXT BUFFER EMPTY
ADVBFF: HRRZ TAC1,DEVIAD(DDB) ;ADR. OF LAST INPUT BUFFER
JUMPE TAC1,CPOPJ ;RETURN IF CLEARED BY RELEASE
.UMOVM IOS,-1(TAC1) ;NO, STORE IOS IN FIRST WORD
.UMOVE TAC,(TAC1) ;GET 2ND WORD
TLO TAC,IOUSE ;IOUSE = 1
.UMOVM TAC,(TAC1) ;STORE BACK
MOVEI TAC,(TAC) ;ISOALTE ADR. OF NEXT BUFFER IN RH
CAILE TAC,JOBPFI ;IN PROTECTED PART OF JOBDAT?
CAML TAC,USRREL ;NO, ABOVE HIS AREA?
POPJ PDP, ;YES, GIVE STOP RETURN
HRRM TAC,DEVIAD(DDB) ;YES, STORE ADR. OF NEXT BUFFER
.UMOVE TAC1,(TAC) ;GET 2ND WORD OF NEXT BUFFER
JUMPL TAC1,CPOPJ ;GIVE STOP RETURN IF NEXT INPUT BUFFER
;IS STILL FULL
HLRZ TAC1,TAC1 ;GET LENGTH OF BUFFER INTO RH
ADDI TAC,(TAC1) ;FORM ADR. OF LAST WORD
CAMLE TAC,USRREL ;IN BOUNDS?
POPJ PDP, ;NO, GIVE STOP RETURN; WE'LL SCREW HIM LATER
ADVBF1: SKIPGE TAC,JBTSTS ;IS RUN BIT ON?
TRNE IOS,IOCON ;YES, IS IT NON-DISCONTINUOUS MODE?
POPJ PDP, ;NO, STOP RETURN
JRST CPOPJ1 ;YES, GO RETURN
;UADCK1 UADRCK IADRCK
;** UUOCON.MAC **
;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY
;CALL HRRZ AC1,REL. ADR.
; PUSHJ PDP,UADCK1
; NEVER RETURNS IF ERROR, STOPS JOB AND PRINTS ERROR
;BAD ADR. IF IN LOC. 20-JOBPFI IN JOB DATA AREA
; OR IF ABOVE C(USRREL)
UADCK1: TRNN AC1,777760 ;IN USER AC'S ?
POPJ PDP, ;YES, ADR. IS OK
;SAME AS ABOVE BUT AC'S ARE ILLEGAL ALSO
UADRCK: CAILE AC1,JOBPFI ;IS ADR. IN I/O PROTECTED PART OF JOBDAT?
CAMLE AC1,USRREL ;NO, IS IT ABOVE PROT.?
JRST ADRERR ;YES, STOP JOB AND PRINT ERROR
POPJ PDP, ;NO, OK!
;ROUTINE TO ADR. CHECK AT ANY LEVEL
;CALL HRRZ TAC,REL. ADR.
; PUSHJ PDP,IADRCK
; ERROR RETURN
; OK RETURN
IADRCK: CAILE TAC,JOBPFI ;IN PROTECTED PART OF JOBDAT?
CAMLE TAC,USRREL ;NO, ABOVE PROT.?
POPJ PDP, ;YES, ERROR RETURN
JRST CPOPJ1 ;NO, OK RETURN
;COMCHK COMCK0 COMCK1 COMCK2 COMCKE
;** UUOCON.MAC **
;ROUTINE TO CHECK VALIDITY OF A DUMP MODE COMMAND LIST
;CALL: MOVE UUO,[XWD 0 REL.ADR. OF FIRST COMMAND]
; PUSHJ PDP,COMCHK
; ADR. CHECK RETURN
; OK RETURN - SUM OF LH OF IOWDS IN DAT
; ADR. OF FIRST IOWD WITH NEG. LH IN UUO
COMCHK: PUSH PDP,UUO ;SAVE POINTER TO LIST
PUSH PDP,AC2
MOVEI AC1,JOBPFI ;ALR. OF HIGHEST I/O PROTECTED LOC.
;IN JOB DATA AREA
SKIPGE USRHCU ;SAVE OR GET IN PROGRESS?
MOVEI AC1,JOBSAV ;YES, HIGHEST LOC. NOT WRITTEN BY SAVE
SETZB DAT,AC2 ;CLEAR WORD COUNT & ADR. OF FIRST IOWD
MOVEI ITEM,100 ;"ONLY" 100 LISTS!! ?(HA, HA)?
JRST COMCK1
COMCK0: HRRI UUO,(TAC1) ;CHANGE COMMAND LIST POINTER
;ON "GO TO" WORD
HRRI TAC,(TAC1) ;SET UP TAC FOR IADRCK
PUSHJ PDP,IADRCK
JRST COMCKE ;BAD ADR.
COMCK1: SOJLE ITEM,COMCKE ;EXCEEDED 100 YET?
.UMOVE TAC1,(UUO) ;NO, GET NEXT IOWD
JUMPE TAC1,COMCK2 ;MOVE ON IF END OF LIST
JUMPG TAC1,COMCK0 ;NO, IS IT "GO TO" WORD?
HLRE TAC,TAC1 ;NO, SAVE NEG. WORD COUNT
MOVEI TAC1,(TAC1) ;GET LOWEST ADR.-1
CAIGE TAC1,(AC1) ;IS IT GREATER THAN LOC. PROTECTED
;FROM I/O ?
JRST COMCKE ;NO, ERROR RETURN
SUB TAC1,TAC ;YES, COMPUTE LAST LOC.
CAMLE TAC1,USRREL ;IN BOUNDS?
JRST COMCKE ;NO, ERROR RETURN
SUB DAT,TAC ;YES, ACCUMULATE WORD COUNT
JUMPE AC2,.+2 ;IS THIS FIRST IOWD?
MOVE AC2,UUO ;YES, SAVE ADR. IN AC2
AOJA UUO,COMCK1 ;GET NEXT IOWD
COMCK2: JUMPE AC2,.+2 ;ANY IOWD'S WITH LH NEGATIVE?
MOVE UUO,AC2 ;YES, POINT UUO AT FIRST ONE
POP PDP,AC2 ;RESTORE THIS AC
JRST TPOPJ1 ;REMOVE SAVED UUO AND SKIP RETURN
COMCKE: POP PDP,AC2
POP PDP,UUO ;RESTORE ORIGINAL UUO
POPJ PDP, ;ERROR RETURN
;CLOSE1 UCLS5 UCLSBI UCLS4 UCLS0 UCLS1
;** UUOCON.MAC **
CLOSE1:
; PUSHJ PDP,WAIT1 ;PROBABLY DON'T NEED THIS ****
TRNN UUO,CLSIN ;SUPPRESS INPUT CLOSE?
TLOE DDB,ICLOSB ;NO, HAS IT ALREADY BEEN CLOSED?
JRST UCLS2 ;YES
LDB TAC,PIOMOD ;NO, GET I/O MODE
CAIGE TAC,SD ;DUMP MODE?
JRST UCLSBI ;NO, CLOSE BUFFERED INPUT
UCLS5: PUSHJ PDP,DCLI(DSER) ;YES, DO DEVICE-DEPENDENT STUFF
JRST UCLS2 ;WHICH BETTER NOT DESTROY UUO, DDB,
;UCHN, OR DSER
UCLSBI: MOVE TAC,DEVMOD(DDB)
TLNE DDB,INPB+INBFB ;WAS AN INPUT BUFFER SET UP?
JRST UCLS4 ;YES
TLNE TAC,DVDSK ;NO, ARE WE CLOSING A DISK FILE?
JRST UCLS5 ;YES, DO DEVICE-DEPENDENT ANYWAY
JRST UCLS2 ;NO, CLOSE OF INPUT NOT NECESSARY
UCLS4: TLNE TAC,DVLNG ;IS THIS A LONG DISPATCH TABLE?
PUSHJ PDP,DCLI(DSER) ;YES, CLOSE INPUT
HRRZ TAC1,DEVBUF(DDB) ;GET ADR. OF USER'S INPUT BUFFER
.UMOVE DAT,(TAC1) ;GET FIRST WORD OF 3-WORD HEADER
ANDI DAT,-1 ;RH ONLY
MOVEI TAC1,(DAT) ;SAVE A COPY
JUMPE DAT,UCLS1 ;HAS A RING BEEN SET UP?
MOVEI AC1,(DAT) ;YES, IS ADR. SPECIFIED BY CONTENTS OF
PUSHJ PDP,UADRCK ;FIRST WORD IN BOUNDS?
SETZ AC1, ;YES, CLEAR
UCLS0: .UMOVE DAT,(DAT) ;ADVANCE CURRENT INPUT BUFFER ADR.
CAIN AC1,(DAT) ;IS THIS SAME BUFFER AS LAST ONE?
JRST UCLS1 ;YES, BAD RING - IT IS LOOPING ON SELF
MOVEI AC1,(DAT) ;NO, IS ADR. OK?
PUSHJ PDP,UADRCK
.UMOVE TAC,(DAT) ;YES, CLEAR USE BIT
TLZ TAC,IOUSE
.UMOVM TAC,(DAT)
CAIE TAC1,(DAT) ;DONE?
JRST UCLS0 ;NO
UCLS1: HRRZ DAT,DEVBUF(DDB)
.UMOVE TAC,(DAT)
TLO TAC,IOUSE ;FLAG AS VIRGIN BUFFER IN 3-WORD HEADER
.UMOVM TAC,(DAT)
SETZ TAC,
.UMOVM TAC,2(DAT) ;CLEAR INPUT ITEM COUNT
MOVE IOS,[XWD IOEND IODEND]
ANDCAB IOS,DEVIOS(DDB)
;UCLS2 UCLS7 UCLSBO UCLS2A UCLS2B UCLS3 UCLS6
;** UUOCON.MAC **
UCLS2: TRNN UUO,CLSOUT ;SUPPRESS OUTPUT CLOSE?
TLOE DDB,OCLOSB ;NO, OUTPUT ALREADY CLOSED?
JRST UCLS3 ;YES
LDB TAC,PIOMOD ;NO
CAIGE TAC,SD ;IS IT DUMP MODE?
JRST UCLSBO ;NO, CLOSE BUFFERED OUTPUT
UCLS7: PUSHJ PDP,DCL(DSER) ;YES, DO DEVICE-DEPENDENT
JRST UCLS3
UCLSBO: TLNN DDB,OUTBFB+OUTPB ;WAS AN OUTPUT BUFFER SET UP?
JRST UCLS6 ;NO
HLRZ DAT,DEVBUF(DDB) ;VIRGIN OUTPUT BUFFER?
.UMOVE TAC,(DAT)
JUMPLE TAC,UCLS6 ;YES, DON'T CLOSE UNLESS IT IS DISK
UCLS2A: MOVE DSER,DEVSER(DDB) ;NO, HAS SERVICE ROUTINE
.UMOVE TAC,@DEVOAD(DDB) ;WRITTEN NEXT BUFFER YET ?
JUMPGE TAC,UCLS2B ;YES
ANDCMI IOS,760000 ;NO, CLEAR ERROR BITS AND START
;OUTPUT DEVICE
PUSH PDP,UUO
PUSHJ PDP,DOU(DSER) ;CALL SERVICE ROUTINE TO DO OUTPUT
POP PDP,UUO
;** PUSHJ PDP,WAIT1 ;PROBABLY UNNECESSARY ***
TRNN IOS,760000 ;ERROR?
JRST UCLS2A ;NO, RETURN WHEN ALL EMPTIED
UCLS2B: MOVE DSER,DEVSER(DDB)
PUSHJ PDP,DCL(DSER) ;CLOSE OUTPUT BUFFER
HLRZ DAT,DEVBUF(DDB)
.UMOVE TAC,(DAT)
TLO TAC,IOUSE
.UMOVM TAC,(DAT)
SETZ TAC,
.UMOVM TAC,2(DAT) ;JBFCTR = 0
;** PUSHJ PDP,WAIT1 ;PROBABLY UNNECESSARY ***
TLO DDB,OCLOSB ;SET OCLOSB AFTER OUTPUT IS COMPLETE
UCLS3: MOVEM DDB,USRJDA(UCHN)
.UMOVM DDB,JOBJDA(UCHN)
POPJ PDP,
UCLS6: MOVSI TAC,DVDSK ;CLOSING A DISK FILE?
TDNE TAC,DEVMOD(DDB)
JRST UCLS7 ;YES, DO DISK CLOSE ANYWAY
JRST UCLS3 ;NO, FINISH UP
;IORELS IOALL IOALL1 IOALL2 IOKILL SETUSR CLRUSR
;** UUOCON.MAC **
;ROUTINE TO RELEASE ALL DEVICES ASSIGNED TO JOB
IORELS: MOVEI TAC,RELEA3 ;RELEASE ALL I/O DEVICES ( DON'T CLOSE )
IOALL: PUSH PDP,TAC ;SAVE ADR. OF SUBROUTINE
PUSH PDP,UUO ;SAVE UUO
SETZB UCHN,UUO ;START WITH USER CHANNEL # 0
IOALL1: CAMLE UCHN,USRHCU ;IS IT GREATER THAN HIGHEST
;CHANNEL USED?
JUMPN UCHN,IOALL2 ;YES, RETURN - BUT, IF USRHCU IS NEG., ASSUME
;SAVGET WHICH USES CHANNEL 0.
SKIPN DDB,USRJDA(UCHN) ;GET DDB FOR THIS CHANNEL;
;IS IT IN USE?
AOJA UCHN,IOALL1 ;NO, KEEP GOING
MOVE IOS,DEVIOS(DDB) ;YES, SET UP FOR SUB. CALL
DPB UCHN,PUUOAC
MOVE DSER,DEVSER(DDB)
PUSHJ PDP,@-1(PDP) ;CALL THE SPECIFIED SUBROUTINE
AOJA UCHN,IOALL1 ;CONTINIUE WITH NEXT CHANNEL
IOALL2: POP PDP,UUO ;RESTORE UUO
SETZ ITEM, ;RESET JOB #
JRST TPOPJ ;RESTORE TAC AND RETURN
;KILL ALL DEVICES (RELEASE WITHOUT WAITING FOR DEVICE INACTIVE)
IOKILL: MOVEI TAC,RELEA5 ;SET UP ADR. OF SUB.
PUSHJ PDP,IOALL ;RELEASE WITHOUT WAITING
;ROUTINE TO CLEAR PROTECTED JOB DATA AREA IN MONITOR
;AND RECLAIM FREE AREA ABOVE USER PROGRAM FOR I/O BUFFERS
SETUSR: .UMOVE TAC,JOBSA ;RESET FIRST FREE LOC. FOR THIS JOB
HLRZ TAC,TAC
.UMOVM TAC,JOBFF
CLRUSR: SETZ TAC, ;INITIALIZE APR TRAPPING
.UMOVM TAC,JOBHCU ;CLEAR HIGHEST CHANNEL IN USE
MOVEI TAC,USRLO1 ;CLEAR SOME OF JOBDAT
HRLI TAC,USRLO
SETZM USRLO
BLT TAC,USRHI
SETZM USRHCU
MOVEI TAC,JOBLO ;CLEAR IT IN PROCEDURE ALSO
HRLI TAC,USRLO
.UBLTO TAC,JOBHI
POPJ PDP,
;ASSASG ASSAS1
;** UUOCON.MAC **
;ASSIGN DEVICE IF UNASSIGNED
;CALL: MOVE DDB,ADR. OF DDB
; MOVEI TAC1, EITHER ASSPRG OR ASSCON
; PUSHJ PDP,ASSASG
; CAN'T ASSIGN RETURN
; ASSIGNED RETURN
ASSASG: MOVSI TAC,DVDSK ;SET UP "I'M A DISK" BIT
TDNE TAC,DEVMOD(DDB) ;IS THIS A DSK?
PUSHJ PDP,SETDDB ;YES - GET A DSK DDB
ASSAS1: IORM TAC1,DEVMOD(DDB) ;SET WHICHEVER ONE HE WANTS
JRST CPOPJ1 ;GIVE GOOD RETURN
;DEVSRC DEVLG DEVLP0 DEV0 DEVPHY DEVLP1 DEVPH1
;** UUOCON.MAC **
;SEARCH FOR DEVICE WHOSE NAME IS IN TAC
;SEARCH FOR LOGICAL NAME FIRST.
DEVSRC: PUSHJ PDP,DEVLG ;SEARCH LOGICAL NAMES FIRST
JRST DEVPHY ;NOT FOUND, SEARCH PHYSICAL NAMES
JRST CPOPJ1 ;FOUND, GIVE SKIP RETURN
DEVLG: HLRZ DDB,DEVLST ;BEGINNING OF DDB CHAIN
DEVLP0: CAMN TAC,DEVLOG(DDB) ;EQUAL LOGICAL NAME?
JUMPN TAC,CPOPJ1 ;YES, BUT GOOD ONLY IF NON-ZERO
DEV0: HLRZ DDB,DEVSER(DDB) ;NO, KEEP LOOKING
JUMPN DDB,DEVLP0
POPJ PDP, ;NOT FOUND
;SEARCH PHYSICAL NAMES
DEVPHY: MOVEI TAC1,SYSDEV ;START OFF ASSUMING "SYS"
CAME TAC,[SIXBIT /SYS/] ;IS THAT RIGHT?
TRZA TAC1,SYSDEV ;NO, TURN OFF FLAG
MOVSI TAC,(SIXBIT /DSK/) ;YES, USE DSK
HLRZ DDB,DEVLST ;SEARCH DDB'S
DEVLP1: TLO DDB,(TAC1) ;SET SYS. BIT IF ON
CAMN TAC,DEVNAM(DDB) ;MATCH?
JUMPN TAC,CPOPJ1 ;YES, IF NAME NON-ZERO
DEVPH1: HLRZ DDB,DEVSER(DDB) ;NO, GET NEXT IN CHAIN
JUMPN DDB,DEVLP1 ;CONTINUE IF NOT END
CAME TAC,[SIXBIT /TTY/] ;IS IT PUBLIC NAME "TTY"?
JRST GETDDB ;NO, SEE IF IT IS A TTYNN
PUSHJ PDP,TTYFND ;YES, FIND USER'S TTY DDB
JRST CPOPJ1 ;AND GIVE SUCCESSFUL RETURN
;UUOHAN UUDISP P40OP P40AC
;** UUOCON.MAC **
;LUUO HANDLER
.UMOVE=1_27. ;OPDEF FOR .UMOVE
.UMOVM=2_27. ;OPDEF FOR .UMOVM
.UBLTI=3_27. ;OPDEF FOR .UBLTI
.UBLTO=4_27. ;OPDEF FOR .UBLTO
UUOHAN: PUSH PDP,TAC ;SAVE TAC
LDB TAC,P40AC ;GET THE AC FIELD FROM UUO IN 40
CAIN TAC,TAC ;IS HE SPECIFYING AC "TAC" ?
MOVEI TAC,(PDP) ;YES, POINT TO ITS CONTENTS, SEEING AS WE
;HAVE CLOBBERED THE AC ITSELF.
TLO TAC,777777 ;PUT -1 IN LH FOR POSSIBLE .IOT ON IT
PUSH PDP,TAC ;SAVE FOR LATER USE
LDB TAC,P40OP ;GET THE OP CODE FROM THE UUO
CAIG TAC,HIUUO ;IS IT IN RANGE?
JRST @UUDISP-1(TAC) ;YES, DISPATCH
JRST SYSERR ;NO, ERROR!
JRST .-1
UUDISP: UMOVE ;MOVE THE SPECIFIED LOC. IN INFERIOR
;INTO THE SPECIFIED ACCUMULATOR
UMOVM ;STORE THE CONTENTS OF THE SPECIFIED
;ACCUMULATOR INTO THE SPECIFIED LOC.
;IN INFERIOR
UBLTI ;BLOCK TRANSFER FROM INFERIOR TO "SIM"
UBLTO ;BLOCK TRANSFER FROM "SIM" TO INFERIOR
HIUUO==.-UUDISP
P40OP: POINT 9,40,8, ;BYTE POINTER TO OP-CODE FIELD OF UUO
P40AC: POINT 4,40,12, ;BYTE POINTER TO AC FIELD OF UUO
;UMOVE T2POPJ UMOVM UUOSUB UBLTI UBLTO
;** UUOCON.MAC **
;LUUO HANDLER
UMOVE: .ACCES UPRGI,40 ;SET UP TO ACCESS INFERIOR LOC.
.IOT UPRGI,(PDP) ;SUCK SPECIFIED WORD INTO RIGHT AC
T2POPJ: POP PDP,TAC ;REMOVE ONE STACK LOC.
JRST TPOPJ ;RESTORE TAC AND RETURN
UMOVM: .ACCES UPRGO,40 ;SET UP DESTINATION ADR.
.IOT UPRGO,(PDP) ;SEND THE WORD THERE
JRST T2POPJ ;RESTORE AND RETURN
;THIS SUBROUTINE GETS THE CONTENTS OF THE AC SPECIFIED IN
;THE UUO INTO TAC
UUOSUB: LDB TAC,P40AC ;GET SPECIFIED AC
CAIN TAC,TAC ;IS IT TAC?
SKIPA TAC,-2(PDP) ;YES, GET CONTENTS OF TAC
MOVE TAC,(TAC) ;NO, GET OTHER CONTENTS
POPJ PDP, ;RETURN
UBLTI: PUSHJ PDP,UUOSUB ;GET CONTENTS OF AC INTO TAC
MOVS TAC,TAC ;SWAP HALVES
.ACCES UPRGI,TAC ;ACCESS THE "FROM ADR."
HLRZ TAC,TAC ;ISOLATE "TO ADR."
MOVEM TAC,1(PDP) ;STORE TEMPORARILY
SUBI TAC,@40 ;FORM -LENGTH
HRLZI TAC,-1(TAC)
HRR TAC,1(PDP) ;PICK UP "TO ADR."
.IOT UPRGI,TAC ;MAKE TRANSFER
JRST T2POPJ ;RESTORE AND RETURN
UBLTO: PUSHJ PDP,UUOSUB ;GET CONTENTS OF AC INTO TAC
.ACCES UPRGO,TAC ;ACCESS "TO ADR."
MOVEM TAC,1(PDP) ;STORE "FROM ADR." TEMPORARILY
SUBI TAC,@40 ;FORM -LENGTH
HRLZI TAC,-1(TAC)
HLR TAC,1(PDP) ;RESTORE "FROM ADR."
.IOT UPRGO,TAC ;MAKE TRANSFER
JRST T2POPJ ;RESTORE AND RETURN
;APRER APRER5 APDSBL
;** CLOCK1.MAC ** PAGE 4
;APR INTERRUPTS COME HERE
; IF FROM USER'S PROGRAM, WE FIRST GENERATED CLASS-3 INTERRUPT TO SUPERIOR.
; APRCHL: PC IN USER PROGRAM (INCL. USRMOD BIT)
; APRERR: I.T.S. PIRQC FLAGS FROM INFERIOR AT TIME OF INTERRUPT.
; IF FROM MONITOR, A CLASS-2 INTERRUPT WAS GENERATED TO BREAK FROM
; UUO CONTROLLER - THEN OPERATING AT CLASS-3 INTERRUPT LEVEL.
; APRCHL: PC IN MONITOR (NO USRMOD BIT)
; APRERR: I.T.S. PIRQC FLAGS OF SUPERIOR AT TIME OF INTERRUPT
APRER: MOVE TAC,APRCHL ;GET PC
MOVE TAC1,APRERR ;USER ENABLED FOR THIS ERROR ?
TDNN TAC1,ITSENB
JRST APRER2 ;NO
SETZM APRERR
.UMOVM TAC,JOBTPC ;STORE PC IN JOB DATA AREA
ANDCM TAC1,[BIOADC\200000\AROIF\ARFOIF] ;CLEAR OUT ALL BUT MEANINGFUL BITS
;NOTE - WE WOULD ORDINARILY HAVE BPIPI(=4) SET DUE TO I.T.S.
; METHOD OF INTERRUPTING SUPERIOR WHEN INFERIOR RECEIVED ENABLED
; INTERRUPT IN UTRAP MODE.
TLZE TAC1,(ARFOIF) ;ARFOIF FOUND ?
TRO TAC1,100 ;CHANGE TO FOV IF SO, ALSO RESETTING ARFOIF BIT
MOVE TAC,ITSENB
TLNE TAC,(ARFOIF) ;DIDDLE AC(TAC) TO MAKE IT LOOK LIKE A CONI APR, WORD.
TRO TAC1,200 ;C.F. PDP10 REFERENCE MANUAL, P 97.
TRNE TAC,AROIF
TRO TAC1,20
TRZ TAC1,400000 ;CLEAR "LEAVE INTERRUPTS ENABLED" BIT
.UMOVM TAC1,JOBCNI
MOVE TAC1,ITSENB
TRNN TAC1,400000 ;DOES USER WANT TRAPS DISABLE WHENEVER ONE OCCURS
JRST APDSBL ;YES - DO SO
APRER5: .UMOVE TAC,JOBAPR ;GET USER LOC TO TRAP TO
.USET UPRGO,[.SUPC,,TAC] ;SET STARTING ADDR
.USET UPRGO,[.SUSTP,,[0]] ;START HIM UP
POPJ PDP, ;RETURN TO INTERRUPT ROUTINE
APDSBL: SETZM ITSENB ;NOTHING ENABLED FOR USER
.USET UPRGO,[.SMASK,,[BIOADC\BILLOP\200000]]
;VIRGIN STATUS OF MASK - THE SAME AS WHEN PROCEDURE WAS CREATED
JRST APRER5
;APRER2 WSCHED USCHED USCHD1
;** CLOCK1.MAC ** PAGES 5+7
APRER2: TRNE TAC1,BIOADC\200000 ;IS THIS A TRAP WE WISH TO SIGNAL
; AS AN ERROR ?
JRST SAVPC ;SAVE A MONITOR PC SO THAT THE
; USER WILL NOT CONFUSE JOBPC W/INTERRUPT LOCATION.
; AT SAVPC: WE GO TO APRILM:[ERRCON] WHICH WILL GET
; US TO HOLD:[CLOCK1] WHERE ERROR BIT WILL BE SET IN
; JOB STATUS WORD.
JRST SYSERR ;YES
;HERE WHILE PROCESSING A TELETYPE INPUT UUO AND WE ARE WAITING
; FOR CHARACTER OR STORED ^C SEEN.
;CALL: PUSHJ PDP,WSCHED
; RETURN HERE WHEN RUNNABLE AGAIN
WSCHED: POP PDP,AC3
TLZ AC3,USRMOD
MOVEM AC3,USRPC
.UMOVM AC3,JOBPC
MOVEI AC3,USRDAC ;COPY OUR AC'S TO DUMP AREA
BLT AC3,USRD16
JRST USCHD1
;HERE FROM UUO EXIT CODE WHEN JOB RETURNS TO UUO CONTROLLER WHERE
; RETURN PC NOW IN MONITOR MODE. PROGRAM MUST HAVE EXECUTED A
; SOFT EXIT (CALLI 1,12) OR A HALT.
;CALL: PUSHJ PDP,USCHED
; RETURN HERE WHEN JOB RUNNABLE
USCHED: POP PDP,AC3 ;COLLECT RETURN ADDR INTO MONITOR
TLZ AC3,USRMOD ; AND RESET USRMOD BIT SO USER KNOWS WHAT'S UP
MOVEM AC3,USRPC
.UMOVM AC3,JOBPC
MOVEM PDP,USRDPD
USCHD1: MOVE AC3,USRPD1
.UMOVM AC3,JOBPD1
JRST RSCHED
;SAVPC RSCHED SETREL SETHRD
;** CLOCK1.MAC ** PAGES 8,9,+13
SAVPC: JSP TAC,.+1 ;GET A REASONNABLE PC
TLZ TAC,USRMOD ;RESET USER MODE BIT
MOVEM TAC,USRPC
SKIPE USRREL ;DON'T TRY TO WRITE INTO NON-EXISTENT INFERIOR
.UMOVM TAC,JOBPC
SKIPE TAC,APRERR ;IS THIS AN APR ERROR OR AN ERROR STOP ?
JRST APRILM ;APR ERROR-TYPE ERROR MESSAGE.
JRST RSCHED ;ELSE WAIT FOR USER TO DO SOMETHING.
RSCHED: JRST PW2IB ;GO WAIT FOR USER TO TYPE IN SOMETHING.
; A COMMAND WOULD BE NICE IF WE'RE IN TPMON-MODE.
; ELSE ANY ODL CHAR WILL DO.
;ROUTINE TO SET SOFTWARE RELOCATION INFORMATION FOR USER
;CALLED FROM:
; CORE ROUTINE WHEN CORE REASSIGNED FOR CURRENT USER
; CORE UUO
; REMAP UUO
; CALL RESET UUO
;
;CALL: STORE PROTECTION FOR SEG IN JBTADR+1
; PUSHJ PDP,SETREL
; ALWAYS RETURN, C(ITEM)=JOB # (=0)
; C(PROG)=XWD PROT,,0 FOR LOWSEG
SETREL: MOVE PROG,JBTADR
HLRZM PROG,USRREL
JUMPE PROG,SETHRD
MOVE PROG,USRREL
.UMOVM PROG,JOBREL
MOVE PROG,JBTADR
SETHRD: POPJ PDP,
;SETAPR PHOLD HOLD HOLD1
;** CLOCK1.MAC ** PAGES 14+16
;ROUTINE TO ENABLE/DISABLE APR TRAPPING FROM INFERIOR
;CALL: MOVEI TAC,APR CONSO FLAGS, DEC STYLE
; PUSHJ PDP,SETAPR
; RETURN W/APR RESET
;FOR I.T.S., WE HAVE THE FOLLOWING INTERRUPT REQUEST TRANFORMATIONS.
;WE OBSERVE THEM TO SET UP PROPER PIRQC MASK.
;
; DEC BIT ITS BIT
; 400000 D.N.A.(="REPETITIVE ENABLE")
; 200000(PDL) SAME(UNNAMED)
; 20000(MEM PROT) SAME=BIOADC)
; 100(FOV) 400,,(=ARFOIF)
; 10(AROV) SAME(=AROIF)
SETAPR: ANDI TAC,620110
TRZE TAC,100 ;FOV ->
TDO TAC,[ARFOIF] ; ARFOIF
MOVEM TAC,ITSENB
.USET UPRGO,[.RMASK,,TAC]
AND TAC,[ARFOIF\AROIF] ;ALWAYS LEAVE PDL OVF + ILL MEM ON
IOR TAC,ITSENB
TRZ TAC,400000 ;WE DON'T WANT TO SET THIS D.N.A. BIT
.USET UPRGO,[.SMASK,,TAC] ;ENABLE HIM FOR DESIRED TRAPPING CONDITIONS
POPJ PDP,
;ROUTINE TO STOP JOB, SET ERROR BIT, AND PRINT MESSAGE
;THEN ADD ^C<CRLF><CRLF><PERIOD>
;CALL: MOVEI TAC,ADDR. OF MESSAGE
; PUSHJ PDP,PHOLD
PHOLD: PUSHJ PDP,CONMES
HOLD: PUSHJ PDP,INLMES
ASCIZ /
^C
./
HOLD1: PUSHJ PDP,TTYSTC ;MAKE SURE TTY STAYS IN MONITOR MODE
; FALL INTO ESTOP
;ESTOP STOP1 STOP1B STOP1C STOP1A
;** CLOCK1.MAC ** PAGES 17+18
;ROUTINE TO STOP USER AND FLAG AS ERROR STOP
ESTOP: MOVSI TAC,JERR ;SET ERROR BIT
IORM TAC,JBTSTS ;SO 'CONTINUE' WON'T WORK
MOVE TAC,TTYOIP
JUMPE TAC,.+4
AOJE TAC,.+2
.RESET CTYI,
SETZM TTYOIP
;FALL INTO STOP1 BELOW
;ROUTINE TO STOP ANY JOB
;CALL: PUSHJ PDP,STOP1
; EXIT
STOP1: MOVSI TAC,RUN
TDNN TAC,JBTSTS ;RUNNING ?
JRST STOP1A ;NO
ANDCAM TAC,JBTSTS ;YES - BUT IT WON'T BE BY THE TIME WE'RE DONE
.USET UPRGO,[.RUSTP,,TAC] ;IS USER ALREADY STOPPED ?
TLNN TAC,100000 ;I.E. IS BIT ON ?
JRST STOP1B ;NO - STILL RUNNING
MOVSI TAC,377
ANDCAM TAC,INTR
.USET UPRGO,[.RPIRQC,,TAC] ;STOPPED - ARE THERE REQUESTS PENDING ?
TDZN TAC,[BUTRAP\BIOADC\BILLOP\200000\AROIF\ARFOIF]
JRST STOP1A ;NO - MUST HAVE BEEN LEFT IN MONITOR WAITING
; AND FOUND THE ^C -- OR CALLI 12 CAME HERE, PC ALREADY SAVED
; -- OR HALT SEEN
STOP1B: .USET UPRGO,[.SUSTP,,[100000,,0]] ;STOP HIM
STOP1C: .USET UPRGO,[.RUPC,,USRPC]
MOVE TAC,USRPC
.UMOVM TAC,JOBPC
.USET UPRGO,[.RPIRQC,,TAC]
TDZN TAC,[BUTRAP\BIOADC\BILLOP\200000\AROIF\ARFOIF]
JRST STOP1A
.USET UPRGO,[.SPIRQC,,TAC] ;RESET POSSIBLE INFERIOR INTERRUPT BITS
.SUSET [.SIFPIR,,[400000,,0]] ;PREVENT A STOPPED USER FROM
;CAUSING SPURIOUS INTERRUPTS.
MOVE TAC,USRPC ;NOW DROP PC BACK 1 LOCATION
HRRI TAC,-1(TAC)
MOVEM TAC,USRPC
.UMOVM TAC,JOBPC
STOP1A: MOVEI TAC,NULPDL ;NOW TO TELL WHETHER WE ARRIVED HERE VIA A
; UUO OR A COMMAND
CAIGE TAC,(PDP) ;IF PD STACK POINTS TO SOMEWHERE IN NPDL, THEN
; WE ARRIVED VIA A COMMAND
POPJ PDP, ;AND IF SO, RETURN
MOVE TAC,JBTSTS ;ERROR IN JOB ?
TLNE TAC,JERR
JRST SAVPC ;YES - SAVE A MONITOR PC SO USER KNOWS
; THAT HE DIDN'T COME FROM THERE
POPJ PDP, ;RETURN TO CALLER IF WE STOPPED W/O
; ERR'ING -- SPECIFICALLY BY "HALT" COMMAND OR VIA A SOFT
; EXIT OR VIA A PROGRAM HALT
;MONSTR USTART USTRT1 MSTART
;** CLOCK1.MAC ** PAGES 20+21
;ROUTINE TO SETUP AC'S FOR MONITOR JOB STARTING AT UUO LEVEL.
; SETS UP PROG W/PROTECTION AND PDP W/PUSHDOWN POINTER TO LIST WHICH
; WOULD ORDINARILY BE IN USER'S JOB DATA AREA
MONSTR: MOVE PROG,JBTADR ;SET UP PROG
MOVE PDP,UPDP ;START UP POINTER TO USEFFUL PC
HRRZ TAC1,TAC1 ;THIS TURNS OF USER MODE BIT
PUSH PDP,TAC1 ;EXEC JOB ABOUT TO START !
JRST (TAC) ;RETURN AND DO MONITOR JOB
;1. TAC1=ESTOP IF CALLED BY CORE0 -> ESTOP MEANS THAT THERE MAY BE
; NO CONTINUE AFTER A CORE 0.
;2. TAC1 IMMATERIAL WHEN CALLED BY FINISH.
;3. TAC1=RETURN FROM SG1 WHEN CALLED FROM SG1. (SG1 ED BY A
; JSP TAC1,SG1.) THEN THE PDPJ PDP, AT END OF SG1: WINS.
; SG1->CALLED FROM:
; GETJOB P 70 COMCON
; RUNJOB P 70 COMCON
; SAVJOB P 67 COMCON
;ROUTINE TO SET JOB READY TO RUN
;CALL: MOVE TAC1,STARTING PC
; PUSHJ PDP,USTART(PC TO USER MODE),MSTART(PC TO MONITOR MODE)
; RETURN IMMEDIATELY
USTART: MOVE TAC,USRPC ;GET OLD PC
TLNE TAC,USRMOD ;IN USER MODE ?
JRST USTRT1 ;YES
MOVE TAC,USRPD1 ;NO - IT MUST HAVE BEEN A UUO THEREFORE
; (OR A PROGRAM HALT)
HRRI TAC,-1(TAC) ;ADDRESS IN USER CORE MAY BE FOUND IN FIRST
;LOCATION OF STACK
USTRT1: .UMOVM TAC,JOBOPC
HLL TAC1,TAC ;PRESERVE USER APR FLAGS
TLO TAC1,USRMOD ;MAKE USRE PC IN USWER MODE
TLZ TAC1,37 ;+ NO INDIRECT BITS OR INDEX FLAG.
;MSTART - CALLED FROM COMMAND DECODER AT 'SAVE', 'GET',
; 'REASSIGN', AND 'FINISH'.
;ALSO CALLED VIA MONJOB FROM 'KJOB' AND 'CORE 0.'
;ALSO EXECUTED WHEN USTART: DROPS THROUGH
MSTART:
MOVEM TAC1,USRPC
.UMOVM TAC1,JOBPC
MOVSI TAC,JERR ;CLEAR ERROR BIT
ANDCAM TAC,JBTSTS
JRST TTYSET ;SET TTY TO INITIAL CONDITION
;SETRUN SETR3 WSYNC
;** CLOCK1.MAC ** PAGES 22+29
;SETS JOB TO RUN - ESSENTIALLY COMBINES AXN OF SETRUN AND
; CONTEXT SWITCHING AT CIP7:
SETRUN: MOVSI TAC,RUN
IORM TAC,JBTSTS
MOVE TAC,USRPC ;DO WE GO TO USER OR MONITOR (VIA MSTART) ?
TLNE TAC,USRMOD ;AND NOW, WE CHECK
JRST SETR3
MOVSI 17,USRDAC ;RESTORE PC'S
BLT 17,16
JRST @USRPC ;TO MONITOR
SETR3: .USET UPRGO,[.SUPC,,USRPC]
.USET UPRGO,[.SUSTP,,[0]] ;START HIM UP HERE
POPJ PDP,
;WSYNC IS CALLED TO WAIT UNTIL SETIOD IS CALLED BY INTERRUPT SERVICE ROUTINE -
; AND THERE ONLY ACTIVE INTERRUPTS NOW WILL BE THOSE FROM THE TTY.
; WE ARRIVE HERE EXCLUSIVELY FROM THE TTY ROUTINE. AT TYWYNC: WE ARRIVE
; WITH BITS TTYIOW SET IN AC(IOS). FROM MONUS6: (STORED ^C), WE ALSO HAVE
; TPMON SET. WE NOW PUT OURSELVES INTO I/O WAIT STATE - TO BE
; CHECKED BY OUR TTY INTERRUPT ROUTINE AFTER CHARACTERS HAVE BEEN INPUT
WSYNC: MOVSI IOS,IOW ;SETUP I/O WAIT
IORM IOS,DEVIOS(DDB)
PUSHJ PDP,WSCHED
ANDCAB IOS,DEVIOS(DDB) ;RETURNS HERE
POPJ PDP,
;COMMAND COMLP COMNEQ
;** COMCON.MAC **
;TEMPORARY ACCUMULATORS
T==BUFPNT
T1==BUFWRD
T2==UUO
T3==AC1
T4==AC2
COMMAND:
MOVEI DAT,TTIBUF(DDB) ;THIS ALLOWS US TO DO GETCHR'S
;NOTE: ACCUMULATORS ARE ALREADY SET UP HAVING BEEN
; STARTED UP BY OUR GENERAL CONSOLE INTERRUPT ROUTINE.
; WE FOUND THAT THE TTY IS IN MONITOR MODE AND THAT A BREAK
; CHARACTER WAS JUST SEEN.
MOVE LINE,TITCTR(DDB)
DPB LINE,PCOMIC ;SAVE COMMAND INPUT COUNTER
MOVEI ITEM,0 ;THAT'S THE JOB NUMBER WE SET OURSELVES TO BE
PUSH PDP,DDB
PUSHJ PDP,CTEXT ;SCAN COMMAND NAME, RETURN IT IN AC(TAC1)
MOVE T,TAC1 ;COPY COMMAND
MOVNI T1,1 ;SET MASK ALL ONES
LSH T1,-6 ;CLEAR OUT ONE MORE CHAR
LSH T,6 ;SHIFT 1 COMMAND CHAR OFF
JUMPN T,.-2 ;IF NOT END OF COMMAND, GO BACK
MOVEI T4,0
MOVSI T,-DISPL ;SEARCH COMMAND TABLE FOR MATCH
COMLP: MOVE T2,COMTAB(T) ;GET NEXT ENTRY FROM COMMAND TABLE
TDZ T2,T1 ;MASK OUT CHAR 5
CAMN TAC1,COMTAB(T) ;EXACT MATCH ?
JRST COMFND ;YES, THIS IS IT
CAME TAC1,T2 ;MATCH WITH MASK ?
JRST COMNEQ ;NO, NOT EVEN THEN
TROE T4,1 ;MATCHES W/MASK, IS THIS FIRST ?
TROA T4,2 ;NO, TELL OURSELVES THAT
MOVE T3,T
COMNEQ: AOBJN T,COMLP ;NO, KEEP LOOKING
CAIN T4,1 ;DID ONE AND ONLY ONE COMMAND MATCH ?
MOVE T,T3 ;YES, GET ITS INDEX
;IF NOT --- THEN WE LET DISPATCH ENTRY FALL THROUGH TIL LAST,
; LAST ENTRY IS THE ERROR DISPATCH
;COMFND CHKRUN CHKACT COMER COMGO COMDIS COMRET
;** COMCON.MAC ** PAGES 3,4,5+6
COMFND: MOVE TAC1,DISP(T) ;GET DISPATCH TABLE ENTRY
PUSH PDP,TAC1 ;SAVE RH(DISPATCH ADDR.+BITS)
MOVE T,JBTSTS ;COLLECT JOB STATUS WORD FOR OURSELVES
CHKRUN: TLNE T,RUN ;RUN BIT ON ?
TLNN TAC1,NORUN ;AND IS THAT OK ?
JRST CHKACT ;YES
JSP TAC,COMER
ASCIZ /Please type ^C first
/
CHKACT: MOVE PROG,JBTADR ;XWD PROTECTION,RELOCATION
TLNE TAC1,NOCORE ;NEED CORE ?
JRST COMGO ;NO - NO NEED TO CHECK ANY FURTHER
JUMPN PROG,COMGO ;BETTER HAVE SOME
JSP TAC,COMER
ASCIZ /No core assigned
/
COMER: MOVEI TAC1,CERR
COMGO:
COMDIS:
MOVEI IOS,0
PUSHJ PDP,(TAC1)
;RETURN FROM COMMAND SETUP ROUTINE
COMRET: POP PDP,T1
POP PDP,DDB
LDB TEM,TITAKR(DDB)
PUSHJ PDP,SKPBRK
SOS TISYNC(DDB)
JUMPGE ITEM,PCRLF
MOVSI T1,ERRFLG
;PCRLF PCRLF1 SKPBRK SKPBR2 SKPBR1
;** COMCON.MAC ** PAGES 7+8
PCRLF: TLNN T1,NOCRLF ;SUPPRESS CRLF ?
PUSHJ PDP,CRLF ;NO
TLNN T1,NOPER ;SUPPRESS PRINTING PERIOD ?
PUSHJ PDP,PRPER ;NO
JUMPL ITEM,PCRLF1
TLNE T1,TTYRNU ;JOB TO RUN IN USER MODE ?
PUSHJ PDP,TTYUSR
TLNE T1,TTYRNC
PUSHJ PDP,SETRUN
POPJ PDP,
PCRLF1: POPJ PDP,
SKPBRK: PUSH PDP,TAC
SKPBR2: PUSHJ PDP,SPCHEK
JRST SKPBR1
TLNE TAC,BREAKB ;IS THIS THE BREAK ?
JRST TPOPJ ;YES - RETURN
SKPBR1: PUSHJ PDP,GETCHR ;GET ANOTHER
JUMPN TEM,SKPBR2 ;IS IT IS ?
MOVEI TEM,12 ;NO MORE - FORCE A BREAK
DPB TEM,TITAKR(DDB)
JRST TPOPJ ;AND RETURN
;TABLE OF CONSOLE COMMANDS
;BITS CHECKED BEFORE DISPATCHING TO COMMAND SETUP ROUTINE
NOCORE==400000 ;NO CORE NEEDED FOR COMMAND
NORUN==10000 ;CANNOT BE EXECUTED WHILE JOB IS RUNNING
;BITS CHECK AFTER RETURN FROM COMMAND SETUP ROUTINE
NOCRLF==200 ;NO PRINTING OF <CR><LF>
NOPER==100 ;NO PRINTING OF PERIOD
TTYRNU==40 ;SET TTY TO USER MODE AND START JOB
TTYRNC==20 ;KEEP TTY IN COMMAND MODE AND START JOB
ERRFLG==1 ;COMMAND ERROR
;COMTAB DISP
;** COMCON.MAC ** PAGE 9
DEFINE NAMES
C []CBLANK,NOCORE\NOCRLF
C START,START,NOPER\TTYRNU\NORUN
C HALT,STOP,NOCORE
C R,RCOM,NOCORE\NOPER\TTYRNU\NORUN\NOCRLF
C RUN,RUNCOM,NOCORE\NOPER\TTYRNU\NORUN\NOCRLF
C CORE,CORE,NOCORE\NORUN
C GET,GET,NOCRLF\NOPER\TTYRNC\NOCORE\NORUN
C SAVE,SAVE,NOCRLF\NOPER\TTYRNC\NORUN
C CONTIN,CONT,NOPER\TTYRNU\NORUN
C D,DCOM
C E,ECOM,NOCRLF
C PJOB,PJOB,NOCORE
C ASSIGN,ASSIGN,NOCORE
C DEASSI,DEASSI,NOCORE
C DDT,DDTGO,NOPER\TTYRNU\NORUN
C FINISH,CFINI,TTYRNC\NORUN
C REENTE,REENTE,TTYRNU\NOPER\NORUN
C CSTART,STARTC,TTYRNC\NORUN
C CCONTI,CCONT,TTYRNC\NORUN
C DAYTIM,DAYTIM,NOCORE
C TIME,RUNTIM,NOCORE
C RESOUR,FREDEV,NOCORE
C COMPIL,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C COPY,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C CREF,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C DEBUG,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C DELETE,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C DIRECT,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C EXECUT,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C LIST,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C LOAD,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C MAKE,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C RENAME,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C TECO,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C TYPE,CCLRUN,NOCORE\NOPER\TTYRNU\NOCRLF\NORUN
C LOGIN,LOGIN,NOCORE\NOPER\NOCRLF\NORUN
C KJOB,LOGOUT,NOCORE\NOPER\NOCRLF\NORUN
C HELP,HELP,NOCORE
C PPPN,PPN,NOCORE
C SNAME,SNA,NOCORE
TERMIN
DEFINE C A,B,C
SIXBIT /A/
TERMIN
COMTAB: NAMES
DISPL==.-COMTAB
DEFINE C A,B,D
D,,B
TERMIN
DISP: NAMES
NOCORE,,NOCOM
;COR0 PJOB DECLF CERR START STARTC STRTC1
;** COMCON.MAC ** PAGES 12,13,14+15
;CALLED FROM COMMAND DECODER
; DDB=ADDR OF CTY DDB
; PROG=XWD PROT., (O IF NO CORE)
COR0: JUMPE PROG,CPOPJ ;RETURN IF JOB DOES NOT HAVE CORE
MOVEI TAC1,ESTOP
JSP TAC,MONSTR
PUSHJ PDP,RESET ;RELEASE ALL IO DEVICES
PUSHJ PDP,TTYFNU
MOVEI TAC,0
SOS (PDP) ;NEGATE SKIP RETURN WHICH CORE1 WILL DO
JRST CORE1
; "PJOB" - PRINT JOB # OF JOB
PJOB: MOVE TAC,JOB ;JOB # = I.T.S. USER INDEX OF SIM PROCEDURE
DECLF: PUSHJ PDP,RADX10 ;PRINT AS A DEC #
JRST CRLF
;ERROR IN COMMAND
CERR: JRST ERRMES
; "START L" OR "START"
START:
; "CSTART L" OR "CSTART"
STARTC: .UMOVE TAC1,JOBSA
PUSH PDP,TAC1 ;SAVE USER'S JOBFF
PUSHJ PDP,OCTIN
SKIPA TAC1,(PDP)
JRST STRTC1 ;ILLEGAL CHARACTER
POP PDP,(PDP) ;ADJUST STACK
JRST CHKSTR
STRTC1: POP PDP,(PDP) ;ADJUST STACK
JRST COMERA
;HELP HELP1 REENTER DDTGO CHKSTR STOP CCONT CONT
;** COMCON.MAC ** PAGES 16+17
HELP: PUSHJ PDP,INLMES
ASCIZ/The monitor has the following commands:
/
MOVSI AC1,1-DISPL ;LOAD AN AOBJN PNTR
HELP1: TRNN AC1,7 ;SHOULD I CRLF?
PUSHJ PDP,CRLF
MOVE TAC1,COMTAB+1(AC1) ;LOAD A COMMAND
PUSHJ PDP,PRNAME ;TYPE IT
PUSHJ PDP,INLMES
ASCII / /
AOBJN AC1,HELP1 ;TYPE ANOTHER
JRST CRLF ;TYPE A CRLF
REENTER:
.UMOVE TAC1,JOBREN ;GET REENTER ADDRESS FROM JOB DATA AREA
JRST CHKSTR
DDTGO: MOVE TAC1,USRDDT
CHKSTR: TLZ TAC1,-1 ;ZERO LEFT HALF
JUMPN TAC1,USTART
JSP TAC,ERRMES
ASCIZ /No starting address
/
; "HALT" OR "^C"
;SCANNER ROUTINE DUMMY UP STOP WHEN ^C TYPED IN.
STOP: PUSHJ PDP,INLMES ;TYPE MESSAGE
ASCIZ /^C
/
JRST STOP1 ;STOP JOB
; "CCONTINUE" - CONTINUE EXECUTION (TTY REMAINS IN COMMAND MODE)
CCONT: ;SAME AS "CONTINUE"
; "CONTINUE" - CONTINUE EXECUTION FROM WHERE USER LEFT OFF
CONT: MOVSI TAC1,JERR
TDNN TAC1,JBTSTS ;IS JOB ERROR SET ?
POPJ PDP, ;NO - COMMAND DECODER WILL DO THE REST
JSP TAC,ERRMES ;YES - PRINT CAN'T CONTINUE
ASCIZ /Can't continue
/
;CORE COR1 COR2 COR3
;** COMCON.MAC ** PAGES 18+19
; "CORE NN" - ASSIGNS NN*1024. WORDS OF CORE TO JOB
; "CORE" WITH NO ARGUMENT WILL PRINT NO. OF FREE BLOCKS LEFT WITHOUT
; AFFECTING CURRENT ASSIGNMENT OF CORE
CORE: PUSHJ PDP,DECIN ;GET NN - NO. OF 1K BLOCKS
JRST COR3 ;NO ARG. SPECIFIED, JUST TYPE CURRENT CORE ALLOCATION
JRST COMERA ;ILLEGAL DECIMAL CHARACTER RETURN
JUMPE TAC1,COR1
LSH TAC1,12 ;CONVERT 1K BLOCKS TO WORDS
MOVEI TAC,-1(TAC1) ;HIGHEST REL ADR. = LENGTH-1 OF LOW SEG.
PUSHJ PDP,CORE0 ;TRY TO ASSIGN CORE - ONLY LOWSEG CORE EVER GETS REASSIGNED
JRST COR2 ;CORE NOT AVAILABLE - PRINT MESSAGE
POPJ PDP,
;USER ASKING FOR 0K
COR1: JRST COR0 ;GO RELEASE ALL DEVICES IF HE HAS CORE
;ERROR DURING ATTEMPT TO REASSIGN CORE
; COMES HERE UPON FAIL RETURN FROM CORE0:[CORE1]
COR2: MOVE DDB,-2(PDP) ;RESTORE TTY DDB ADDR
PUSHJ PDP,COR3
PUSHJ PDP,INLMES
ASCIZ "?"
MOVNI ITEM,1 ;SIGNAL ERROR
POPJ PDP,
COR3: MOVEI ITEM,0
PUSHJ PDP,PRTSEG ;PRINT SIZE OF LOWSEG
PUSHJ PDP,INLMES
ASCIZ "/"
MOVE TAC,CORMAX ;PRINT MAX. NO OF BLOCKS IN PHYSICAL
LSH TAC,-12 ;CORE AVAILABLE TO A SINGLE USER
PUSHJ PDP,RADX10
PUSHJ PDP,INLMES
ASCIZ /K core
/
POPJ PDP,
;SAVE GET LOGIN CCLRUN ARCOM ARCOM1 RCOM RUNCOM RUNCO2 RUNCM
;** COMCON.MAC ** PAGES 20,22+23
; "SAVE FILE-NAME [PROJ.,PROG.] CORE" - SAVES JOB AREA ON RETRIEVABLE DEVICE.
; NO ATTEMPT IS MADE TO SAVE DEVICE ASSIGNMENTS, AC'S, OR PC.
SAVE: HRRI IOS,SAVJOB ;SET UP TO RUN SAVJOB
PUSHJ PDP,CTEXT1 ;DISPATCH
SKIPE SDVNMF
JRST SGSET
CAIE TAC1,
MOVEM TAC1,JBTPRG
MOVSI TAC1,'DSK
JRST SGSET
GET: MOVEI IOS,GETJOB
PUSHJ PDP,CTEXT1
SKIPE SDVNMF
JRST RUNCM
CAIE TAC1,
MOVEM TAC1,JBTPRG
MOVSI TAC1,'DSK
JRST RUNCM
LOGIN: PUSHJ PDP,CTEXT1 ;GET A LOGIN NAME
JRST ULOGIN ;AND LOG ME IN
CCLRUN: MOVE TAC,[SIXBIT /COMPIL/]
JRST ARCOM ;RUN IT
; "R CUSPNAME CORE" - DOES "RUN SYS:CUSPNAME"
ARCOM: PUSHJ PDP,SKPBRK ;DELETE ANY ARGS
ARCOM1: MOVEM TAC,JBTPRG
RCOM: MOVSI TAC1,(SIXBIT /SYS/) ;READ FROM SYS DEVICE
JRST RUNCO2
; "RUN DEVICE:FILE[PROJ.,PROG.] (CORE)"
; DOES A CORE, GET, START ALL IN ONE.
; IF CORE ARG MISSING, SIZE IN DIRECTORY IS USED
RUNCOM: PUSHJ PDP,CTEXT1 ;GET DEVICE NAME FROM COMMAND STRING
SKIPE SDVNMF ;WAS IT A DEVICE NAME?
JRST RUNCO2-1 ;NO, ASSUME DSK
CAIE TAC1,
MOVEM TAC1,JBTPRG ;SET PROGRAM NAME THEN
MOVSI TAC1,'DSK
PUSHJ PDP,SPRGNM ;NAME INFERIOR "NULL" - IF THERE IS ONE
RUNCO2: MOVEI IOS,RUNJOB ;ROUTINE ADDR
RUNCM: PUSHJ PDP,GETMIN
JRST SGSET
;ASSIGN ASSG3 ASSG4 ASSG4A ASSG4B ASSG4C ASSG5 ASSER1 ASSER2
;** COMCON.MAC ** PAGES 24,25+26
; "ASSIGN DEV:NAME" - ASSIGN DEVICE TO JOB AND GIVE IT A LOGICAL NAME
ASSIGN: PUSHJ PDP,CTEXT1 ;GET FIRST ARG TO AC(TAC1)=DEV
JUMPE TAC1,NOTENF ;NO ARGUMENT TYPED IF=0
MOVE T1,TAC1 ;SAVE DEVICE NAME
PUSH PDP,DDB ;SAVE TTY DDB - WE WILL LIKELY LOSE CONTENTS OF DDB
; WHEN WE GO THROUGH DDB'S ETC., BELOW.
MOVE TAC,TAC1 ;DEV NAME -> AC(TAC)
PUSHJ PDP,DEVPHY ;LOOK FOR MATCH OF PHYSICAL NAMES - TAKES NAME
; IN AC(TAC). USES AC(DDB) TO CHAIN THROUGH DDB'S. SUCCESS IF
; EXACT MATCH - E.G. LPT.
JRST ASSG3 ;FAIL
JRST ASSG4 ;MATCH FOUND
ASSG3: POP PDP,DDB ;RESTORE TTY DDB
JRST NOTDEV ;TYPE ERROR
MXDDDB==16.
ASSG4: CAME T1,[SIXBIT /DSK/] ;IS THIS "ASSIGN DSK"
JRST ASSG5 ;NO
EXCH DDB,0(PDP) ;COLLECT TTY DDB - SAVE CURRENT DDB
PUSHJ PDP,CTEXT1 ;GET LOGICAL NAME ARG.
MOVE TAC,TAC1 ;COPY TO AC(TAC) FOR DEVLG ROUTINE
JUMPE TAC,ASSF1 ;NO LOG. NAME SPECIFIED
;THUS THIS IS SIMPLY THE COMMAND "ASSIGN DSK"
; AND WE MAKE IT A NO-OP SINCE IT WILL ONLY CHEW UP A DDB
; TO BE FREED ONLY AT "DEASSIGN" OR "FINISH DSK" TIME
PUSHJ PDP,DEVLG ;IS THERE A MATCH ?
JRST .+2 ;NO - GOOD - WE MAY USE NAME
JRST ASSF0 ;YES - ERROR, DO NOT ASSIGN
POP PDP,DDB ;RETRIEVE DDB ADDR
PUSH PDP,TAC ;SAVE LOG. NAME
MOVEI AC1,MXDDDB ;MAX # OF ASSIGNED DSK DDB'S ALLOWED
HLRZ AC2,DSKDDB+DEVSER ;BEGIN LOOKING THROUGH
; CHAIN OF DDB'S (WE WILL FIND TTYNM AND DSK DDB'S THERE)
MOVSI AC3,DVDSK ;CHECK DSK BIT AS WE GO THROUGH
ASSG4A: JUMPE AC2,ASSG4C ;IF END OF CHAIN, ALL OK
TDNN AC3,DEVMOD(AC2) ;THIS ONE A DSK ?
JRST ASSG4B ;NO
SKIPE DEVLOG(AC2) ;DOES THIS DSK DDB HAVE A LOGICAL NAME ?
; (IF ASSIGNED BY CONSOLE, IT MUST)
SOJLE AC1,ASSER2 ;YES - HAVE WE ALREADY ASSIGNED MAX # ?
ASSG4B: HLRZ AC2,DEVSER(AC2) ;NO - KEEP CHAINING
JRST ASSG4A
ASSG4C: MOVEI TAC1,ASSCON
PUSHJ PDP,ASSASG ;ASSIGN-BY-CONSOLE
JRST SYSERR ;CAN'T HAPPEN, WE SHOULD ALWAYS BE ABLE TO GRAB A DSK DDB
POP PDP,TAC ;RESTORE LOG. NAME
JRST ASSF2 ;+ FINISH OFF "ASSIGN"MENT
ASSG5: ;PHYSICAL NAMES MATCH - AND NAME .NE. "DSK"
MOVEI TAC1,ASSCON ;SO DO "ASSIGN"
PUSHJ PDP,ASSASG
JRST ASSER1 ;("ALREADY ASSIGNED TO ANOTHER JOB" -- WON'T HAPPEN TO US!)
JRST ASSFIN ;SUCCESS
; "ALREADY ASSIGNED TO ANOTHER JOB" -- WE SHOULD NEVER GET HERE!
ASSER1: JRST SYSERR
ASSER2: POP PDP,DDB ;ADJUST STACK
MOVE DDB,-2(PDP) ;GET TTY DDB ADR.
JSP TAC,ERRMES
ASCIZ /Too many disk DDB's
/
;ASSFIN ASSF0 ASSF1 ASSF2 LOGERR
;** COMCON.MAC ** PAGE 27
;DEVICE ASSIGNED, GIVE IT A LOGICAL NAME
ASSFIN: SETZM DEVLOG(DDB) ;CLEAR LOGICAL NAME
EXCH DDB,0(PDP) ;GET TTY DDB, SAVE DEVICE DDB
PUSHJ PDP,CTEXT1 ;GET LOG. NAME ARG. - IF ANY
SKIPE TAC,TAC1 ;WAS THERE ANY ?
PUSHJ PDP,DEVLG ;YES - IS IT IN USE ALREADY ?
JRST ASSF1 ;NO - OR NO LOG NAME SPECFIED
ASSF0: MOVEI TAC,LOGERR ;YES - PRINT ERROR
MOVE DDB,-3(PDP) ;RESTORE TTY DDB !!
PUSHJ PDP,ERRMES ;TYPE ERROR MESSAGE
MOVEI TAC,0
ASSF1: POP PDP,DDB ;RESTORE DDB FOUND IN DEVPHY:
ASSF2: MOVEM TAC,DEVLOG(DDB) ;STORE LOG. NAME IN DDB
MOVE TAC1,DEVNAM(DDB) ;PHYSICAL NAME
MOVE DDB,-2(PDP) ;RESTORE TTY DDB
PUSHJ PDP,PRNAME
JSP TAC,CONMES
ASCIZ / Assigned
/
LOGERR: ASCIZ /Logical name was in use, /
;DEASSI NOTDEV DEAER1 DEAER2
;** COMCON.MAC ** PAGE 28
; "DEASSIGN DEVICE" - DEASSIGNS DEVICE FROM CONSOLE
DEASSI: PUSHJ PDP,CTEXT1 ;GET DEVICE NAME
JUMPE TAC1,DEASTY ;NO ARG IF 0, DEASSIGN ALL BUT TTY
MOVE TAC,TAC1 ;DEVICE NAME
PUSHJ PDP,DEVSRC ;SEARCH FOR IT
JRST DEAER1 ;NOT FOUND
PUSHJ PDP,DEASG ;FOUND, DEASSIGN IT
JRST DEAER2 ;NOT PREVIOUSLY ASSIGNED
POPJ PDP,
NOTDEV:
DEAER1: MOVE DDB,-2(PDP) ;RESTORE TTY DDB
JSP TAC,ERRMES
ASCIZ /No such device
/
DEAER2: MOVE TAC1,DEVNAM(DDB) ;PRINT PHYSICAL DEV NAME
MOVE DDB,-2(PDP) ;RESTORE TTY DDB
PUSHJ PDP,PRNAME
JSP TAC,ERRMES
ASCIZ / wasn't assigned
/
;DAYTIM RUNTIM
;** COMCON.MAC ** PAGES 37-39
; "DAYTIME" - PRINT TIME OF DAY
DAYTIM: .RDATE TAC1, ;READ DATE AS SIXBIT /YYMMDD/
PUSH PDP,TAC1 ;SAVE IT
LSH TAC1,24. ;PRINT DAY
PUSHJ PDP,PRNAME
LDB TAC,[POINT 7,(PDP),23,] ;GET SUFFICIENT PART OF MONTH
TRZE TAC,100 ;IS MONTH 10, 11, OR 12 ?
SKIPA TAC,MONTAB-20-1+10.(TAC) ;YES, GET 10. MORE THAN INDEX,
;WHICH IS NOW EQUAL TO 0, 1, OR 2 (+20).
MOVE TAC,MONTAB-20-1(TAC)
MOVEM TAC,DAMESS ;STORE FOR PRINTOUT
MOVEI TAC,DAMESS
PUSHJ PDP,CONMES ;PRINT MONTH AS "-MON-"
POP PDP,TAC1 ;RESTORE /YYMMDD/
TLZ TAC1,77 ;MAKE THIRD BYTE NULL TO END STRING
;AT TWO CHARS.
PUSHJ PDP,PRNAME ;PRINT YEAR
PUSHJ PDP,PRSPC ;PRINT SOME SPACES
.RTIME TAC1, ;READ TIME -> AC(TAC1)
JRST PRTIM1
; "TIME" - PRINTS TOTAL AND INCREMENTAL RUNNING TIME FOR A JOB.
; TOTAL RUNNING TIME FOR PAST INFERIORS KEPT IN TRTPI
; TOTAL RUNNING TIME FOR PAST INFERIORS SINCE LAST "TIME" COMMAND KEPT IN TRTPIT
; TOTAL RUNNING TIME FOR SIMULATOR AT LAST "TIME" COMMAND KEPT IN TRTST
; TOTAL RUNNING TIME FOR INFERIOR AT LAST "TIME" COMMAND KEPT IN TRTIT
; (=0 IF THERE IS NONE.)
; ALL TIME KEPT IN 4.069 MICROSECOND UNITS
RUNTIM: PUSHJ PDP,DECIN ;GET SECOND ARG IF THERE
JRST .+3 ;NO ARG SEEN, ALL OK
JRST COMERA ;ILLEGAL CHARACTER
JUMPN TAC1,COMERA ;IF HE SPECIFIES ANY JOB, IT HAD BETTER BE JOB 0
MOVN TAC,TRTIT
SKIPE JBTADR ;INFERIOR ?
.USET UPRGO,[.RRUNT,,TRTIT]
ADD TAC,TRTIT ;=0 IF NO INFERIOR
ADD TAC,TRTPIT
SETZM TRTPIT ;RESET ACCUMULATED TIME OF PAST INFERIORS
; SINCE LAST "TIME" COMMAND
PUSHJ PDP,PRTIM.
ASCIZ / (/
MOVN TAC,TRTST ;INCREMENTAL TIME FOR SUPERIOR =
.SUSET [.RRUNT,,TRTST] ;CURRENT RUN TIME - RUN TIME AT LAST "TIME" COMMAND
ADD TAC,TRTST
PUSHJ PDP,PRTIM.
ASCIZ /)
/
MOVE TAC,TRTIT ;NOW PRINT TOTAL RUN TIME FOR ALL INFERIORS
ADD TAC,TRTPI
PUSHJ PDP,PRTIM.
ASCIZ / (/
MOVE TAC,TRTST ;AND SAME FOR SIM PROCEDURE
PUSHJ PDP,PRTIM.
ASCIZ /)
/
POPJ PDP,
;ECOM
;** COMCON.MAC ** PAGE 41
; "EXAMINE LOC" - LOOKS AT CONTENTS OF LOC AND PRINTS IN OCTAL.
;IF LOC IS MISSING, NEXT LOC IS PRINTED IF PREVIOUS WAS E COMMAND.
;PRINTS SAME LOC IF PREVIOUS WAS D COMMAND.
;<TAB> IS PRINTED INSTEAD OF <CR><LF> (LIKE DDT).
ECOM: SKIPGE USREXM ;WAS PREVIOUS D OR E COMMAND. A D COMMAND ?
AOS USREXM ;NO, IT WAS E. INCREMENT IN CASE HE TYPES NO ARG.
HRROS USREXM ;YES, FLAG THAT E HAPPENED LAST (LH=-1)
PUSHJ PDP,OCTIN ;GET OCTAL LOCATION
SKIPA TAC1,USREXM ;NONE SPECIFIED, USE LAST LOC OF D OR NEXT OF E
JRST COMERA ;ILLEGAL CHARACTER
HRRM TAC1,USREXM ;SAVE ADDR
HRRZI UUO,(TAC1)
PUSHJ PDP,GETWRD ;GET WORD FROM LOW OR HIGH SEG
JRST ECOMA ;ERROR, OUT OF BOUNDS
PUSH PDP,TAC ;SAVE CONTENTS OF LOC TO BE PRINTED
HRRZ TAC,USREXM ;PRINT LOC BEING EXAMINED
PUSHJ PDP,OCTPNT
PUSHJ PDP,INLMES
ASCIZ */ * ;PRINT SLASH,<TAB>
HLRZ TAC,(PDP) ;PRINT LH
PUSHJ PDP,OCTPNT
PUSHJ PDP,INLMES ;PRINT SPACE
ASCIZ / /
HRRZ TAC,(PDP) ;PRINT RH
PUSHJ PDP,OCTPNT
PUSHJ PDP,INLMES ;PRINT FINAL TAB
ASCIZ / /
JRST TPOPJ ;READJUST STACK AND RETURN
;DCOM DCOMA ECOMA CBLANK NOCOM
;** COMCON.MAC ** PAGES 42-44
; "DEPOSIT LH RH LOC" - DEPOSITS XWD LH,RH->LOC.
;IF LOC ARG. IS MISSING, ASSUME NEXT LOC IF PREVIOUS D, SAME LOC IF
;PREVIOUS D.
DCOM: PUSHJ PDP,OCTIN ;GET LH
JRST NOTENF ;NOT ENOUGH ARGUMENTS
JRST COMERA ;ILLEGAL CHARACTER
HRLM TAC1,IOS ;SAVE LH
PUSHJ PDP,OCTIN ;GET RH
JRST NOTENF
JRST COMERA
HRRM TAC1,IOS ;SAVE RH
SKIPL USREXM ;WAS PREVIOUS D OR E. AN E COMMAND ?
AOS USREXM ;NO, INCREMENT IN CASE USER TYPES NO 3RD ARG.
HRRZS USREXM ;FLAG THAT D WAS DONE LAST (LH=0)
PUSHJ PDP,OCTIN ;GET LOC ARG.
SKIPA TAC1,USREXM ;NONE SPECIFIED, USE LAST OF E OR NEXT OF D
JRST COMERA ;ILLEGAL CHARACTER
HLRZ TAC,PROG ;GET PROTECTION
CAILE TAC1,17 ;AC'S ARE OK
CAILE TAC1,JOBPFI ;NO. > HIGHEST LOC PROTECTED FROM IO ?
CAILE TAC1,(TAC) ;IN BOUNDS ?
JRST DCOMA ;NO
HRRM TAC1,USREXM
.UMOVM IOS,(TAC1) ;STORE IT AWAY
POPJ PDP,
DCOMA:
ECOMA: JSP TAC,ERRMES
ASCIZ /Out of bounds
/
;"BLANK" OR NO ALPHANUMERIC BEFORE BREAK CHAR COMMAND
;DISPATCHED TO LIKE ANY OTHER COMMAND
CBLANK: CAIE TEM,12 ;WAS BREAK LF ?
CAIN TEM,";
POPJ PDP, ;YES IGNORE
;COMMAND NOT IN COMMAND DIRECTORY
NOCOM: JRST COMERR ;NO, APPEND ? TO WHAT HE TYPED IN
;CFINI FDV4 FDV5 FDV2 FDV1 FDV6 FDV3
;** COMCON.MAC ** PAGE 45
; "FINISH DEVICE" - CLOSES, RELEASES, AND DEASSIGNS DEVICE.
; FINISHES LOGICAL "DEVICE" IF ONE EXISTS
; IF NO LOGICAL MATCH IS FOUND, PHYSICAL "DEVICE" IS FINISHED.
; NOTE: PHYSICAL "DSK" IS TREATED SPECIALLY -- ALL CHANNELS OPEN
; ON PHYSICAL DSK ARE FINISHED.
; JOB MUST HAVE CORE
CFINI: PUSHJ PDP,CTEXT1 ;GET "DEVICE" ARG.
JUMPE TAC1,NOTENF ;AND THERE MUST BE ONE
MOVE TAC,TAC1 ;PREPARE TO LOOK FOR DEVICE
PUSHJ PDP,DEVLG ;FIRST LOOK FOR A LOGICAL MATCH
JRST FDV4 ;NO MATCH - LOOK FOR PHYSICAL
JRST FDV5 ;WE'RE GOLDEN !
FDV4: PUSHJ PDP,DEVPHY ;LOOK FOR MATCH OF PHYSICAL NAME
JRST NOTDEV ;NO MATCH
CAIN DDB,DSKDDB ;HAVE WE FOUND THE PROTOTYPE
; DSK DDB IN LOOKING FOR A MATCH TO PHYSICAL "DSK" ?
AOBJN PDP,DEVPH1 ;YES - RESTORE OLD PD POINTER W/RETURN + SEARCH
; FOR AN ACTIVE DDB
HLRZ TAC,DEVNAM(DDB) ;LOOK AT PHYSICAL NAME OF MATCH
CAIN TAC,(SIXBIT /DSK/) ;="DSK" ?
TLO DDB,-1 ;YES - FLAG DDB
FDV5: MOVEM DDB,USRFDV ;SAVE DDB ADDR
MOVE DDB,-2(PDP) ;COLLECT TTY DDB ADDRESS - IT LIES BENEATH RETURN
; ADDR AND DISP FOR COMMAND.
JSP TAC1,MSTART ;SET UP MONITOR JOB
JSP TAC,MONSTR ;SET UP AC(PDP)+AC(PROG)(=AC(JDAT))
MOVE ITEM,USRFDV ;GET THAT SPECIAL DDB ADDR
FDV2: MOVE UCHN,USRHCU
FDV1: HRRZ DDB,USRJDA(UCHN) ;GET NEXT DEVICE
MOVSI UUO,071000 ;SET UP RELEASE UUO
DPB UCHN,PUUOAC ;WITH CHANNEL NUMBER
PUSH PDP,UCHN
CAIE DDB,(ITEM) ;MATCH ?
JRST FDV6 ;NO - LOOK AT NEXT CHANNEL LOWER
JSP UCHN,DOXUUO ;YES - EXECUTE THE RELEASE UUO FROM
UUO ;THE MONITOR.. USES THIS LOCATION TO POINT TO
; LOCATION WHERE UUO STORED
FDV6: POP PDP,UCHN
SOJGE UCHN,FDV1
PUSHJ PDP,DEASG ;DEASSIGN DEVICE
JFCL ;IGNORE IF NOT ASSIGNED-BY-CONSOLE
TLNN ITEM,-1 ;WAS THIS A PHYSICAL MATCH TO "DSK"
JRST ESTOP
HRROI ITEM,DSKDDB ;COLLECT POINTER TO PROTOTYPE DDB.
; WE RESTART OUR SEARCH HERE SINCE DDB'S MAY HAVE BEEN
; SHUFFLED IN FREE CORE DUE TO THE RELEAS 0, .
FDV3: TRNN ITEM,-1 ;END OF CHAIN
JRST ESTOP ;YES
HLRZ TAC,DEVNAM(ITEM) ;LOOK FOR MORE PHYSICAL DSK DDB'S
CAIN TAC,(SIXBIT /DSK/) ;A WINNER ?
JRST FDV2 ;YES
HLRO ITEM,DEVSER(ITEM) ;NO - KEEP CHAINING THROUGH DDB'S, STILL LOOKING
JRST FDV3
;FREDEV FREDV2 FREDV1 PPN SNA
;** COMCON.MAC ** PAGE 46
; "RESOURCES" - PRINT OUT # FREE DISK BLOCKS (= # FREE TRACKS * 8)
FREDEV: PUSHJ PDP,INLMES
ASCIZ /DSK:/
HRRZ TAC1,NQSV ;COLLECT VALUES OF NQS,
HLLZ T,QACTV ;QACT,
HRLZ T1,QTUTOV ;QTUTO,
HLLZ AC1,QSFTV ;AND QSFT FROM VALUE-SAVE LOCATIONS READ DURING INITIALIZATION
HRRI T,AC2 ;ALL .GETLOC CALLS RETURN VALUES INTO AC(AC2)
HRRI T1,AC2
HRRI AC1,AC2
MOVEI TAC,0 ;SET TOTAL FREE TRACKS = 0 TO BEGIN WITH
FREDV2:
.GETLOC T, ;QACT ENTRY -> AC(AC2)
JUMPL AC2,FREDV1 ;=0 ?
.GETLOC T1, ;YES - GET QTUTO ENTRY
TLNE AC2,40000 ;DIR IN ?
JRST FREDV1 ;NO
.GETLOC AC1, ;GET # FREE TRACKS (I.E. QSFT ENTRY)
ADD TAC,AC2
FREDV1: ADD T,[1,,] ;INCREMENT ABSLOC POINTER IN .GETLOC ARGUMENTS
ADD T1,[1,,]
ADD AC1,[1,,]
SOJG TAC1,FREDV2 ;MORE PACKS
LSH TAC,3 ;MULITPLY # FREE TRACKS BY 8 = # FREE 128.-WORD BLOCKS
PUSHJ PDP,RADX10
PUSHJ PDP,INLMES
ASCIZ /,LPT:,TTY:/
JRST CRLF
;CONVERT SNAME TO PROJECT,PROGRAMMER NUMBER
PPN: PUSHJ PDP,CTEXT1 ;COLLECT SNAME
SKIPN TAC,TAC1 ;DID HE REALLY SAY SOMETHING ?
MOVE TAC,SNAME ;NO, USE HIS OWN SNAME
PUSH PDP,TAC ;SAVE CONVERTED [PROJ,PROG]
MOVEI TEM,"[
PUSHJ PDP,OUTCHS
HLRZ TAC,(PDP) ;COLLECT PROJECT #
PUSHJ PDP,PRTOCT ;PRINT IT, WITHOUT LEADING ZEROES
MOVEI TEM,",
PUSHJ PDP,OUTCHS
HRRZ TAC,(PDP)
PUSHJ PDP,PRTOCT
MOVEI TEM,"]
PUSHJ PDP,OUTCHS
JRST TPOPJ
;CONVERT [PROJECT,PROGRAMMER] # TO SNAME
SNA: PUSHJ PDP,PJPGNO ;GET PROJ,PROG
MOVE TAC,AC2
PUSHJ PDP,PPTOSN ;CONVERT IT TO A SNAME
MOVE TAC1,TAC
JRST PRNAME ;AND PRINT IT
;CTEXT CTEXT1 CTEX0 CTEX1 CTEX CTEXA CTXCNC
;** COMCON.MAC ** PAGES 49+50
;ROUTINE TO RETURN NEXT ALPHANUMERIC STRING
; IN COMMAND LINE (SIXBIT)
;CALL: MOVE TAC,BYTE POINTER TO PREVIOUS CHAR.
; PUSHJ PDP,CTEXT
; SIXBIT STRING RETURNED LEFT JUSTIFIED IN AC(TAC1)
CTEXT: PUSHJ PDP,SKIPS ;CALL HERE IF AT START OF LINE
CAIA ;THE FASTEST SKIP IN THE WEST !
CTEXT1: PUSHJ PDP,SKIPS1 ;SKIP LEADING SPACES, TABS, NULLS, AND CLEAR AC (TAC1)
; DO NOT RETURN IF <CR> WAS PREVIOUS BREAK
SETZM SDVNMF ; CLEAR "sAW DEVICE NAME" FLAG
MOVE T,[POINT 6,TAC1,-1,]
LDB TEM,TAKR(DAT)
JRST CTEX1
CTEX0: PUSHJ PDP,GETCHR
CTEX1: PUSHJ PDP,CTEX
TRC TEM,40 ;-> SIXBIT
TLNE T,770000 ;6 CHARS ?
IDPB TEM,T ;NO- ADD IT ON
JRST CTEX0
;SCAN FOR ALPHANUMERIC CHAR IN TEM
CTEX: CAILE TEM,"Z+40 ;GREATER THAN LC Z ?
JRST CTEXA ;YES, NOT SIXBIT
CAIL TEM,"A+40 ;LOWER CASE LETTER ?
TRZ TEM,40 ;YES, MAKE IT UPPER CASE
CAIL TEM,"0
CAILE TEM,"Z ;AS THEY SAY, "LETTERS ARE LARGER THAN NOS."
JRST CTEXA ;NEITHER
CAILE TEM,"9
CAIL TEM,"A
POPJ PDP,
CTEXA: CAIE TEM,": ;DEVICE NAME
JRST .+3
SETOM SDVNMF
PUSHJ PDP,GETCHR
CAIE TEM,3
JRST TPOPJ ;(-> POP PDP,TAC; POPJ PDP,)
; I.E. -- RETURN TO ROUTINE WHICH CALLED CTEXT
CTXCNC: MOVSI TAC1,(SIXBIT /HAL/) ;GET HERE VIA CTEX: OR SKIPS:
MOVEI TEM,12 ; I.E. -- ALWAYS A LEVEL DOWN FROM CTEXT:
JRST TPOPJ ;THAT'S WHY WE CAN TO THIS W/RELATIVE IMPUNITY
;SKIPS SKIPS1 SKIPSA SKIPS2 SKIPS3 COMERP COMERA COMERR COMERL COMER1
;** COMCON.MAC ** PAGES 51+52
;ROUTINE TO IGNORE LEADING SPACES, TABS, AND NULLS
;ALSO CLEARS TAC1
;DOES NOT RETURN IF PREVIOUS CHAR. OR NEXT NON-SPACING
;CHAR. IS <CR> (IE POP SUBROUTINE LEVEL UP 1 ON RETURN)
;CALL: MOVE TAC,BYTE POINTER TO PREVIOUS BREAK CHAR.
; PUSHJ PDP,SKIPS1
SKIPS: PUSHJ PDP,GETCHR ;GET FIRST CHAR ON LINE
SKIPS1: MOVEI TAC1,0 ;FOR CTEXT, DECIN
LDB TEM,TAKR(DAT)
CAIN TEM,15 ;=<CR> ?
SKIPSA: PUSHJ PDP,GETCHR ;NULL ?
JUMPE TEM,SKIPS3 ;NULL, OR <CR>+NULL
PUSHJ PDP,SPCHEK ;SPECIAL ?
JRST SKIPS2 ;NO
TLNE TAC,BREAKB ;BREAK ?
JRST SKIPS3
SKIPS2: CAIG TEM,40 ;SPACE OR CNTRL CHAR ?
JRST SKIPSA ;YES - SKIP IT
POPJ PDP,
SKIPS3: CAIN TEM,3 ;^C ?
JRST CTXCNC
MOVEI TEM,12
JRST TPOPJ
COMERP: POP PDP,T ;REMOVE SUBROUTINE RETURN BEFORE CALLING COMERA
COMERA: PUSHJ PDP,GETCHR ;MOVE UP A CHAR
;ROUTINE TO REPLACE LAST CHARACTER IN INPUT STRING BY "?"
; AND SET AS OUTPUT
;CALL: MOVE TAC,BYTE POINTER TO LAST CHAR. IN INPUT STRING
; PUSHJ PDP,COMERR
COMERR:
MOVE T,TITAKR(DDB)
PUSHJ PDP,TRESCN
COMERL:
PUSHJ PDP,GETCHR
CAMN T,TITAKR(DDB)
JRST COMER1
PUSHJ PDP,OUTCHS
JUMPN TEM,COMERL
COMER1: PUSHJ PDP,SETBFI
AOS TISYNC(DDB)
MOVEI TEM,"?
PUSHJ PDP,OUTCHS
JRST CRLF
;ERRMES CRLF CONMES CONMS1 CON0 CONOUT INLMES PRQM PRSPC NOTENF PRCRCC PRPER
;** COMCON.MAC ** PAGES 53-55
;ROUTINE TO PRINT A COMMAND ERROR MESSGE
ERRMES: MOVNI ITEM,1
PUSHJ PDP,CONMES
SKIPA TAC,[[ASCII/?
/]]
;ROUTINE TO PRINT CARRIAGE RETURN-LINEFEED
;CALL: PUSHJ PDP,CRLF
CRLF: MOVEI TAC,[ASCII /
/]
;ROUTINE TO TYPE ASCII CHAR. STRING
;CALL: MOVE TAC,ADDRESS OF ASCII MESSAGE
; PUSHJ PDP,CONMES
; STRING TERMINATED BY NULL
;CONMES DOES NOT START TTY
;CONMS1 - SAME CALLING SEQUENCE AS CONMES, EXCEPT LH IS BYTE POINTER
CONMES: HRLI TAC,440700 ;FORM ASCIZ BYTE POINTER
CONMS1: PUSH PDP,TAC ;SAVE BYTE POINTER
CON0: ILDB TEM,(PDP) ;GET NEXT CHAR.
JUMPE TEM,TPOPJ ;IS IT NULL ? (IF SO, RESTORE AC(TAC) AND RETURN)
CONOUT:
PUSHJ PDP,OUTCHS
JRST CON0
;ROUTINE TO PRINT INLINE ASCIZ MESSAGE
;CALL: PUSHJ PDP,INLMES
; ASCIZ /THE MESSAGE/
;RETURN TO NEXT LOC AFTER MESSAGE
INLMES: POP PDP,TAC ;SET UP PRINT ADDRESS FOR CONMES
PUSHJ PDP,CONMES
JRST 1(TAC) ;RETURN TO NEXT LOC AFTER MESSAGE
;ROUTINE TO APPEND ? TO ERROR MESSAGE
;CALL: PUSHJ PDP,PRQM
; RETURN
PRQM: MOVEI TEM,"?
JRST OUTCHS
PRSPC: MOVEI TAC,[ASCIZ / /]
JRST CONMES
;ROUTINE TO PRINT "TOO FEW ARGUMENTS"
;CALL: PUSHJ PDP,NOTENF
NOTENF: JSP TAC,ERRMES
ASCIZ /Too few arguments
/
;ROUTINE TO PRINT CRLF ^C CRLF
;CALL: PUSHJ PDP,PRCRCC
; RETURN
PRCRCC: JSP TAC,CONMES
ASCIZ/
^C
/
;ROUTINE TO PRINT PERIOD
;CALL: PUSHJ PDP,PRPER
; RETURN
PRPER: JSP TAC,CONMES
ASCIZ /./
;DECIN1 DECIN OCTIN ANYRIN OCT0
;** COMCON.MAC ** PAGE 57
;ROUTINE TO READ CONSOLE AND CONVERT ANY RADIX #
;CALL: MOVE TAC1,DESIRED RADIX
; PUSHJ PDP,ANYRIN
; NO-ARG.-TYPED RETURN, AC(TAC1)=0
; ILLEGAL CHAR RETURN
; NORMAL EXIT - AC(TAC1) CONTAINS #
;SCAN STOPS ON FIRST <CR>, DASH, SPACE, TAB, OR ILLEGAL CHARACTER
;SKIPS LEADING SPACES AND TABS.
R==BUFWRD ;RADIX AC
DECIN1:
DECIN: MOVEI R,12 ;DECIMAL INPUT
JRST ANYRIN
OCTIN: MOVEI R,10 ;OCTAL INPUT
ANYRIN: PUSHJ PDP,SKIPS1 ;SKIP LEADING SPACES, TABS, NULL
; DO NOT RETURN IF <CR> WAS PREVIOUS BREAK OR THIS BREAK
OCT0: CAIGE TEM,175 ;ALTMODES (175 OR 176) ?
CAIN TEM,"[ ;NO. LT BRACKET (SO SPACE NOT REQ BEFORE [P,P] )
JRST CPOPJ2
CAIE TEM,"- ;DASH
CAIG TEM,40 ;SPACE OR <CNTRL CHAR> ?
JRST CPOPJ2 ;YES - ONLY LEGA TERMINATORS
CAIE TEM,", ;COMMA ?
CAIN TEM,"] ;RT BRACKET ?
JRST CPOPJ2 ;YES
SUBI TEM,60
JUMPL TEM,CPOPJ1
CAML TEM,R ;>= RADIX ?
JRST CPOPJ1 ;YES - ERROR
IMUL TAC1,R
ADD TAC1,TEM
PUSHJ PDP,GETCHR ;GET NEXT CHAR
JRST OCT0
;DEASG DEASTY DEA1
;** COMCON.MAC ** PAGE 56
;ROUTINE TO DEASSIGN A DEVICE
;CALL: MOVE DDB,DEV DATA BLOCK
; PUSHJ PDP,DEASG
; ERROR - NOT PREVIOUSLY ASSIGNED
; OK RETURN W/DEVICE DEASSIGNED
DEASG: SETZM DEVLOG(DDB) ;CLEAR LOGICAL NAME
MOVE TAC1,DEVMOD(DDB) ;GET DEVICE CHAR.
TRNE TAC1,ASSCON ;IS DEV ASSIGNED-BY-CONSOLE
AOS (PDP)
MOVEI TAC1,ASSCON ;SET UP ASSIGNED-BY-CONSOLE BIT FOR RELEA6
JRST RELEA6 ;RELEASE DDB
;ROUTINE TO DEASSIGN ALL DEVICES EXCEPT LOGICAL TTY
;CALL: MOVE DDB,ADR. OF DEVICE NO T BE DEASSIGNED
; PUSHJ PDP,DEASTY
DEASTY: PUSH PDP,DDB ;SAVE TTYDDB ADDR
HLRZ DDB,DEVLST ;SEARCH ALL DDB'S
DEA1: CAIE DDB,@(PDP) ;IS THIS SPECIAL ?
PUSHJ PDP,DEASG ;NO - TRY TO DEASSIGN IT
JFCL ;IF WE FAIL, WHO CARES ?
HLRZ DDB,DEVSER(DDB)
JUMPN DDB,DEA1
POP PDP,DDB ;RESTORE TTY DDB ADDR
POPJ PDP, ;AND RETURN
;PP0 PJPGNO PP1
;** COMCON.MAC ** PAGE 58
;GET PROJECT-PROGRAMMER NUMBERS
;CALL: PUSHJ PDP,PJPGNO
;
;(AC2)LH _ PROJECT #
;(AC2)RH _ PROGRAMMER #
;(AC2)=0 IF NO []'S TYPED
; THE TERMINAL ] IS OPTIONAL
PP0: PUSHJ PDP,SKIPS1
PJPGNO: CAIN TEM,"[ ;IS IT A "[" ?
JRST PP1 ;YES, GET PROJ-PROG NUMBERS FROM INSIDE
CAIE TEM," ;NO, IS IT A SPACE ?
CAIN TEM,11 ;OR A TAB ?
JRST PP0 ;YES, KEEP LOOKING
MOVEI AC2,0 ;NEITHER SPACE NOR TAB, THUS RETURN 0
; MEANING NO PROJ-PROG # ENCOUNTERED
POPJ PDP,
PP1: PUSHJ PDP,SKIPS
PUSHJ PDP,OCTIN ;GET FIRST ARG. - PROJ #
JRST COMERP ;NO ARG.
JRST COMERP ;ILLEGAL OCTAL CHAR GIVEN
HRL AC2,TAC1 ;ENTER ARG
CAIE TEM,", ;LOOK FOR TERMINAL COMMA
JRST COMERP ;NOT FOUND
PUSHJ PDP,SKIPS
PUSHJ PDP,OCTIN ;GET SECOND ARG
JRST COMERP
JRST COMERP
HRR AC2,TAC1 ;ENTER IT
PUSHJ PDP,SKIPS1 ;SKIP BLANKS
CAIN TEM,"] ;IS USUAL ENDING "]" ?
PUSHJ PDP,GETCHR ;YES, SKIP IT SO FINAL "]" IS OPTIONAL
POPJ PDP,
;PRTIME PR0 PR1 PRTIM1 PRT2
;** COMCON.MAC ** PAGES 59+60
;ROUTINE TO PRINT TIME AS HOURS, MINUTES, SECONDS, AND HUNDRETHS
; FORMAT IS HH:MM:SS.HH
;CALL: MOVE TAC,TIME IN JIFFIES
; PUSHJ PDP,PRTIME
;JIFMIN=NO. OF JIFFIES/MIN
;JIFSEC=NO. OF JIFFIES/SEC
;JIFSC2=1/2 JIFSEC
PRTIME: IDIVI TAC,JIFMIN ;FORM MINUTES
PUSH PDP,TAC1 ;SAVE REMAINDER IN MIN
JUMPE TAC,PR1
IDIVI TAC,60. ;HOURS, MINUTES IN AC(TAC),AC(TAC1)
JUMPE TAC,PR0 ;SUPPRESS 0 HOURS
PUSHJ PDP,RADX10 ;PRINT "HH" OR "H"
PUSHJ PDP,INLMES ;THEN ":"
ASCIZ /:/
PR0: MOVE TAC,TAC1 ;GET MINUTES
PUSHJ PDP,PRT2 ;PRINT "MM:"
PUSHJ PDP,INLMES
ASCIZ /:/
PR1: POP PDP,TAC ;RESTORE SECONDS
IDIVI TAC,JIFSEC ;JIFFIES/SEC
PUSHJ PDP,RADX10 ;PRINT SECONDS
PUSHJ PDP,PRPER ;PRINT "."
MOVE TAC,TAC1 ;# JIFFIES
IMULI TAC,100.
ADDI TAC,JIFSC2
IDIVI TAC,JIFSEC ;IN HUNDRETHS
JRST PRT2
;ROUTINE TO PRINT HH:MM - AS ENTERED IN 6-BIT CHARACTERS IN AC(TAC)
; VIA THE .RTIME UUO - I.E. SIXBIT /HHMMSS/.
PRTIM1: PUSH PDP,TAC1
TLZ TAC1,77 ;ONLY TWO CHARS. THIS OUTPUT
PUSHJ PDP,PRNAME ;HH
PUSHJ PDP,INLMES
ASCIZ /:/ ;:
POP PDP,TAC1
LSH TAC1,12. ;PUT MM INTO LT. 12. BITS
TLZ TAC1,77
PUSHJ PDP,PRNAME ;MM
JRST CRLF ;<CRLF>
PRT2: MOVEI TEM,"0 ;PRINT DEC NO. IN 2 PLACES
CAIGE TAC,10.
XCT CONOUT ;PUT OUT LEADING 0 IF < 10
JRST RADX10
;PRTSEG SEGSIZ GETMIN
;** COMCON.MAC ** PAGES 61+62
;ROUTINE TO PRINT SIZE OF LOGICAL SEGMENT (LOW OR HIGH)
;CALL: MOVE ITEM,(0=LOW SEG, 1=HIGH SEG)
; PUSHJ PDP,PRTSEG
; RETURN
PRTSEG: PUSHJ PDP,SEGSIZ ;TAC1=SIZE OF HIGH OR LOW SEG
MOVEI TAC,(TAC1) ;RADX10 TAKES DEC. NO. IN AC(TAC)
JRST RADX10 ;PRINT DECIMAL
;ROUTINE TO RETURN SIZE OF HIGH OR LOW SEG
;CALL: MOVE ITEM,(0=LOW SEG, 1=HIGH SEG)
; PUSHJ PDP,SEGSIZ
; RETURN W/SIZE IN K IN AC(TAC1)
SEGSIZ: HLRZ TAC1,JBTADR(ITEM)
JUMPE TAC1,CPOPJ
LSH TAC1,-12 ;CONVERT TO #K-1
AOJA TAC1,CPOPJ ;NOW MAKE IT RIGHT
GETMIN: PUSH PDP,DDB ;SAVE TTY DDB ADDR
PUSH PDP,IOS ;DISPATCH ADDRESS
MOVEI TAC,JOBDA ;LENGTH OF JOBDAT AREA
PUSHJ PDP,CORE0 ;ASSIGN JOBDA WORD - AND WE HAD BETTER
; COLLECT AN INFERIOR PROCEDURE IF WE DON'T HAVE
; ONE ALREADY
JFCL
POP PDP,IOS
POP PDP,DDB
POPJ PDP,
;GETWRD
;** COMCON.MAC ** PAGE 63
;ROUTINE TO GET 1 WORD FROM USER AREA WHICH CAN BE IN LOW OR HIGH SEG
;CALL: HRR UUO,USER ADDRESS
; PUSHJ PDP,GETWRD
; ERROR RETURN - ADDR OUT OF BOUNDS
; OK RETURN - CONTENTS IN AC(TAC)
GETWRD: HLRZ TAC,JBTADR
CAIGE TAC,(UUO)
POPJ PDP, ;ERROR RETURN IF LOWSEG ONLY
.UMOVE TAC,(UUO)
JRST CPOPJ1
;SGSET SGSET1
;** COMCON.MAC ** PAGE 65
SGSET: JUMPE TAC1,NOTENF ;GOT TO HAVE A DEVICE NAME
MOVEM TAC1,SGADEV
PUSHJ PDP,CTEXT1
CAIN TAC1, ;WAS THERE A NAME?
MOVE TAC1,JBTPRG ;NO, USE DEFAULT NAME
JUMPE TAC1,NOTENF ;IF STILL NONE, THEN COMPLAIN
MOVEM TAC1,SGANAM ;FILE NAME
MOVEM TAC1,JBTPRG
PUSHJ PDP,SPRGNM
MOVEI TAC1,0
CAIN TEM,". ;X10N SPECIFIED ?
PUSHJ PDP,CTEXT ;YES - SO COLLECT IT
HLLZM TAC1,SGAEXT ;SAVE IT FOR FUTURE LOOKUP OR ENTER
SETZM SGADAT
PUSHJ PDP,PJPGNO ;GET [PROJ,PROG]
MOVEM AC2,SGAPPN ;SGAPPN=7
PUSHJ PDP,DECIN1 ;CORE ARG (OPTIONAL 3RD ARG)
JRST SGSET1 ;RETURNS HERE IF NO ARG FOUND
JRST COMERA ;ILLEGAL CHARACTER
LSH TAC1,12
SUBI TAC1,1 ;CONVERT TO HIGHEST LEGAL ADDRESS
SGSET1: MOVEM TAC1,SGANEW ;SGANEW=15
HRRZ TAC1,IOS ;WE ARE ABOUT TO START A "MONITOR JOB"
; GUARANTEE LH=0 - SINCE IT WILL BE ADDED
; TO STARTING ADDRESS (IF A RUN COMMAND)
JRST MSTART
;GETARG
;** COMCON.MAC ** PAGE 66
;ROUTINE TO PICK UP ARGUMENTS FOR RUN UUO.
; THIS ROUTINE DOES THE SAME THING AS SGSET, EXCEPT THAT ARGUMENTS
; ARE OBTAINED FROM USER UUO ARGUMENTS INSTEAD OF FROM CONSOLE COMMAND.
; THE USER'S ARGS ARE MOVED TO (SGA...) LOCATIONS. USER AC FIELD AND
; START PC OFFSET ARE SAVED ON PD LIST AT JOBPD3. JBTPRG NOT SET FOR LOW SEG.
;CALL: MOVE TAC,CONTENTS OF USER AC
; MOVE PROG,[PROT.,,0]
; PUSHJ PDP,GETARG
; RETURN
GETARG: HRR UUO,TAC ;MOVE ADR OF ARG LIST TO AC(UUO)
EXCH TAC,(PDP) ;AND ONTO PD LIST
PUSH PDP,TAC ;MOVE RETURN PC UP ONE
LDB TAC,PUUOAC ;UUSER AC FIELD IN RUN UUO
HRRM TAC,-1(PDP) ;JOBPD1 NOW HAS S.A.INCR,,USER AC
PUSHJ PDP,GETWRD ;GET FIRST ARG. FROM USER - USES AC(UUO) FOR ADDR.
MOVEM TAC,SGADEV
PUSHJ PDP,GETWD1 ;GET NEXT ARG
MOVEM TAC,SGANAM
PUSHJ PDP,GETWD1 ;GET 3RD ARG
MOVE TAC1,TAC ;PUT ARG IN AC(TAC1), SO SAME
; AS SGSET RETURN FROM CTEXT
MOVEM TAC1,SGAEXT ;STORE X10N
PUSHJ PDP,GETWD1 ;4TH ARG - DATE WORD
MOVEM TAC,SGADAT
PUSHJ PDP,GETWD1 ;[PROJ.,PROG.]
MOVEM TAC,SGAPPN
PUSHJ PDP,GETWD1 ;CORE ARG OR 0 [HIGHEST LOC OR 0]
HRRZM TAC,SGANEW
JRST SG2A ;GO SET UP LOWER CORE AND RETURN
;SAVJOB SVLUP SVLP1 SVLP2 SVLP2A SVLP3 SVLP4 SVLP5 SVLP6 SVLP7 SAVFIN SAVERR
;** COMCON.MAC ** PAGES 67-69
;SAVE JOB AREA ON RETREIVABLE STORAGE
; NO ATTEMPT IS MADE TO SAVE STATUS OF IO DEVICES, JOBPDP,
; OR AC'S. IN FACT THE ONLY USEFUL THING WHICH MAY BE DONE
; WITH A JOB AREA AFTER IT HAS BEEN SAVED IS TO START EXECUTION
; OVER AT THE STARTING ADDRESS.
SAVJOB: JSP TAC1,SG1 ;SET UP AC'C, RESET DEVICES
HLRE TAC1,SGADMP ; - NO. OF WORDS TO WRITE
PUSHJ PDP,CKIOWD ;CHECK USER'S CORE ARG. (IF ANY) WITH
;AMOUNT TO WRITE. RETURNS ONLY IF 0 OR NOT SMALLER.
.UMOVE TAC1,JOBCOR
HRRI TAC1,(TAC)
.UMOVM TAC1,JOBCOR ;STORE MAX. SIZE OF FILE OR CORE ARG.
.UMOVE TAC,JOB41 ;SAVE USER UUO HANDLING INSTR.
.UMOVM TAC,JOBS41 ;HIGHER UP SO IT GETS SAVED
.UMOVE TAC,JOBDDT ;SAVE DDT STARTING ADR. ALSO
.UMOVM TAC,JOBSDD
MOVEI TAC,SGCHN ;SET UP TO USE A SPECIFIC I.T.S. CHANNEL
DPB TAC,PDEVO
.IOPUSH SGCHN, ;SAVE STATUS OF WHATEVER IS THERE NOW
JSP UCHN,DOXUUO ;DO THE ENTER
[ENTER 0,SGANAM]
JRST SAVERR ;DIR. FULL OR PROTECTION FAILURE
.UMOVE TEM,JOBSA ;SAVE START ADR.
HLRE ITEM,SGADMP ;IOWD FOR THIS SIZE CORE
; - LENGTH TO WRITE
MOVN ITEM,ITEM ;POSITIVE LENGTH
MOVEI ITEM,JOBSVM(ITEM) ;ADD IN FIRST LOC.-1 TO WRITE,
; WHICH = HIGHEST LOC. FOR END TEST.
PUSH PDP,ITEM ;SAVE ON STACK
MOVEI TAC1,JOBSDD ;START BY SETTING PTR. TO FIRST USER ADR.
SVLUP: MOVEI TAC,MONBUF+1 ;SET UP TO BRING A BUFFER LOAD
;INTO MONBUF FROM USER CORE. (MAX. OF MBFSIZ-1)
HRLI TAC,(TAC1)
MOVE DAT,(PDP) ;GET HIGHEST ADR.
SUBI DAT,-1(TAC1) ;FORM # WORDS REMAINING TO BE SAVED
JUMPE DAT,SVLP7 ;FINISH UP IF WE ARE DONE
CAILE DAT,MBFSIZ-1 ;IS IT GREATER THAN MBFSIZ-1?
MOVEI DAT,MBFSIZ-1 ;YES, READ MAX. OF MBFSIZ-1, BUT AVOID TRYING
;TO READ MORE THAN THERE MAY BE
.UBLTI TAC,MONBUF(DAT)
MOVNI ITEM,(DAT) ;SET UP AOBJN POINTER TO DATA WORDS
HRLZI ITEM,(ITEM)
HRRI ITEM,MONBUF+1
MOVEI DAT,MONBUF ;ADR. OF FIRST IOWD
JRST SVLP2 ;GET INTO IT A BIT
SVLP1: MOVEI DAT,(ITEM) ;SET ADR. WHERE NEXT IOWD TO GO
SVLP2: SKIPE (ITEM) ;IS THIS A DATA WORD?
JRST SVLP3 ;YES
AOBJP ITEM,.+2 ;NO, INCREMENT POINTER INTO MONBUF
;BUT MOVE ON IF NOTHING LEFT
AOJA TAC1,SVLP2 ;OK, INCREMENT USER ADR. AND CONTINUE
ADDI TAC1,1
SUBI DAT,MONBUF ;ALL OF MONBUF CHECKED - FORM # WORDS
;IN MONBUF TO BE OUTPUT (SAVED)
MOVNI DAT,(DAT) ;FORM .IOT POINTER
SVLP2A: ADDM DAT,DEVCNT(DDB) ;UPDATE NEG. WORD COUNT OF FILE
HRLI DAT,MONBUF
MOVS DAT,DAT
TLNE DAT,-1 ;IS THERE REALLY ANYTHING TO SEND?
.IOT SGCHN,DAT ;YES, OUTPUT DATA & IOWD'S TO FILE
JRST SVLUP ;NEXT MONBUF LOAD
SVLP3: MOVEI AC1,1(DAT) ;PICK UP ADR. WHERE FIRST DATA
;WORD SHOULD BE
CAIN AC1,(ITEM) ;IS IT THERE? (AFTER IOWD LOC.)
JRST SVLP4 ;YES, MOVE ON
HRLI AC1,(ITEM) ;NO,MOVE REMAINDER OF MONBUF SO AS TO
;START THERE
HRRI ITEM,1(DAT) ;POINT THERE
HLRE TAC,ITEM ;GET NEG. COUNT OF WORDS TO
MOVN TAC,TAC ;BE MOVED AND MAKE POSITIVE
ADDI TAC,(DAT) ;FORM FINAL "TO ADR." FOR BLT
BLT AC1,(TAC) ;FILL IN THE PREVIOUS ZEROES
SVLP4: HRLOI AC1,-1(TAC1) ;START IOWD
SVLP5: ADDI TAC1,1 ;POINT TO NEXT USER ADR.
AOBJP ITEM,SVLP6 ;POINT TO NEXT WORD IN MONBUF;
;MOVE ON IF NONE LEFT
SKIPE (ITEM) ;NEXT WORD NON-ZERO?
SOJA AC1,SVLP5 ;YES, COUNT IT AND CHECK NEXT
MOVSM AC1,(DAT) ;NO, STORE IOWD
JRST SVLP1 ;AND CONTINUE
SVLP6: MOVSM AC1,(DAT) ;STORE IOWD
SUBI ITEM,MONBUF ;FIGURE # WORDS TO BE SENT
MOVNI DAT,(ITEM) ;MAKE NEGATIVE IN PREPARATION FOR SAVING
JRST SVLP2A ;OUTPUT THE GOODS FROM MONBUF AND CONTINUE
SVLP7: HRLI TEM,254000 ;PUT JRST C(JOBSA) AT END OF FILE
HRROI DAT,TEM ;FORM POINTER WORD FOR .IOT
.IOT SGCHN,DAT ;OUT GOES LAST WORD
SOS DEVCNT(DDB) ;ONE MORE WORD TO COUNT
MOVNS DEVCNT(DDB) ;MAKE THAT WORD COUNT POSITIVE
; DEVCNT CONTAINS EITHER A -BLOCK OR +WORD COUNT
POP PDP,DAT ;RESTORE STACK
SAVFIN: PUSHJ PDP,SGREL
JSP TAC,PHOLD ;PRINT MESSAGE AND STOP JOB
ASCIZ /Job saved/
SAVERR: PUSHJ PDP,SGRLE1 ;RELEASE DEVICE, FIND TTY, AND PRINT ?<CR><LF>
JSP TAC,PHOLD ;PRINT MESSAGE AND STOP JOB
ASCIZ /Protection failure/
;GETJOB RUNJOB
;** COMCON.MAC ** PAGE 70
GETJOB: JSP TAC1,SG1
PUSHJ PDP,GETJB ;GET OUR JOB - AND RETURN IF THERE ARE NO ERRORS
JSP TAC,PHOLD
ASCIZ /Job setup/
;THIS GETS A JOB AREA FROM A RETRIEVAL DEVICE AND STARTS IT UP.
; JOB HAS JUST A JOB DATA AREA ASSIGNED WHEN CONTROL GETS HERE.
RUNJOB: JSP TAC1,SG1 ;SETUP AC'S,SETUP LOWER CORE
JRST URUN1 ;LH OF PC WORD=0
;URUN URUN1
;** COMCON.MAC ** PAGE 71
;RUN UUO
;CALL: MOVE AC,[XWD N,D]
; CALL AC,[SIXBIT /RUN/]
; ERROR RETURN -UNLESS LH=HALT - PRINT CONSOLE MESSAGE IF NO
; IF OK, TRANSFER TO C(JOBSA)+N FOR NEW PROGRAM
;WHERE: D/ DEV NAME
; D+1/ FILE NAME
; D+2/ FILE EXT OR 0
; D+3/ DATE, ETC.
; D+4/ PROJECT-PROGRAMMER # OR 0 (=CURRENT)
; D+5/ HIGHEST LOC DESIRED (OR 0) - LH IGNORED
URUN: PUSHJ PDP,RESET ;RELEASE DEVICES. AC(UUO) PRESERVED.
.UMOVE TAC,(UUO) ;USER'S CALLING AC
PUSHJ PDP,GETARG ;GET 6 ARGUMENTS FROM USER + STORE. SAVE S.A. INCR. (LH
; OR AC(TAC)) + USER AC # (IN CASE OF ERROR RETURN).
MOVE TAC,SGANAM
MOVEM TAC,JBTPRG
PUSHJ PDP,SPRGNM ;SEG NAME OF INFERIOR
URUN1: PUSHJ PDP,GETJB ;GET BOTH LOW + HIGH SEGMENTS
HLRZ TAC1,(PDP) ;GET S.A. INCREMENT
PUSH PDP,TAC1 ;SAVE IT MOMENTARILY
.UMOVE TAC1,JOBSA ;ADD IT TO JOBSA
ADD TAC1,(PDP)
.UMOVM TAC1,JOBSA ;SAVE IT AWAY SO ^C, START WILL START PROGRAM
; AT SAME STARTING ADDRESS
HRLI TAC1,USRMOD ;SET USER MODE BIT
MOVEM TAC1,(PDP)
JRST USRXIT
;SG1 SG2 SG2A SG3 SG4 SGERRA
;** COMCON.MAC ** PAGES 73-74
;ROUTINE TO SETUP ACS, RESET IO, AND SETUP LOWER CORE
; LOCATIONS FOR SAVE AND GET
; SGADMP SET TO IOWD FOR THIS CORE SIZE
;CALL: JSP TAC1,SG1
; ALWAYS RETURN HERE, UNLESS DEVICE NOT FOUND
; DDB SETUP TO DEVICE DATA BLOCK AND INIT'ED
SG1: JSP TAC,MONSTR ;SETUP PROG,PDP
; PUT TAC1 ON END OF PD LIST (EXEC MODE PC, SO ERROR MESSAGES WILL
; ALWAYS PRINT. SEE SGRELE.)
SG2: PUSHJ PDP,RESET ;RELEASE ALL DEVICES
SG2A: MOVEI TAC,DR ;DUMP MODE 16
MOVEM TAC,SGAMOD ;STORE FOR OPEN UUO
.UMOVE TAC,JOBCOR ;RESET RIGHT HALF OF JOBCOR
HLLZ TAC,TAC
.UMOVM TAC,JOBCOR ;IN THREE INSTRUCTIONS
SETZM SGAHED ;CLEAR BUFFER HEADER ARG. FOR OPEN UUO
JSP UCHN,DOXUUO ;TRY TO ASSIGN DEVICE
[OPEN 0,SGAMOD]
JRST SGERRA ;NO SUCH DEVICE
;DEVICE INIT'ED
SG3: .UMOVE TAC,JOBFF ;FIRST FREE LOC IN JOB
; (SET FROM LH OF JOBSA WHICH IS SET BY LOADER.)
MOVEI TAC,-1(TAC) ;MAKE LAST LOC TO SAVE OR GET (MAKE 0=777777)
SKIPN USRDDT ;USER DDT IN USE, SAVE ALL OF CORE
PUSHJ PDP,IADRCK ;NO - ADDRESS TOO SMALL OR TOO LARGE ?
MOVE TAC,USRREL ;YES, DUMP ALL OF CORE RATHER THAN
; GIVE ADDRESS CHECK MESSAGE - HIGHEST REL. ADR.
MOVNI TAC,(TAC) ;MAKE IT NEGATIVE
ADDI TAC,JOBSVM ;LOWER CORE NOT DUMPED
HRLI TAC,JOBSVM ;IE FIRST LOC-1 TO BE DUMPED
MOVSM TAC,SGADMP ;STORE IOWD OF THIS SIZE CORE
SG4:
MOVE TAC,SGAPPN ;MAKE USRE 4TH WORD IS PROJ.,PROG.
MOVEM TAC,SGALEN ;INSERT IT INTO PROPER PLACE IN LOOKUP/ENTER BLOCK
SKIPN TAC,SGAEXT ;DID USER SPECIFY AN X10N ?
MOVSI TAC,SAVDMP ;NO, USE .SAV
MOVEM TAC,SGAEXT
POPJ PDP,
;ERROR IN OPEN OF SAVGET DEVICE
SGERRA: MOVEI TAC,NSDERR ;ERROR CODE IN CASE RUN UUO (NO SUCH DEVICE)
PUSHJ PDP,SGRELE ;RETURN TO USER IF RUN UUO
; OR FIND TTY AND PRINT ?<CR><LF>
JSP TAC,PHOLD
ASCIZ /No such device/
;GETJB
;** COMCON.MAC ** PAGES 75-80
;ROUTINE TO GET FILE FROM DEVICE
;CALL: AC'S PROG, PDP,DDB SETUP
; PUSHJ PDP,GETJB
; RETURN ONLY IF EVERYTHING OK
GETJB:
.IOPUSH SGCHN, ;SAVE AN I.T.S. CHANNEL TEMPORARILY WHILST WE
; DO SOME INPUT
MOVEI TAC,SGCHN
DPB TAC,PDEVI ;INSERT SGCHN INTO DEVCHN WORD OF THIS DDB
; SO UUOCON WON'T GO LOOKING FOR A CHANNEL TO USE.
JSP UCHN,DOXUUO ;TRY A LOOKUP ON OUR LOW SEG FILE
; (EXT=SAV)
[LOOKUP 0,SGANAM]
JRST NOFILE ;GO PRINT FILE.EXT NOT FOUND
;AND THAT LOOKUP BETTER RETURN THE FILE SIZE PROPERLY
; INTO SGALEN
HLRE TAC1,SGALEN ;-NO. OF WORDS IN FILE
PUSHJ PDP,CKIOWD ;CHECK USER'S SUPPLIED ARGUMENT TO MAKE SURE NOT
; TOO SMALL
;RETURN LARGER OF FILE SIZE OR CORE ARG
PUSHJ PDP,GETCOR ;GET WHAT WE THINK WILL BE ENOUGH CORE FOR NOW
HRRZS USRPD1 ;TURN OFF USER MODE PC FLAG IN CASE THIS IS
; A RUN UUO, SO ERRORS WILL NOT TRY TO RETURN TO USER
MOVE TAC,USRPD1 ;TELL USER TOO !
.UMOVM TAC,JOBPD1
;EXPAND
;** COMCON.MAC ** PAGES 75-80
;READ IN USER FILE PIECE BY PIECE USING MONBUF TO READ DATA
EXPAND: HLRE AC3,SGALEN ;COMPUTE HIGHEST LEGAL ADDRESS THAT WE WOULD HAVE
; HAVE TO REFERENCE WERE WE IN USER CORE DOING THE 10-50
; XPAND. (NOTE: FOR SOME SAVE'ED FILES, THE FILE LENGTH
; WILL BE ROUNDED UP TO THE NEXT INTERVAL OF 8 128-WORD
; BLOCKS. BUT THAT WON'T SCREW US UP.)
MOVN AC3,AC3
ADDI AC3,JOBSVM ;JOBSVM=75
HRROI TAC,MONBUF ;READ ONE WORD INTO MONBUF
.IOT SGCHN,TAC ;READ IN FIRST WORD OF FILE SO THAT WE CAN
; DO OUR INITIAL .ACCESS UUO, ETC. SEE II.T.S.R.M. P 40
SKIPL TAC,MONBUF
JRST SYSERR ;OLD FORMAT SAVE FILE
HRRZ TAC,TAC
CAILE TAC,JOBDDT ;JOBDDT=74
JRST EXPND1
JRST SYSERR ;????
;EXPND1 EXPLP1 EXPLP2
;** COMCON.MAC ** PAGES 75-80
EXPND1: PUSHJ PDP,CHKADR
ADDI TAC,1 ;SET UP A .ACCESS WORD
.ACCESS UPRGO,TAC ;FIRST DO AN .ACCESS TO OUR
; INFERIOR TO THE RIGHT PLACE
MOVEI TAC,JOBSV ;JOBSV=76 - PLACE WHERE JOBS ARE SAVED FROM
EXPLP1: HRRZ AC1,MONBUF ;GET NEXT IOWD
CAIGE AC1,JOBSAV ;JOBSAV=73
AOJA AC1,TOOLOW
HLRE AC1,MONBUF ;- WORD COUNT OF THIS BLOCK
MOVN AC1,AC1 ;+ WORD COUNT
ADDI TAC,1(AC1) ;PLACE WHERE WE WOULD BE AFTER HAVING PROCESSED THIS BLOCK.
; WE AACCOUNT FOR THE HEADER IOWD BY ADDING 1.
CAMLE TAC,AC3 ;AND NOW WE CHECK - IS IT WITHIN RANGE ?
JRST SGDOER ;NO
PUSH PDP,MONBUF ;NOW READ AND WRITE A TOTAL OF AC(AC1) WORDS
EXPLP2: MOVNI AC2,MBFSIZ
CAIGE AC1,MBFSIZ
MOVN AC2,AC1
ADD AC1,AC2 ;AC(AC1) NOW CONTAINS # WORD LEFT TO PROCESS
HRLZ AC2,AC2
HRRI AC2,MONBUF
MOVEM AC2,1(PDP) ;SAVE IO WORD
.IOT SGCHN,AC2 ;CAUSE IT WILL BE CHANGED HERE !!
.IOT UPRGO,1(PDP) ;WRITE THESE WORDS OUT
JUMPG AC1,EXPLP2 ;MORE TO READ ?
;EXPL3
;** COMCON.MAC ** PAGES 75-80
;AS WE ARE MERRILY GOING ALONG HERE, WE MAY WELL BE EXPANDING THE
; AMOUNT OF CORE ASSIGNED TO OUR SOLICITOUS LITTLE USER, SO THAT
; IS WHY WE HAVE THE CHKADR ROUTINE CALLS.
HRRZ TAC1,(PDP) ;ADDR-1
HLRE AC2,(PDP) ;- WORD COUNT
SUB TAC1,AC2 ;AC(TAC1) NOW CONTAINS THE LAST WORD
;WE JUST WROTE INTO
POP PDP,(PDP) ;READJST STACK
HRROI AC1,MONBUF ;READ NEXT HEADER WORD
.IOT SGCHN,AC1
PUSHJ PDP,CHKADR ;EVERY TIME WE HAVE A HEADER WORD IN
; MONBUF, WE CALL CHKADR TO BE SURE THAT WE KNOW HOW MUCH
; CORE IS BEING USED BY THE USER
SKIPL AC1,MONBUF
JRST EXPLP4 ;MAYBE THESE INSTRUCTIONS SHOULD GO ABOVE THE CALL TO CHKADR
HRRZ AC1,AC1 ;ADDR-1, IT HAD BETTER BE >= AC(TAC1)
SUBI AC1,(TAC1) ;AC1 NOW CONTAINS THE # OF WORDS AFTER OUR
; LAST BLOCK AND BEFORE THE NEXT
JUMPL AC1,SGDOER ;AS WE SAID, IT HAD BETTER BE >= 0
JUMPE AC1,EXPLP1 ;IF=0, THEN DON'T DO ANYTHING
PUSH PDP,MONBUF
PUSHJ PDP,CLRMBF ;CLEAR OUR MONBUF
EXPL3: MOVNI AC2,MBFSIZ
CAIGE AC1,MBFSIZ
MOVN AC2,AC1
ADD AC1,AC2
HRLZ AC2,AC2
HRRI AC2,MONBUF
.IOT UPRGO,AC2 ;WRITE OUT SOME ZEROES
JUMPG AC1,EXPL3
POP PDP,MONBUF ;RESTORE MONBUF
JRST EXPLP1
;EXPLP4 TOOLOW SGDO2 LOWFIN SGDOER SGREL
;** COMCON.MAC ** PAGES 75-80
EXPLP4:
.UMOVE AC1,JOBSDD ;=114
SETZ AC2,
.UMOVM AC2,JOBSDD
.UMOVM AC1,JOBDDT ;=74
JRST SGDO2
TOOLOW: JRST SYSERR ;COMPRESSED DATA FOUND BELOW JOBSDD
SGDO2: MOVEM AC1,USRDDT ;COPY DDT STARTING ADDR INTO MONITOR PROTECTED AREA
;CHECK FOR TRANSMISSION ERROR
;ACTUALLY THIS SHOULD BE DONE AT EXPLP4:
.UMOVE TAC,JOBS41 ;RESTORE USER UUO LOC
.UMOVM TAC,JOB41 ;SAVED BY "SAVE"
LOWFIN: .UMOVE TAC,JOBCOR ;CORE ARG FROM PREVIOUS "SAVE"
HRRZ TAC,TAC
SKIPN TAC ;IS THIS AN OLD FORMAT FILE W/NO CORE ARG TO SAVE ?
MOVE TAC,USRREL ;YES - USE ASSIGNMENT MADE WHEN LOW FILE READ IN
PUSHJ PDP,CKSARG ;RETURN ONLY IF USER'S SUPPLIED ARG IS 0
; OR NOT < SAVE CORE ARG, RETURN LARGER
PUSHJ PDP,GETCOR ;TRY TO GET THIS AMOUNT OF CORE
.UMOVE TAC,JOBCOR ;HIGHEST LOC ASSIGNED TO LOW SEG
HRR TAC,USRREL ;SET INITIAL CORE ASSIGNMENT IN JOB DATA AREA
; FOR USER TO USE TO RESET CORE TO INITIAL SETTING
.UMOVM TAC,JOBCOR ;WHEN PROGRAM IS RESTARTED
JRST SGREL
SGDOER: PUSH PDP,CHNSAT
JSP UCHN,DOXUUO
[RELEAS 0,]
POP PDP,CHNSAT
.IOPOP SGCHN,
JRST ADRERR
;ROUTINE TO RELEASE DEVICE AND FIND TTY
SGREL: SKIPN USRJDA ;HAS CHANNEL BEEN RELEASED ALREADY ?
JRST TTYFUW ;YES, FIND TTY
PUSH PDP,IOS ;NO - WELL THEN DO IT
PUSH PDP,CHNSAT
JSP UCHN,DOXUUO
[RELEAS 0,]
POP PDP,CHNSAT
.IOPOP SGCHN,
POP PDP,IOS
JRST TTYFUW ;FIND TTY
;CKIOWD CKSARG NROOM1 NOROOM
;** COMCON.MAC ** PAGE 81
;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND
; CHECK TO SEE IF 0 OR >= IOWD USED TO SAVE OR GET FILE
;CALL: HLRE TAC1,-NO. OR WORDS IN FILE
; PUSHJ PDP,CKIOWD
; RETURN W/GREATER OF 2 POSITIVE #'S IN AC(TAC) W/1777 IOR'ED IN
; DO NOT RETURN IF CORE ARG SUPPLIED TOO SMALL
CKIOWD: MOVEI TAC,JOBSVM
SUB TAC,TAC1 ;JOBSVM- (-# OF WORDS)
; FALL INTO CKSARG
;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK IF 0
; OR >= CORE ARG FOR PREVIOUS SAVE
;CALL: (HRRZ TAC,JOBCOR) ;WRITTEN WHEN FILE SAVED
; PUSHJ PDP,CKSARG
; RETURN W/LARGER OF 2 IN AC(TAC) ONLY IF USER ARG NOT TOO SMALL
CKSARG: IORI TAC,1777
CAMG TAC,SGANEW ;USER ARG BIGGER ?
SKIPA TAC,SGANEW ;YES (OR =)
SKIPN SGANEW ;DID HE SAY ANYTHING ?
POPJ PDP,
;ROUTINE TO PRINT #K OF CORE NEEDED
;CALL: MOVE TAC,HIGHEST REL. USER ADR.
; PUSHJ PDP,NROOM1
; NEVER RETURN
NROOM1: PUSH PDP,TAC ;YES, USER'S SUPPLIED CORE TOO SMALL
NOROOM: MOVEI TAC,NECERR ;ERROR CODE IN CASE THIS IS RUN UUO (NOT ENOUGH CORE)
PUSHJ PDP,SGRELE ;RELEASE DEVICE AND ERROR RETURN TO USER IN RUN UUO
; OR FIND TTY AND PRINT ?<CR><LF>
HRRZ TAC,(PDP) ;GET AMOUNT OF CORE REQUESTED
LSH TAC,-12 ;CONVERT TO # OF 1K BLOCKS-1
PUSHJ PDP,DECP1 ;ADD 1 PRINT PRINT DECIMAL
JSP TAC,PHOLD ;STOP JOB
ASCIZ /K of core needed/
;GETCOR NOFILE
;** COMCON.MAC ** PAGES 82+83
GETCOR: PUSH PDP,TAC ;SAVE CORE ARG IN CASE OF ERROR
HRRZ ITEM,TAC
JSP UCHN,DOXUUO
[CALLI ITEM,11]
JRST NOROOM
JRST TPOPJ
;ROUTINE TO PRINT FILE NOT FOUND
NOFILE:
; MOVEI TAC,FNFERR ;ERROR IN CASE THIS IS RUN UUO (FILE NOT FOUND)
PUSHJ PDP,SGRELL ;RETURN DISK LOOKUP/ENTER ERROR CODE.
; RELEASE DEVICE AND ERROR RETURN TO USER IF HE WANTED.
; OR FIND TTY AND PRINT ?<CR><LF>
MOVE TAC1,SGANAM ;PRINT FILE NAME
PUSHJ PDP,PRNAME
PUSHJ PDP,PRPER ;PRINT PERIOD
HLLZ TAC1,SGAEXT ;PRINT X10N
PUSHJ PDP,PRNAME
JSP TAC,PHOLD ;STOP JOB
ASCIZ / not found/
;SGRELL SGRELE SGRLE2 SGRLE1
;** COMCON.MAC ** PAGE 84
;ROUTINE TO RELEASE DEVICE ON AN ERROR AND CHECK TO SEE IF WE
; ERRED IN MONITOR OR USER UUO
; -IF A USER UUO -> GIVE ERROR RETURN UNLESS WE FIND A HALT
; AT RETURN LOCATION
; -OTHERWISE -> FIND TTY AND PRINT ?<CRLF> AND RETURN TO CALLER
; WHERE MORE INFORMATION IS PRINTED AND SO AS TO LET CALLER
; STOP JOB
;CALL: MOVEI TAC,ERROR CODE
; PUSHJ PDP,SGRELE
; DO NOT RETURN TO CALLER IF HE WANTS RETURN ON RUN AND GETSEG UUO'S
SGRELL: HRRZ TAC,SGAEXT ;RETURN DISK SERVICE ERROR CODE
SGRELE: MOVE TAC1,USRPD1 ;GET FIRST PC ON PD LIST
TLNN TAC1,USRMOD ;USER UUO ?
JRST SGRLE1 ;NO
PUSH PDP,TAC ;SAVE ERROR CODE
HRR UUO,TAC1 ;ADDR OF RETURN AFTER RUN OR GETSEG
PUSHJ PDP,GETWDU
HLRZ TAC1,TAC ;GET OP CODE
POP PDP,TAC ;RESTORE AC(TAC)
CAIN TAC1,(HALT)
JRST SGRLE1
HRR UUO,USRPD3 ;AC # OF CURRENT UUO
PUSHJ PDP,STOTAC ;STORE ERROR # IN USER AC
SKIPN USRJDA+0 ;DO NOT RELEASE CHANNEL 0 IF NOT INIT'ED YET.
; UUO CONTROLLER DOES NOT ALLOW THIS FROM EXEC MODE.
JRST SGRLE2
PUSH PDP,CHNSAT
JSP UCHN,DOXUUO
[RELEAS 0,]
POP PDP,CHNSAT
.IOPOP SGCHN,
SGRLE2: PUSH PDP,USRPD1 ;PUT RETURN AT END OF PDLIST -- THEN RETURN THERE
JRST USRXIT
SGRLE1: PUSHJ PDP,SGREL ;RELEASE S/G-DEVICE AND FIND TTY
JSP TAC,CONMES
ASCIZ /?
/
;CHKADR SPRGNM TNAME TNAME2 TNAME1
;** COMCON.MAC **
;MISC ROUTINES -- CHKADR AND SPRGNM AND TNAME
;ROUTINE TO MAKE SURE THAT THE REST OF OUR SYSTEM
; KNOWS WHETHER CORE IS EXPANDING OR NOT AS WE BUSILY EXPAND
; THE CURRENT FILE READ IN DUE TO GET OR RUN COMMANDS,
; OR DUE TO THE RUN UUO
CHKADR: SKIPL AC1,MONBUF ;WILL THIS BLOCK CAUSE MORE CORE TO BE USED ?
POPJ PDP, ;NO - LAST WORD OF FILE
HLRE AC1,AC1 ;-WORD COUNT OF THIS BLOCK
MOVNM AC1,1(PDP) ;GRAB A FREE STORAGE LOCATION
HRRZ AC1,MONBUF ;NOW DETERMINE HOW HIGH WE WILL GO
ADDM AC1,1(PDP) ;HIGHEST ADDRESS WRITTEN INTO BY THIS
; BLOCK NOW IN LOCATION BEYOND CURRENT PD STACK
HLRZ AC1,JBTADR ;WILL THIS INCREASE AMOUNT OF LOW CORE WE WILL NEED
CAML AC1,1(PDP)
JRST CPOPJ ;NO - SO JUST RETURN
EXCH TAC,1(PDP)
PUSH PDP,1(PDP)
PUSH PDP,TAC1
PUSHJ PDP,GETCOR ;GET OURSELVES SOME CORE
POP PDP,TAC1
ADDI TAC1,1
.ACCESS UPRGO,TAC1 ;RESET OUR .ACCESS POINTER, IT WILL BE MODIFIED
; IN THE CORUUO WHEN WORDS IN THE JOB DATA AREA ARE SENT WITH
; .UMOVM'S.
SUBI TAC1,1 ;READJUST AC(TAC1)
JRST TPOPJ ;RETURN AFTER RESTORING AC(TAC)
;ROUTINE TO SET PROGRAM NAME TO JBTPRG LOCATION - RECENTLY MODIFIED BY THE
; PROGRAM. JBTPRG CHANGED BY RUN UUO, RUN COMMAND, GET COMMAND
SPRGNM: PUSHJ PDP,TNAME
SKIPE JBTADR ;DO WE HAVE A LIVE INFERIOR AT PRESENT ?
.USET UPRGO,[.SJNAME,,FILNM2] ;TRY TO SET UP THE JNAME OF OUR
; INFERIOR.
POPJ PDP,
;ROUTINE TO TEST PROPOSED JNAME AS ENTERED IN JBTPRG TO BE SURE
; THAT THE NAME IS NOT ALREADY IN USE AS THE NAME OF A CURRENT
; INFERIOR. THE NAME, OR ITS SUBSTITUTE IS LEFT IN FILNM2, AND
; FILNAM AND FILNM1 ARE LEFT WITH DATA SUITABLE FOR .OPEN'S
TNAME: PUSH PDP,TAC
SETZM FILNM1 ;THE SYSTEM WILL SUPPLY CURRENT UNAME
SKIPN TAC,JBTPRG
MOVE TAC,NULNAM ;USE NULNAM: IF USER IS ZEROING JBTPRG
MOVEM TAC,FILNM2
SKIPE TAC,JBTADR ;DO WE HAVE AN INFERIOR ?
.USET UPRGO,[.RJNAME,,TAC]
CAMN TAC,FILNM2 ;IF SO, DOES IT HAVE A MATCHING JNAME ?
JRST TPOPJ1 ;YES - SKIP RETURN.
; WE EXPECT THAT THIS SKIP RETURN WILL ONLY AFFECT CALLING
; SEQUENCE AT SPRGNM: AS OPPOSED TO THAT IN [CORE1]
MOVEI TAC,(SIXBIT /USR/)
HRLI TAC,IBOMDE ;TEST JNAME TO SEE IF AN INFERIOR HAS THIS NAME
MOVEM TAC,FILNAM
.IOPUSH UPRGO,
TNAME2: .OPEN UPRGO,FILNAM ;WE WANT A SUCCESS RETURN
JRST TNAME1 ;IN USE, TRY ANOTHER
.UCLOSE UPRGO, ;DELETE THIS INFERIOR, WE WERE JUST CHECKING
.IOPOP UPRGO, ;RESTORE UPRGO
JRST TPOPJ ;AND RETURN, RESTORING AC(TAC)
TNAME1: .GENSYM TAC, ;COLLECT A SYSTEM GENERATED NAME
MOVEM TAC,FILNM2 ;AND TRY AGAIN
JRST TNAME2
;PRTIM.
;** COMCON.MAC **
;MISC ROUTINES -- PRTIM.
;ROUTINE TO INTERFACE "TIME" ROUTINE AND DEC ROUTINE, PRTIME: (PRINTS TIME
; IN HH:MM:SS.DD FOR ARG IN JIFSECS).
;CALL: MOVE TAC,TIME IN 4.069 MICROSECOND UNITS
; PUSHJ PDP,PRTIM.
; RETURN
PRTIM.: FSC TAC,233 ;FLOAT # 4.069 MICROSECOND UNITS
FMPR TAC,[.OP FMPR <.OP FDVR 4.069 1.0^6> 60.0]
;CONVERT TO # MICROSECONDS
; 4.069 MICROSECOND -> JIFFSECS.
;CONVERT TO SECONDS
;TO JIFFIES
FADR TAC,[0.5] ;ROUNDED
UFA TAC,[233000,,0] ;NOW FIX RESULT
LDB TAC,[POINT 27,TAC1,35,] ; AND COLLECT BOTTOM 27 BITS
PUSHJ PDP,PRTIME
JRST INLMES ;PRINT TRAILING MESSAGE AFTER CALL
;CORMAX MONTAB CPOPJ2 CPOPJ1 CPOPJ TPOPJ1 TPOPJ IPOPJ1 IPOPJ SYSPP PUUOAC PIOMOD PDEVI PDEVO
;** COMMON.MAC **
;** PAGE 2 **
JIFSEC==60. ;60 JIFFIES/SECOND
JIFSC2==JIFSEC/2 ;# JIFFIES IN A HALF SECOND (FOR ROUNDING)
JIFMIN==JIFSEC*60. ;# JIFFIES/MINUTE
;** PAGE 8 **
CORMAX: 1000000 ;MAX # WORD AVAILABLE FOR USER
; USED BY CORUUO:[CORE1]
; USED BY "CORE" COMMAND[COMCON]
;=MAXIMUM CORE REQUEST+1 (I.E. LARGEST REL. ADR.+1)
;MONITOR COMMON DATA AREA
STTYBF==20 ;THIS ACTUALLY IS DEFINED IN PTYSRF
;** PAGE 34 **
;MONTH TABLE FOR DAYTIME COMMAND PRINTING
MONTAB: ASCII /-Jan-/
ASCII /-Feb-/
ASCII /-Mar-/
ASCII /-Apr-/
ASCII /-May-/
ASCII /-Jun-/
ASCII /-Jul-/
ASCII /-Aug-/
ASCII /-Sep-/
ASCII /-Oct-/
ASCII /-Nov-/
ASCII /-Dec-/
;** PAGE 36 **
CPOPJ2: AOS (PDP) ;DOUBLE SKIP RETURN
CPOPJ1: AOS (PDP) ;SKIP SUBROUTINE RETURN
CPOPJ: POPJ PDP,
TPOPJ1: AOS -1(PDP) ;RESTORE AC(TAC) AND SKIP SUBROUTINE RETURN
TPOPJ: POP PDP,TAC ;RESTORE AC(TAC)
POPJ PDP,
IPOPJ1: AOS -1(PDP)
IPOPJ: POP PDP,ITEM ;RESTORE ITEM
POPJ PDP,
SYSPP: SIXBIT /DECSYS/
;** PAGE 37 **
PUUOAC: POINT 4,UUO,12, ;UUO AC FIELD
PIOMOD: POINT 4,IOS,35, ;MODE BITS
PDEVI: POINT 4,DEVCHN(DDB),3,
PDEVO: POINT 4,DEVCHN(DDB),7,
;** PAGE 48 **
SAVDMP=='SAV
;CORUUO CORU1 CORERR ZERCOR
;** CORE1.MAC ** PAGE 2
;CORE UUO
;CALL: MOVEI AC,HIGHEST REL. ADR. DESIRED IN LOW SEG
; HRLI AC,HIGHEST REL. ADR. DESIRED IN HIGH SEG
; CALL AC,[SIXBIT /CORE/]
; ERROR RETURN
; OK RETURN TO USER
;RETURN MAX. NO. BLOCKS ALLOWED
;LH=0 -> DO NOT CHANGE HIGH SEG ASSIGNMENT
;RH=0 -> DO NOT CHANGE LOW SEG ASSIGNMENT
;BOTH HALVES=0 -> ERROR, RETURN MAX. NO. OF BLOCKS IMMEDIATELY W/O AFFECTING CORE
CORUUO: JUMPE TAC,ZERCOR ;IS HE ASKING FOR ZERO CORE ?
PUSH PDP,TAC ;NO - SAVE HIGHEST ADDRESS
MOVEI TAC,(TAC)
JUMPE TAC,CORU1 ;IS RH=0 (IF SO - DO NOT CHANGE LOW SEG)
IORI TAC,1777
SETZ ITEM, ;SET FOR LOW SEG.
PUSHJ PDP,CORE1
JRST CORERR
CORU1: HLRZ TAC,(PDP)
CAMG TAC,USRREL
AOS -1(PDP) ;PREPARE FOR SUCCESSFUL RETURN
CORERR: POP PDP,TAC
ZERCOR: MOVE TAC,CORMAX ;# BLOCKS AVAILABLE
LSH TAC,-12
JRST STOTAC
;CORE0 CORE1
;** CORE1.MAC ** PAGES 8-18
;CALL: MOVE TAC,HIGHEST LEGAL ADDRESSABLE LOC. DESIRED
; MOVEI ITEM,(0=LOWCORE, 1=HIGH CORE)
; MOVE PROG,[XWD PROT.,0] = JBTADR(ITEM)
; PUSHJ PDP,CORE0
; ERROR - NOT ENOUGH CORE
; OK RETURN
;AC(PROG)(=AC(JDAT)) SET TO NEW CORE ASSIGNMENT
CORE0: ;CALLED BY GETMIN: (AMONG OTHER PLACES)
; ALSO BY THE CORE UUO
;DROPS THROUGH TO CORE1, REGARDLESS:
; REASON -> CORE IS ALWAYS "IN CORE"
CORE1:
JUMPE PROG,CORGET ;OLD ASSIGNMENT=0 ?
; IF YES, DON'T WORRY ABOUT IT
JUMPN TAC,CORE1B ;ARE WE TRYING TO RELEASE ALL OF CORE ?
; YES
PUSHJ PDP,RTV ;RESET "TIME" VARIABLES
.UCLOSE UPRGO, ;DESTROY INFERIOR
; THEN CODE AT CORE1I SETS JBTDR ENTRY TO 0 SINCE
; WE ALREADY KNOW THAT AC(TAC)=0
JRST CORE1I
;CORE1B CORE1I CORE1L
;** CORE1.MAC ** PAGE 8-18
;COMES HERE IF OLD ASSIGNMENT .EQ. 0 AND NEW ASSIGNMENT .NE. 0
CORE1B: CAILE TAC,JOBDA ;LOW SEG - AND DOING A RESET ?
JRST CORE1F ;NO
PUSHJ PDP,RTV ;RESET "TIME" VARIABLES
.RESET UPRGO, ; AHA - WE FINALLY GET CLEARANCE
.USET UPRGO,[.SMASK,,[BIOADC\BILLOP\200000]]
.USET UPRGO,[.SUTRP,,[1]]
IORI TAC,1777
CORE1I: MOVSI PROG,(TAC)
MOVEM PROG,JBTADR(ITEM)
CORE1L: PUSHJ PDP,SETREL
JRST CPOPJ1
;CORGET
;** CORE1.MAC ** PAGES 8-18
CORGET:
JUMPE TAC,CPOPJ1 ;IS REQUESTED CORE=0, IF SO, DON'T BOTHER
; DOING ANYTHING
;NOW WE SEE THAT CORE IS BEING REQUESTED WHEN WE PREVIOUSLY HAVE HAD NO
; CORE ASSIGNED (AND THUS WERE WITHOUT AN INFERIOR). SO SET ONE UP.
;NOTE: WE WILL USE PROG AS A FREE ACCUMULATOR
PUSHJ PDP,TNAME ;TEST PROPOSED NAME
MOVEI PROG,IBOMDE ;IMAGE, BLOCK, OUTPUT MODE
HRLM PROG,FILNAM
.OPEN UPRGO,FILNAM ;CREATE THE INFERIOR HERE
JRST SYSERR
.USET UPRGO,[.SMASK,,[BIOADC\BILLOP\200000]] ;SET UP INTERRUPT BITS HERE.
.USET UPRGO,[.SUTRP,,[1]] ; THEY INCLUDE MEM PROT VIOLATION, SYS UUO TRAP, ILLEGAL INSTR,
; PDL OVF, RESPECTIVELY.
MOVEI PROG,IBIMDE ;THIS IS SO THAT I CAN SEE YOU BETTER
HRLM PROG,FILNAM
.OPEN UPRGI,FILNAM
JRST SYSERR
MOVSI PROG,1777
MOVEM PROG,JBTADR ;WE KNOW WE HAVE 1K OF LOW CORE AT THIS POINT
;CORE1F
;** CORE1.MAC ** PAGES 8-18
;WE ARRIVE HERE HAVING MADE THE DECISION THAT THE CURRENT ASSIGNMENT OF CORE
; WILL NEEDS CHANGE THE FIRST ILLEGAL ADDRESS OF OUR INFERIOR.
; ASSIGNMENT OR CHANGE TO LOW SEG WHERE THERE IS NO HIGH SEG AROUND
CORE1F: IORI TAC,1777
HLRZ PROG,JBTADR(ITEM) ;ARE WE REQUESTING SAME AS BEFORE ?
CAMN PROG,TAC
JRST CORE1L ;YES - DON'T BOTHER WITH ANY MUCKING AROUND
ADDI TAC,1
.USET UPRGO,[.SMEMT,,TAC]
SUBI TAC,1
JRST CORE1I
;RTV
;** CORE1.MAC ** MISC
;ROUTINE TO RESET "TIME" VAIABLE FOR PROCEDURE ON CHANNEL UPRGO, THIS
; ROUTINE CALLED JUST BEFORE PROCEDURE TO BE DESTROYED (AT "CORE 0" TIME).
; ALSO CALLED WHEN .RESET TO BE EXECUTED WHEN USER REQUESTS NEW CORE (AT GETMIN:
; TIME).
;CALL: PUSHJ PDP,RTV
; DESTROYS AC(PROG)
RTV:
.USET UPRGO,[.RRUNT,,PROG] ;READ CURRENT RUN TIME OF INFERIOR JUST BEFORE
; WE DESTROY IT
ADDM PROG,TRTPI ;ADD IT TO "TOTAL RUN TIME FOR PAST INFERIORS"
ADDM PROG,TRTPIT ;ADD IT TO "T.R.T FOR PAST INFERIORS SINCE LAST "TIME"
; COMMAND"
MOVN PROG,TRTIT ;WE MAY HAVE DONE A "TIME" WHILE IN THE MIDST OF THE PROCEDURE
ADDM PROG,TRTPIT ;TO BE DESTROYED. THUS TRTPIT MUST BE DECREMENTED BY THE RUN TIME
SETZM TRTIT ; FOUND AT THAT MOMENT.
POPJ PDP,
;APRILM APRIL1 APRILR APRPDL APRSCD ADRERR
;** ERRCON.MAC ** PAGES 1+2
;APR-DETECTED ERRORS
; PUSHDOWN OVERFLOW AND ILLEGAL MEMORY
; FOR WHICH THE USER IS NOT ENABLED.
APRILM: SETZM APRERR ;RESET APRERR WORD FOR NEXT ERROR
APRIL1: TRNN TAC,BIOADC ;MEM PROT VIOLATION ??
JRST APRPDL ;NO
;ROUTINE TO HANDLE ILLEGAL MEMORY REFERENCES DUE TO PROTECTION FAILURES.
; CALLED EXCLUSIVELY FROM MAIN INTERRUPT DRIVER WHEN INFERIOR
; INTERRUPT DETECTED AND BIOADR (BIT 2.5) SEEN IN PIRQC WORD.
HRRZ TAC,APRPC
CAMG TAC,USRREL
;IS PC IN USER ASSSIGNED CORE AREAS ?
JRST APRILR ;YES - MUST BE ILL MEM REF
JSP TAC,ERRPTU ;NO
ASCIZ /PC out of bounds/
JRST APRSCD
APRILR: JSP TAC,ERRPTU
ASCIZ /Ill mem ref/
JRST APRSCD
APRPDL: JSP TAC,ERRPTU
ASCIZ /Pdl ov/
APRSCD: MOVE TAC1,APRPC
JRST PCPNT
;ADDRESS CHECK ERROR
;DDB MUST BE SET UP TO POINT TO OFFENDING DEVICE
ADRERR: JSP TAC,ERRPTU
ASCIZ /Address check for /
JRST DEVEXC ;PRINT "DEVICE XXX; UUO AT USER/EXEC YYY"
; THEN STOP JOB AND FLAG AS AN ERROR STOP.
;ILLINP ILLMOD IOIERR
;** ERRCON.MAC ** PAGES 3+4
;INPUT UUO FOR OUTPUT DEVICE
ILLINP: JSP TAC,ERRPTU
ASCIZ /Device /
PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX"
JSP TAC,UUOMES ;PRINT MESSAGE
ASCIZ / cannot do input/
;ILLEGAL DEVICE DATA MODE (INIT, OPEN, OR SETSTS UUO'S)
ILLMOD: JSP TAC,ERRPTU
ASCIZ /Illegal data mode for /
JRST DEVEXC ;PRINT "DEVICE XXX", AND UUOPC
;IO UUO TO USER CHANNEL W/NO PREVIOUS INIT OR OPEN
IOIERR: JSP TAC,ERRPTU
ASCIZ \I/O to unassigned channel\
JRST UUOPCP
;SYSERR UUOERR ILLINS HALTI DEVEXC
;** ERRCON.MAC ** PAGES 5+6
;SYSTEM ERROR
SYSERR: JSP TAC,ERRPTU
ASCIZ/System error/
MOVE TAC1,UUO0
SOJA TAC1,PCPNT
;ILLEGAL UUO
UUOERR: JSP TAC,ERRPTU
ASCIZ /Illegal UUO/
MOVE TAC1,UUO0 ;GET UUOPC
SOJA TAC1,PCPNT
;ILLEGAL INSTRUCTION
; HALT INSTRUCTION IS A SPECIAL CASE WHICH STOPS JOB
; BUT THE USER MAY CONTINUE FROM IT. (AT EFFECTIVE ADDR.)
ILLINS: HLRZ TAC,UUO
CAIN TAC,254200 ;A JRST 4, ?
JRST HALTI ;YES
JSP TAC,ERRPTU ;NO
ASCIZ /Illegal instruction/
JRST UUOPCP
HALTI: PUSHJ PDP,INLMES
ASCIZ /Halt at user /
SOS TAC,USRPD1 ;UUO PC = LOC OF HALT+1
PUSHJ PDP,OCTPNT ;PRINT PC
PUSHJ PDP,INLMES
ASCIZ /
^C
./
HRRM UUO,USRPD1 ;SAVE EFFECTIVE ADDR
PUSHJ PDP,TTYSTC
PUSHJ PDP,STOP1
PUSH PDP,USRPD1 ;SAVE "RETURN" ADDR - LET UUO EXIT ROUTINES
; TAKE CARE OF US - NOTE IT WILL FIND A STOPPED JOB.
JRST USRXIT
;ROUTINE TO PRINT "DEVICE XXX; UUO AT EXEC/USER YYY"
; THEN STOP JOB
DEVEXC: PUSHJ PDP,ERNAM
JRST EXCALP
;ERRPTU ERRDEV UUOMES UUOPCP PCPNT EXCALP PCSTOP
;** ERRCON.MAC ** PAGES 8+9
;COMMON ERROR MESSAGE SETUP ROUTINE
;CALL: JSP TAC,ERRPTU
; ASCIZ /MESSAGE/
; AC(DDB) SAVED IN 0(PDP)
; AC(DAT) SAVED IN -1(PDP)
ERRPTU:
ERRDEV: PUSH PDP,DAT
PUSH PDP,DDB
PUSH PDP,TAC
MOVE PROG,JBTADR
PUSHJ PDP,TTYFNU
PUSHJ PDP,INLMES
ASCIZ /?Error in job /
PUSHJ PDP,PJOB
JRST INLMES ;PRINT CALLER REQUESTED MESSAGE AND RETURN
;ROUTINE TO PRINT UUO PC AND STOP JOB
; IF IN USER MODE PC WILL PRINT AS "AT USER XXX"
; IF IN EXEC MODE -- "AT EXEC XXX; UUO AT EXEC/USER YYY"
UUOMES: PUSHJ PDP,CONMES ;PRINT MESSAGE POINTER TO BY TAC
UUOPCP: MOVE TAC1,USRPD1 ;UUO PC
SOJA TAC1,PCPNT ;DECREMENT TO POINT TO UUO
;ROUTINE TO PRINT 1 OF 3 MESSAGES AND STOP JOB
; "AT EXEC XXX; UUO AT EXEC YYY"
; "AT EXEC XXX; UUO AT USER YYY"
; "AT USER YYY"
;CALL: MOVE TAC1,XXX
; PUSHJ PDP,PCPNT
PCPNT: PUSHJ PDP,PCP
TLNE TAC1,USRMOD
JRST PCSTOP
;ROUTINE TO PRINT 1 OF 2 MESSAGES AND STOP JOB
; ";UUO AT EXEC YYY"
; ";UUO AT USER YYY"
EXCALP: PUSHJ PDP,INLMES
ASCIZ /; UUO/
MOVE TAC1,USRPD1 ;UUOPC
SUBI TAC1,1
PUSHJ PDP,PCP
PCSTOP: PUSHJ PDP,HOLD ;STOP JOB
POP PDP,DDB ;RETURNS ONLY IF AT "INTERRUPT LEVEL"
; I.E. FROM COMMAND SCANNER OR FROM APR INTERRUPT
JRST TPOPJ ;RETURN AFTER REMOVING STACKED INFO STORED AT ERRPTU:
;XMODE UMODE PCP OCTPNT OCTP1 DECP1 RADX10 EIGHT PRTOCT PRTDIG PRTDG1 PRTNUM
;** ERRCON.MAC ** PAGE 10
;ROUTINE TO PRINT PC AS "EXEC XXX" OR "USER XXX"
;CALL: MOVE TAC1,PC TO PRINT(LH(FLAGS)
; PUSHJ PDP,PCP
XMODE: ASCIZ / at Exec PC /
UMODE: ASCIZ / at user PC /
PCP: MOVEI TAC,XMODE
TLNE TAC1,USRMOD
MOVEI TAC,UMODE
PUSHJ PDP,CONMES
HRRZ TAC,TAC1 ;PRINT RH IN OCTAL
; FALL INTO OCTPNT
;ROUTINE TO PRINT 6 DIGIT OCTAL #
;CALL: HRR TAC,OCTAL #
; PUSHJ PDP,OCTPNT
; RETURN AC(TAC1) PRESERVED, AC(TAC) DESTROYED
OCTPNT: HRLZ TAC,TAC ;MOVE TO LH FOR ROTATING
TRO TAC,700000 ;SET UP AN END FLAG
OCTP1: ROT TAC,3 ;GET NEXT OCTAL DIGIT
TLNN TAC,-1 ;WAS THAT FLAG ?
POPJ PDP, ;YES - DO NOT PRINT - ONLY RETURN TO LOSER
PUSHJ PDP,PRTNUM ;NO, PRINT OCTAL DIGIT
HRRI TAC,0 ;CLEAR RH
JRST OCTP1
;ROUTINE TO ADD 1 TO TAC AND PRINT DECIMAL
DECP1: AOJA TAC,RADX10 ;ADD 1 AND GO PRINT
;ROUTINE TO PRINT DECIMAL
;CALL: MOVE TAC,DECIMAL #
; PUSHJ PDP,RADX10
; RETURN -- TAC1 PRESERVED, TAC DESTROYED
RADX10: PUSH PDP,TAC1 ;SAVE TAC1
PUSHJ PDP,PRTDIG ;PRINT DECIMAL DIGITS
POP PDP,TAC1 ;RESTORE TAC1
EIGHT: POPJ PDP,10
;RECURSIVE DECIMAL PRINT ROUTINE
;CALL: MOVE TAC,DECIMAL #
; PUSHJ PDP,PRTDIG
PRTOCT: SKIPA TEM,EIGHT ;RADIX 8. PRINT ROUTINE
PRTDIG: MOVEI TEM,12 ;RADIX 10. PRINT ROUTINE
PRTDG1: IDIVI TAC,(TEM) ;DIVIDE BY 10
HRLM TAC1,(PDP) ;RT HALF ON PD LIST
JUMPE TAC,.+2 ;FINISHED
PUSHJ PDP,PRTDG1 ;NO
HLRZ TAC,(PDP) ;GET LAST #
PRTNUM: MOVEI TEM,60(TAC) ;PUT CHAR IN CHAR AC (TEM=CHREC)
JRST OUTCHS ;OUTPUT CHAR
;ERNAM PRNAME
;** ERRCON.MAC ** PAGE 11
;ROUTINE TO PRINT "DEVICE XXX"
;CALL: PUSH PDP,DDB
; PUSHJ PDP,ERNAM
ERNAM: PUSHJ PDP,INLMES
ASCIZ /Device /
SKIPE TAC1,-1(PDP)
MOVE TAC1,DEVNAM(TAC1) ;FALL INTO PRNAME
;ROUTINE TO PRINT SIXBIT NAME
;CALL: MOVE TAC1,NAME
; PUSHJ PDP,PRNAME
PRNAME: ;PRINT SIXBIT NAME IN AC(TAC1)
MOVEI TAC,0
LSHC TAC,6 ;SHIFT IN NEXT CHAR
JUMPE TAC,CPOPJ
MOVEI TEM,40(TAC) ;MAKE IT ASCII
PUSHJ PDP,OUTCHS
JRST PRNAME
;TTYNA TPLNA ERRAVL
;** ERRCON.MAC ** MISC
;TNM DEVICE FAILED DURING ATTEMPTED .OPEN
; MUST BE ILLEGAL OR IN USE AS A CONSOLE TTY
TTYNA: JSP TAC1,ERRAVL ;RETURN PDEVO CHANNEL TO COMMON POOL
0 ;BUT DON'T TYPE A MESSAGE
PUSHJ PDP,ERNAM ;"ERROR IN JOB XX
;DEVICE TTYNM"
JSP TAC,UUOMES
ASCIZ / not available/
;.OPEN ON DEVICE TPL: FAILURE
; MUST BE A FULL DIRECTORY
TPLNA: JSP TAC1,ERRAVL ;RETURN PDEVO CHANNEL TO POOL
0
PUSHJ PDP,ERNAM
JSP TAC,UUOMES
ASCIZ / not available/
ERRAVL: LDB TAC,PDEVO ;FREE UP CHANNEL
PUSHJ PDP,RTFCHN
SETZ TAC,
DPB TAC,PDEVO
MOVEI TAC,(TAC1)
JRST ERRPTU
;JOBDAC JOBDPD JOBD16 JOB41 JOBREL JOBPD1 JOBPRT JOBHCU JOBPC JOBDDT JOBSAV JOBJDA JOBLO JOBSV JOBSVM JOBSDD JOBPFI JOBHI JOBHRL JOBSA JOBFF JOBS41 JOBREN JOBAPR JOBCNI JOBTPC JOBOPC JOBCOR JOBVER JOBDA JOBHSA JOBH41 JOBHCR JOBHRN JOBHVR JOBHNM JOBHSM JOBHDA
;** JOBDAT.MAC **
JOBDAC==20
JOBDPD==JOBDAC+PDP
JOBD16==JOBDAC+16
JOB41==41 ;USER UUO JSR LOCATION
JOBREL==44 ;LH=0, RH=HIGHEST REL. ADR. IN USER AREA
; (IE LOW SEGMENT). SET BY MONITOR EACH TIME JOB CHANGES
; CORE SIZE.
JOBPD1==45
JOBPRT==72 ;FIRST LOC PROTECTED
JOBHCU==72
JOBPC==JOBHCU+1
JOBDDT==74 ;LH UNUSED
;RH=STARTING ADDRESS OF USER DDT
JOBSAV==JOBDDT-1 ;FIRST LOC-1 WRITTEN BY SAVE COMMAND
JOBJDA==JOBDDT+1 ;JOB DEVICE ASSIGNMENT TABLE
; LH=UUO'S DONE SO FAR
; RH=ADR. OF DEVICE DATA BLOCK IN MONITOR
JOBLO==JOBJDA ;FIRST LOC TO ZERO OUT DURING A RESET UUO
JOBSV==JOBJDA+1 ;FIRST LOC READ INTO OR WRITTEN FROM BY NEW
; SAVGET WHICH ZERO-COMPRESSES. THIS LOC CONTAINS
; THE FIRST IOWD W/NO. OF DATA WORDS IN LH, FIRST ADR-1
; IN RH.
JOBSVM==JOBSV-1 ;FIRST LOC-1 USED FOR SETTING UP DUMP MODE
; COMMAND LIST FOR SAVGET
JOBSDD==JOBJDA+17 ;PLACE TO SAVE JOBDDT ON SAVE
JOBPFI==JOBJDA+17 ;HIGHEST LOC IN JOB DATA AREA PROTECTED FROM IO
JOBHI==JOBJDA+17 ;LAST LOC TO ZERO OUT DURING A RESET UUO (C.F. USRHI)
JOBHRL==115 ;LH IS FIRST FREE LOC IN HIGH SEG RELATIVE TO ORIGIN.
; ANALAGOUS TO LH OF JOBSA FOR LOW SEG. (IE LH=LENGTH TO
; SAVE ON SAVE COMMAND). SET BY LOADER.
; RH ANALAGOUS TO JOBREL, IE HIGHEST LEGAL USER ADDRESS IN HIGH SEG.
JOBSA==120 ;LH=INITIAL FIRST FREE LOCATION IN LOW SEG (SET BY LOADER)
;RH=STARTING ADDRESS OF USER PROGRAM
;(SET FROM HIGH DATA AREA ON GET IF NO LOW FILE)
JOBFF==121 ;CURRENT FIRST FREE LCATION IN LOW SEG USED
; AND UPDATED BY MONITOR TO ASSIGN IO BUFFERS IN TOP OF USER
; AREA.
; USER MAY CHANGE CONTENTS IN ORDER TO AFFECT PLACEMENT OF
; BUFFERS BY MONITOR
JOBS41==122 ;C(JOB41) SAVED HERE ON SAVE COMMAND.
; RESTORE FROM HERE ON GET.
JOBREN==124 ;REENTER ADDRESS FOR REENTER COMMAND.
; (SET FROM HIGH DATA AREA ON GET IF NO SAVE FILE)
JOBAPR==125 ;PLACE TO TRAP TO IN USER AREA ON APR TRAP.
; ENABLED BY APRENB UUO.
JOBCNI==126 ;APR IS "CONI'ED" INTO C(JOBCNI) ON APR TRAP
JOBTPC==127 ;PC IS STORED HERE ON USER APR TRAP
JOBOPC==130 ;OLD PC IS STORED HERE ON START, DDT, REENTER,
; STARTC COMMANDS.
JOBCOR==133 ;(SET FOM HIGH DATA AREA IN NO LOW FILE)
; LH=HIGHEST LOCATION LOADED (LOW SEG) W/PROG OR DATA.
; (BLOCK STATEMENTS DO NO COUNT HERE). SAVE WILL NOT
; WRITE THE LOWSEG OF A 2 SEG PROG IF LH IS <= 137
; AND GET WILL NOT READ.
; RH=SIZE OF CORE FROM LOW SEG ON RUN, SAVE, GET COMMANDS.
; (SET FROM HIGH DATA AREA ON GET IF NOT LOW FILE)
; SET BY SAVE TO CORE ASSIGNMENT TO BE USED ON GET (UNLESS USER
; TYPES A LARGER ARG TO GET) TO FRIST FREE LOC-1 (OR TOP
; OF USER DDT) OR TO USER'S CORE ARG TO SAVE IF BIFFER.
; GET ALWAYS SET RH TO INITIAL CORE ASSIGNMENT SO THAT PROG
; CAN RESTORE CORE TO ORIGINAL ASSIGNMENT ON RESTARTING.
JOBVER==137 ;CONTAINS VERSION # (OCTAL) OF CUSP BEING RUN IN RH
JOBDA==140 ;FIRST LOC NOT USED BY JOB DATA AREA
JOBHSA==400000 ;A COPY OF JOBSA
JOBH41==400001 ;A COPY OF JOB41
JOBHCR==400002 ;A COPY OF JOBCOR
JOBHRN==400003 ;A COPY OF JOBHRL/JOBREN
JOBHVR==400004 ;A COPY OF JOBVER
JOBHNM==400005 ;HIGH SEGMENT NAME
JOBHSM==400006 ;HIGH SEGMENT SYMBOLS
JOBHDA==400010 ;FIRST LOCATION NOT USED
;LP0DDB
;** LPTSER.MAC **
LPTSIZ==201
LP0DDB: SIXBIT /LPT/ ;DEVNAM
LPTSIZ ;DEVCHR. (LH UNUSED SINCE THIS DDB IS NEVER USED AS A PROTOTYPE)
; RH - SIZE OF BUFFER
0 ;DEVIOS
LPTDSP ;DEVSER
DVOUT+DVLPT,,1_A+1_AL+1_I ;DEVMOD
LP0LEN==.-LP0DDB ;LENGTH OF NON-ZERO SEGMENT OF LP0DDB
0 ;DEVLOG
0 ;DEVBUF
0 ;DEVIAD
0 ;DEVOAD
0 ;DEVCHN
LP0DDS==.-LP0DDB
LOC LP0DDB+LP0LEN ;RELOCATE OURSELVES OVER ZERO SEGMENT OF
; LP0DDB
;LPTDSP LPTCLS
;** LPTSER.MAC **
;LINE PRINTER SERVICE DISPATCH TABLE
LPTDSP: JRST CPOPJ ;RELEASE
JRST LPTCLS ;CLOSE
JRST LPTOUT ;OUTPUT
JRST ILLINP ;INPUT
LPTCLS: PUSHJ PDP,OUT ;WRITE OUT LAST BUFFER IF THERE IS SOMETHING THERE
LDB TAC,PDEVO ;HAVE WE REALLY SET UP AN ACTIVE TPL: FILE ?
JUMPE TAC,CPOPJ ;NO
ROT TAC,-13. ;INSERT CHANNEL # INTO AC FIELD
IOR TAC,[.CLOSE 0,] ;CONSTRUCT A .CLOSE CHNUM,
XCT TAC ;DO IT
LDB TAC,PDEVO ;NOW RETURN CHANNEL TO GENERAL POOL
PUSHJ PDP,RTFCHN
SETZ TAC,
DPB TAC,PDEVO ;AND SIGNAL NO ACTIVE FILE IN LPTDDB
POPJ PDP,
;LPTOUT LPTOU1 LPTOU2
;** LPTSER.MAC **
;LINE PRINTER OUTPUT UUO ROUTINE
LPTOUT: HRRZ TAC,DEVOAD(DDB) ;GET ADDR IN USER CORE OF CURRENT BUFFER
HRLZI TAC,1(TAC) ;WE WANT TO BEGIN READING FROM 3RD WORD OF BUFFER
HRRI TAC,MONBUF ;AND WE WILL PUT IT INTO MONBUF
.UBLTI TAC,MONBUF+LPTSIZ-1 ;READ IN LPTSIZ WORDS
HRRZ TAC1,MONBUF ;-WORD COUNT
JUMPE TAC1,LPTOU2 ;IF=0, THERE IS NOTHING TO DO
LDB TAC,PDEVO ;HAVE WE AN ACTIVE TPL: FILE SET UP ?
JUMPN TAC,LPTOU1 ;SKIP TO LPTOU1: IF SO
PUSHJ PDP,GTFCHN ;NOT SO, FIRST GET A CHANNEL FOR OURSELVES
JRST NOCHNE
DPB TAC,PDEVO ;INSERT IT INTO LPTDDB:
ROT TAC,-13. ;CONSTRUCT A .OPEN CHNUM,FILNAM
IOR TAC,[.OPEN 0,FILNAM]
MOVE AC1,[IBOMDE,,(SIXBIT /TPL/)]
MOVEM AC1,FILNAM
XCT TAC ;DO THAT .OPEN
JRST TPLNA ;THE TPL: DEVICE WILL NOT ACCEPT THE .OPEN
LPTOU1: IMULI TAC1,5 ;-> # OF CHARACTERS TO PROCESS
MOVE AC1,[POINT 7,MONBUF,35,]
MOVE AC2,[POINT 7,MONBUF,35,]
ILDB AC3,AC1 ;COLLECT CHARACTER FROM TAKER
JUMPE AC3,.+3 ;FILTER OUT NULLS AND EMBEDDED ^C'S
CAIE AC3,3
IDPB AC3,AC2 ;A GOOD CHARACTER GOES BACK INTO PUTTER
SOJG TAC1,.-4
MOVEI TAC1,(AC2)
MOVEI TAC,3
IDPB TAC,AC2 ;FILL OUT FINAL WORD WITH ^C'S
CAIN TAC1,(AC2)
JRST .-2
MOVNI TAC1,-MONBUF(TAC1)
HRLZI TAC1,(TAC1)
HRRI TAC1,MONBUF+1 ;BEGIN WRITING AT MONBUF+1
LDB TAC,PDEVO ;NOW THE .IOT-WORD IS SETUP, NEXT CONSTRUCT
ROT TAC,-13. ;THE .IOT ITSELF
IOR TAC,[.IOT 0,TAC1]
XCT TAC ;WRITE OUT THIS BUFFER'S WORTH
LPTOU2: PUSHJ PDP,ADVBFE ;ADVANCE OUTPUT BUFFER
POPJ PDP,
JRST OUT ;MORE TO OUTPUT, FIRST GO COMPUTE PROPER WORD COUNT
;IOSUPR TPMON DDTM SYNC TTYIOW FCS NOECHO DLRSUP BUF PUTR PCTR TAKR TCTR FCTR
;** SCNSRF.MAC **
;DATA STRUCTURES AND PARAMETERS
;TTY DDB FORMAT
; DEVCHR: RIGHT HALF
; BITS 24-35 = MONITOR BUFFER SIZE+1
; DEVIOS: LEFT HALF
IOSUPR==200 ;SUPPRESS ALL OUTPUT TILL NEXT
;INPUT OR INIT (^0)
TPMON==400 ;TTY IS IN MONITOR COMMAND MODE
DDTM==1000 ;DDT MODE
SYNC==20000 ;BREAK CHAR SEEN - SIGNAL TO
;INCREMENT SYNC COUNT
TTYIOW==400000 ;TTY INPUT WAIT BIT -- RESET BY CHAR INTERRUPT
;PROCESSOR AND USED AS A SWITCH WHEN PROGRAM NO LONGER WAITING FOR TTY
; DEVIOS: RIGHT HALF
FCS==100 ;FULL CHARACTER SET. PASS ON ALL
;CHARS EXCEPT ^C - NO SPECIAL PROCESSING
NOECHO==200 ;ECHO SUPPRESSION REQUESTED BY PROG
DLRSUP==400 ;400 SUPPRESSES "$" FOR ALTMODE
; DEVIAD: BITS 6-12 = HORIZONTAL POSITION
; (BYTE POINTER = PHPOS)
;THE FOLLOWING ARE DEFINITIONS OF THE RELATIVE LOCATIONS OF THE
;BUFFER PARAMETER WORDS OF THE DEVICE DATA BLOCK
BUF==0 ;BUF(DAT) CONTAINS POINTER TO BEG. OF CURRENT BUFFER
PUTR==1 ;PUTR(DAT) = BYTE POINTER TO PUT CHARACTERS INTO BUFFER.
; IT MUST ALWAYS BE AHEAD OF OR EQUAL TO THE TAKER POINTER.
PCTR==2 ;NUMBER OF TIMES PUTR MAY BE INCREMENTED BEFORE
; REACHING THE LAST BYTE IN THE LAST WORD OF THE BUFFER.
TAKR==3 ;TAKER POINTER TO PICK UP CHARACTERS.
; WHEN THE TAKR IS EQUAL TO THE PUTR, THE BUFFER IS "EMPTY."
TCTR==4 ;COUNT OF NUMBER OF TIMES TAKR CAN BE INCREMENTED BEFORE
; REACHING PHYSICAL END OF THE BUFFER.
FCTR==5 ;COUNT OF FREE CHARACTERS LEFT IN BUFFER, I.E.
; HOW MANY TIMES THE PUTR MAY BE INCREMENTED BEFORE IT WOULD
; COME AROUND AND "STEP ON" THE TAKR. WHEN =0, NO MORE CHARS
; MAY BE PLACED IN THE BUFFER.
;PHPOS PCOMIC PLSTLC
;** SCNSRF.MAC **
;DEFINITION OF LINE CHARACTERISTCS (SEE TTYLIN OF SCNDDB)
FULTWX==4 ;SELF-ECHOING FULL DUPLEX (I.E. DATEL)
T35==10 ;MODEL 35
T37==20 ;MODEL 37
ROBTPD==40 ;RUBOUT TYPED LAST (ECHO \ BEFORE NEXT CHAR.)
LGLSET==T35+T37+FULTWX ;THESE CAN BE SET OR RESET BY PROGRAM
;ACCUMULATOR ASSIGNMENTS
CHREC==TEM ;AC FOR CHARACTER
LINE==TAC1 ;SCANNER LINE NUMBER
HPOS==ITEM ;HORIZONTAL POSITION OF TTY (0-71)
;BYTE POINTERS
PHPOS: POINT 7,DEVIAD(DDB),12, ;HORIZONTAL POSITION
PCOMIC: POINT 9,TTYPTR(DDB),19, ;FOR RESCANNING COMMAND INPUT LINE
PLSTLC: POINT 9,TTYPTR(DDB),28, ;FOR ^U DELETION
;TTYPTR CONTAINS THE FOLLOWING BYTES:
;
; 11-19 PCOMIC, FOR COMMAND RESCAN
; 20-28 PLSTLC, FOR ^U
;SETBFI TSETBF SETBF2 PUTCHI PUTCI1
;** SCNSRF.MAC ** PAGE 8
SETBFI: MOVEI DAT,1
DPB DAT,PCOMIC ;FOR RESCAN
DPB DAT,PLSTLC ;FOR ^U
MOVSI TAC,T37
IORM TAC,TTYLIN(DDB) ;DEFAULT TO T37
MOVEI DAT,TTIBUF(DDB)
SETZM TISYNC(DDB) ;ZERO BREAK COUNT
MOVE TAC,BUF(DAT)
HRLI TAC,(POINT 7,,-1,)
MOVEM TAC,TAKR(DAT)
MOVEM TAC,PUTR(DAT)
MOVEI TAC,1
MOVEM TAC,TCTR(DAT)
MOVEM TAC,PCTR(DAT)
HLRZ TAC,BUF(DAT)
MOVEM TAC,FCTR(DAT)
POPJ PDP,
TSETBF: PUSHJ PDP,SETBFI
SETBF2: .RESET CTYO,
POPJ PDP,
;ROUTINE TO PUT A CHARACTER INTO A BUFFER
;CALL MOVEI DAT,TTXBUF(DDB) ;SPECIFIES BUFFER
; PUSHJ PDP,PUTCHI
; ERROR RETURN, BUFFER "FULL"
; SUCCESSFUL RETURN
PUTCHI: SOSGE FCTR(DAT)
JRST PUTCI0
SOSLE PCTR(DAT) ;LAST BYTE IN BUFFER FILLED ?
JRST PUTCI1 ;NO - GO AHEAD
PUSH PDP,TAC
MOVE TAC,BUF(DAT)
HLRZM TAC,PCTR(DAT)
HRLI TAC,440700 ;MAKE A BYTE POINTER
MOVEM TAC,PUTR(DAT) ;STORE IT
POP PDP,TAC ;RESTORE TAC
PUTCI1: IDPB CHREC,PUTR(DAT)
JRST CPOPJ1
;GETCHR GETCH2 GETCH1 PUTCI0 PUTCHO PUTCH SPCHEK SPCHK1
;** SCNSRF.MAC ** PAGES 9+10
;ROUTINE TO PICK UP A CHARACTER FROM ANY BUFFER
;CALL MOVEI DAT,TTXBUF(DDB) ;SPECIFIES BUFFER
; PUSHJ PDP,GETCHR
; ONLY RETURNS TO HERE
GETCHR: HLRZ CHREC,BUF(DAT) ;SIZE OF THIS BUFFER
CAMG CHREC,FCTR(DAT)
JRST GETCH1
SOSLE TCTR(DAT)
JRST GETCH2
MOVE CHREC,BUF(DAT)
HLRZM CHREC,TCTR(DAT)
HRLI CHREC,440700
MOVEM CHREC,TAKR(DAT)
GETCH2: ILDB CHREC,TAKR(DAT)
AOS FCTR(DAT)
JUMPE CHREC,GETCHR
POPJ PDP,
GETCH1: TDZA CHREC,CHREC
PUTCI0: AOS FCTR(DAT)
POPJ PDP,
;ROUTINE TO PLACE A CHARACTER INTO THE OUTPUT BUFFER
PUTCHO: PUSH PDP,TAC ;SAVE TAC
LDB TAC,PDEVO ;GET OUTPUT CHANNEL ON I.T.S.
DPB TAC,[POINT 4,TAC,12,] ; AND STICK IT IN CURRENT AC
TLO TAC,(.IOT)
HRRI TAC,CHREC
PUTCH: XCT TAC
JRST TPOPJ ;POP PDP -> AC(TAC), THEN RETURN
;ROUTINE TO CHECK IF A CHARACTER IS SPECIAL (ASCII 0-37, 175-177)
;CALL MOVE CHREC,CHAR. TO BE CHECKED
; PUSHJ PDP,SPCHEK
; RETURN1 IF REGULAR ASCII CHAR (40-174), C(TAC)=0
; RETURN2 IF SPECIAL CHAR., TAC LOADED WITH WORD FROM SPCTAB
SPCHEK: MOVEI TAC,0
CAIGE CHREC,40
JRST SPCHK1
CAIG CHREC,174
POPJ PDP,
SKIPA TAC,SPCTAB-135(CHREC)
SPCHK1: MOVE TAC,SPCTAB(CHREC)
JRST CPOPJ1 ;SKIP RETURN
;SPCTAB
;** SCNSRF.MAC ** PAGE 11
;SPECIAL CHARACTER TABLE
;FORMAT XWD BITS,ADDRESS OF ROUTINE
;HIGH ORDER BITS IN LEFT HALF:
SPACTN==400000 ;SPECIAL ACTION TO BE TAKEN
SPOUT==100000 ;SPECIAL HANDLING ON UUO OUTPUT
; I.E. VT,FF,HT
BREAKB==20000 ;BREAK CHARACTER
FCSBRK==4000 ;BREAK CHARACTER IN FCS (100) MODE
ECHSUP==2000 ;SUPPRESS ECHO OF CHAR ITSELF
SPCTAB: ECHSUP,,0 ;NULL
ECHSUP,,0 ;^A
ECHSUP,,0 ;^B
SPACTN+ECHSUP+BREAKB,,CONTC ;^C
ECHSUP,,0 ;^D <EOT>
ECHSUP,,0 ;^E
ECHSUP,,0 ;^F
FCSBRK,,0 ;^G <BELL>
SPACTN,,CONTH ;^H <BACKSPACE>
SPACTN+SPOUT,,CONTI ;^I <TAB>
BREAKB,,0 ;^J <LF>
SPACTN+SPOUT+BREAKB,,CONTK ;^K <VERT TAB>
SPACTN+SPOUT+BREAKB,,CONTL ;^L <FF>
SPACTN,,CR ;^M <CR>
ECHSUP,,0 ;^N
SPACTN,,CONTO ;^O SUPPRESS OUTPUT
ECHSUP,,0 ;^P
ECHSUP,,0 ;^Q
ECHSUP,,0 ;^R
ECHSUP,,0 ;^S
ECHSUP,,0 ;^T
SPACTN,,CONTU ;^U
ECHSUP,,0 ;^V
ECHSUP,,0 ;^W
ECHSUP,,0 ;^X
ECHSUP,,0 ;^Y
SPACTN+BREAKB+ECHSUP,,CONTZ ;^Z <TTY EOF>
SPACTN+BREAKB+ECHSUP,,ALTMOD ;ASCII 33 <ALTMODE>
ECHSUP,,0 ;ASCII 34
ECHSUP,,0 ;ASCII 35
ECHSUP,,0 ;ASCII 36
ECHSUP,,0 ;ASCII 37
;CHARS 0-40 ABOVE, 175-177 BELOW:
SPACTN+BREAKB+ECHSUP,,ALTMOD ;ASCII 175
SPACTN+BREAKB+ECHSUP,,ALTMOD ;ASCII 176
SPACTN+ECHSUP+FCSBRK,,RUBOUT ;177 <RUBOUT>
;DDTIN
;** SCNSRF.MAC ** PAGE 12
;INPUT TO DDT
;CALL AC,[SIXBIT /DDTIN/]
;BUFFER AREA MUST BE 21 WORDS LONG
DDTIN: PUSHJ PDP,TTYFNU
MOVSI IOS,TTYIOW+DDTM
IORB IOS,DEVIOS(DDB) ;PUT INTO I/O WAIT
; IF WE FIND AN EMPTY BUFFER
MOVE TAC,TIPUTR(DDB) ;PLACE IN BUFFER TO PUT NEXT CHAR
CAMN TAC,TITAKR(DDB) ;ANYTHING IN BUFFER ?
PUSHJ PDP,TWSYNC ;NO
MOVSI IOS,TTYIOW
ANDCAB IOS,DEVIOS(DDB)
MOVSI TAC,IOFST+DDTM
IORM TAC,DEVIOS(DDB)
.UMOVE TAC,(UUO) ;CONTENTS OF USER AC
HRRZ TAC,TAC
ADDI TAC,21
PUSHJ PDP,IADRCK
JRST ADRERR
SUBI TAC,21
PUSHJ PDP,IADRCK
JRST ADRERR
PUSH PDP,TAC
MOVE AC2,[POINT 7,MONBUF,-1,] ;TEMPORARILY PUT CHARS INTO MONBUF - SEND THEM
; TO USER W/A .UBLTO
MOVEI DAT,TTIBUF(DDB)
MOVEI AC1,<21*5>-1 ;= # CHARS ALLOWED
;XFRIN XFRIN1 XFRIN2 DDTCNC TWSYNC
;** SCNSRF.MAC ** PAGE 13
XFRIN: PUSHJ PDP,GETCHR
JUMPE CHREC,XFRIN2
PUSHJ PDP,SPCHEK
JRST XFRIN1
TLNE TAC,FCSBRK+BREAKB
SOS TISYNC(DDB)
XFRIN1: CAIN CHREC,3 ;A PRESTORED ^C ?
JRST DDTCNC ;YES - GO INTO MONITOR MODE
IDPB CHREC,AC2 ;PUT CHAR INTO INTERMEDIARY BUFFER
SOJG AC1,XFRIN
XFRIN2: MOVEI CHREC,0 ;TERMINATE STRING
IDPB CHREC,AC2
MOVSI TAC,IOSUPR
ANDCAM TAC,DEVIOS(DDB)
HRRZI AC2,-MONBUF(AC2) ;= WORD # WHERE FINAL STRING STORED
POP PDP,TAC ;TAC HAS ADR IN USER AREA
ADDI AC2,(TAC) ;COMPUTE FINAL ADDR IN USER AREA
; AC(AC2) = "TO" ADDR
HRLI TAC,MONBUF ;THE "FROM" ADDR
.UBLTO TAC,(AC2) ;ZAP IT TO USER
POPJ PDP, ;ALL DONE
DDTCNC: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS
JRST MONUS6 ;GO PROCESS ^C
;TWSYNC: IS CALLED FOR INPUT IO WAIT. SPECIFICALLY FROM 4 PLACES.
; (1) DDTIN: WAITING FOR INPUT IN DDT MODE, (2) TTYIN: WAITING FOR INPUT
; IN LINE MODE (INPUT UUO FOR TTY), (3) INCHWL: TTCALL WAITING FOR
; CHARACTER, LINE MODE, AND (4) INCHRW: TTCALL WAITING FOR A
; CHARACTER, DDT MODE.
TWSYNC: JRST WSYNC
;AT WSYNC: WE WILL SAVE THE BULK OF OUR ACCUMULATORS, INCLUDING
; OUR PUSHDOWN STACK. NOTE: THE IOACT BIT IN AC(IOS) IS ALWAYS SET WHICH
; WOULD INVOKE SAVING ACCUMULATORS. SINCE WE DO NOT WISH TO LOSE
; OUR PUSHDOWN STORAGE, WE WILL HAVE TO HAVE TWO PUSHDOWN LISTS -
; CORRESPONDING TO THAT USED BY THE SCANNER SERVICE AND THE INITIAL PART
; OF THE COMMAND DECODER (IN NULL JOB) AND THAT OF UUOCON AND COMCON
; AFTER MONSTR HAS BEEN CALLED.
;DDTOUT DDT5 DDT2 DDT3 TYUUO TTYUU1
;** SCNSRF.MAC ** PAGES 14+15
;OUTPUT FROM DDT
;CALL AC,[SIXBIT /DDTOUT/]
; AC HAS POINTER TO DDT OUTPUT BUFFER
DDTOUT: PUSHJ PDP,TTYFNU
.UMOVE UUO,(UUO)
DDT5: MOVSI IOS,DDTM
IORB IOS,DEVIOS(DDB)
PUSHJ PDP,TYUUO ;SIGNAL TTY OUTPUT UUO IN PROGRESS
HRRI UUO,-1(UUO) ;COMPENSATE FOR GETWD1:
DDT2: MOVE DAT,[440700,,TAC] ;BYTE POINTER TO AC(TAC)
PUSHJ PDP,GETWD1 ;GET THE USER'S WORD
DDT3: TLNN DAT,760000 ;ANY CHARS LEFT?
JRST DDT2 ;NO - NEXT WORD NEEDED
ILDB CHREC,DAT ;YES - GET NEXT
JUMPE CHREC,CPOPJ ;NULL ENDS THE STRING
PUSHJ PDP,OUTCHR ;OUTPUT CHAR
JRST DDT3
TYUUO: TLNE IOS,IOSUPR ;WILL CHARACTERS ACTUALLY GO OUT ?
TTYUU1: JRST CPOPJ ;NO
SETOM TTYOIP ;YES, SIGNAL TTY OUTPUT IN PROGRESS
SETZM CNCLAS ;AND NOT ^C LAST
LDB CHREC,TITAKR+CTYDDB ;WAS LAST CHAR TYPED A ^C ?
CAIN CHREC,3
SETOM CNCLAS ;YES, SET FLAG
.DISMIS TTYUU1 ;AND NOW LEAVE INTERRUPT LEVEL !!!
;OUTCHR OUTCHS OUTCH3
;** SCNSRF.MAC ** PAGE 15
;OUTCHR: CALLED TO OUTPUT A CHARACTER
; AC(DAT) AND AC(DDB) MUST BE SET UP
; CHECK IS MADE FOR WHETHER SPECIAL ECHO IS REQUIRED
; RIGHT THINGS ARE DONE WITH PHPOS AND HPOS (NEEDN'T BE SET)
;CALL: MOVE CHREC,CHAR TO BE OUTPUT
; PUSHJ PDP,OUTCHR
; RETURN, WITH CHAR, OR ITS SPECIAL ECHO OUTPUT
OUTCHR: TLNE IOS,IOSUPR ;I/O OFF DUE TO ^O ?
POPJ PDP, ;YES, RETURN
OUTCHS: PUSH PDP,TAC
PUSH PDP,HPOS
PUSH PDP,TAC1 ;(TAC1=LINE)
ANDI CHREC,177 ;MASK JUNK
LDB HPOS,PHPOS ;GET HORIZONTAL POSITION
PUSHJ PDP,ADJHP ;FIGURE OUT WHAT NEW HPOS WOULD BE
JFCL ;IGNORE SKIP/NO SKIP RETURN
PUSH PDP,IOS ;SAVE IO STATUS
TRZ IOS,NOECHO
CAILE HPOS,72.
PUSHJ PDP,CRLFEC
POP PDP,IOS
TLNE TAC,SPOUT ;VT,FF,HT ?
JRST OUTCH1 ;YES
PUSHJ PDP,PUTCHO ;NO - PLACE IN BUFFER
OUTCH3: DPB HPOS,PHPOS ;UPDATE HPOS
POP PDP,TAC1
POP PDP,HPOS
JRST TPOPJ ;AREN'T WE GLAD THAT WE PUSH'ED TAC FIRST, FOR WE
;MAY USE THE TPOPJ EXIT
;OUTCH1 OUTC1B OUTC1A ADJHP
;** SCNSRF.MAC ** PAGE 16
;HERE ON UUO OUTPUT OF HT,FF,VT
OUTCH1: MOVE LINE,TTYLIN(DDB) ;GET LINE CHARACTERISTICS
TLNE LINE,T35 ;SMART TTY ?
JRST OUTC1A ;YES
MOVE TAC,CHREC ;NO - COPY CHAR
MOVEI CHREC,40 ;SIMULATE WITH SPACES
LDB HPOS,PHPOS
CAIE TAC,11 ;HT ?
MOVEI CHREC,12 ;NO - FOR VT,FF SIMULATE WITH LINEFEEDS
CAIN TAC,14 ;FF ?
MOVNI HPOS,10 ;YES -> 8 LINEFEEDS
CAIN TAC,13 ;VT ?
MOVNI HPOS,4 ;YES -> 4 LINEFEEDS
OUTC1B: PUSHJ PDP,PUTCHO ;OUTPUT SIMULATED EQUIVALENT
ADDI HPOS,1 ;VT'S AND FF'S WORK THEIR WAY FROM A NEGATIVE HPOS TO 0.
; HT WORKS ITS WAY TO A TAB STOP.
TRNE HPOS,7
JRST OUTC1B
JRST OUTCH3
OUTC1A: PUSHJ PDP,PUTCHO ;HERE ON OUTPUT OF HT,FF,VT TO A MODEL 35
JRST OUTCH3
ADJHP: CAILE CHREC,174 ;HIGH SPECIALS
JRST SPCHEK ;YES - NO CHANGE IN HPOS
CAIL CHREC,40 ;CONTROL CHAR ?
AOJA HPOS,SPCHEK ;NO
CAIN CHREC,10 ;BACKSPACE ?
SOJL HPOS,.+2 ;YES
CAIN CHREC,15 ;<CR> ?
MOVEI HPOS,0 ;YES
CAIE CHREC,11 ;<TAB> ?
JRST SPCHEK ;NO
TRO HPOS,7 ;ROUND UP 8 IN 2 INSTRS
AOJA HPOS,SPCHEK
;SCNDDB
;** SCNSRF.MAC ** PAGE 20
ZZ==.
SCNDDB: SIXBIT /TTY/ ;DEVNAM
SCNCOR,,STTYBF+1 ;DEVCHR
0 ;DEVIOS
SCNDSP ;DEVSER - ADDRESS OF TTY SERVICER
DVTTY+DVOUT+TTYUSE,,3 ;DEVMOD - TTY DOES ASCII/ASCII-LINE
; OUTPUT
; (ONLY CTY DOES BOTH INPUT AND OUTPUT)
0 ;DEVLOG - LOGICAL NAME (6 BYTES)
0 ;DEVBUF - O.B./I.B. HEADER ADDRESSES
0 ;DEVIAD - CURRENT I.B. ADDRESS
; AND HORIZONTAL POSITION (BITS 6-12.)
0 ;DEVOAD - NOT USED BY TTY (BUT USED BY OTHERS)
0 ;DEVCHN - I.T.S.-ASSOCIATED CHANNELS
TTIBUF==.-ZZ
STTYBF*5,,0 ;ADDR OF TTY I.B.
SCNLEN==.-SCNDDB
TIPUTR==.-ZZ ;TTY I.B. PUTTER
0
TIPCTR==.-ZZ ;# CHARS LEFT IN I.B. BEFORE LAST
0 ;LAST BYTE IS REACHED
TITAKR==.-ZZ ;TAKER
0
TITCTR==.-ZZ
0
TIFCTR==.-ZZ ;FREE CTR - # CHARS LEFT FOR PUTTING
0
TIBF==.-ZZ
BLOCK STTYBF
TTYPTR==.-ZZ
0
TISYNC==.-ZZ ;COUNTS BREAK CHARACTERS
0
TTYLIN==.-ZZ ;WHERE LINTAB BITS WOULD ORDINARILY GO
0
TTYCHR==STTYBF*5
SCNDDS==.-ZZ ;LENGTH OF PROTOTYPE DDB
LOC SCNDDB+SCNLEN ;FROM TIPUTR TO THE END OF SCNDDB THERE ARE ONLY ZEROES
;SCNDSP TTYIN TENDIN T0POPJ
;** SCNSRF.MAC ** PAGE 23
;DEVICE DEPENDENT PART OF IO UUOS
;DISPATCH TABLE
SCNDSP: JRST TTYREL ;RELEASE
JRST OUT ;CLOSE
JRST TTYOUT ;OUTPUT
TTYIN: ;INPUT
MOVSI IOS,TTYIOW
IORB IOS,DEVIOS(DDB)
MOVSI IOS,DDTM+TPMON ;ZAP USER OUT OF COMMAND MODE IF PROGRAM WANTS DATA FROM
; USER (E.G. DURING A CSTART OR CCONTINUE)
ANDCAB IOS,DEVIOS(IOS)
PUSHJ PDP,STLNAC
SKIPG TISYNC(DDB)
PUSHJ PDP,TWSYNC
PUSHJ PDP,MONUSR
TENDIN: MOVSI IOS,TTYIOW+DDTM+IOSUPR
T0POPJ: ANDCAB IOS,DEVIOS(DDB)
POPJ PDP,
;MONUSR MONUS1 MONUS2 MONUS3 MONUS5
;** SCNSRF.MAC ** PAGE 24
;ROUTINE TO MOVE LINE OR STRING FROM TTY INPUT BUFFER TO USER'S I.BUFFER.
; CALLED FROM INPUT UUO ONLY. THE ROUTINE CONSTRUCTS AN IMAGE OF THE
; USER'S BUFFER IN CORE, DATA BEGINNING AT MONBUF+1
MONUSR: HRRZ TAC,DEVIAD(DDB) ;ADDRESS OF BUFFER IN USER AREA
PUSHJ PDP,BUFCLR ;CLEAR WHOLE BUFFER
JRST ADRERR ;ADDR CHECK RETURN
PUSHJ PDP,CLRMBF ;CLEAR MONBUF SO THAT A PARITALLY FILLED DATA WORD
; WILL BE FILLED WITH ZEROES
PUSHJ PDP,STLNAC ;SET UP AC(LINE)
MOVEI AC2,TTYCHR ;MAX # CHARACTERS
MOVE AC1,[10700,,MONBUF] ;BEGIN ZIPPING CHARACTERS INTO MONBUF+1.
; WE USE THIS BYTE POINTER RATHER THAN 440700,,MONBUF+1 SO THAT
; WE CAN DO A SUBTRACT-IMMEDIATE ON MONBUF TO FIND OUT HOW MANY WORDS ARE
; FILLED WITH DATA
MOVEI DAT,TTIBUF(DDB) ;SPECIFIY USER'S I.BUFFER
MONUS1: PUSHJ PDP,GETCHR ;GET A CHAR
JUMPE CHREC,MONUS3 ;=0 -> EMPTY
IDPB CHREC,AC1 ;PUT CHAR -> MONBUF
PUSHJ PDP,SPCHEK ;SPECIAL CHARACTER ?
JRST MONUS2 ;NO
TLNE TAC,FCSBRK+BREAKB ;BREAK CHAR ?
SOSA TISYNC(DDB) ;YES - REDUCE SYNC
MONUS2: SOJG AC2,MONUS1 ;NON-BREAK
CAIN CHREC,3 ;^C ?
JRST MONUS7 ;YES
MOVEI IOS,0
CAIN CHREC,"Z-100 ;^Z ?
MOVSI IOS,IOEND ;YES
IORB IOS,DEVIOS(DDB)
MONUS3: HRRZ AC2,DEVIAD(DDB)
.UMOVE AC2,1(AC2) ;COLLECT 3RD WORD OF BUFFER
MOVEM AC2,MONBUF ;PUT IT INTO INTERMEDIATE BUFFER
; WE WILL UPDATE ITS RIGHT HALF
SUBI AC1,MONBUF ;COMPUTE # WORDS USED
HRRM AC1,MONBUF ;EVERYTHING ALL SET UP
HRRZ AC2,DEVIAD(DDB) ;THE "TO" ADDRESS-1
HRRZI AC2,1(AC2) ;BEGIN 1 WORD BEFORE BUFFER DATA
HRLI AC2,MONBUF ;THE "FROM" ADDRESS
ADDI AC1,(AC2) ;COMPUTE THE ADDRESS OF THE FINAL WORD TRANSFERRED
.UBLTO AC2,(AC1) ;SOCK IT TO USER
PUSHJ PDP,ADVBFF ;INPUT UUO DONE, NEXT BUFFER IN USE ?
JRST MONUS5 ;YES - ALL DONE
SKIPLE TISYNC(DDB) ;NO - BUT CAN BE GIVE HIM MORE ?
JRST MONUS8 ;YES
MONUS5: MOVSI IOS,IOFST
IORB IOS,DEVIOS(DDB)
POPJ PDP,
;MONUS6 MONUS7 MONUS8
;** SCNSRF.MAC ** PAGE 25
MONUS6: PUSHJ PDP,CNCMOD ;^C MODE
MOVSI TAC,70000 ;DECREMENT TAKR
ADDM TAC,TITAKR(DDB) ;SO NEXT ILDB WILL GET ^C
AOS TITCTR(DDB) ;ADJUST FREE COUNTER
SOS TIFCTR(DDB)
AOS TISYNC(DDB)
PUSHJ PDP,COMSET
JRST WSYNC ;SAVE PUSHDOWN STACK IN USER AREA AND GET COMMAND
; PUSHDOWN STACK IS VITAL BECAUSE JOBPC WILL ONLY HAVE
; A MONITOR PC POINTING INTO THE SIMULATOR. JOBPD1 WILL
; CONTAIN WHAT WE ARE INTERESTED IN.
MONUS7: MOVSI IOS,TTYIOW
IORB IOS,DEVIOS(DDB)
PUSHJ PDP,MONUS6 ;GET ^C TO COMMAND DECODER
JRST TTYIN ;A "CONTINUE" WILL GET US BACK HERE - EXCEPT THAT
; USTART: REINVOKES THE CALLING USER UUO FROM THE USER'S PROGRAM
; THUS, I DON'T THINK WE EVER GET HERE
MONUS8: TLNN IOS,IOEND ;ROOM FOR ANOTHER BUFFER, BUT HAVE WE SEEN A ^Z ?
JRST MONUSR ;NO
POPJ PDP,
;TTYOUT TYOUT1 USRMON USRMN2 USRMN5
;** SCNSRF.MAC ** PAGES 26+27
;OUTPUT UUO
TTYOUT: LDB TAC,PDEVO ;DO WE HAVE A CHANNEL ALREADY ASSIGNED ?
JUMPN TAC,TYOUT1
PUSHJ PDP,GTFCHN ;NO - GET ONE
JRST NOCHNE ;NONE AVAILABLE
DPB TAC,PDEVO
LDB TAC1,[POINT 12,DEVNAM(DDB),29,] ;COLLECT NM CHARACTERS FROM TTY NAME
; NOTE AC(TAC1)=AC(LINE) - BUT STLNAC: SETS UP LINE BEFORE WE
; REALLY DO ANYTHING
IORI TAC1,(SIXBIT /T/) ;MAKE TNM DEVICE NAME
HRLI TAC1,CTYOMD ;.OPEN IT IN IMAGE, UNIT, OUTPUT MODE
MOVEM TAC1,FILNAM ;SAVE IT AWAY FOR THE .OPEN
SETZM FILNM1
SETZM FILNM2
ROT TAC,-13. ;INSERT CHANNEL NUMBER INTO AC FIELD
IOR TAC,[.OPEN 0,FILNAM] ;CONSTRUCT THE .OPEN
XCT TAC ;DO IT
JRST TTYNA ;FAILED
TYOUT1: MOVSI IOS,IOBEG
TDNE IOS,DEVIOS(DDB)
TLO IOS,IOSUPR ;KILL ^O ON FIRST OUTPUT
IOR IOS,[TPMON+DDTM,,]
ANDCAM IOS,DEVIOS(DDB)
MOVSI IOS,IOFST
IORB IOS,DEVIOS(DDB)
PUSHJ PDP,TYUUO ;SIGNAL TTY OUTPUT IN PROGRESS IF
; CHARS ARE REALLY GOING OUT
PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS - NEEDED WHEN WE OUTPUT THE
PUSHJ PDP,USRMON ; IN USRMON:
PUSHJ PDP,ADVBFE
JFCL ;MORE BUFFER AVAILABLE
POPJ PDP, ;NO MORE BUFFERS
;ROUTINE TO MOVE USER OUTPUT BUFFER TO MONITOR OUTPUT BUFFER.
USRMON: HRRZ AC1,DEVOAD(DDB) ;GET O.BUFFER ADDR
PUSHJ PDP,UADRCK ;AND CHECK IT
.UMOVE AC2,1(AC1) ;READ 3RD WORD OF CURRENT BUFFER
HRRZ AC2,AC2 ;RH ONLY (=WORD COUNT). C.F. P 398 DEC PDP10 R.M. (1969)
SKIPN AC2 ;# OF WORDS TO OUTPUT
MOVEI AC2,1
ADDI AC1,-1(AC2) ;COMPUTE L.W. IN BUFFER UNLESS .LT. 1 WORD
PUSHJ PDP,UADRCK ;AND BE SURE THAT IT'S OK
HRRZ AC1,DEVOAD(DDB) ;ADDR OF BUF
HRLZI AC1,2(AC1) ;DATA BEGINS 2 WORDS LATER - "FROM"
HRRI AC1,MONBUF ;NOW READ INTO MONBUF
.UBLTI AC1,MONBUF-1(AC2)
MOVE AC1,[POINT 7,MONBUF,-1,]
IMULI AC2,5 ;COMPUTE # OF WORDS
USRMN2: ILDB CHREC,AC1 ;PICK UP CHARACTER
JUMPE CHREC,USRMN5 ;IF NULL, IGNORE
PUSHJ PDP,OUTCHR ;PLACE IN OUTBUF
USRMN5: SOJG AC2,USRMN2
POPJ PDP,
;TTYUUO TTUUOT
;** SCNSRF.MAC ** PAGE 28
;TTYUUO - QUANTITY IN AC FIELD DETERMINES AXN OF UUO
TTYUUO: PUSHJ PDP,TTYFNU ;FIND OUR TTY DDB ADDR + PICK UP RANDOM INFO
CAIL UCHN,TTUUOL ;TOO HIGH AC FIELD ?
POPJ PDP, ;YES - NO-OP
CAIE UCHN,1 ;A READ OPERATION ?
CAIN UCHN,3 ;I.E., PURE ?
JRST @TTUUOT(UCHN) ;YES - NO ADDR CHECK REQ.
HRRZ AC1,UUO
PUSHJ PDP,UADCK1
JRST @TTUUOT(UCHN) ;DISPATCH
TTUUOT: INCHRW ;(0) INPUT CHAR, WAIT TILL TYPED
ONEOUT ;(1) OUTPUT A CHARACTER
INCHRS ;(2) INPUT A CHAR, AND SKIP
OUTSTR ;(3) OUTPUT A STRING
INCHWL ;(4) INPUT CHAR, WAIT, LINE MODE
INCHSL ;(5) INPUT CHAR, SKIP, LINE MODE
GETLIN ;(6) GET LINE CHARACTERISTICS WORD
SETLIN ;(7) SET BITS IN LH OF TTYLIN
TRESCU ;(10) BACK UP POINTER TO COMMAND
SETBFI ;(11) CLEAR INPUT BUFFER
SETBF2 ;(12) CLEAR OUTPUT BUFFER
SKPINC ;(13) SKIP IF CHAR TO INPUT
SKPINL ;(14) SKIP IF LINE TO INPUT
IONEOU ;(15) OUTPUT AN IMAGE CHARACTER
TTUUOL==.-TTUUOT
;INCHSL INCHRS INCHWL OUTSTR SKPINL SKPINC NOCTRO
;** SCNSRF.MAC ** PAGE 29
;INPUT A CHARACTER + SKIP
; IF NONE TYPED, THEN DON'T SKIP
INCHSL: SKIPG TISYNC(DDB) ;ANY LINES IN BUFFER ?
JRST NOCTRO ;NO, RETURN CLEARING ^O
INCHRS: MOVEI DAT,TTIBUF(DDB) ;GET A CHARACTER
PUSHJ PDP,GETCHR ; FROM TTI BUFFER
JUMPE CHREC,NOCTRO ;RETURN IF NULL (EMPTY BUFFER) - THIS ALSO
; CLEARS ^O BIT (=IOSUPR)
PUSHJ PDP,SPCHEK ;COLLECT SPCTAB ENTRY
JFCL
TLNE TAC,FCSBRK+BREAKB
SOS TISYNC(DDB) ;DECREMENT SYNC COUNT
PUSHJ PDP,TENDIN
CAIN CHREC,3 ;^C ?
JRST MONUS6 ;YES
.UMOVM CHREC,(UUO) ;MOVE INTO LOC SPECIFIED BY AC(UUO)
JRST CPOPJ1 ;SKIP RETURN
;INPUT A CHAR + WAIT, LINE MODE
INCHWL: PUSHJ PDP,INCHSL ;ANY CHARACTERS ?
JRST .+2 ;NO
POPJ PDP, ;YES - GIVE IT TO USER
MOVSI IOS,TTYIOW ;NONE, WAIT FOR IT
IORM IOS,DEVIOS(DDB)
MOVSI IOS,DDTM ;CLERA DDT MODE BRAK FLAG
ANDCAB IOS,DEVIOS(DDB)
PUSHJ PDP,TWSYNC ;WAIT
JRST INCHWL ;AND TRY AGAIN
;OUTPUT A STRING
OUTSTR: JRST DDT5 ;JUST USE DDT OUTPUT CODE
SKPINL: SKIPLE TISYNC(DDB) ;INPUT BUFFER HAVE A LINE ?
AOS 0(PDP) ;YES - SKIP
JRST NOCTRO ;RETURN, CLEARING ^O
SKPINC: HLRZ TAC,TTIBUF(DDB) ;SIZE OF BUFFER
CAMLE TAC,TIFCTR(DDB) ;SIZE > # FREE CHARS
AOS 0(PDP) ;YES - SKIP
NOCTRO: MOVSI IOS,IOSUPR ;^O BIT
JRST T0POPJ
;INCHRW ONEOUT IONEOU GETLIN SETLIN
;** SCNSRF.MAC ** PAGE 30
;MORE ROUTINES CALLED BY TTYUUO DISPATCHER
;INCHRW GOES INTO "I/O WAIT" IF NO CHARACTER HAS BEEN TYPED--HO SKIPS
INCHRW: PUSHJ PDP,INCHRS ;GET A CHAR IF ONE IS THERE
JRST .+2 ;NONE THERE
POPJ PDP,
MOVSI IOS,TTYIOW+DDTM ;SET UP FOR TTY IOWAIT
IORB IOS,DEVIOS(DDB)
PUSHJ PDP,TWSYNC ;WAIT FOR CHAR TO BE TYPED
JRST INCHRW ;GO GET IT
;ONEOUT OUTPUT ONE CHARACTER
ONEOUT: PUSHJ PDP,GETWDU ;PICK UP CHAR FROM USER
MOVE CHREC,TAC ;PUT IT INTO PROPER AC
ANDI CHREC,177 ;ONLY LAST 7 BITS
JUMPE CHREC,CPOPJ ;AND NO NULLS
JRST OUTCHR ;TYPE IT
IONEOU: PUSHJ PDP,GETWDU ;PICK UP A CHARACTER
MOVE CHREC,TAC
JRST OUTCHR ;AND TYPE IT
;GETLIN PUTS LINE CHARACTERISTICS WORD IN ADDR OF UUO AC FIELD
GETLIN: .UMOVE TAC,(UUO)
SKIPL TAC, ;DOES USER WISH HIS OWN LINE
MOVEI LINE,0
.UMOVM LINE,(UUO)
POPJ PDP,
;ROUTINE TO SET LINE CHARACTERICS THAT ARE SETABLE
SETLIN: MOVSI TAC,LGLSET
ANDCAM TAC,TTYLIN(DDB)
.UMOVE TAC,(UUO)
AND TAC,[LGLSET,,]
IORM TAC,TTYLIN(DDB) ;SET ONLY THOSE BITS THAT USER WANTS TO SET
POPJ PDP,
;TRESCN TRESC1 TRESCU TRESCL TLHBYT TBYTEP
;** SCNSRF.MAC ** PAGES 34+35
TRESCN: LDB TAC,PCOMIC
MOVEM TAC,TITCTR(DDB)
PUSHJ PDP,TBYTEP
MOVEM TAC,TITAKR(DDB)
TRESC1: MOVE TAC,TIPCTR(DDB) ;COMPUTE NEW FREE COUNT
SUB TAC,TITCTR(DDB)
SKIPG TAC
ADDI TAC,TTYCHR
MOVEM TAC,TIFCTR(DDB)
JRST STLNAC
TRESCU: PUSHJ PDP,TRESCN
SETZM TISYNC(DDB)
MOVEI DAT,TTIBUF(DDB)
TRESCL: PUSHJ PDP,GETCHR
JUMPE CHREC,TRESCN ;HAVE WE PASSED THROUGH ALL AVAILABLE CHARS ?
PUSHJ PDP,SPCHEK ;NO - KEEP COUNTING BREAKS
JRST TRESCL
TLNE TAC,FCSBRK+BREAKB
AOS TISYNC(DDB)
JRST TRESCL
TLHBYT: 350700,,0
260700,,0
170700,,0
100700,,0
010700,,0
TBYTEP: PUSH PDP,TAC1
MOVNS TAC
SKIPGE TAC
ADDI TAC,TTYCHR
IDIVI TAC,5
ADD TAC,TTIBUF(DDB)
HLL TAC,TLHBYT(TAC1)
POP PDP,TAC1
POPJ PDP,
;TTYFNU TTYFUW TTYFND TTYREL TTYSET TTYSRC STLNAC TTYSTC TTYSTR
;** SCNSRF.MAC ** PAGES 36-40
;ROUTINE TO FIND USER'S CONSOLE TTY
TTYFNU:
TTYFUW:
TTYFND:
JRST TTYSRC
;DEVICE DEPENDENT PART OF RELEASE UUO
TTYREL: MOVEI IOS,-1 ;CLEAR INITED STUFF IN IOS
JRST T0POPJ ;GO CLEAR OUT IOS BITS
;ROUTINE TO SET TTY INTO USER MODE
;CALL: MOVE DDB,ADDRESS OF DEVICE DATA BLOCK
; PUSHJ PDP,TTYSET
TTYSET: MOVSI IOS,DDTM+IOSUPR+TTYIOW+IOW
JRST T0POPJ ;CLEAR THESE BITS IN AC(IOS) AND RETURN
;ROUTINE TO "SEARCH" FOR USER'S CONSOLE TTY
TTYSRC: MOVEI DDB,CTYDDB
MOVE IOS,DEVIOS(DDB)
STLNAC: MOVE LINE,TTYLIN(DDB)
POPJ PDP,
TTYSTC: MOVSI TAC,TPMON ;PUT TTY IN MONITOR MODE
IORM TAC,DEVIOS(DDB)
;DROP THROUGH TO START UP CODE
TTYSTR: MOVSI IOS,DDTM+IOSUPR+IOBEG
ANDCAB IOS,DEVIOS(DDB)
SKIPLE TISYNC ;DID USER TYPE AHEAD
PUSHJ PDP,COMSET ;YES (COMSET WILL RETURN IMMEDIATELY IF NOT IN MONITOR MODE)
POPJ PDP,
;TTYUSR COMSET
;** SCNSRF.MAC ** PAGES 42+47
;ROUTINE TO START UP JOB
;CALL: MOVE DDB,TTY DDB ADR.
; PUSHJ PDP,TTYUSR
; TTY WILL GO INTO USER MODE
TTYUSR: MOVSI IOS,TPMON ;PUT TTY IN USER MODE
ANDCAM IOS,DEVIOS(DDB)
JRST SETRUN
;ROUTINE TO "WAKE UP" COMMAND DECODER IF TPMON SET
COMSET: TLNN IOS,TPMON ;MONITOR MODE ?
POPJ PDP, ;NO - RETURN
MOVSI IOS,IOFST ;SET FIRST BUFFER FLAG
IORB IOS,DEVIOS(DDB)
POPJ PDP, ;AND RETURN - COMMAND AXN TAKEN AUTOMATICALLY AT
; END OF CHAR INT PROCESSING AND UUO INT PROCESSING
;TTEDIT TIPACK TTIPUT TTIPT1 DUPLX1 SPCECO UPRCTL
;** SCNSRF.MAC ** PAGE 50
;KEYBOARD EDITOR ROUTINE
;UPON RECEIPT OF A CHARACTER, THIS ROUTINE DETERMINES WHAT TO DO
;WITH IT: WHETHER IT'S A SPECIAL CHARACTER NEEDING SPECIAL ECHOING,
;WHETHER SOME OTHER CHARACTER IS TO BE STORED IN ITS PLACE, WHETHER
;IT IS A BREAK CHARACTER (LINE TERMINATOR), OR WHETHER THE CHARACTER
;TYPED IS A SIGNAL TO UNDERTAKE SOME SPECIAL ACTION.
; THIS ROUTINE CALLS SPCHEK:, WHICH MAKES USE OF THE SPECIAL
;CHARACTER TABLE, SPCTAB. NOTE THAT IF A CHARACTER IS TO
;DISPATCH TO A "SPECIAL ACTION ROUTINE" OR A SPECIAL ECHO ROUTINE,
;THE LEFT HALF OF THE CORRESPONDING CHARACTER-WORD MUST HAVE SPACTN SET
;AND THE ADDRESS OF THE SPECIAL ROUTINE MUST BE ASSEMBLED INTO THE
;RIGHT HALF OF THE WORD.
;CALL: HAVE 7-BIT ASCII CHARACTER IN AC(CHREC)
; LDB HPOS,PHPOS
; MOVEI DAT,TTIBUF(DDB)
; PUSHJ PDP,TTEDIT
; RETURN WITH ACTION DONE, SYNC (LH OF AC(IOS)) SET IF BREAK CHAR STORED.
TTEDIT: PUSHJ PDP,ADJHP
JRST TIPACK ;NOT SPECIAL
MOVSI IOS,0 ;RESET IOS
TLNE TAC,BREAKB+FCSBRK ;BREAK CHAR ?
;NOTE: FCSBRK CHAR IS BREAK BOTH IN NORMAL AND FCS MODES
TLO IOS,SYNC ;BREAK CHAR, SET SYNC
IORB IOS,DEVIOS(DDB)
JUMPL TAC,0(TAC) ;DISPATCH IF SPACTN - I.E. SPECIAL CHAR
TIPACK: CAIGE CHREC,140 ;L.C. LETTER ?
JRST TTIPUT ;NO
TLNN LINE,T37 ;YES - IN MODEL-37 MODE ?
TRZ CHREC,40 ;NO - MAKE IT U.C.
TTIPUT: TLZE LINE,ROBTPD ;ARE WE IN DELETE MODE ?
PUSHJ PDP,BSECHO ;YES - OUTPUT A "\"
TTIPT1: PUSHJ PDP,PUTCHI ;PUT CHAR IN INPUT BUFFER
JRST INBFUL ;BUT IT WON'T GO
TLNN TAC,ECHSUP ;TO BE ECHOED ?
TLNE LINE,FULTWX ;YES - AND HAS IT BEEN ALREADY ?
JRST SPCECO ;SEE IF SPECIAL ECHO
DUPLX1: PUSH PDP,TAC ;SAVE TAC (=SPCTAB ENTRY)
TLNN IOS,TPMON ;MON MODE ?
TRNN IOS,NOECHO ;
PUSHJ PDP,PUTCHO ;OUTPUT CHAR
JRST TPOPJ ;RETURN + RESTORE AC(TAC)
SPCECO: JUMPE CHREC,CPOPJ ;NEVER ECHO NULLS
CAIE CHREC,3
CAIN CHREC,32
POPJ PDP,
CAIN CHREC,33
POPJ PDP,
CAIGE CHREC,7 ;ECHO BELOW ^G
JRST UPRCTL ;DO IT
CAILE CHREC,15
CAIL CHREC,40
POPJ PDP,
UPRCTL: PUSH PDP,CHREC
MOVEI CHREC,"^
PUSHJ PDP,PUTCHO
MOVE CHREC,(PDP)
ADDI CHREC,"@
PUSHJ PDP,PUTCHO
POP PDP,CHREC
POPJ PDP,
;INBFUL CONTC CONTZ CONTO CONTU CONTU1 ALTMOD
;** SCNSRF.MAC ** PAGES 51+52
INBFUL: MOVSI IOS,SYNC ;DON'T REGISTER THIS AS SYNC
ANDCAB IOS,DEVIOS(DDB) ;SINCE CHAR NOT STORED
CAIN CHREC,3 ;WAS XTRA CHAR A ^C ?
JRST CNCTS1 ;YES - PANIC
MOVEI CHREC,7 ;NO - ECHO BELL TO SHOW LOSSAGE
JRST PUTCHO
CONTC: PUSHJ PDP,DELETL ;DELETE CURRENT LINE
MOVE TAC,SPCTAB+3 ;RETRIEVE SPCTAB ENTRY
CONTZ: PUSHJ PDP,CNTLEC ;OUTPUT ^C OR ^Z
PUSHJ PDP,CRLFEC ;OUTPUT A <CR><LF>
JRST TTIPUT ;AND STORE CHAR
CONTO: PUSHJ PDP,SETBF2 ;CLEAR CTYO OUTPUT BUFFER
SKIPE TTYOIP ;AT SPECIAL (NON-INTERRUPT) LEVEL ?
JRST CONTU1 ;YES, ALL OF THIS HAS BEEN DONE FOR US
MOVSI IOS,IOSUPR ;GET THAT IOSUPRESS BIT
XORB IOS,DEVIOS(DDB) ;AND FLIP IT OFF
JRST CONTU1
CONTU: TLNE IOS,DDTM ;IN DDT MODE ?
JRST TTIPUT ;YES - PASS CHAR
TLZ LINE,ROBTPD
PUSHJ PDP,DELETL
CONTU1: PUSHJ PDP,CNTLEC ;ECHO ^O OR ^U
JRST CRLFEC ;OUTPUT <CR><LF> - THEN RETURN W/O STORING CHAR
ALTMOD: HRRI TAC,(CHREC) ;SAVE WHICH KIND OF ALTMODE
MOVEI CHREC,44 ;ECHO A $
TLNN IOS,TPMON ;IF IN MONITOR MODE
TRNN IOS,DLRSUP ;OR IF IN USER MODE (WITHOUT $-SUPPRESS SET)
PUSHJ PDP,AOJDPX
MOVEI CHREC,(TAC) ;RESTORE CHAR, BUT
TRNN IOS,FCS ;IF NOT FCS MODE -> CONVERT TO 33
MOVEI CHREC,33
JRST TTIPUT ;AND STORE
;CONTHR CONTH RUBOUT RUBOU2 AOJDPX RUBOU1 CONTK CONTL
;** SCNSRF.MAC ** PAGE 53
CONTHR: SOJ HPOS, ;COMES HERE IF RUBBING OUT A ^H
CONTH: TLNE LINE,T37 ;<BACKSPACE>
JRST TTIPUT ;JUST PASS TO PROG IF A MODEL 37
;NOTE: A MODEL 33/35 <BACKSPACE> -> ALTMODE
RUBOUT: TLNE IOS,TPMON ;IN MONITOR COMMAND MODE, NOT A BREAK CHAR
JRST RUBOU2
TDNE IOS,[DDTM,,FCS]
JRST TTIPT1 ;STORE RUBOUT IF DDT OR FCS
RUBOU2: MOVSI IOS,SYNC ;NOT A BREAK
ANDCAB IOS,DEVIOS(DDB) ;BREAK - SO CLEAR BREAK-FOUND BIT
LDB CHREC,PUTR(DAT) ;GET LAST CHAR INPUT
PUSHJ PDP,DCPUTR ;BACK UP TIPUTR
; DCPUTR USED PLSTLC TO INSURE THAT WE DON'T BACK UP OVER A BREAK
JRST RUBOU1 ;EMPTY ALREADY
TLON LINE,ROBTPD ;MARK RUBOUT --- AND WERE WE IN RUBOUT MODE DEJA ?
PUSHJ PDP,BSECHO ;NO - TURN HIM ON TO US
PUSHJ PDP,SPCHEK ;GET SPECIAL BITS FOR CHAR JUST UNZAPPED
;MIGHT 'A BEEN A <TAB>, ETC.
AOJDPX: AOJA HPOS,DUPLX1 ;NOT SPECIAL -- OUTPUT IT AND COUNT HPOS
TLNE TAC,SPACTN ;IF IT IS REALLY SPECIAL,
JRST -1(TAC) ; USE ALTERNATE SPECIAL CHAR ROUTINE
; ENTRY WHEN IN RUBOUT MODE
POPJ PDP, ;OTHERWISE, RETURN
RUBOU1: TLZE LINE,ROBTPD ;END OF INPUT STREAM REACHED
PUSHJ PDP,BSECHO ;OUTPUT A "\" AND <CR><LF>
JRST CRLFEC
CONTK: HRRI TAC,4 ;HERE ON VT
CAIA
CONTL: HRRI TAC,10 ;HERE ON FF
TLNE LINE,T35 ;DOES TTY HAVE VERT MECHANICS ?
JRST TTIPUT ;YES
;NO - FALL INTO SIMFF
;SIMFF CONTIR CONTI CONTI2 CONTI1
;** SCNSRF.MAC ** PAGE 54
;ROUTINE TO SIMULATE VT OF FF WITH LINEFEEDS
; IF THIS IS NOT A MODEL 35 TTY
SIMFF: TLO TAC,ECHSUP ;DON'T OUTPUT A FF OR A VT TO A MODEL 33
PUSHJ PDP,TTIPUT ;PUT IT IN BUFFER
MOVEI CHREC,12 ;NOW SIMULATE FF OR VT WITH LF'S
PUSHJ PDP,DUPLX1 ;OUTPUT ECHO OF LF
TRNE TAC,17 ;DONE YET ?
SOJA TAC,.-2 ;NO - OUTPUT MORE
POPJ PDP, ;DONE
CONTIR: JRST CONTI1 ;COMES HERE HERE TO RUBOUT A TAB
CONTI: TLNN LINE,T35 ;HERE ON HT
TLO TAC,ECHSUP
PUSHJ PDP,TTIPUT ;PUT INTO BUFFER, MAYBE ECHO
TLNE LINE,T35
POPJ PDP, ;IF ECHOED, RETURN
;NOT ECHOED, WE MUST SIMULATE WITH SPACES
LDB HPOS,PHPOS ;GET OUR OLD HORIZONTAL POSITION BEFORE
; IT WAS CHANGED BY ADJHP:
CONTI2: MOVEI CHREC,40 ;SEND SPACES FOR THAT TAB
PUSHJ PDP,AOJDPX ;OUTPUT A SPACE
TRNE HPOS,7 ;AT A TAB STOP ?
JRST .-2 ;NO - WE NEED TYPE MORE SPACES
POPJ PDP, ;YES - STOP
CONTI1: TLNN LINE,T35 ;A MODEL 35 ?
JRST CONTI2 ;YES - SIMULATE A TAB USING CURRENT (!!)
; HPOS VALUE (WE COULD HAVE JUST TYPED OUR INITIAL "\")
TRO HPOS,7 ;INDICATE THAT WE ARE AT A TAB STOP
AOJA HPOS,DUPLX1 ;IN TWO INSTRUCTIONS (C.F. ADJHP:)
;CRLFEC CHPOPJ CNTLEC CR CNCTST CNCTS1 CNCMOD
;** SCNSRF.MAC ** PAGES 55-56
CRLFEC: MOVEI HPOS,1 ;ECHO A CR, LF, SAVING CHREC
PUSH PDP,CHREC
MOVEI CHREC,15 ;CR
PUSHJ PDP,DUPLX1
MOVEI CHREC,12 ;LF
PUSHJ PDP,DUPLX1
CHPOPJ: POP PDP,CHREC ;RESTORE CHREC
POPJ PDP,
CNTLEC: HRRI TAC,100(CHREC) ;AND NOW, TO NORMALCY
MOVEI CHREC,"^
PUSHJ PDP,AOJDPX ;TYPE THE ^
MOVEI CHREC,(TAC) ;TYPE THE UN-CONTROL VERSION OF THE CHAR
PUSHJ PDP,AOJDPX
TRZ CHREC,100 ;MAKE IT A CONTROL CHAR AGAIN
POPJ PDP,
CR: MOVEI HPOS,0 ;HERE ON INPUT OF A CARRIAGE RETURN
PUSHJ PDP,TTIPUT
MOVEI CHREC,12 ;FOLLOW IT WITH A <LF>
MOVSI IOS,SYNC ;WHICH IS A BREAK
IORB IOS,DEVIOS(DDB)
JRST TTIPUT
CNCTST:
;NO NEED HERE TO CHECK JACCT BIT IN JBTSTS - WE
; DO NOT USE PRIVILEGED CUSPS, ETC.
LDB TAC,TIPUTR(DDB) ;LOOK AT LAST CHAR INSERTED
CAIE TAC,3
POPJ PDP,
CNCTS1: PUSHJ PDP,TSETBF ;STOP I/O, BY CLEARING BUFFERS
MOVEI DAT,TTIBUF(DDB)
MOVE TAC,SPCTAB+3 ;GET BACK ENTRY
CNCMOD: MOVSI IOS,DDTM+IOSUPR
ANDCAM IOS,DEVIOS(DDB)
MOVSI IOS,TPMON+IOFST
IORB IOS,DEVIOS(DDB)
POPJ PDP,
;BSECHO DCPUTR DELETL GETDDB GETDB3
;** SCNSRF.MAC ** PAGES 57+60
;ROUTINE TO ECHO BACKSLASH
BSECHO: PUSH PDP,CHREC
MOVEI CHREC,"\
PUSHJ PDP,AOJDPX
JRST CHPOPJ
;ROUTINE TO DECREMENT PUTR
DCPUTR: LDB TAC,PLSTLC ;CHECK FOR NONE TO DELETE
CAMN TAC,PCTR(DAT)
POPJ PDP,
MOVSI TAC,70000
ADD TAC,PUTR(DAT)
TLNE TAC,400000
ADD TAC,[347777,,-1]
MOVEM TAC,PUTR(DAT)
AOS FCTR(DAT)
AOS TAC,PCTR(DAT)
CAIG TAC,TTYCHR
JRST CPOPJ1 ;SKIP
SUBI TAC,TTYCHR ;WE HAVE JUST BACKED UP OVER THE FRONT
MOVEM TAC,PCTR(DAT) ;END OF THE BUFFER
MOVEI TAC,STTYBF
ADDM TAC,PUTR(DAT)
JRST CPOPJ1
;ROUTINE TO DELETE CURRENT LINE (^U)
DELETL: LDB TAC,PLSTLC ;COUNTER AT LAST LINE
MOVEM TAC,TIPCTR(DDB) ;RESTORE COUNT TO THIS VALUE
PUSHJ PDP,TBYTEP ;CONVERT TO BYTE POINTER
MOVEM TAC,TIPUTR(DDB)
JRST TRESC1 ;COMPUTE NEW TIFCTR
;ROUTINE TO SETUP DDB
;CALL: MOVE TAC,[TTY##]
; PUSHJ PDP,GETDDB
; NOT AVAILABLE RETURN
; RETURN WITH LINE AND DDB SETUP
GETDDB: HLRZ AC1,TAC
CAIE AC1,(SIXBIT /TTY/) ;TTY PREFIX ?
POPJ PDP, ;NO - CAN'T HELP YOU OUT
TRNE TAC,770000 ;HE HAD BETTER BE REQUESTING TTYNM
TRNE TAC,77 ;AND NOTHING ELSE
POPJ PDP,
PUSH PDP,TAC ;SAVE TTYNM NAME
HRLZ TAC,TAC ;NOW LET'S BE SURE THAT BOTH N AND M ARE DIGITS
GETDB3: ROT TAC,6 ;GET NEXT DIG
TRZE TAC,20 ;20 BIT BETTER BE ON
TRNE TAC,50 ;AND NO OTHER HIGH ORDER BITS
JRST TPOPJ ;ELSE LOSE
TLNE TAC,-1 ;MORE ?
JRST GETDB3 ;YES
MOVEI AC1,SCNCOR
PUSHJ PDP,GTF ;GET SCNCOR # OR CONTIGUOUS FREE BLOCKS
HRRI DDB,(AC1) ;MOVE THAT ADDRESS TO AC(DDB)
PUSH PDP,DAT ;MAKE SURE THAT WE DON'T LOSE AC(DAT)
PUSHJ PDP,MNTDDB ;MAKE NEW TTY DDB
POP PDP,DAT
POP PDP,DEVNAM(DDB) ;AND PLACE TTYNM INTO DEVNAM
JRST CPOPJ1 ;SUCCESS RETURN
;UFDBYT UFDBPW UDNAMP UDNAME UDDESC UDTKMX UDWPH NXLBYT LUNBLK UNFN1 UNFN2 UNRNDM UNLINK UNWRIT UNCDEL UNPDEL DELBTS UNIGFL UNDSCP UNDATE UNTIM UNREFT UNMON UNDAY UNYRD
;I.T.S. FILE DIRECTORY PARAMETERS
; C.F. P 285, I.T.S. SYSTEM LISTING
;RANDOM INFO
UFDBYT==6 ;SIZE OF BYTES
UFDBPW==36./UFDBYT ;# BYTES PER WORD
UDNAMP==1 ;PNTR TO ORG OF NAME AREA
UDNAME==2 ;USER NAME
UDDESC==11. ;FIRST LOCATION AVAILABLE FOR DESC
;UFD DESCRIPTORS
; 0 -> FREE
; 1-UDTKMX -> TAKE NEXT N
; UDTKMX+1 THROUGH UDWPH-1 -> SKIP N-UDTKMX AND TAKE 1
; 40-BIT SET -> LOAD ADDR. LOWEST 5 BITS + NEXT 2 CHARS (17. BITS IN ALL)
UDTKMX==12. ;HIGHEST "TAKE N" CODE
UDWPH==31. ;PLACE HOLDER ON WRITE (OR NULL FILE)
NXLBYT==2 ;# ADDITIONAL BYTES FOR LOAD ADDR
;NAME DATA AREA
LUNBLK==5 ;LENGTH OF USER FILE NAME BLOCK
UNFN1==0 ; FILE NAME 1
UNFN2==1 ; FILE NAME 2
UNRNDM==2 ; ALL KINDS OF RANDOM INFO
UNLINK==1 ;LINK BIT
UNWRIT==4 ;OPEN FOR WRITING
UNCDEL==20 ;DELETE WHEN CLOSED
UNPDEL==40 ;DELETE FROM UNMOUNTED PACK
DELBTS==UNCDEL+UNPDEL ;DELETED -- IGNORE
UNIGFL==DELBTS+UNWRIT ;BITS TO IGNORE FILE
UNDSCP==1500,, ;PNTR TO DESC
UNDATE==3 ; DATE, ETC.
UNTIM==2200,, ;COMPACTED TIME OF DAY
UNREFT==341000,, ;DAYS AFTER CREATION LAST REFERENCED
UNMON==270400,, ;MONTH
UNDAY==220500,, ;DAY
UNYRD==330100,, ;YEAR BIT
;UNDATE:
; --/--/--/--/--/--/ --/--/--/--/--/--/
; 0......78.......17
; LAST REF YR MO DAY COMPACTED TIME OF CREATION IN 1/2 SECS.
;RFD
;READ FILE DIRECTORY
; TAC/SNAME OF DESIRED DIRECTORY
; TAC1/ADDRESS OF DISPATCH ROUTINE
;EVERY TIME A 4-WORD ENTRY IS COMPLETE, AND PLACED IN WORDS
; FILNAM...FILNAM+3(=FILNM3), WE DO A PUSHJ PDP,(TAC1),
; WHICH SHOULD DO APPROPRIATE THINGS WITH THE DIRECTORY
; ENTRY. SPECIFICALLY WE WOULD EXPECT THE (TAC1) CO-ROUTINE
; EITHER TO ENTER THE FILENAME INTO THE USER DIRECTORY
; (A PART OF LIST STORAGE), OR THE FILENAME WOULD BE
; SENT OUT TO A PSEUDO U.F.D. FILE.
;DEFINE ACCUMULATORS
T==BUFPNT
T1==BUFWRD
T2==UUO
T3==AC1
T4==AC2
T5==AC3
RFDSTK==10. ;= PC + # ELEMENTS STORED ON PD STACK
; WHEN TAC1 CO-ROUTINE CALLED + PC OF CALLING SEQ
; + PC TO CO-ROUTINE.
; THUS, THE CALLER'S RETURN POINTER IS IN -RFDSTK+3(PDP)
RFD: PUSH PDP,T ;SAVE ALL ACCUMULATORS WE USE
PUSH PDP,T1 ;THEY ARE RESTORED AT UFDFIN: -- THE COMMON EXIT
PUSH PDP,T2
PUSH PDP,T3
PUSH PDP,T4
PUSH PDP,T5
CAME TAC,SNAME ;IS USER READING HIS OWN UFD ?
; I.E. AC(TAC)=SNAME OR =0
JRST RFD4 ;NO
SKIPE DIRLST ;YES - IF SO - DO WE HAVE IT IN CORE ?
; (INITIALLY WE WON'T, AND IF USER USES "REFRESH" COMMAND, IT WILL BE
; BE RESET.)
JRST RICUFD ;YES- READ IN-CORE UFD
;RFD4 RFD1 RFD2 RFD2A PASS1 PASS1B PASS1C PASS1A
RFD4: HRRZ T,HLADR ;DO WE HAVE A DIRECTORY IN CORE ?
JUMPN T,RFD1 ;YES
HLRZ T,HLADR ;NO
ADDI T,4000 ;PREPARE FOR A .CORE TO GIVE US ONE MORE K
LSH T,-12
.CORE (T)
JRST SYSERR
HLRZ T,HLADR
IORI T,1777
ADDI T,1
HRRM T,HLADR
JRST RFD2 ;NOW READ IN THE DIRECTORY
RFD1: CAMN TAC,UDNAMP(T) ;MATCH FOUND TO IN CORE DIRECTORY ?
JRST RFD3 ;YES - USE IT
RFD2: HRRZI T1,(SIXBIT /DSK/)
HRLI T1,IBIMDE ;IMAGE, BLOCK, INPUT MODE
MOVEM T1,FILNAM
MOVE T1,[SIXBIT /.FILE./]
MOVEM T1,FILNM1
MOVE T1,[SIXBIT /(DIR)/]
MOVEM T1,FILNM2
CAME TAC,SNAME ;ARE WE READING OUR OWN UFD ?
.SUSET [.SSNAME,,TAC] ;NO - SO DIRECT US TO THE RIGHT ONE
.IOPUSH UFD,
.OPEN UFD,FILNAM
JRST OPNERR ;ERROR -> DIRECTORY NOT FOUND
; OR NOT NOW AVAILABLE
RFD2A: AOS -RFDSTK+4(PDP)
CAME TAC,SNAME
.SUSET [.SSNAME,,SNAME]
HRLI T,-1024.
.IOT UFD,T ;READ IN THE DIRECTORY
.IOPOP UFD, ;RESTORE CHANNEL
HRRZ T,HLADR ;ADDRESS OF UFD
MOVE T1,T
ADD T1,UDNAMP(T1) ;GET ADDR OF FIRST FILE NAME
PASS1: CAIL T1,1024.(T) ;DONE W/FIRST PASS ?
JRST PASS2 ;YES
SKIPE UNFN1(T1) ;NULL NAME ?
JRST PASS1A ;NO
PASS1B: SETZM UNFN1(T1) ;YES
PASS1C: ADDI T1,LUNBLK ;ADVANCE TO NEXT ENTRY
JRST PASS1
PASS1A: MOVE T2,UNRNDM(T1) ;IS THIS A LINK OR A FILE TO BE IGNORED ?
TLNE T2,UNIGFL+UNLINK
JRST PASS1B ;YES - SO SET NAME1=0 TO ERASE IT FROM FUTURE PASSES
HRRZ T2,UNFN2(T1) ;GET LAST 3 CHARS IN EXT
JUMPE T2,PASS1C ;IS IT GOOD?
JRST PASS1B ;NO GOOD, DEC SYSTEM ONLY ALLOWS 3
;OPNERR OPNER3 OPNER1 OPNER2
;.OPEN FAILURE WHILE TRYING TO READ UFD
; IF IT WAS DUE TO A "DIRECTORY NOT AVAILABLE" ERROR WE PATIENTLY
; RETRY TO READ THE DIRECTORY IN QUESTION, WAITING 3 SECONDS
; EACH TIME. WE TRY UP TO 5 TIMES.
; IF IT WAS DUE TO A NON-EXISTENT USER WE RETURN TO CALLER AFTER
; RESTORING AC'S. WE GIVE HIM A NON-SKIP RETURN.
OPNERR: .STATUS UFD,T2 ;WHAT WENT WRONG ??
LDB T2,[POINT 6,T2,17,] ;COLLECT ERROR CODE FROM BITS 3.1-3.6
CAIE T2,20 ;DOES USER EXIST ?
JRST OPNER1 ;YES
OPNER3: .IOPOP UFD, ;NO - RESTORE TEMP UFD CHANNEL
CAME TAC,SNAME ;IS IT THE RIGHT SNAME?
.SUSET [.SSNAME,,SNAME] ;NO, SET IT STRAIGHT
JRST UFDFIN ;NON-SKIP RETURN. FIRST RESTORE AC'S
OPNER1: MOVEI T3,5 ;TRY SLEEPING 3 SECS THEN RETRY.
; UP TO 5 TIMES OVER
OPNER2: MOVEI T2,90.
.SLEEP T2,
.OPEN UFD, ;TRY
SKIPA ;LOSE
JRST RFD2A ;WIN
SOJG T3,OPNER2 ;TRY AGAIN ?
JRST OPNER3 ;NO - THAT'S ENOUGH OF THIS - LET'S LOSE
;PASS2 PASS2B PASS2C PASS2A PASS2D
PASS2: MOVE T1,T
ADD T1,UDNAMP(T1)
PASS2B: CAIL T1,1024.(T) ;HAVE WE ADVANCED BEYOND END IN LOOKING
; FOR A NEW BASE NAME ?
JRST RFD3 ;YES - NOW GO HAVE FUN
SKIPE T2,UNFN1(T1) ;ENTRY NULL ?
JRST PASS2A ;NO - USE IT
PASS2C: ADDI T1,LUNBLK ;ADVANCE
JRST PASS2B ;AND CHECK NEXT
PASS2A: HLLZ T3,UNFN2(T1) ;READ NAME2 - 1ST 3 CHARS
MOVE T5,T1 ;NEW POINTER
PASS2D: ADDI T5,LUNBLK
CAIL T5,1024.(T) ;HAVE WE PASSED TESTING FOR CURRENT BASE ?
JRST PASS2C ;YES - TRY NEXT BASE
JRST PASS2D ;NO - ADVANCE
;RFD3 UQL4C UQL4D UQL4B
RFD3: HRRZ T1,HLADR
ADD T1,UDNAMP(T1) ;ADD VALUE OF NAME AREA POINTER
UQL4C: CAIL T1,1024.(T) ;ARE WE DONE ?
JRST UFDFIN ;YES
SKIPE UNFN1(T1) ;NULL FILE ?
JRST UQL4B ;NO
UQL4D: ADDI T1,LUNBLK ;YES - GO TO NEXT ENTRY
JRST UQL4C
UQL4B: MOVE T2,UNFN1(T1) ;GET + STASH FIRST NAME
MOVEM T2,FILNAM
HLLZ T2,UNFN2(T1) ;DITTO FOR SECOND
HLLZM T2,FILNM1
SETZM FILNM2
SETZM FILNM3
LDB T2,[UNYRD+UNDATE(T1)]
SKIPN T2 ;YEAR BIT SET ?
SKIPA T3,YRESET ;NO - LOAD PROPER YEAR EQUIV
MOVE T3,YSET ;YES
SUBI T3,64. ;NOW CONVERT TO DEC FORMAT
IMULI T3,12. ; C.F. P 377 DEC-PDP10(1969) REFERENCE MANUAL
LDB T2,[UNMON+UNDATE(T1)]
ADDI T3,-1(T2)
IMULI T3,31.
LDB T2,[UNDAY+UNDATE(T1)]
ADDI T3,-1(T2)
DPB T3,[POINT 12,FILNM2,35,] ;-> E+3(24-35)
LSH T3,-12. ;DATE75 HACKERY
DPB T3,[POINT 3,FILNM1,20,] ;HIGH ORDER 3 BITS
LDB T2,[UNREFT+UNDATE(T1)]
ADDI T3,(T2)
;GET DATE LAST REFERENCED
DPB T3,[POINT 15,FILNM1,35,] ;-> E+1(21-35)
;UQL5 UQL5B UQL5A ILNGTH
;NOW DETERMINE CREATION TIME OF DAY
LDB T2,[UNTIM+UNDATE(T1)] ;GET IT INTO 1/2 SECS.
IDIVI T2,120. ;THERE ARE 120 1/2 SECS. PER MIN
DPB T2,[POINT 11,FILNM2,23,] ;-> E+2(13-23)
;MODE/PROTECTION BITS
SETZ T2, ;ALWAYS .IOASC
DPB T2,[POINT 4,FILNM2,12,] ;MODE
MOVEI T2,055 ;ALWAYS 055
DPB T2,[POINT 9,FILNM2,8,] ;PROT.
;NOW DETERMINE FILE LENGTH. FIRST WE USE DESCRIPTOR
; BYTES TO COLLECT BASIC LENGTH. THEN WE ADJUST.
LDB T2,[UNDSCP+UNRNDM(T1)]
IDIVI T2,UFDBPW
ADDI T2,UDDESC(T) ;TO POINT TO DESCRIPTOR AREA
HLL T2,QBTBLI(T3)
MOVNI T4,1
UQL5: ILDB T3,T2 ;GET NEXT DESC BYTE
JUMPE T3,UQL5A ;STOP IF DESC=0
CAILE T3,UDTKMX
JRST UQL5B
ADD T4,T3
JRST UQL5
UQL5B: CAIN T3,UDWPH ;PLACE HOLDER ?
JRST UQL5 ;YES
CAIG T3,UDWPH
AOJA T4,UQL5
REPEAT NXLBYT,[IBP T2
]
AOJA T4,UQL5
UQL5A: LDB T3,[POINT 10,UNFN2(T1),35,] ;COLLECT INCR.
; WE HAVE AUTOMATICALLY STARTED FILE LENGTH
; AT -1024. WORDS
SKIPN T3 ;=0?
AOJ T4,
IMULI T4,8.*128.
ADDI T4,(T3)
SKIPGE T4
SETZ T4, ;NOW WE HAVE A LENGTH IN WORDS
CAMLE T4,[2_17.]
JRST GT2.17
MOVNS T4
ILNGTH: HRLZM T4,FILNM3
SUBI T1,(T) ;MAKE T1 A RELATIVE POINTER IN CASE CORE HAS
; TO BE EXPANDED IN THE CO-ROUTINE
PUSHJ PDP,GT1UF ;GOT 1 USER FILE
; NOW USER'S RETURN ADDR IN -RFDSTK+2(PDP)
HRRZ T,HLADR ;SET UP AC(T) IN CASE HLADR CHANGES
ADDI T1,(T) ;AND MAKE AC(T1) RIGHT
JRST UQL4D
;GT2.17 UFDFIN
GT2.17: MOVE T3,T4
IDIVI T3,128.
SKIPE T4
AOJ T3,
MOVE T4,T3
JRST ILNGTH ;INSERT LENGTH
UFDFIN: POP PDP,T5 ;RESTORE ALL THOSE AC'S
POP PDP,T4
POP PDP,T3
POP PDP,T2
POP PDP,T1
POP PDP,T
POPJ PDP, ;AND THEN GO AWAY
;RICUFD RICUF1 GT1UF QBTBLI
;READ THROUGH IN-CORE SIMULATOR UFD + PASS IT ALONG TO USER, ENTRY-BY-ENTRY.
RICUFD: AOS -RFDSTK+4(PDP)
HRRZ T1,DIRLST ;COLLECT BEGINNING OF UFD
RICUF1: JUMPE T1,UFDFIN
HRLZ T2,T1
HRRI T2,FILNAM ;THE "TO ADDRESS"
BLT T2,FILNAM+FSIZ-1
PUSHJ PDP,GT1UF
HRRZ T1,FSIZ-1(T1) ;COLLECT NEXT POINTER
JRST RICUF1
;GOT 1 UF (USER FILE ENTRY)
GT1UF: PUSH PDP,TAC1
EXCH T,-RFDSTK+3(PDP)
EXCH T1,-RFDSTK+4(PDP)
EXCH T2,-RFDSTK+5(PDP)
EXCH T3,-RFDSTK+6(PDP)
EXCH T4,-RFDSTK+7(PDP)
EXCH T5,-RFDSTK+8.(PDP)
PUSHJ PDP,(TAC1)
;USER'S RETURN PC NOW IN -RFDSTK+1(PDP)
EXCH T5,-RFDSTK+8.(PDP)
EXCH T4,-RFDSTK+7(PDP)
EXCH T3,-RFDSTK+6(PDP)
EXCH T2,-RFDSTK+5(PDP)
EXCH T1,-RFDSTK+4(PDP)
EXCH T,-RFDSTK+3(PDP)
POP PDP,TAC1
POPJ PDP,
QBTBLI: 440600,,
360600,,
300600,,
220600,,
140600,,
060600,,
;CLRMBF
CLRMBF: PUSH PDP,TAC
HRRZI TAC,MONBUF+1
HRLI TAC,MONBUF
SETZM MONBUF
BLT TAC,MONBUF+MBFSIZ-1
JRST TPOPJ ;RESTORE AC(TAC) AND RETURN
;PPTOSN GTFCHN GTFCH1 GTFCH2 RTFCHN
;ENTER WITH PPN IN TAC; RETURN WITH SNAME IN TAC.
;TAC1 GETS CLOBBERED.
PPTOSN: CAMN TAC,[XWD 1 4] ;IF HE IS SPECIFYING 1,4 (SYS. PPN)
MOVE TAC,SYSPP ;CAUSE THE RESULT TO BE "DECSYS"
CAIN TAC, ;IS IT MYSELF?
MOVE TAC,SNAME ;THEN MAKE IT ME!!
POPJ PDP, ;AND RETURN
;FIND FREE I.T.S. CHANNEL
;CALLING SEQUENCE:
; PUSHJ P,GTFCHN
; ERROR RETURN ( NONE LEFT )
; OK RETURN - CHANNEL # IN TAC
;NO AC'S ARE CLOBBERED (EXCEPT TAC!)
GTFCHN: PUSH PDP,TAC1 ;SAVE TAC1
MOVSI TAC1,400000_-15. ;POSITION A BIT CORRESPONDING
;TO CHANNEL 17
MOVEI TAC,17 ;LOOK FOR FREE CHAN. FROM 17 DOWN TO 0
GTFCH1: TDNN TAC1,CHNSAT ;IS THIS ONE FREE?
JRST GTFCH2 ;YES, USE IT
LSH TAC1,1 ;NO, SHIFT TO CHECK NEXT
SOJGE TAC,GTFCH1 ;TRIED ALL YET?
SOS -1(PDP) ;YES, CAUSE NON-SKIP RETURN
;TAC1 NOW = 0 BECAUSE WE MOVED
;THE BIT ALL THE WAY OUT
GTFCH2: IORM TAC1,CHNSAT ;GRAB THE CHANNEL (IF ANY)
POP PDP,TAC1 ;RESTORE TAC1
JRST CPOPJ1 ;SKIP RETURN (UNLESS FAILURE ABOVE)
;RETURN THE ITS CHANNEL WHOSE # IS IN TAC TO A STATE OF
;AVAILABILITY BY CLEARING THE ASSOCIATED BIT IN "CHNSAT".
RTFCHN: MOVNI TAC,(TAC) ;NEGATE CHANNEL #
HRLI TAC,400000 ;PUT MASK BIT IN BIT 0
LSH TAC,(TAC) ;POSITION IT TO CORRESPOND WITH CHAN. #
ANDCAB TAC,CHNSAT ;TURN IT OFF IN CHNSAT AND GUARANTEE
;THAT RH OF TAC IS CLEAR
POPJ PDP, ;RETURN
;GTTIME T1POPJ GTTIM1 CNVDEC GTDATE
;RETURN THE CURRENT TIME OF DAY IN JIFFIES (1/60 SECOND)
;PAST MIDNIGHT IN TAC.
GTTIME: PUSH PDP,TAC1 ;SAVE TAC1
PUSH PDP,[0] ;INITIALIZE RESULT
.RTIME TAC1, ;GET TIME IN SIXBIT FROM ITS
PUSHJ PDP,GTTIM1 ;HANDLE HOURS
PUSHJ PDP,GTTIM1 ;HANDLE MINUTES
PUSHJ PDP,GTTIM1 ;HANDLE SECONDS
POP PDP,TAC ;PUT RESULTING # JIFFIES IN TAC
T1POPJ: POP PDP,TAC1 ;RESTORE TAC1
POPJ PDP, ;AND RETURN
GTTIM1: PUSHJ PDP,CNVDEC ;GET NEXT TWO SIXBIT DIGITS FROM TAC1 (LEFT)
;AND CONVERT TO DECIMAL
ADD TAC,-1(PDP) ;UPDATE RUNNING TOTAL
IMULI TAC,60.
MOVEM TAC,-1(PDP) ;STORE BACK
POPJ PDP, ;RETURN
;TAKES BITS 0-11 OF TAC1 AS TWO SIXBIT DIGITS AND RETURNS
;THEIR DECIMAL EQUIVALENT IN TAC; ALSO SHIFTS TAC1 LEFT 12 PLACES.
CNVDEC: LSHC TAC,12. ;GET NEXT TWO SIXBIT #'S
PUSH PDP,TAC1 ;SAVE RESULTING TAC1
ANDI TAC,1717 ;KEEP ONLY PERTINENT BITS
LSHC TAC,-6 ;SEPARATE DIGITS
LSH TAC1,-30.
IMULI TAC,10. ;MAKE 10'S
ADDI TAC,(TAC1) ;FORM DECIMAL EQUIVALENT
JRST T1POPJ ;RESTORE TAC1 AND RETURN
;RETURN TODAY'S DATE IN TAC IN STANDARD DEC FORMAT:
; DATE=((YEAR-1964)*12+(MONTH-1))*31+DAY-1
GTDATE: PUSH PDP,TAC1 ;SAVE TAC1
.RDATE TAC1, ;GET TODAY'S DATE IN SIXBIT
PUSHJ PDP,CNVDEC ;GET YEAR
SUBI TAC,64.
IMULI TAC,12. ;FORM PARTIAL # MONTHS
PUSH PDP,TAC ;SAVE PARTIAL RESULT
PUSHJ PDP,CNVDEC ;GET MONTH
SUBI TAC,1 ;MINUS 1
ADD TAC,(PDP) ;FORM TOTAL # MONTHS
IMULI TAC,31. ;FORM PARTIAL # DAYS
MOVEM TAC,(PDP) ;STORE BACK
PUSHJ PDP,CNVDEC ;GET DAY
POP PDP,TAC1 ;RESTORE PARTIAL # DAYS
ADDI TAC,-1(TAC1) ;FORM FINAL RESULT IN TAC
JRST T1POPJ ;RESTORE TAC1 AND RETURN
;UPRGI UPRGO CTYI CTYO FFITSC UFD SGCHN BPIPI AROIF BILLOP BIOADC BUTRAP ARFOIF FSIZ DSKCOR SCNCOR MINFRE
;I.T.S. FIXED CHANNEL ASSIGNMENTS
UPRGI==0 ;CHANNEL ASSOCIATED W/USER TO READ HIS CORE
UPRGO==1 ;CHANNEL ASSOCIATED W/USER TO WRITE INTO HIS CORE
CTYI==2 ;CHANNEL ASSOCIATED W/CONSOLE TTY INPUT
CTYO==3 ;CHANNEL ASSOCIATED W/CONSOLE TTY OUTPUT
FFITSC==4 ;FIRST FREE DYNAMIC I.T.S. CHANNEL
;TEMPORARILY USED CHANNELS
; SAVED BEFORE AND RESTORED AFTER USAGE WITH .IOPOP'S AND .IOPUSH'S
UFD==FFITSC ;TO USE WHILE READING UFD'S
SGCHN==FFITSC ;TO USE DURING "GET" AND "SAVE" COMMANDS
;INTERRUPT BITS AS FOUND IN PIRQC INTERRUPT REQUEST WORDS
BPIPI==4 ;BAD LOCATION 42
AROIF==10 ;ARITHMETIC OVERFLOW
BILLOP==40 ;ILLEGAL INSTRUCTION
BIOADC==20000 ;MEMORY PROTECTION VIOLATION
BUTRAP==40,, ;SYSTEM UUO TO USER TRAP
ARFOIF==400,, ;ARITHMETIC FLOATING OVERFLOW
;FREE STORAGE PARAMETERS
FSIZ==4 ;# WORDS/CELL ENTRY
DSKCOR==<<PTR1-1>/FSIZ>+1 ;# OF FSIZ-SIZE CHUNKS IN A DSK DDB
SCNCOR==<<SCNDDS-1>/FSIZ>+1 ;# OF FSIZ-SIZE CHUNKS IN A TTY DDB
MINFRE==DSKCOR ;MINIMUM NUMBER OF FREE CHUNKS IN ORDER TO
; PROMPT RETURNING 1K TO SYSTEM WHEN MORE THAN 1K
; OF FREE STORAGE EXISTS.
; (AT PRESENT WE WANT TO BE SURE THAT THERE WILL BE AT LEAST
; ENOUGH ROOM FOR ONE DSK DDB, SINCE THE REPETITIVE ASSIGNMENT
; AND RELEASE OF A DSK DDB MIGHT CAUSE CORE TO THRASH)
IFG SCNCOR-DSKCOR,[MINFRE==SCNCOR]
;NULNAM UPDP NPDP
;COMMON I/O MODE DEFINITIONS
IBMDE==6 ;IMAGE, BLOCK
IBIMDE==6 ;IMAGE, BLOCK, INPUT
IBOMDE==7 ;IMAGE, BLOCK, OUTPUT
CTYIMD==4 ;IMAGE, UNIT, INPUT
; (MODE FOR CTY INPUT)
; (IMAGE -> HANDLE SPECIAL CHARS OURSELVES;
; UNIT -> 1 CHAR AT A TIME)
CTYOMD==5 ;IMAGE, UNIT, OUTPUT
; (MODE FOR CTY OUTPUT)
;SPECIAL NOTE:
; I.T.S. REFERENCE MANUAL, PAGE 52, SAYS IMAGE MODE => NO
; I.T.S.-SUPPLIED ECHO AND NO MODIFICATION OF CHAR CODES.
; IT IS ASSUMED THAT DEFAULT CONDITION IS THAT ALL CHARS
; ARE BREAK CHARS.
;COMMON FILE NAMES
NULNAM: SIXBIT /NULL/ ;NAME FOR INFERIOR WHEN JBTPRG=0
;PUSHDOWN POINTERS
UJOBPD==-40 ;=-LENGTH OF UUO/MONITOR JOB PUSHDOWN STACK
UPDP: UJOBPD,,USRPDL
NJOBPD==-40
NPDP: NJOBPD,,NULPDL
;DEFINE FIRST SAVED AC ON RECEIVING CLASS-3 INTERRUPT
; (MUST BE >= 17)
FSAC==17
;GO DSLEEP
;ALLOCATE MEMORY
GO: .CORE <FRSTFR+1777>_-10.
.LOSE %LSSYS
MOVE PDP,NPDP ;COLLECT A PUSH DOWN POINTER
;CLEAR ALL OF WRITABLE CORE
SETZM FRSTWR ;CLEAR FIRST WORD
MOVE TAC,[FRSTWR,,FRSTWR+1]
BLT TAC,FRSTFR-1 ;COPY THE ZERO WORD BY WORD TIL WE GET TO THE LAST
;INITIALIZE HLADR SO THAT FREE CORE ROUTINES WILL BEGIN TO WORK
HRLZI TAC,<<<FRSTFR+1777>&776000-FRSTFR>/FSIZ>*FSIZ+FRSTFR-1
;= "LAST LOCATION" USED BY FREE CORE ROUTINES
; THIS WILL BE CHAINED JUST AFTER WE "RETURN" ALL CORE AFTER
; END OF WRITABLE CORE UP TO NEXT K BOUNDARY
MOVEM TAC,HLADR
;GIVE AWAY AS MUCH AS POSSIBLE TO INITIAL FREE STORAGE, AFTER
; INITIALIZNG FREE CORE WRITABLE WORDS.
MOVEI AC1,<<FRSTFR+1777>&776000-FRSTFR>/FSIZ
JUMPE AC1,.+3
MOVEI AC2,FRSTFR
PUSHJ PDP,RTF ;"RETURN" CONTIGUOUS FREE CHUNKS STARTING
; AT FRSTFR
;INITIALIZE CHNSAT
MOVSI TAC,-1_<18.-FFITSC> ;PLACE A BIT IN LH OF CHNSAT FOR
MOVEM TAC,CHNSAT ;FOR EVERY I.T.S. CHANNEL WE INTEND TO PREEMPT
;INITIALIZE DDB'S
MOVEI DDB,CTYDDB
PUSHJ PDP,MNTDDB
MOVEI DAT,CTYI
DPB DAT,PDEVI
MOVEI DAT,CTYO
DPB DAT,PDEVO
MOVSI IOS,TPMON ;TTY IN MONITOR MODE
MOVEM IOS,DEVIOS(DDB)
MOVSI TAC,DVIN+TTYATC ;INSERT INPUT-DEVICE BIT INTO DEVICE
IORM TAC,DEVMOD+CTYDDB ;DESCRIPTION OF USER'S CONSOLE TTY
; ALSO INCLUDE TTY ATTACHED TO JOB BIT
HRLZI AC1,LP0DDB ;INITIALIZE NON-ZERO SEGMENT OF LINE PRINTER DDB
HRRI AC1,LPTDDB
BLT AC1,LPTDDB+LP0LEN-1
HRLZI AC1,DSDDB ;DITTO FOR PROTOTYPE DSK DDB
HRRI AC1,DSKDDB
BLT AC1,DSKDDB+DSLEN-1
MOVSM DDB,DEVLST ;CTY BECOMES FIRST DDB IN CHAIN
MOVSI TAC,LPTDDB
HLLM TAC,DEVSER+CTYDDB
MOVSI TAC,DSKDDB ;PROTOTYPE DSK DDB ALWAYS LAST OF NON-EXPANDING
HLLM TAC,DEVSER+LPTDDB ;DDB'S
;INITIALIZE FILE DIRECTORY
.SUSET [.RSNAME,,SNAME] ;READ CURRENT POINTER TO UFD
MOVE TAC,SNAME ;PREPARE TO INITIALIZE PRJPRG WORD
MOVEM TAC,PRJPRG ;DONE
;MISC NON-ZERO WORDS IN WRITABLE CORE
MOVE TAC,[JRST PRCINT]
MOVEM TAC,INTR2
MOVEI TAC,(SIXBIT /DSK/)
MOVEM TAC,FRENAM
.SUSET [.RUIND,,JOB]
MOVE TAC,[SQUOZE 0,NQS] ;COLLECT SYSTEM VALUES FOR VARIABLES
.EVAL TAC, ;USED BY "RESOURCES" COMMAND
.LOSE %LSSYS
HRRZM TAC,NQSV
MOVE TAC,[SQUOZE 0,QACT]
.EVAL TAC,
.LOSE %LSSYS
HRLM TAC,QACTV
MOVE TAC,[SQUOZE 0,QTUTO]
.EVAL TAC,
.LOSE %LSSYS
HRRZM TAC,QTUTOV
MOVE TAC,[SQUOZE 0,QSFT]
.EVAL TAC,
.LOSE %LSSYS
HRLM TAC,QSFTV
.RYEAR TAC,
MOVEI TAC,-3554(TAC)
MOVEI TAC1,TAC
PUSH PDP,TAC1 ;SAVE YEARPH
ADD TAC1,TAC ;TAC1 NOW HAS THE YEAR WHICH CORRESPONDS TO
;MISMATCH BETWEEN YEAR BIT IN UNDATE (OF UFD) AND LAST BIT OF YEAR.
; SOMETIMES A NON-MATCH->"LAST" YEAR, SOMETIMES A NON-MATCH
; -> "NEXT" YEAR.
MOVE T1,TAC ;IT WILL BE YEAR GIVEN IF YEAR BIT RESET
MOVE T2,TAC ;T2 WILL BE YEAR IF YEAR BIT SET
TRNN TAC,1 ;IS THIS AN EVEN YEAR ?
SKIPA T2,TAC1 ;YES - YEAR BIT BEING SET -> CHANGE
MOVE T1,TAC1 ;NO - YEAR BIT RESET -> CHANGE
MOVEM T2,YSET
MOVEM T1,YRESET
POP PDP,TAC1 ;RESTORE AC(TAC1)=YEARPH
;NOW TO FOOL AROUND FINDING WHETHER OR NOT THE YEAR BIT
; IN A DATE (LAST 28. BITS OF UNDATE ENTRY=DATE) SHOULD BE XOR'ED TO MAKE A
; SIMPLE COMPARE OF .GT. OR .LT. WORK.
ADDI TAC1,1 ;-1->0, 1->2
ASH TAC1,-1 ;YEARPH=-1 -> 0 -> 0
;YEARPH=1 -> 2 -> 1
XOR TAC1,TAC
XORI TAC1,1
ANDI TAC1,1 ;YEARPH=-1, YEAR EVEN -> 1
;YEARPH=-1, YEAR ODD -> 1 -> 0
;YEARPH=1, YEAR EVEN -> 1 -> 0
;YEARPH=1, YEAR ODD -> 0 -> 1
;RESULT=1 -> BIT MUST BE XOR'ED TO WIN
;RESULT=0 -> BIT MUST BE UNCHANGED TO WIN (BUT XOR'ING WON'T HURT)
LSH TAC1,27. ;PUT RESULT IN RIGHT PLACE FOR THE XOR
MOVEM TAC1,XRYRBT
;INITIALZE UUO EXECUTE LOCATION
MOVE TAC,[JSR UUOH] ;THE INITIAL PART OF USER UUO HANDLING TAKES PLACE IN WRITABLE CORE
MOVEM TAC,41 ;SINCE I.T.S. ALWAYS SIMULATES A JSR TO THE EA OF 41
MOVE TAC,[PUSH PDP,UUOH] ;WE THEN SIMULATE A PUSHJ PDP,UUOHAN AS IF IT CAME FROM 41
MOVEM TAC,UUOH1
MOVE TAC,[JRST UUOHAN]
MOVEM TAC,UUOH2
;INITIALIZATION OF CONSOLE TTY
; INCLUDED IN THE DDB OF EVERY DEVICE ARE THE I.T.S.
; CHANNEL #'S ASSOCIATED WITH INPUT AND OUTPUT OF
; EVERY CHANNEL. FOR TTY (OR, MORE GENERALLY, FOR ANY
; CLASS 3 INTERRUPT DUE TO THE GENERAL CONDITION:
; BUFFERED TTY INPUT ON CHANNEL.) EVENTUALLY, IT IS EXPECTED THAT
; > 1 TTY DEVICE MAY BE ATTACHED TO A JOB.
; (E.G. SELECTRIC TTY FOR SCRIPT OUTPUT.)
HRRZI TEM,(SIXBIT /TTY/)
HRLI TEM,CTYIMD ;MODE OF CTY INPUT
MOVEM TEM,FILNAM
SETZM FILNM1
SETZM FILNM2
;NOW GRAB I.T.S. CHANNELS FOR CTY (ASSUMING THAT WE HAVE
; CONTROL OF CONSOLE)
.OPEN CTYI,FILNAM ;AND GRAB IT
.LOSE %LSSYS ;OPEN CTYI, FAILURE
HRLZI TEM,CTYOMD ;CTY OUTPUT MODE
HLLM TEM,FILNAM
.OPEN CTYO,FILNAM
.LOSE %LSSYS ;OPEN CTYO, FAILURE
;RESET THE OLD TTY CHANNELS
.RESET CTYI,
.RESET CTYO,
.RESET UPRGO,
.DISMIS [.+1]
;THIS SHOULD HELP US OUT ESPECIALLY IF WE HAPPENED TO
; RESTART THE PROGRAM NEVER HAVING .DISMISS'ED
; OURSELVES FROM OUR INTERRUPT ROUTINE.
MOVE TAC,SNAME ;NOW'S THE TIME TO READ IN OUR UFD
MOVEI TAC1,INITFD ;HERE'S WHERE WE GO EACH TIME AN ENTRY IS FOUND
PUSHJ PDP,RFD ;READ THE UFD IN, SKIPS IF FOUND
HRROS DIRLST ;NON-SKIP, USER HAS NO DIRECTORY
MOVSI TAC,200000 ;INSERT BIT 1 IN LEFT HALF OF DIRLST IF USER HAS A DIR
SKIPL DIRLST
IORM TAC,DIRLST
HRRZ TAC,HLADR ;COLLECT ADDRESS OF FIRST WORD IN TOP K
LSH TAC,-12 ;CONVERT IT TO A CORE SIZE
.CORE (TAC) ;REDUCE CORE TO THAT AMOUNT
.LOSE %LSSYS
HLLZS HLADR ;AND INFORM THE WORLD THAT IT IS NO LONGER THERE
.IOT CTYO,.CR
.IOT CTYO,.LF
.IOT CTYO,PERIOD ;TYPE A PERIOD AS SIGNON
;NOW LET'S GET THE OLD INTERRUPT ROUTINES IN ORDER
MOVE DAT,[JSR INTR]
MOVEM DAT,42
.IOPDL ;RESET I/O PUSHDOWN LIST
.SUSET [.SMASK,,[0]] ;RESET PRIQC INTERRUPT MASK
.SUSET [.SMSK2,,[377,,1_<CTYI>]] ;THIS ENABLES THE TTY INPUT INTERRUPT.
; ALSO ENABLED ARE BITS TO ALLOW INTERRUPTS GENERATED
; BY ANY INFERIOR. BOTH ARE WORD-2 INTERRUPTS. BOTH ARE
; CLASS-3 INTERRUPTS.
;NOW IT'S BEDDY-BY TIME ... ZZZZZZ
DSLEEP: JFCL
.HANG
;DESCRIPTION OF INTERRUPT TIMING AND PROCESSING.
; WE ORDINARILY WILL BE EXPECTED TO HANDLE 2 TYPES OF INTERRUPTS:
; (1) CHARACTER-TYPED-ON-USER'S-TTY INTERRUPTS, AND (2) INFERIOR
; INTERRUPT DUE TO ATTEMPTED EXECUTION OF A SYSTEM UUO.
; BOTH OF THESE ARE CLASS-3 INTERRUPTS.
; DURING REAL EXECUTION OF USER PROGRAMS, THE SECOND TYPE OF INTERRUPT,
; AS DESCRIBED ABOVE, IS EXPANDED TO INCLUDE INTERRUPTS BY
; THE INFERIOR DUE TO ILLEGAL OP CODES, PUSHDOWN OVERFLOW, AND
; MEMORY PROTECTION VIOLATIONS BESIDES THE SYSTEM UUO INTERRUPTS.
; IN FACT, THE USER MAY WISH TO ENABLE ARITHMETIC AND FLOATING OVERFLOW
; TRAPPING, IN WHICH CASE THESE CONDITIONS MAY CAUSE THE INFERIOR
; TO GENERATE CLASS-3 INTERRUPTS, WHICH IN THIS CASE WILL
; ALSO GENERATE "BAD LOCATION 42" INTERRUPTS - AND
; SINCE THESE ARE CLASS-2 INTERRUPTS, THEY WILL CAUSE AN INTERRUPT HERE.
; THE TIMING BETWEEN INTERRUPT PROCESSING FOR CHARACTERS AND
; INFERIORS IS SOMEWHAT INVOLVED, SINCE SOME SCHEDULING IS NEEDS
; COMBINED WITH EVERYTHING ELSE.
; CHARACTER INTERRUPTS ARE HANDLED FIRST. CHARACTERS ARE INPUT UNTIL
; THEY ARE EXHAUSTED WITH REPEATED .ITYIC INSTRUCTIONS. THEN, IF WE FIND THAT A BREAK
; CHARACTER HAS BEEN RECEIVED THEN EITHER THE COMMAND DECODER OR THE
; USER UUO ROUTINES WILL BE EXECUTED, DEPENDING WHETHER THE USER
; WAS IN COMMAND MODE OR TELETYPE-INPUT-WAIT MODE.
; IF NO TTY INTERRUPT WAS RECEIVED, OR IF NO BREAK
; CHARACTERS WERE SEEN, THE INTERRUPT REQUEST WORD
; IS CHECKED FOR INFERIOR INTERRUPT REQUEST
; BITS (BITS 3.1-3.8). IF FOUND, INTERRUPTS DUE TO ATTEMPTED EXECUTION OF
; SYSTEM UUOS OR ILLEGAL OP CODES ARE HANDLED BY UUOCON. IF THE USER IS
; ENABLED FOR OTHER INTERRUPTS SEEN IN THE INFERIOR'S PIRQC WORD,
; CONTROL IS PASSED TO HIM. OTHERWISE, THE INTERRUPT MUST BE DUE
; TO MEMORY PROT VIOLATIONS OR A USER-UNENABLED CONDITION.
; IN THIS CASE CONTROL IS PASSED TO ERRCON WHERE AN ERROR MESSAGE IS TYPED.
; SHOULD THE USER RETURN FROM UUO PROCESSING IN MONITOR MODE (WHICH WOULD HAPPEN
; AS THE RESULT OF A CALLI 12, FOR EXAMPLE), WE CHECK TO SEE IF COMMAND LINES
; ARE PENDING.
;PRCINT PW2IZ PW2IY PW2IX PW2IW PW2IA PW2II PW2IJ
;PROCESS WORD1 INTERRUPTS
PRCINT: SKIPL INTR ;WORD1 INTERRUPT (PIRQC-TYPE) ?
JRST SYSERR ;STOP IF WORD1 INTERRUPT FOUND
;PROCESS WORD2 INTERRUPTS
MOVEM 17,SAV17
MOVE 17,INTR
TRNN 17,1_<CTYI> ;CONSOLE INTERRUPT ?
JRST PW2IB ;NO
SKIPN TTYOIP
JRST PW2IW
SOS TTYOIP
MOVEI 17,CTYI
.ITYIC 17,
JRST SYSERR
CAIE 17,3 ;^C ?
JRST PW2IY
SKIPN CNCLAS
JRST PW2IZ
TLO IOS,IOSUPR ;SUPPRESS OUTPUT FOR WHATEVER TTY THIS HAPPENS TO BE.
; SINCE IOS ISN'T STORED BACK INTO DDB, WE WON'T BE THIS WAY FOR
; LONG. BUT ^C^C IS TOP PRIORITY.
JRST PW2IX
PW2IZ: SETOM CNCLAS
JRST ENDINT
PW2IY: SETZM CNCLAS
CAIE 17,17 ;^O ?
JRST ENDINT
MOVSI 17,IOSUPR
XORB 17,DEVIOS+CTYDDB
MOVE IOS,DEVIOS(DDB) ;RESTORE AC(IOS)
PW2IX: HRRZ 17,INTR1
CAIN 17,PUTCH ;IS THIS THE XCT TAC WHICH .IOT'S
AOS INTR1
JRST ENDINT
PW2IW: MOVE PDP,NPDP ;START UP WITH A PUSHDOWN STACK
MOVEI DDB,CTYDDB
PW2IA: SKIPN TTYOIP
JRST PW2II
AOSL TTYOIP
.DISMIS DSLEEP
JRST PW2IJ
PW2II: MOVEI CHREC,CTYI
.ITYIC CHREC, ;READ NEXT CHAR
JRST PW2IB ;NO MORE LEFT TO PROCESS
PW2IJ: .IOT CTYI,CHREC ;.IOT THE CHARACTER
;RECIN2
;CODE HERE BASED ON SCNSRF, COMMON RECEIVER INTERRUPT ROUTINE
; FOR ALL KEYBOARD DEVICES. CODE AT RECINT:, FF. (PP 44-45)
TRNN CHREC,177 ;IGNORE NULLS
JRST PW2IA
HLLZ LINE,TTYLIN(DDB)
MOVE IOS,DEVIOS(DDB)
RECIN2: ANDI CHREC,177 ;7-BIT ASCII ONLY
CAIN CHREC,3 ;^C ?
PUSHJ PDP,CNCTST ;YES - SEE IF 2ND IN A ROW
LDB HPOS,PHPOS ;PICK UP HORIZONTAL POSITION OF OUTPUT CHAR
MOVEI DAT,TTIBUF(DDB)
PUSHJ PDP,TTEDIT ;GO EDIT (+ ECHO) CHAR
TRNN IOS,NOECHO ;ECHO-ING DONE ?
DPB HPOS,PHPOS ;YUP - UPDATE
HLLM LINE,TTYLIN(DDB)
TLNN IOS,SYNC+DDTM ;WAS A BREAK CHAR TYPED ?
JRST PW2IA ;NO - SO THAT'S ALL THERE IS TO THIS CHAR
SKIPG TISYNC(DDB) ;HAVE WE ALREADY SET THIS LOSER FOR COMMAND ?
PUSHJ PDP,COMSET ;NO - SET UP IOFST IN AC(IOS) IF TPMON SET
TLNE IOS,SYNC
AOS TISYNC(DDB) ;TISYNC GETS INCREMENTED IF BREAKB OR FCSBRK SEEND
; IN LH OF SPCTAB ENTRY FOR CHAR. (OR IF CHAR=<CR>).
MOVSI IOS,SYNC
ANDCAB IOS,DEVIOS(DDB) ;CLEAR SYNC BIT
MOVE TAC,TIPCTR(DDB) ;ALL BREAK CHARS (WHICH CAUSE SYNC TO BE SET)
DPB TAC,PLSTLC ;AND ALL CHARS RECEIVED IN DDT MODE CAUSED ^U UPDATING.
TLNE IOS,IOW ;IN I/O WAIT ?
TLZN IOS,TTYIOW ;AND STILL THERE ?
JRST PW2IA ;NO
MOVEM IOS,DEVIOS(DDB) ;CLEAR "STILL WAITING BIT"
JRST PW2IA ;ALL DONE W/THIS CHAR, LOOK FOR NEXT
;PW2IB PW2IF
;TTY CHARS HAVE BEEN SEEN, BUT NOW THEY HAVE BEEN EXHAUSTED.
; CALL COMMAND DECODER IF IN MONITOR MODE. UPON RETURN FROM COMMAND,
; CALL DECODER AGAIN IF WE ARE STILL IN MONITOR MODE AND THERE ARE MORE COMMANDS
; WAITING.
PW2IB: SKIPN TTYOIP ;TTY OUTPUT IN PROGRESS ?
JRST .+3 ;NO
.SUSET [.SIFPIR,,INTR] ;YES - FIRST MAKE SURE THAT WE GET THIS INTERRUPT
; A SECOND TIME, WHEN WE CAN REALLY DO SOMETHING WITH IT
JRST @INTR1 ;FINISH UP WITH THOSE CHARS FIRST
MOVE PDP,NPDP
PUSHJ PDP,TTYFNU
TLNN IOS,TPMON ;IN MONITOR MODE ?
JRST PW2IF ;NO - NOW CHECK INTERRUPTS FROM INFERIORS. NOTE,
; THIS BIT MAY HAVE BEEN SET AT INTERRUPT TIME, BUT
; CLEARED IF COMMAND FORCED JOB TO BE STOPPED.
SKIPG TISYNC(DDB) ;COMMANDS WAITING ?
JRST PW2IC ;NO
PUSHJ PDP,COMMAND ;CALL COMMAND DECODER.
; WE ARE IN MONITOR MODE AND A COMMAND LINE IS WAITING.
; COMMAND: HAD BETTER REDUCE TISYNC TO MAKE THIS ALL WORK.
JRST PW2IB ;LOOK TO SEE IF MORE COMMANDS ARE WAITING
PW2IF: TLNE IOS,IOW ;ARE WE IN IOWAIT ?
TLNE IOS,TTYIOW ;AND STILL WAITING ?
JRST PW2IC ;YES
MOVSI AC3,USRDAC ;NO - PREPARE TO GO BACK INTO MIDDLE OR USER UUO PROCESSING
BLT AC3,16 ;RESTORE AC'S
JRST @USRPC ;GO BACK INTO OUR CODING
;PW2IC URETRN
;NOW CHECK TO SEE IF INFERIOR INTERRUPT TO BE PROCESSED.
; IT MAY HAVE BEEN CAUSED BY AN ILLEGAL INSTRUCTION, A SYSTEM UUO
; (OPCODES 40-127, AND 0), OR AN ILLEGAL REFERENCE TO MEMORY.
; THIS BIT WILL BE TURNED OFF IF WE WERE REQUESTED TO STOP JOB BY
; COMMAND DECODER. THE USER PC WILL HAVE BEEN DECREMENTED BY 1 SO
; THAT A 'CONTINUE' WILL WORK.
PW2IC: MOVE TAC,INTR
TLZN TAC,377 ;ANY INTERRUPTS FROM OUR (IN FACT, ANY) INFERIOR ?
JRST ENDINT ;NO - ALL DONE
MOVEM TAC,INTR ;RESET INTR.3 SO WE DON'T GET HERE AGAIN
SKIPL JBTSTS ;DO WE UNDERSTAND THIS TO BE A RUNNING PROGRAM ?
JRST SYSERR ;IF NOT - LOSE BIG
.USET UPRGO,[.RPIRQC,,TAC] ;READ IN HIS INTERRUPT REQUEST WORD
TDZN TAC,[BUTRAP\BILLOP] ;ILLEGAL INSTRUCTION OR SYS UUO TRAP ??
JRST PW2ID ;NO - MUST BE A MEM VIOLATION OR PDL OVFOR AROV OR FOV
.USET UPRGO,[.SPIRQC,,TAC] ;RESET REQUEST
.USET UPRGO,[.RSV40,,FORTY] ;SET UP LOCATIONS SO THAT UUOCON HAS A HOLD ON THE WORLD
.USET UPRGO,[.RUPC,,UUO0] ;READS USER'S AT TIME OF TRAPPING UUO
JRST UUOUSR ;CALL UUO CONTROLLER
URETRN: ;RETURNS HERE
SKIPN TTYOIP ;TTY OUTPUT IN PROGRESS
JRST PW2IB ;RETURN TO SEE IF WE HAVE SWITCHED MODES - IF WE HAVE,
; COMMANDS MAY BE READY TO PROCESS
; (NOTE THAT WE START USING NPDP AGAIN)
JRST PW2IW
;PW2ID ENDINT
PW2ID: PUSH PDP,TAC
TDZN TAC,[BIOADC\200000\AROIF\ARFOIF\BPIPI] ;DID WE GET SOME COMBINATION OF
; ANTICIPATED INTERRUPTS ?
JRST SYSERR ;NO !!
.USET UPRGO,[.SPIRQC,,TAC] ;RESET REQUEST WORD
;PROCESS USER INTERRUPTS FOR ILL MEM/PC OUT OF BOUNDS, PDL OVF, AROV, AND FOV.
; RESTART USER IF HE WISHES TO HANDLE TRAPS.
; ALWAYS RETURNS
POP PDP,APRERR ;STORE INTERRUPT FLAGS
; (ALSO USED AS AN ERROR FLAG)
.USET UPRGO,[.RUPC,,APRCHL]
PUSHJ PDP,APRER
JRST PW2IB ;GO BACK- WE MAY HAVE SWITCHED TO MONITOR MODE W/SOME
; COMMANDS READY IN OUR INPUT BUFFER. WE DON'T PROCESS WORD2
; INTERRUPTS MORE THAN ONCE EACH DUE TO THE FACT THAT INTR:
; WAS SUITABLY CLEARED.
ENDINT:
MOVE 17,SAV17
.DISMIS INTR1 ;SEE I.T.S.R.M. P 96
;MNTDDB INITFD PERIOD .CR .LF PATCH
;A COUPLE OF MISC ROUTINES USED DURING INITIALIZATION
MNTDDB: ;MAKE A NEW TTY DDB STARTING AT LOCATION
; AS ADDRESSED BY AC(DDB). ESSENTIALLY COPIES OUT
; PROTOTYPE (THERE THERE HAD BETTER BE ENOUGH ROOM)
; AND THEN COMPUTES AN IMMEDIATE ADDR (OR 2) AND PUTS THEM INTO
; THE NEW DDB AT THEIR PROPER PLACES. SEE TTYINI:,
; SCNSRF, P 7.
HRLZI AC1,SCNDDB ;GET ADDR OF THAT PROTOTYPE
HRRI AC1,(DDB)
BLT AC1,SCNLEN-1(DDB) ;WRITE OUT INITIAL SCNLEN WORDS FROM
; PROTOTYPE
SETZM SCNLEN(DDB) ;THEN ZERO OUT THE REST
HRLZI AC1,SCNLEN(DDB)
HRRI AC1,SCNLEN+1(DDB)
BLT AC1,SCNDDS-1(DDB)
HRRZI TEM,TIBF(DDB)
HRRM TEM,TTIBUF(DDB)
JRST TSETBF
INITFD:
MOVEI AC1,1 ;GET 1 CHUNK FOR THIS UFD ENTRY
PUSHJ PDP,GTF ;RETURNS ADDRESS OF CHUNK IN T -- OUR "TO ADDRESS"
MOVE T1,AC1
HRLI T1,FILNAM ;THE "FROM ADDRESS"
BLT T1,FSIZ-1(AC1) ;ZAP
MOVE T1,DIRLST ;INSERT THIS CHUNK AS THE NEW BEGINNING ENTRY
; THIS PREVENTS US FROM GETTING SCREWED IF CORE HAS
; TO BE MOVED, THEREBY CHANGING THE ADDRESSES OF
; SPECIFIC UFD ENTRIES.
HRRM AC1,DIRLST
HRRM T1,FSIZ-1(AC1)
POPJ PDP, ;RETURN TO LET RFD: GIVE US SOME MORE ENTRIES
PERIOD: ".
.CR: ^M
.LF: ^J
;LITERALS GO HERE
CONSTANTS
;PATCH SPACE HERE
PATCH: BLOCK 100.
;INTR INTR1 INTR2 FRENAM FOPRNM FILNAM FILNM1 FILNM2 FILNM3 FILNM4 DIRLST DEVLST HLADR FRENUM FREEPT CHNSAT TTYOIP CNCLAS SAV17 SNAME JOB NQSV QACTV QTUTOV QSFTV DAMESS YSET YRESET XRYRBT TRTPI TRTPIT TRTST TRTIT APRCHL APRERR ITSENB
;WRITABLE CORE
FRSTWR==. ;FIRST LOCATION OF WRITABLE CORE
INTR: 0
INTR1: 0
;LOCATION 42 (THE INTERRUPT LOCATION) HAS A JSR
; INTR. THE USER'S APPROPRIATE INTERRUPT WORD GETS STORED
; HERE. SEE I.T.S. REFERENCE MANUAL, P 93.
;THE INTERRUPT REALLY CAUSES A JSR TO INTR1.
INTR2: JRST PRCINT ;GO TO OUR INTERRUPT PROCESSOR
FRENAM: 0,,(SIXBIT /DSK/) ;DEVICE NAME
0 ;FILE TO BE DELETED OR RENAMED
0 ;FILE TO BE DELETED OR RENAMED
0 ;NEW NAME1 OR 0 FOR DELETE
FOPRNM: 0 ;NEW NAME2 OR INSIGNIFICANT
0 ;ALWAYS = 0
FILNAM: 0 ;FOR OUR .OPEN'S
FILNM1: 0 ;NAME1
FILNM2: 0 ;NAME2
FILNM3: 0 ;USED BY MISC FOR RENAMING
FILNM4: 0
DIRLST: 0 ;RH POINTS TO LIST OF USER DIRECTORY ENTRIES,
; EACH "FSIZ LONG. FORWARD POINTER IN ENTRY FOUND IN RH
; OR LAST WORD.
DEVLST: 0 ;LH POINTS TO DDB CHAIN, THE FIRST OF WHICH IS THAT
; FOR THE CTY. FORWARD POINTERS FOUND IN LH OF DEVSER WORD OF DDB.
HLADR: 0 ;RH=ADDRESS OF 1K DIRECTORY BLOCK IF IT EXISTS,
; 0 IF NOT
;LH = LAST LOCATION USED BY FREE CORE ROUTINES. MUST
; BE INITIALIZED WHEN INITIAL BLOCK OF FREE CORE GIVEN TO FREE STORAGE ROUTINE
FRENUM: 0 ;# FREE CELLS, EACH "FSIZ" LONG
FREEPT: 0 ;RH POINTS TO LIST OF FREE CELLS. FORWARD POINTER IN
; CELL BLOCK IN RH OF LAST WORD
CHNSAT: 0 ;I.T.S. CHANNEL ASIGNMENTS TABLE
TTYOIP: 0
CNCLAS: 0
SAV17: 0
SNAME: 0 ;SNAME FOR CURRENT USER - USED BY RFD:
JOB: 0 ;USER INDEX OF SIM PROCEDURE (USED AS JOB NUMBER)
NQSV: ;SAVE-LOCATIONS OF VARIABLES USED IN "RESOURCES" COMMAND
QACTV: 0 ;VALUES OCCUPY HALF WORDS ONLY
QTUTOV:
QSFTV: 0
DAMESS: ASCII /-Jan-/ ;C.F. [CLOCK1, P 1]
;*** WE DEPEND ON YSET HAVING A NULL INITIAL BYTE ***
YSET: 0 ;YEAR TO USE IF YEAR BIT FOUND TO BE SET
YRESET: 0 ;YEAR TO USE IF YEAR BIT FOUND TO BE RESET
XRYRBT: 0 ;BIT TO XOR TO 28 BIT CREATION DATE FOUND IN
; UNDATE WORD OF I.T.S. UFD ENTRY TO MAKE SIMPLE
; .LT., .GT. COMPARING WORK TO DETERMINE IF ONE FILE NEWER
; THAN ANOTHER
;"TIME" STORAGE CELLS
TRTPI: 0 ;TOTAL RUN TIME FOR PAST INFERIORS
TRTPIT: 0 ;TOTAL RUN TIME FOR PAST INFERIORS SINCE LAST "TIME"
; COMMAND
TRTST: 0 ;TOTAL RUN TIME FOR SIMULATOR AT LAST "TIME" COMMAND
TRTIT: 0 ;TOTAL RUN TIME FOR CURRENT INFERIOR AT LAST "TIME" COMMAND.
;ALL VALUES STORED IN 4.069 MICROSECOND UNITS
;APR TRAPPING VARIABLES
APRCHL: 0
APRPC=APRCHL
APRERR: 0
ITSENB: 0 ;I.T.S. INTERRUPT REQUEST WORD
; (IE I.T.S. VERSION OF USER'S ENABLED TRAPS)
;PUSHDOWN STORAGE
USRPD1=.
USRPDL=USRPD1-1
USRPD3=USRPDL+3
BLOCK -UJOBPD
NULPDL=.-1
BLOCK -NJOBPD
;USRREL USRHCU USRPC USRDDT USRJDA USRFDV USREXM JBTSTS JBTADR JBTNAM JBTPRG PRJPRG FORTY UUO0 UUOH UUOH1 UUOH2 MONBUF SGANAM SGAEXT SGADAT SGALEN SGAPPN SGAMOD SGADEV SGAHED SGADMP SGANEW SGAHGH SGALOW SDVNMF CTYDDB LPTDDB DSKDDB
;C.F. COMMON.MAC PAGE 6
USRREL: 0
USRHCU: 0 ;HIGHEST USER I/O CHANNEL IN USE.
; 0 MEANS EITHER NONE OF CHANNEL 0 IN USE.
USRPC: 0
USRDDT: 0 ;RH=STARTING ADDRESS OF USER DDT.
; LH UNUSED
USRJDA: BLOCK 20 ;RH=JOB DEVICE ASSIGNMENTS (DEVICE DATA BLOCK
; ADRESSES)
;LH=UUO'S DONE SO FAR FOR THIS CHANNEL.
;0 MEANS NO DEVICE INITIALIZED ON THIS CHANNEL.
USRLO==USRJDA ;FIRST LOCATION TO ZERO OUT IN CORE ON RESET UUO
USRLO1==USRLO+1
USRHI==.-1 ;LAST LOC AFFECTED BY THE ABOVE
USRFDV: 0 ;USED BY "FINISH" CODING
USREXM: 0 ;USED BY EXAMINE/DEPOSIT COMMANDS
;USER DUMP AC AREA
USRDAC==.
USRDPD==USRDAC+PDP
USRD16==USRDAC+16
BLOCK 17
;C.F. COMMON.MAC PAGES 12-13
JBTSTS: 0 ;JOB STATUS WORD
JBTADR: 0
JBTNAM: ;NAME OF HIGH SEGMENT (FILE IT WAS INITIALIZED FROM)
JBTPRG: 0 ;NAME OF FILE USED IN LAST R, RUN, GET, ETC.
PRJPRG: 0 ;USER'S "PROJECT-PROGRAMMER #" (CONVERTED FROM USER'S SNAME)
;UUOCON STORAGE CELLS
FORTY: 0 ;CONTENTS OF MONITOR LOCATION 40 IF WERE TO HAVE
; RECEIVED A TRAP FROM USER ON ILLEGAL INSTRUCTION OR
; SYSTEM UUO
UUO0: 0 ;D.E.C. MONITOR WOULD HAVE DONE A JSR UUO0
; UPON RECEIVING A LOCATION 40 TRAP
;UUO HANDLER VARIABLES (HANDLES UUO'S 0-37) VIA I.T.S. MONITOR
UUOH: 0 ;I.T.S. SIMULATES A JSR TO HERE
UUOH1: PUSH PDP,UUOH ;FIRST WE SAVE RETURN POINTER ON PUSHDOWN STACK
UUOH2: JRST UUOHAN ;THEN CALL THE UUO HANDLER
MBFSIZ==200
MONBUF: BLOCK MBFSIZ
;C.F. COMCON.MAC PAGE 64
;SAVGET CORE LOCATION USED FOR UUOS TO MONITOR.
; USED IN SAVGET IN SEGCON.MAC
SGANAM: 0 ;FILE NAME
SGAEXT: 0 ;FILE X10N
SGADAT: 0 ;FILE CREATION DATE AND TIME
SGALEN: 0 ;PROJECT-PROGRAMMER NUMBER
SGAPPN: 0 ;PLACE TO SAVE PROJ.,PROG. USED TYPED IN
SGAMOD: 0 ;IOS MODE WORD FOR OPEN UUO
SGADEV: 0 ;DEVICE NAME
SGAHED: 0 ;I/O BUFFER HEADER ADDRESSES (=0)
SGADMP: 0
SGANEW: 0 ;NEW CORE ASSIGNMENT SPECIFIED BY 3RD ARG
SGAHGH: 0 ;LH=EXT TO USE FOR SAVING HIGH SEG
SGALOW: 0 ;LH=EXT WHICH USER TYPED FOR SAVE OR GET
; OR .SAV IF HE DIDN'T TYPE ARG W/LEADING PERIOD.
;RH=0
SDVNMF: 0 ;SAW DEVICE FLAG
CTYDDB: BLOCK SCNDDS
LPTDDB: BLOCK LP0DDS ;LINE PRINTER DDB
DSKDDB: BLOCK PTR1 ;PROTOTYPE DSK DDB
FRSTFR=.
END GO