mirror of
https://github.com/PDP-10/its.git
synced 2026-03-26 10:12:37 +00:00
7891 lines
226 KiB
Plaintext
7891 lines
226 KiB
Plaintext
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
|