; UPDATE 2/15/73 PATCHR.S03 ; UPDATE 1/26/73 PATCHR.S02 .TITLE PATCHR (DYNAMIC PATCHES FOR CITGO) ; ;***********************************************************************PCHR ; *PCHR ; P A T C H R *PCHR ; *PCHR ; PROGRAM IDENTIFICATION: PATCHR ; UPDATE 10/18/72 LPRNTR.C01 ; UPDATE LPRNTR.009 06.21.72 ; UPDATE LPRNTR.008 05.12.72 ; UPDATE LPRNTR.007 05.03.72 ROS SYSTEM VERSION .TITLE LPRNTR ;********************************************************************** ;* ** ;* L P R N T R ** ;* ; MAGTAP.S11 ON TAPE 123 21 FEB 73 .TITLE MAGTAP ; MAGTAP.S09 ON TAPE 123 16 FEB 1973 ; MAGTAP.S07 ON TAPE 124 05 JAN 1973 ; MAGTAP.S06 ON TAPE 125 29 DEC 1972 ;********************************************************************** ;* M A G T A P ** ;* ** ;* PROGRAM IDENTIFICATION. MAGTAP - MAGNETIC TAPE INTERFACE ** ;* SUBROUTI .TITLE CLOCK ; CONTROL TIMERS & CALENDAR UNDER LINE .REF TIMER,CALEND ; FREQUENCE CLOCK (60 HZ) .DEF CLOCKT,PATCH CLOCKT: MOV #340,-(SP) ; SET UP STACK ST. TIMERS' RTI GOES MOV #A,-(SP) ; TO 'A' JMP TIMER ; A: MOV #340,-(SP) ; SEP UP STACK ST. CALEND'S RTI GOES MOV #B,-(SP) ; TO 'B' JMP CALEND B: RTI ; GET DONE WITH THE INTERRUPTION *PCHR ; *PCHR ; PURPOSE: TO PROVIDE A METHOD OF PATCHING ROS OVERLAY TASKS *PCHR ; AT LOAD TIME IN THE ROS II/CITGO SYSTEM. *PCHR ; *PCHR ; METHOD: THIS TASK WILL CREATE AND MAINTAIN A SYSTEM FILE *PCHR ; CONTAINING ALL PATCHES FOR ALL TASKS. SECTOR ZERO WILL CONTAIN*PCHR ; POINTE ** ;* PROGRAM IDENTIFICATION. LPRNTR - LINE PRINTER OUTPUT ** ;* SUBROUTINE. ** ;* ** ;* PURPOSE. THIS SUBROUTINE PERFORMS THE OUTPUT PROCESSING ** ;* AND CONTROL FUNCTIONS FOR EVERY LINE PRINTER IN THE ** ;* SYSTEM. ALL OUTPUT REQUESTS ARE QUEUED ON A PRIORITY ** ;* BASIS, THEREBY PERMITTING THE LINE PRINTER TO BE USE NE ** ;* ** ;* PURPOSE. ALL COMMUNICATIONS WITH THE MAGNETIC TAPES WILL ** ;* BE THROUGH THIS SUBROUTINE. THIS ROUTINE PERFORMS THE ** ;* FOLLOWING MAGNETIC TAPE FUNCTIONS: ** ;* 1 OPEN (RETURN STATUS) ** ;* 2 CLOSE (NO OPERATION) ** ;* PATCH: .=.+1000 ; RESERVE A PATCH AREA .END ; THE END !! RS TO A LINKED LIST OF PATCHES, ONE FOR EACH TASK. *PCHR ; WORD1 POINTS TO TASK 1'S PATCHES, WORD2 TO TASK 2'S, ETC. A *PCHR ; BLANK ENTRY IMPLIES NO PATCHES. WORD0 WILL POINT TO THE NEXT *PCHR ; SLOT A PATCH RECORD CAN BE STORED IN. *PCHR ; *PCHR ; EACH PATCH RECORD WILL CONTAIN 4 WORDS. THEY ARE: *PCHR ; WORD 0 LINK POINTER D ** ;* IN REAL-TIME APPLICATIONS FOR PRIORITY ALARM MESSAGES, ** ;* ETC. THE INTERNAL MESSAGE FORMAT ACCEPTED BY LPRNTR ** ;* IS EITHER ASCII OR EBCDIC. NON-PRINTABLE CHARACTERS ARE ** ;* CONVERTED TO BLANKS, ALTHOUGH THE CHARACTER IS SYSGENABLE ** ;* TO ANY OTHER PRINTABLE CHARACTER. ALL THREE GENERAL I/O ** ;* EXITS ARE SUPPORTED BY LPRNTR. ** ;*  3 READ ** ;* 4 WRITE ** ;* 5 WRITE FILE MARK ** ;* 6 REWIND ** ;* 7 SPACE (+-N) RECORDS ** ;* 10 SKIP (+-N) FILES ** ;* ALL THREE STANDARD R0S I/O EXITS ARE SUPPORTED BY MAGTAP. ** ; UPDATE 3/7/73 COMPRS.C03 ; UPDATE 1/3/73 COMPRS.C02 ; UPDATE 12/12/72 COMPRS.C01 ; UPDATE 6/22/72 COMPRS.S05 ; UPDATE 5/2/72 COMPRS.S04 ; UPDATE 4/10/72 COMPRS.S03 ; UPDATE 4/5/72 COMPRS.S02 ; UPDATE 4/4/72 COMPRS.S01 .TITLE COMPRS ;*********************************************************************** ;*  *PCHR ; WORD 1 LOCATION TO PATCH *PCHR ; WORD 2 BIT 0 =0 NON-RELOCATABL PATCH *PCHR ; =1 RELOCATABLE PATCH *PCHR ; WORD 2 BIT 15 =0 WORD PATCH *PCHR ; =1 BYTE PATCH *PCHR ; WORD 3 PATCH VALUE *PCHR ;  ** ;* USAGE. THE ASSEMBLER LINKAGE TO LPRNTR IS: ** ;* ** ;* MOV #LIST,-(SP) ;PUSH LIST ADDRESS ON STACK ** ;* EMT LPRNTR ** ;* ** ;* THE FORTRAN EQUIVALENT CALL IS: ** ;* ;* ** ;* USAGE. THE ASSEMBLER LINKAGE TO MAGTAP IS: ** ;* ** ;* MOV #LIST,-(SP) ;PUSH LIST ADDRESS ON STACK ** ;* EMT MAGTAP ** ;* ** ;* THE FORTRAN EQUIVALENT CALL IS: ; UPDATE 10/18/72 FLIST.C01 ; UPDATE 6/22/72 FLIST.S08 ; UPDATE 5/4/72 FLIST.S07 ; UPDATE 5/2/72 FLIST.S06 ; UPDATE 4/27/72 FLIST.S05 ; UPDATE 4/25/72 FLIST.S04 ; UPDATE 4/25/72 FLIST.S03 ; UPDATE 4/21/72 FLIST.S02 ; UPDATE 4/11/72 FLIST.S01 .TITLE FLIST ;*********************************************************************** ;*  *PCHR ; ALL LINK POINTERS WILL POINT TO THE SECTOR AND WORD OF THE *PCHR ; PATCH RECORD. BITS 0-6 WILL CONTAIN THE BYTE ADDRESS IN *PCHR ; THE SECTOR SPECIFIED BY BITS 7-15. *PCHR ; *PCHR ; THIS TASK ACCEPTS REQUESTS IN THE FOLLOWING FORMS: *PCHR ; D,N DEFINE A PATCH FILE OF 'N' SEC ** ;* CALL LPRNTR (IADDR(LIST)) ** ;* ** ;* THE FORMAT OF THE DATA BUFFER, DATA, IS: ** ;* ** ;* ----------------------------------- ** ;* WORD 1 ! NWORD ! ** ;* -------------------- ** ;* ** ;* CALL MAGTAP(IADDR(LIST)) ** ;* ** ;* THE FORMAT OF THE LIST IS AS FOLLOWS: ** ;* ** ;* LIST THREAD ** ;* +2 EXIT TYPE (1 OR 2) DEVICE TYPE (MAG T * ;* FLIST IS THE ROS FILE LIST PROGRAM. THIS WILL BE INITIALTED * ;* VIA INPUT BY: * ;* FL,XXX * ;* WHERE XXX IS THE FILE TYPE(FILE TYPE 0 NOT ALLOWED). * ;* OR: * ;* FL * ;* TORS *PCHR ; X DELETE THE PATCH FILE *PCHR ; E TASK EXIT *PCHR ; C,T CANCEL ALL PATCHES FOR TASK 'T' *PCHR ; L LIST ALL PATCHES FOR ALL TASKS *2/12/73 ; L,T LIST ALL PATCHES FOR TASK 'T' *PCHR ; L,T1,T2 LIST ALL PATCHES FOR ALL TASKS FROM *2/12/73 ; --------------- ** ;* WORD 2 ! RESRVD ! ** ;* ----------------------------------- ** ;* WORD 3 ! CHAR 1 ! CNTRL ! ** ;* ----------------------------------- ** ;* . . ** ;* . . ** ;* . APE=4) ** ;* +4 EXIT ADDRESS (EXIT TYPE 3 ONLY) ** ;* +6 PRIORITY LEVEL DEVICE NUMBER (0 OR 1) ** ;* +10 RETURN ERROR PARAMETER (0 TO 14) ** ;* +12 SYSTEM (CALLING TASK #) ** ;* +14 DATA BUFFER ADDRESS ** ;* +16 SYSTEM ** ;* +20 SYSTEM  TO LIST ALL ROS FILE ENTRYS. * ;* * ;* THE LISTING WILL BE PRINTED ON THE LINE PRINTER UNLESS * ;* IT DOESN'T EXIST IN WHICH CASE IT WILL BE LISTED ON THE * ;* SYSTEM TELETYPE. * ;* * ;* PROGRAMMER 54 *  TASK 'T1' TO TASK 'T2' INCLUSIVE. *2/12/73 ; P,T,L,V SPECIFY A PATCH OF VALUE 'V' AT *PCHR ; LOCATION 'L' IN TASK 'T'. *PCHR ; R,T,L,V SPECIFY A RELOCATABLE PATCH OF VALUE *PCHR ; 'V' AT LOCATION 'L' IN TASK 'T'. *PCHR ; B,T,L,V SPECIFY A BYTE PATCH OF VALUE 'V' AT *PCHR ; LOCATION 'L' IN TASK 'T' . ** ;* ----------------------------------- ** ;* WORD X ! CHAR N ! CHAR N-1 ! ** ;* ----------------------------------- ** ;* ** ;* WHERE: ** ;* ** ;* NWORD = NU ** ;* +22 FUNCTION (CODES LISTED ABOVE) ** ;* +24 NWORD ** ;* +26 COUNT ** ;* +30 STATUS ** ;* +32 -BACKSPACE FLAG REPEAT COUNT ** ;* +34 RESERVED ** ;* +36 RESERV ;* DATE * ;* REVISION * ;* * ;*********************************************************************** ; .DEF FLSTHD,FLIST .REF DOD,FSTAT,PHYDEV .REF PUSHR,POPR,CDSRCH .REF FILE ; ******'* LPRNTR = 25 TTYOUT !. *PCHR ; *PCHR ; ILLEGAL REQUESTS WILL BE IGNORED AND AN APPROPIATE ERROR *PCHR ; MESSAGE PRINTED. *PCHR ; *PCHR ; PROGRAMMER: 53 *PCHR ; DATE: 27-NOV-72 *PCHR ; REVISION: "MBER OF CHARACTERS TO PRINT (INCLUDING THE ** ;* CONTROL CHARACTER, CNTRL), AND ** ;* NWORD > 0 FOR ASCII STRINGS ** ;* NWORD < 0 FOR EBCDIC STRINGS ** ;* RESRVD = RESERVED FOR SYSTEM USE ** ;* CNTRL = CARRIAGE CONTROL: 0 - NO LINE FEED ** ;* N - SKIP N LINES (N=1,2,3) ** ;* ED ** ;* ** ;* THE RETURN ERROR CODES ARE AS FOLLOWS: ** ;* ** ;* 0 I/O SUCCESSFUL ** ;* 1 LIST ALREADY IN A QUEUE ** ;* 2 INVALID DEVICE TYPE ** ;* 3 ILLEGAL EXIT TYPE $= 13 DISCIO = 23 EXIT = 4 NOCKPT = 30 BINASC = 16 ; .PAGE ; ; EQUATES FOR RELATIVE FILE POSITIONS ; SCTR = 2. ; START SECTOR FTYPE = 4. ; FILE TYPE PDVCE = 5. ; PROTECT STATUS AND DEVICE LGTH = 6. ; FILE LENGTH CKSAVE = 8. ; CHECKPOINT SECTOR ADDRESS .IFNZ $BATCH ; ; BATCH ELEMENT DIRECTORY EQUATES ; NAME% *PCHR ; CATALOGUE NUMBER: *PCHR ; *PCHR ;***********************************************************************PCHR .PAGE ; PCHR .DEF PATHDR ; PCHR ; & FF- EJECT PAGE ** ;* LF- SKIP 1 LINE (SAME AS N=1) ** ;* CHAR K = MESSAGE IN ASCII OR EBCDIC ** ;* ** ;* FF, LF AND HT MAY BE IMBEDDED IN THE TEXT FOR MULTIPLE LINES.** ;* TAB (HT) POSITIONS ARE: 1, 9, 17, ..., 8N + 1, ... ** ;* ** ;* HRPC ; ND.E HRPC . NEDO; PC S RT HRPC 5. RINR BEUM NRDWO; R5K,MSEC#S C BI HRPC VETILARER TOEC SHE TET GENTH; 5 ,RR3 V MO HRPC 4 RTOINR BEUM NORCTSET IFSHD AN(1 = 0. NAME2 = 2. STATUS = 4. BTYPE = 5. BHOUR = 6. BMIN = 7. BSEC = 8. BYEAR = 9. BDAY = 10. BMNTH = 11. BSTRTS = 12. BLGTH = 14. ; .ENDC ; ; MISCELLANEOUS EQUATES ; PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 340 ; PRIORITY LOCKOUT MASK FLSSIZ = 50. ; FILE LIST TASK SIZE YES = 131 ) PCHR ; SYSTEM EQUATES PCHR STSIZE = 100. ; 100 WORDS IN STACK PCHR PACHID = 11 ; PATCH FILE ID. PCHR DISABL = 6 ; TSTAT ENTRY FOR A DISABLED TASK. PCHR MAXTSK = 63. ; LARGEST LEGAL TASK FOR PATCHR TO HAND.2/12/73 MESSIZ = 16. ; # CHAR. IN LISTING MESS. BUFFER. 2/12/73 ; * PROGRAMMER: 55 ** ;* DATE: 01.17.71 ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ALL RIGHTS RESERVED ** ;* *; R4.,#9 HCAS HRPC . R5O NT IRDWON AICHT PU; 5 ,RR3 V MO HRPC ; R5 R CL HRPC RSTEISEG RUTTPOUR EACL; R4 R CL HRPC ; : DECODE HRPC ; HRPC S)ESDRADE YT B AAS (ERMBNUD OR WVETILARER TOEC S =R5 ; HRPC , ; ASCII Y NO = 116 ; ASCII N .PAGE ; ; FLIST TASK HEADER ; FLSTHD = . .WORD 1 ; THREAD WORD .WORD FLIST ; ENTRY POINT .WORD 0 ; INIT. ENTRY POINT .WORD 0 ; MAX. EXECUTION TIME .BYTE FLSSIZ ; STACK SIZE .BYTE PRIBKG-1 ; PRIORITY ONE HIGHER THAN BACKGROUND .WORD 0 ; CURRENT TIMER VALUE - PCHR ; PATCH RECORD EQUATES PCHR CHAIN = 0 ; CHAIN POINTER PCHR LOC = 2 ; LOCATION OF PATCH PCHR FLAG = 4 ; FLAG WORD PCHR VALUE = 6 ; VALUE OF PATCH PCHR PATSIZ = 10 ; # BYTES IN A PATCH RECORD .* ;********************************************************************** ; .IFG NLP .DEF LPRNTR .DEF LPINIT .REF QSAVEI,SAVE,TTYOUT,DSPTCH .REF QUEUE,IOQTME,IODQTM,IOSTAT .REF ASCLP,ACTIVE,UNSPND,$CTASK .REF PHYDEV,ALTDEV,LOGMAX .DEF LPON,LPOFF .IFNZ INEBC .REF EBCLP .ENDC .IFNZ LPBACK .DEF LPTTY .ENDC .IFNZ OVRLAY /; UPDATE 10/18/72 CLINIT.C01 ; UPDATE 6/21/72 ; UPDATE 4/13/72 CLINIT ; 18-JAN-72 ; 12-DEC-71 ; CLOCK INITIALIZE ROUTINE ; * G U L F E L E C T R O N I C S Y S T E M S * .CSECT .CLINT ;FORCE IT INTO IPL GROUP .TITLE CLINIT .DEF CLINIT .REF HEADER,TSTAT,TPRTY,TASKS .REF TWAITB,TTBPTR,TFIRST,TLAST,RESTAB,CURTAB,TIMBSY,BASCNT .REF THDTAB,CURTHD,SWAITB,0 .IFZ ARG XXXXXXXX FLIST MUST HAVE PASSED ARGUMENT .ENDC FLTYPE: .WORD 0 ; FILE TYPE FOR PASSED ARGUMENT .BYTE 5 ; CPU STATUS - FILE TYPE .BYTE $FLTNO ; TASK NO. .WORD 0 ; STACK POINTER .WORD 204 ; FILE ID . = .+FLSSIZ+FLSSIZ-2 ; TASK STACK ; .PAGE ; .IFNZ DRESDI!$BATCH ; ; DISC I/O PARAMETER LIS1 PCHR BYTFLG = 100000 ; BYTE PATCH FLAG PCHR RELFLG = 000001 ; RELOCATABLE PATCH FLAG PCHR WRDMSK = 000177 ; GET WORD MASK FROM POINTER PCHR SECMSK = 177600 ; GET SECTOR MASK FROM POINTER PCHR ; PCHR ; DISCIO FUNCTIONS PCHR RDFN = 0 2.REF RELTSK .ENDC ;* ;* S Y S T E M E Q U A T E P A R A M E T E R S ;* THREAD = 0. ;LIST THREAD DEVICE = 2. ;LIGICAL DEVICE NO TYPE = 3. ;EXIT TYPE $EXIT = 4. ;I/O COMPLETE ADDR ERRTSK = 6. ;ERROR TASK NO. LEVEL = 7. ;I/O PRIORITY ERROR = 8. ;ERROR PARAMETER SYSTEM = 10. ;RESERVED DATA = 12. 3STBPTR,COUNTR,SKDBSY,ABMPLR .REF TICTOC,MINUTE,MONTH .REF CLOCKT ; ******** CLINIT: ;INIT SUBROUTINE FOR TIMERS AND SCHEDULER MOV #TWAITB,R0 MOV R0,TTBPTR MOV #$TWATZ+1+$NRES,R1 A.: CLR (R0)+ ;CLEAR BOTH WAIT AND FIRST TABLES DEC R1 BNE A. MOV #TLAST-2,R0 MOV #$NRES-1*2,R1 B.: MOV R0,TLAST(R1) ;INIT A4T AND BUFFER ; DLIST = . .WORD 1 ; THREAD WORD DEVNO: .BYTE 0 ; DEVICE NO. .BYTE 2 ; EXIT TYPE 2 .WORD 0 ; NO I/O COMPLETE SUBROUTINE .BYTE 0 ; NO ERROR TASK .BYTE 3 ; DISC LEVEL 3 DERRWD: .WORD 0 ; DISC ERROR WORD .WORD 0 ; FOR SYSTEM .WORD .+2 ; ADDRESS OF DISC I/O BUFFER DODID: .W5 ; A READ PCHR WRTFN = 3 ; A WRITE WITH WRITE CHECK PCHR CR = 15 ; A CR CHARACTER PCHR ; PCHR ; EMT EQUATES PCHR $CRLOAD = 56 ; PCHR $EXIT = 4 ; 6 ;ADDRESS OF DATA PSR = PS ;CPU STATUS REGISTER AVAIL = 100000 ;'AVAILABLE' BIT IN PHYSICAL DEVICE TABLE ALT = 040000 ;'ALTERNATE DEVICE' BIT IN PHYSICAL DEVICE TBL LPDEV = 3 ;PHYSICAL DEVICE TABLE CODE FOR L/P DEVI ;* ;* L P R N T R E Q U A T E P A R A M E T E R S ;* ID = 100000 ;INTERRUPT ON L/P DONE IE = 040000 ;INTERRUPT ON PARITY OR PAPER LOW ERRORS SB7LL "LASTS" WITH ADDR'S OF FIRSTS TST -(R0) DEC R1 DEC R1 BGE B. MOV #RESTAB+$NRES,R0 MOV #$NRES-1,R1 C.: MOVB -(R0),CURTAB(R1) ;INIT RESOLUTION COUNTERS DEC R1 BGE C. MOVB #-1,TIMBSY MOVB #-1,SKDBSY CLRB BASCNT CLR ABMPLR MOV #THDTAB,CURTHD ;FOR SCHEDULER MOV #SWAITB,STBPTR CLR COUNTR MOVGORD 0 ; DOD FILE ID-SET DYNAMICALLY .BYTE 0 ; USE RLSECT AND NWORD .BYTE 0 ; READ DISC I/O FCN .WORD 0,0,0 ; RESERVED FOR DISCIO RLSECT: .WORD 0 ; RELATIVE SECTOR .WORD 64. ; ONE SECTORS LENGTH BUFFER = . . = .+128. ; RESERVE 64. WORDS FOR BUFFER ; .ENDC WORKWD: .WORD 0 WORKWA = WORKWD-5 PAGCTL: .WORD 0 ; E PCHR $TTYOT = 13 ; PCHR $TTYIN = 14 ; PCHR $DEFIN = 51 ; PCHR $DELET = 52 ; PCHR $DSKIO = 23 ; PCHR .PAGE ; PCHR PATHDR: .WORD 1 F = 004000 ;SET L/P BUSY (START I/O) DONE = 100000 ;DONE STATUS BIT BUSY = 040000 ;BUSY STATUS BIT PARITY = 000030 ;PARITY ERROR STATUS BITS READY = 000004 ;PRINTER READY STATUS BIT ONLINE = 000002 ;PRINTER ON-LINE STATUS BIT PLOW = 000001 ;PAPER LOW STATUS BIT NWORD = 0 ;NO. OF CHARACTERS (1ST WORD OF DATA) RESRVD = 2 ;RESERVE #1,TICTOC CLR MINUTE MOV #401,MONTH MOV #CLOCKT,TODINT ; SET UO T-O-D CLOCK VECTOR ******** MOV #340,TODINT+2 ; AND IT'S LEVEL ******** MOV #TODBIT,CLKENB ; ENABLE THE INTERRUPT ******** ; AND STALL ALARM RTS PC .END """""" "bffDDDDDDDDDDDDDDDUDDDDDDDD@$""" """""b&DDDDDDD@DQUUUU """"""""""""""""""""""""""""""""@"""""""""@D@DDDDDDDDDDD"""D@DDDD@DDDDADDB Cw   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * B.&0 M &0 & I ; THREAD WORD PCHR .WORD START ; START ADDRESS PCHR .WORD 0,0 ; NO INIT OR MAX TIME PCHR .BYTE STSIZE ; STACK SIZE PCHR .BYTE 3 ; PRIORITY LEVEL OF TASK PCHR .WORD 0,0 ; CURRENT TIME - PASSED ARGUMENT PCHR .BYTE $OVTYP ; CPU LEVEL & OVERLAY FILE TYPE JD (2ND WORD OF DATA) TEXT = 4 ;BEGINNING OF MESSAGE (3RD WORD OF DATA) HT = 11 ;HORIZONTAL TAB * CARRIAGE LF = 12 ;LINE FEED * FF = 14 ;FORM FEED (PAGE EJECT) * CONTROL CR = 15 ;CARRIAGE RETURN * STAY = 0 ;NO LINE FEED * SKIP1 = 1 ;SKIP ONE LINE * CHARACTERS SKIP2 = KUSED FOR PAGE CONTROL .IFNZ $BATCH ASCII: .WORD 0,0,0 ; USED FOR ASCII CONVERSION ; BETPTB = . .ASCII /OBJECT / .ASCII /LOAD / .ASCII /SYMBOLIC/ .ASCII /ASM SYM / .ASCII /FOR SYM / .ASCII /DATA / ; MNTHTB = .-3 ; NO. ZERO MONTH .ASCII /JAN/ .ASCII /FEB/ .ASCII /MAR/ .ASCII /APR/ .ASCII /MAY/ .ASCII /JUN/ .AL; UPDATE 10/18/72 SYSINI.C01 ; UPDATE 5/2/72 SYSINI.S02 ; UPDATE 4/14/72 SYSINI.S01 .TITLE SYSINI ;*********************************************************************** ;* * ;* SET UP SYSTEM TASKS IN TASK TABLE IF THEY ARE CORE * ;* RESIDENT TASKS-CALLED BY IPL. * ;* MPCHR .BYTE $PCHNO ; TASK # PCHR .WORD 0 ; STACK POINTER PCHR .WORD 206 ; OVERLAY FILE ID & LAST WORD ON STACKPCHR .BLKW STSIZE-1 ; RESERVE THE TASK STACK PCHR .PAGE ; PCHR ; PCHR ; I/O LISTS N 2 ;SKIP TWO LINES * SKIP3 = 3 ;SKIP TWREE LINES * AUTOLF = 1 ;CONTROL FOR AUTO LINE FEED MODE DELAY = 4. INDEX = 6. JSRSUB = 8. MAXCC = 14 ;MAX(HT,LF,FF,STAY,SKIP1,SKIP2,SKIP3) LPBLNK = 240 ;ASCII BLANK CLEAR = 100 .PAGE ;********************************************************************** ;* OSCII /JUL/ .ASCII /AUG/ .ASCII /SEP/ .ASCII /OCT/ .ASCII /NOV/ .ASCII /DEC/ ; STTBL = . .ASCII /FREE / .ASCII /READ / .ASCII /WRITE / .ASCII /DELETED / ; .ENDC ; ; THE FOLLOWING IS THE FILE LIST PRINT LIST ; PRTLST = . .WORD 1 ; THREAD WORD .IFNZ NLP .BYTE 3 ; USE LINE PRINTER .ENDC P * ;*********************************************************************** .DEF SYSINI .REF CMPRHD,FLSTHD,RASHED,LODHED .REF HEADER,TSTAT,TPRTY,TASKS .REF QIPL,INPTHD .REF TSCHED ; ******** .CSECT .SYSIN ; HDRTBL = . .WORD CMPRHD .WORD FLSTHD .WORD TSCHED ; ******** .WORD LOQ PCHR ; PCHR ; TTY LIST PCHR KBLIST: .WORD 1 ; THREAD WORD PCHR .BYTE 0,2 ; SYSTEM TTY, EXIT TYPE 2 PCHR .WORD 0 ; NO I/0 COMPLETE PCHR .BYTE 0,0 ; NO ERROR TASK -NO PRIORITY REQUEST. PCHR R ** ;* L P R N T R D A T A T A B L E S ** ;* ** ;* THE FOLLOWING TABLE AND BUFFER DEFINITIONS ASSUME A ** ;* MAXIMUM OF FOUR (4) LINE PRINTERS WILL EVER BE USED. IF ** ;* NLP > 4, THEN SOME CODE WILL HAVE TO BE ADDED. ** ;* ** ;***********************************S .IFZ NLP .BYTE SYSTTY ; USE SYSTEM TELETYPE .ENDC .BYTE 2 ; EXIT TYPE .WORD 0 .BYTE 0 .BYTE 1 ; PRIORITY LEVEL 1 .WORD 0,0 PRTBUF: .WORD 0 ; PRINT BUFFER ADDRESS ; ; HDR1 = . .WORD 72. .WORD 0 .ASCII /FILE ID START FILE LOGICAL FILE CKSAVE/ .ASCII / PROTECT CORE DIR. IFD/ .BYTE 15 TDHED .WORD INPTHD ; ; TNOTBL = . .WORD $CPTNO .WORD $FLTNO .WORD $TKCNO ; ******** .WORD $RLDNO .WORD $INPNO ; ; NOSYST = 5. ; NO. OF TASKS IN TABLE TO INITIALIZE NOSYSI = NOSYST+NOSYST ; INDEX OF ABOVE PRIOR = 9. ; TASK PRIORITY IN HEADER ; ; SYSINI = . JSR PC,QIPL ; INIT. TASK TABLEUKBERR: .WORD 0,0 ; ERROR - SYSTEM USE PCHR KBADD: .WORD 0 ; ADD. OF MESSAGE ITSELF. PCHR ; PCHR ; DISK LIST PCHR DKLIST: .WORD 1 ; THREAD WORD. PCHR .BYTE 1,2 ; DISK #1 - EXIT TYPE2 PCHR .WORD 0 ; NO I/O CW*********************************** ; LPBUSY: .=.+NLP+NLP ;1 = L/P CURRENTLY IN USE ; LPDATA: .=.+NLP+NLP ;ADDRESS OF ACTIVE DATA BUFFER ; LPFRST: ; * .=NLP+NLP*NLPRTY+. ;ADDRESS OF FIRST LIST IN THREAD " ; " LPLAST: ; * .=NLP+NLP*NLPRTY+. ;ADDX ; CARRIAGE RETURN .EVEN ; HDR2 = . .WORD 62. .WORD 0 .ASCII / SECTOR TYPE DEVICE LENGTH 0=NONE/ .ASCII ' Y/N Y/N' .BYTE 15 ; CARRIAGE RETURN .EVEN ; HDR3 = . .WORD 73. .WORD 0 .ASCII /******************************************************/ .ASCII /******************/ .BYTE 15 ; CARRIAGE RETUR MOV #-NOSYSI,R0 ; LOOP CONTROL AND INDEX SYSI00: MOV HDRTBL+NOSYSI(R0),R1 ; GET A HEADER ADDRESS BEQ SYSI20 ; NOT IN CORE-FORGET MOV TNOTBL+NOSYSI(R0),R2 ; GET TASK'S NUMBER CLRB TSTAT(R2) ; SET TASK QUIESCENT MOVB PRIOR(R1),TPRTY(R2) ; SET PRIORITY DEFAULT CMP R2,TASKS BLE SYSI10 MOV R2,TASKS SYSI10: ASL R2 ; TASK NO. WORD INDEX MOV R1,HYOMPLETE PCHR .BYTE 0,5 ; NO ERROR TASK - REQUEST LEVEL(LOWEST).PCHR DKERR: .WORD 0,0 ; ERROR WORD- SYSTEM USE. PCHR DKADD: .WORD 0 ; ADDRESS OF I/0 BUFFER. PCHR .PAGE ; PCHR ; TTY MESSAGES PCHR ; PCHR ; TTYL ERMBNUR TOEC S =R4 UTTPOU ; HRPC D OR WINHA C =R3 T PUIN ; HRPC S.UEAL VRDWOD AN; HRPC ORCTSES T' ITOIND OR WINHA CLEFIH TCPAA K EABRO TEDUSS IDECODE; HRPC ; E AG.P HRPC RNTURE; PC S RT HRPC K. OLL A =USATSTT SE; [RESS OF LAST LIST IN QUEUE " ; ================================ ; " ; " ; ====> STORED AS: PRIORITY 1 * ; PRIORITY 2 * ; . * ; . * L/P # 1 ; \N .EVEN BLNKLN = . .WORD 3,0 .ASCII / / .BYTE 15 .EVEN ; OUTBUF = . .WORD 70. .WORD 0 .ASCII /XXXX/ OB1: .ASCII /X XXXXX/ OB2: .ASCII /X XX/ OB3: .ASCII /X XX/ OB4: .ASCII /X XXXXX/ OB5: .ASCII /X XXXXX/ OB6: .ASCII /X / OB7: .ASCII /X / OB8: .ASCII /X XXX/ OB9: .ASCII /X/ .BYTE 15 ; CARRIAGE RETURN ]ST IS A MACRO TO DEFINE TTY MESSAGE BUFFERS. PCHR .MACRO TTYLST NAME,MESS,?X ; PCHR NAME: .WORD NAME'N-X ; # OF CHARACTERS PCHR .WORD 0 ; SYSTEM USE PCHR X: .ASCII MESS ; PCHR NAME'N = . ; PCHR .EVEN ; Z SE: 00TEIN HRPC T.YET NO; 00TBIN T BL HRPC E?RETHL ALH IT WNEDO; 6 ,#R0 P CM HRPC D.ELFIT EX NTO0 RMPBU; + 0)(R T TS HRPC W.NOP TO SENTH S.YE; 00TEIN E BL HRPC ? UT OUN RNGRISTT PUINE THS HA; R5 T TS HRPC AGFLD ELFIT SED AN; 0)(R1FLD,F#1 V MO HRPC _ . * ; PRIORITY NLPRTY * ; . ; . ; . ; REPEAT FOR L/P # 2, ETC. ; ; LPTASK: .=.+NLP+NLP ;THE TASK NO. WHO INITIATED THE CURRENT RQST ; LPIOCM: ` .EVEN IFDCLR = OB8+7 ; EJECT = . .WORD 2. .WORD 0 .BYTE 14 ; FORM FEED .BYTE 15 ; CARRIAGE RETURN .EVEN ; .IFNZ $BATCH BTCH1 = . .WORD 62. .WORD 0 .ASCII / ELEMENT / .ASCII /CREATED START/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; BTCH2 = . a PCHR .ENDM TTYLST ; PCHR ; PCHR TTYLST MESS1, ; PCHR TTYLST MESS2,> ; PCHR TTYLST MESS3,> ; PCHR TTYLST MESS4,> ; 2/15/73 LDIE FTOINE LUVAT PU; ) R01(LDIE,FR1 V MO HRPC R0E ORSTRE; R0+,P)(S V MO $:30 HRPC RNTURER ROER; 20TBIN BR HRPC CKTA SORSTRE; + P)(S T TS HRPC K OUSATST; $ 30 Q BE HRPC . ERMBNUY ARIN BTOT ERNVCOD AN; N BICT,OPC R JS HRPC G INTR SERCTRAHA CTOT INPO; 0 ,Rc.=.+NLP+NLP ;I/O COMPLETE ADDRESS OF CURRENT REQUEST ; LPCNT: .=.+NLP+NLP ;INDEX INTO TEXT OF CURRENT REQUEST ; LPMAX: .=.+NLP+NLP ;MAXIMUM VALUE OF LPCNT (= NWORD) ; LPRTRY: .=.+NLP+NLP ;NO. OF ATTEMPTS OF CURRENT REQUEST ; LPRIOR: .=.+NLP+NLP ;PRIORITY INEDX FOR CURRENT REQUEST ; LPMODE: .=.+NLP+NLP ;0 = CARRIAGE CTRL MODE; 1 = AUTO LINE FEED ; LPWORD: d.WORD 73. .WORD 0 .ASCII / NAME TYPE STATUS DATE / .ASCII /TIME SECTOR LENGTH/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; BTCHBF = . .WORD 72. .WORD 0 .ASCII / / BENAME: .ASCII /.NAME. / BETYPE: .ASCII /OBJECT / BESTAT: .ASCII /FREE / DATE1: .ASCII /02/ .ASCII /-/ DATE2: .ASCII /JAN/ .ASCII /-/ DATE3: .ASCII /72 / TIeTTYLST MESS5,> ; PCHR TTYLST MESS6,> ; PCHR TTYLST MESS7,> ; PCHR TTYLST MESS8,> ; PCHR TTYLST MESS9,>; PCHR TTYLST MES10,> ; 2/13/73 TTYLST MES11,>P1EM#T V MO HRPC 0 RVESA; P)(S,-R0 V MO HRPC . GERATO SMPTE; 0$,1R3 B SO HRPCO NT IERRD OEDRSVEREN IRSTEACARCHP PO; ) R1-(+,P)(S VBMO $:10 HRPC S ERCTRAHA COF# L GALEIL; 20TBIN E BL HRPC S ERCTRAHA COF# T GE; 3 ,RR2 B SU: 34TBIN HRPC A.MMCOE THF OFP PO; + P)(S T TS: 32TBIN HRPC g.=.+NLP+NLP ;THIS WORD CONTAINS THE LENGTH OF THE ;CURRENT L/P BUFFER BEING OUTPUT (WHICH ;IS NOT NECESSARILY THE SAME AS THE CALLER'S ;BUFFER LENGTH) ; LPBUF: .=LPSIZE+2*NLP+. ;BUFFERS FOR LINE PRINTER OUTPUT ; LPLIST: .WORD 1,1400,TYDONE,0,0,0,0 ;TTYOUT .WORD 1,1400,TYDONE,0,0,0,0 ; LISTS .WORD 1,1400,TYDONE,0,0,0,0 ; FORM1: .ASCII /23/ .ASCII /:/ TIM2: .ASCII /17/ .ASCII /:/ TIM3: .ASCII /59 00546/ SS: .ASCII /6 00010/ LG: .ASCII /0/ .BYTE 15 .EVEN ; BCHERR = . .WORD 45. .WORD 0 .ASCII /DISC ERROR-BATCH FILE ELEMENT DIRECTORY READ/ .BYTE 15 .EVEN ; .ENDC DISCER = . .WORD 26. .WORD 0 .ASCII /DISC DIRECTORY READ ERROR/ .BYTj ; 2/12/73 TTYLST MES20,> ; PCHR TTYLST MES21,> ; PCHR TTYLST MES22,>; PCHR TTYLST MES23,> ; PCHR TTYLST MES24,> ; PCHR TTYLST MES25,>; 2/15/73 ERLLCAO TRNTURE; PC S RT HRPC ORRR EAXNTSYT SE; Z CL: 20TBIN HRPC +SPE ORSTRE. ARCHD LIVA6 N HA TREMO; P ,S4.#1 D AD HRPC G INTR SINT UNCO; 0$,3R2 B SO HRPC S YE; 32TBIN Q BE HRPC ? MAOM C AITS WA; ',,#P)(S PBCM HRPC . CKTA SHE TONR TEACARCHA T GE; ) SP-(+,4)(Rk .WORD 1,1400,TYDONE,0,0,0,0 ; MESSAGES .=NLP*14.+LPLIST ; LPMOD: .WORD 1,$RES*256.+050000,0,0,LPTIME ;TIMER .WORD 1,$RES*256.+050000,0,2,LPTIME ; MODULE .WORD 1,$RES*256.+050000,0,4,LPTIME ; FOR .WORD 1,$RES*256.+050000,0,6,LPTIME ; DELAYS .=NLP*10.+LPMOD ; LPUNIT: .BYTE 3,0,0,0 ;VALID LOGICAL DEVICE ADDRESSES .=LPUNIT+NLP .EVEN .IFG NLP-1 ; LPIOLS: l; UPDATE 10/12/72 ALLOC.C01 ; UPDATE 4/12/72 ALLOC.S04 ; UPDATE 2/16/72 ALLOC.S03 ; UPDATE 1/27/72 ALLOC.S02 ; UPDATE 1/26/72 ALLOC.S01 .TITLE ALLOC ; ; RPOM DUMMY ALLOCATOR-RUN UNDER LOCKOUT ; .DEF SEARCH,ALLOC,DALLOC .DEF B3FR,B3AR,B3RR,BITTBL .REF PUSHR,POPR ; ; ; TBLSIZ = 16.+16. ; BIT MAP TABLE SIZE BITTBL = . .WORD 0,m; UPDATE 1/26/73 EMT.C06 ; UPDATE 1/3/73 EMT.C05 ; UPDATE 11/14/72 EMTRAP.C03 ; UPDATE 11/6/72 EMTRAP.C02 ; UPDATE 10/12/72 EMTRAP.C01 ; UPDATE 3/MAY/72 EMT.S34 ; UPDATE 4/13/72 EMTRAP ; ******************************************************************** ; * PROGRAM IDENTIFICATION: "EMTRAP" * ; * EMULATOR TRAP SERVICE ROUTINE n TTYLST MES30,> ; PCHR ; PCHR REQLST: .WORD 30. ; 30 CHARACTERS MAX. PCHR REQCNT: .WORD 0 ; NUMBER OF CHARACTERS READ IN. PCHR REQBUF: .BLKB 30. ; RESERVE BUFFER PCHR .EVEN ; PCHR ; o .WORD LPLIST ;ADDRESS OF LINE PRINTER .WORD LPLIST+14. ;TTY MESSAGE I/O LISTS .WORD LPLIST+28. ;FOR QUICK ACCESS .WORD LPLIST+42. ; .=LPIOLS+NLP+NLP ; LPMDAD: .WORD LPMOD ;TIMER MODULE ADDRESSES .WORD LPMOD+10. ;FOR QUICK ACCESS .WORD LPMOD+20. ; .WORD LPMOD+30. ; .=LPMDAD+NLP+NLP .ENDC ; ; .IFNZ LPBACK ; LPTTY: p0,0,0,0,0,0,0 ; ALLOCATION .WORD 0,0,0,0,0,0,0,0 ; TABLE ; TMP1: .WORD 0 ; B3RR: .WORD 0 B3AR: .WORD 0 B3FR: .WORD 0 ; ; ; SEARCH = . BIC #170000,X060 BIS #30000,X060 ; CONSTRUCT BIT #1.,R4 BIC #177400,X061 BIS #1400,X061 ; CONSTRUCT BEQ X070 BR X000 ; ALLOC = . BIC #170000,X060 BIS #50000,X060 ; CONSTRUCT BIS #1.,R4 q * ; * * ; * PURPOSE: DECODES ALL EMT CALLS AND TRANSFERS CONTROL TO PROPER* ; * SUBROUTINE, AFTER ALTERING STACK TO LOOK IDENTICAL TO A * ; * "JSR PC,SBRTNE". * ; * * ; * USAGE: ALL EXTERNAL LINKS TO MONITOR SUBROUTINES ARE MADE VIA * ; * CALLS OF THE FORM: "EMT SNUMBER", WHERE "SNUMBr PCHR LSTMES: .WORD MESSIZ,0 ; BUFFER FOR LISTING PATCHES 2/12/73 LSTBUF: .BLKB MESSIZ ; 2/12/73 .EVEN ; PCHR ; 2/12/73 TSKMES: .WORD 11.,0 ; BUFFER FOR PRINTING TASK # DURING LIST2/12/73 TSKBUF: .ASCII /TASK # / ; s .WORD 0 ;SWITCH FOR LINE PRINTER BACKUP BY TTY .WORD 0 ; .WORD 0 ; 0 = PRINT ON L/P .WORD 0 ; 1 = PRINT ON TTY .=LPTTY+NLP+NLP .ENDC ; LPARTY: .IFG NLP-1 .WORD LPRTY ;ADDRESSES OF DATA BUFFERS FOR .WORD LPRTY+24. ;EACH LINE PRINTER .WORD LPRTY+48. ; .WORD LPRTY+72. .=LPARTY+NLP+NLP t BIC #177400,X061 BIS #102000,X061 ; CONSTRUCT BVC X070-MUST BRANCH BR X000 ; DALLOC = . BIC #170000,X060 BIS #40000,X060 ; CONSTRUCT BIC #1.,R4 BIC #177400,X061 BIS #102000,X061 ; CONSTRUCT BVC X070-MUST BRANCH ; X000 = . JSR R5,PUSHR ; SAVE REGISTERS MOV B3RR,R0 ; GET START BLOCK/NOB REQUESTED CLR TMP1 BISB R0,TMP1 uER" IS A * ; * PRE-ASSIGNED INDEX TO THE TABLE OF MONITOR SUBROUTINES. ANY * ; * ARGUMENTS REQUIRED BY THE SUBROUTINE MUST BE PUSHED ONTO THE * ; * STACK PRIOR TO THE CALL. UPON ENTRY TO THE SUBROUTINE THE STACK* ; * WILL LOOK THE SAME AS IF A "JSR PC,SBRTNE" HAD BEEN THE CALL. * ; * THIS ALLOWS CALLS OF THE JSR-TYPE TO BE COMPATIBLE WITH THE * ; * EMT-TYPE CALLS. ALTHOUGH PROCESSOR STATUS IS RAISED TO LEVEL * ; * SEVEN DURING THE TRAP ROUTINE, IT IS RETv 2/12/73 TSKNUM: .ASCII /NN/ ; WORD ADDRESS NEEDED FOR 'NN' 2/12/73 .EVEN ; 2/12/73 ; 2/12/73 ; DISK I/O BUFFERS PCHR ; THIS IS FOR SECTOR ZERO. PCHR SZHEAD: .WORD PACHID ; FILE ID OF PATCH FILE PCHR .BYTE 0 wLPRTY: .ENDC .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 1 PARITY ERROR' .IFG NLP-1 .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 2 PARITY ERROR' .IFG NLP-2 .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 3 PARITY ERROR' .IFG NLP-3 .WORD 20.,0 .BYTE CR,LF .ASCII 'L/P 4 PARITY ERROR' .ENDC .ENDC .ENDC ; LPRDY: .Ix ; SAVE NOB REQUESTED CLRB R0 SWAB R0 ; START BLOCK REQUESTED CLR R1 ; INIT BITTBL INDEX CLR R2 ; INIT BIT COUNTER CLR R3 ; INIT HIT COUNTER X030: MOV BITTBL(R1),R4 ; GET A BIT MAP WORD CLR R5 ; WILL SHIFT INTO R5 X040: CMP R2,R0 ; GET TO START BLOCK REQUESTED? BGE X060 ; YES X050: ASR R4 yURNED TO ITS STATE * ; * AT THE TIME OF CALL WHEN THE CALLED SUBROUTINE IS ENTERED. * ; * * ; * STACK ON ENTRY: * ; * 2(SP): (PS) AT TIME OF TRAP * ; * (SP): (PC) CALLER RETURN ADDRESS * ; * * ; * STACK ON EXIT: z ; SECTOR SPECIFIED BY CALLER PCHR SZFUN: .BYTE 0 ; DISK FUNCTION (0=READ, 1=WRITE) PCHR .WORD 0,0,0 ; DISCIO USE PCHR .WORD 0 ; SECTOR # TO TRANSFER PCHR .WORD 64. ; 1 SECTOR AT A TIME. PCHR SECZ: .BLKW 64. ; RESERVE A SECTOR PCHR ; THIS IS FOR 'DATA' SECTORS {FG NLP-1 .WORD LPRD ;ADDRESSES OF EACH LINE PRINTER DATA BUFFER .WORD LPRD+22. .WORD LPRD+44. .WORD LPRD+66. .=LPRDY+NLP+NLP LPRD: .ENDC .WORD 17.,0 .BYTE CR,LF .ASCII 'L/P 1 NOT READY' .EVEN .IFG NLP-1 .WORD 17.,0 .BYTE CR,LF .ASCII 'L/P 2 NOT READY' .EVEN .IFG NLP-2 .WORD 17.,0 .BYTE CR|; DOUBLE SHIFT R4 ROR R5 ; TO R5 INC R2 ; BUMP BIT COUNTER BIT #17,R2 ; VALUE DIVISIBLE BY 16? BNE X040 ; NO MOV R5,BITTBL(R1) ; YES-REPLACE BIT MAP WORD TST (R1)+ ; BUMP BITTBL INDEX CMP R1,#TBLSIZ ; SEARCHED COMPLETE TABLE? BGE ERROR ; YES-SET ERROR BIT INCASE SEARCH BR X030 ; KEEP SEARCHING ; } * ; * (SP): (PC) CALLER RETURN ADDRESS * ; * * ; * ERROR RETURNS: IF AN EMT CODE IS USED WHICH IS INVALID * ; * ---EITHER OUTSIDE THE LIMITS OF THE EMT TABLE, OR AN INVALID * ; * CODE WITHIN THE TABLE--- A RETURN IS MADE IMMEDIATELY TO THE * ; * CALLER WITH NO ACTION TAKEN. * ; * THE CALLER SHOULD NOTE T~ PCHR SNHEAD: .WORD PACHID ; FILE ID OF PATCH FILE PCHR .BYTE 0 ; SPECIFY SECTOR PCHR SNFUN: .BYTE 0 ; FUNCTION. PCHR .WORD 0,0,0 ; DISCIO USE PCHR SNSEC: .WORD 0 ; SECTOR TO USE. PCHR .WORD 64. ; ALWAYS 1 BUFFER PCHR SECN: .BLKW 64. ,LF .ASCII 'L/P 3 NOT READY' .EVEN .IFG NLP-3 .WORD 17.,0 .BYTE CR,LF .ASCII 'L/P 4 NOT READY' .EVEN .ENDC .ENDC .ENDC ; LPXXXX: .IFG NLP-1 .WORD LPXX .WORD LPXX ;ADDRESSES OF LINE PRINTER ABORT .WORD LPXX+20. ;MESSAGE DATA BUFFERS .WORD LPXX+40. ; .WORD LPXX+60. ; .=LPXXXX+NLP+NLP ; X060: BIT #1.,R4 ; MAY ALSO BE BIS OR BIC X061: BEQ X070 ; MAY ALSO BE BVC CLR R3 ; RESET HIT COUNTER BR X050 ; ; X070: INC R3 ; BUMP HIT COUNTER CMP R3,TMP1 ; DONE FOR NOB REQUESTED BLT X050 ; NO-KEEP GOING MOV R2,R3 ; SAVE NO. OF BITS LEFT TO SHIFT SUB TMP1,R2 ; CALCULATE START BLOCK INCASE INC R2 HAT HE MAY BE INTERRUPTED BETWEEN HIS * ; * EMT CALL AND THE EVENTUAL RETURN, EVEN IN THE CASE OF AN ERROR.* ; * * ; * PROGRAMMER: 52 * ; * VERSION:003.003 * ; * DATE: 13-APR-72 * ; * * ; * G U L F ; RESERVE BUFFER. PCHR .PAGE ; PCHR ; TABLES AND VARIABLES FOR PATCHR PCHR ; PCHR ; OPCODE TABLE PCHR OPTAB: .ASCII /D / ; DEFINE THE PATCH FILE PCHR .ASCII /X / ; DELETE THE PATCH FILE LPXX: .ENDC .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 1 ABORTED' .EVEN .IFG NLP-1 .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 2 ABORTED' .EVEN .IFG NLP-2 .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 3 ABORTED' .EVEN .IFG NLP-3 .WORD 15.,0 .BYTE CR,LF .ASCII 'L/P 4 ABORTED' .EVEN .ENDC ; SEARCH REQUEST SWAB R2 BISB TMP1,R2 ; SB/NOB MOV R2,B3AR ; SET UP ANSWER REGISTER BIC #1,B3FR X075: ASR R4 ; FINISH CURRENT BITTBL WORD ROR R5 INC R3 BIT #17,R3 BNE X075 MOV R5,BITTBL(R1) ; SET IN BIT MAP X080: JSR R5,POPR ; RESTORE REGISTERS RTS PC ; RETURN ; ; ERROR: BIS #1,B3FR E L E C T R O N I C S Y S T E M S * ; * * ; ******************************************************************** .TITLE EMTRAP .REF QUEUE,SUSPND,UNSPND,EXIT,FRETSK,ABORT,QTIME,DQTIME .REF QSKED,DQSKED,TTYOUT,TTYIN,BINASC,ASCBIN .REF MASK,UNMASK,ERRTYP,GTIME,GDATE .REF CREAD,LPRNTR,DISCIO,SGLOAD,DECTAP .REF GOBACK,CKPT,NOCKPT,SCAN,NUMFLD,NPARAM PCHR .ASCII /E / ; EXIT FROM TASK. PCHR .ASCII /C / ; CANCEL ALL OF THIS TASKS PATCHES PCHR .ASCII /L / ; LIST A TASK'S PATCHES PCHR .ASCII /P / ; DEFINE A PATCH PCHR .ASCII /R / ; DEFINE A RELOCATABLE PATCH PCHR .ASCII /B / ; DEFINE A BYTE PATCH PCHR .WORD -1 .ENDC .ENDC ; LPBUFR: .WORD LPBUF ;ADDRESSES OF L/P PRINT BUFFERS .WORD LPBUF+LPSIZE .WORD LPBUF+LPSIZE+LPSIZE .WORD LPBUF+LPSIZE+LPSIZE+LPSIZE .WORD LPBUF+LPSIZE+LPSIZE+LPSIZE+LPSIZE .=LPBUFR+NLP+NLP+2 .PAGE .IFG NLP-1 ; LPSTS: .WORD STAT.1 ;ADDRESS OF L/P STATUS REGISTERS - L/P # 1 .WORD STAT.2 ;L/P # 2 .WORD STAT.3 ;L/P # 3 ; SET CAN'T FIND AREA STATUS BR X080 ; RETURN ; .END .REF BFINIT,BFENTR,BFOPEN,BFCLOS,BFDELT,BFPACK,BFWRIT,BFREAD .REF BFWAIT,R50PAK,R50UNP,DEFINE,DELETE,PRTCT,UNPRCT .REF CORLOD .REF STIME,SDATE ; FOR CITGO 1/26/73 .REF GETBUF,PUTBUF ; FOR CITGO/ELETE ******** .REF JULDAT,MAGTAP ; FOR CITGO ******** .DEF EMTRAP,EMTABL,MAXEMT,EMTINIT .PAGE EMTRAP = . ;ENTRY TO ; PCHR ; PCHR ; JUMP TABLE FOR HANDLERS PCHR JMPTAB: .WORD DEFINE ; PCHR .WORD DELETE ; PCHR .WORD EXIT ; PCHR .WORD CANCEL ; .WORD STAT.4 ;L/P # 4 .=LPSTS+NLP+NLP ; LPCMD: .WORD CMD.1 ;ADDRESS OF L/P COMMAND REGISTER - L/P # 1 .WORD CMD.2 ;L/P # 2 .WORD CMD.3 ;L/P # 3 .WORD CMD.4 ;L/P # 4 .=LPCMD+NLP+NLP ; LPWDCT: .WORD CNT.1 ;ADDRESS OF L/P WORD COUNT REGISTER - L/P # 1 .WORD CNT.2 ;L/P # 2 .WORD CNT.3 ;L/P # 3 .WORD CNT.4 ; UPDATE 10/13/72 .TITLE FTASK .GLOBL FTASK DEFINE = 51 DELETE = 52 DISCIO = 19. TTYOUT = 11. PRTCT = 53 UNPRCT = 54 DECTAP = 13. EXIT = 4 SP = %6 ; ; FTASK: .WORD 1,FTSK,0,50. .BYTE 100.,1 .WORD 0,0 .WORD 400*5+205,0 .WORD 225. .=.+204. ; DLIST: .WORD 1 .BYTE 5,1,0,0,0,1 .WORD 0,0,DDATA EMT SERVICE ROUTINE ;TIMING: 64 MICROSECONDS TST -(SP) ;PUSH STACK TO MAKE ROOM FOR SBRTNE ADDR MOV R0,-(SP) ;SAVE IT MOV 4(SP),R0 ;CALLER RETURN ADDR MOV 6(SP),4(SP) ;MOVE CALLER'S PS FOR RTI EXIT MOV R0,6(SP) ;WILL LEAVE CALLER'S PC ON STACK @ EXIT DEC R0 ;BACK POINTER ONE BYTE MOVB -(R0),R0 ;BACK POINTER TO EMT INSTR&GET EMT CODE PCHR .WORD LIST ; PCHR .WORD PATCH ; PCHR .WORD RELPCH ; PCHR .WORD BYTPCH ; PCHR ; PCHR ; SOME VARIABLES PCHR LETTR: .WORD 0 ; TH ;L/P # 4 .=LPWDCT+NLP+NLP ; LPFEED: .WORD LFRG.1 ;ADDRESS OF L/P LINE FEED REGISTER / L/P # 1 .WORD LFRG.2 ;L/P # 2 .WORD LFRG.3 ;L/P # 3 .WORD LFRG.4 L/P # 4 .=LPFEED+NLP+NLP ; LPADDR: .WORD LPDT.1 ;ADDRESS OF L/P MEMORY ADDR REGISTER - L/P # 1 .WORD LPDT.2 ;L/P # 2 .WORD LPDT.3 ;L/P # 3 .WORD LPDT.4 ;L/P # 4 DDATA: .WORD 10.,32.,1,2,3,4,5,6,7,8. .WORD 9.,10.,11.,12.,13.,14.,15.,16. .WORD 17.,18.,19.,20.,21.,22.,23.,24. .WORD 25.,26.,27.,28.,29.,30.,31.,32. ; MLIST: .WORD 1,0,0,251.,200+9.,4 ; DSLSTW: .WORD 1 .BYTE 1,2 .WORD 0,1400,0,0,DSWRIT DSWRIT: .WORD 251. .BYTE 1,1 .WORD 0,0,0 DSBUF: .WORD -1 .=.+254.+254. .WORD -1 ; TYLIST: .WORD 1 ASL R0 ;NEED TO INDEX WORDS IN TABLE CMP R0,#MAXEMT*2 ;SEE IF CODE IS VALID BHI EMTA20 ;INVALID: OUTSIDE TABLE RANGE EMTA10: MOV EMTABL(R0),2(SP) ;LOAD STACK WITH SUBROUTINE ADDR ; IF AN INVALID CODE IS USED, THE TABLE ENTRY WILL POINT TO "EMTERR". MOV (SP)+,R0 ;RESTORE USER'S RTI ;POP SUBRTNE ADDRESS AND OLD STATUS ;TO EFFECT TRANSFER, LEAVING RTN TO E CURRENT OPCODE PCHR FLD1F: .WORD -1 ; FIELD FLAGS = -1 NOTHING PCHR FLD2F: .WORD -1 ; =+1 VALUE PCHR FLD3F: .WORD -1 ; = 0 VOID (ONLY AFTER A PCHR ; +1 (VALUE) PCHR FIELD1: .WORD 0 ; VALUE OF FIELD 1 PCHR FIELD2: .WORD 0 ; 2 PCHR .=LPADDR+NLP+NLP ; LPVECT: .WORD LPVC.1 ;L/P # 1 INTERRUPT VECTOR ADDRESS .WORD LPVC.2 ;L/P # 2 INTERRUPT VECTOR ADDRESS .WORD LPVC.3 ;L/P # 3 INTERRUPT VECTOR ADDRESS .WORD LPVC.4 ;L/P # 4 INTERRUPT VECTOR ADDRESS .=LPVECT+NLP+NLP .ENDC .PAGE ;********************************************************************** ;* .BYTE 0,1 .WORD 0,0,0,0,TYDATA TYDATA: .WORD 8.,0 .BYTE 12,15 .ASCII 'TASK F' ; DSLSTR: .WORD 1 .BYTE 1,2 .WORD 0,1400,0,0,DSREAD DSREAD: .WORD 251. .BYTE 1,0 .WORD 0,0,0 DSBUFR: .WORD 0 .=.+255.+255. ; FTSK: MOV #MLIST,-(SP) EMT DEFINE ;DEFINE FILE MOV #TYLIST,-(SP) EMT TTYOUT ;PRINT ON ;CALLER ON TOP. EMTA20: CLR R0 ;RANGE ERROR: USE ENTRY 0... BR EMTA10 ;...AND FORCE EXIT VIA "EMTERR" EMTERR: ;INVALID EMT NUMBER .IFNZ $DEBUG HALT .IFF ; ******** RTS PC .ENDC ; ******** .PAGE EMTABL = . ;TOP OF EMT FIELD3: .WORD 0 ; 3 PCHR FLGWRD: .WORD 0 ; CURRENT FLAGS SET FOR A PATCH PCHR ; = 000001 IF RELOCATABLE PATCH PCHR ; = 100000 IF BYTE PATCH PCHR ; PCHR TSTADD: .WORD 0 ; ADD. OF THE TASK TABLE 'TSTAT' PCHR TTSTAD: .WORD 0 ; ADD. OF ** ;* S T A R T O F L P R N T R ** ;* ** ;* ** LPRNTR: MOV R0,-(SP) ;GUESS MOV R1,-(SP) ; WHAT MOV R2,-(SP) ; WE'RE MOV R3,-(SP) ; DOING MOV R4,-(SP) ; HERE MOV R5,-(SP) TTY, EXIT 1 MOV #DLIST,-(SP) EMT DECTAP ;WRITE DECTAPE, EXIT 1 MOV #DSLSTW,-(SP) EMT DISCIO ; WRITE ON DISC, EXIT 2 MOV #MLIST,-(SP) EMT PRTCT ;PROTECT DISC FILE MOV #111111,DSBUF ;MODIFY DISC BUFFER MOV #DSLSTW,-(SP) EMT DISCIO ;AND TRY TO WRITE ON PROTECTED FILE (EXIT 2) MOV #DSLSTR,-(SP) ;NOW, - EMT DISCIO LINK TABLE .WORD EMTERR ;#0 ALWAYS AN ERROR .WORD QUEUE ;#1 .WORD SUSPND ;#2 .WORD UNSPND ;#3 .WORD EXIT ;#4 .WORD FRETSK ;#5 .WORD ABORT ;#6 .WORD QTIME ;#7 .WORD DQTIME ;#10 .WORD QSKED ;#11 .WORD DQSKED ;#12 .WORD TTYOUT ;#13 .WORD TTYIN CURRENT TASK'S TSTAT ENTRY. PCHR SAVTST: .WORD 0 ; CURRENT TASK'S TSTAT ENTRY. PCHR ; PCHR NEXSEC: .WORD 0 ; SECTOR FOR NEXT PATCH PCHR NEXWRD: .WORD 0 ; WORD FOR NEXT PATCH PCHR WORD0: .WORD 0 ; WORD 0 OF SECTOR 0. PCHR TEMP1: .WORD 0 ; SCRATCH STORAGE PCHR TEMP2:; MOV 14.(SP),R0 ;GET ADDRESS OF LIST MOV DATA(R0),R1 ;GET ADDRESS OF DATA JSR PC,LPCHEK ;GO CHECK SOME OF THE INFO BNE LPRA10 ;OOPS, SOMETHING HAPPENED. GO TELL CALLER CLR R3 ;CHECK L/P DEVICE ADDRESS .IFZ NLP-1 CMPB DEVICE(R0),LPUNIT ;FOR ONE L/P BEQ LPRA20 .ENDC .IFG NLP-1 LPRA00: CMPB DEVICE(R0),LPUNIT(R3) ;FOR MORE ;READ IT CMP #111111,DSBUFR ;AND SEE IF WE WROTE IT BEQ OOPS ;OOPS DELET: MOV #MLIST,-(SP) ;UNPROTECT FILE EMT UNPRCT MOV #MLIST,-(SP) ;DELETE IT EMT DELETE EMT EXIT ; OOPS: MOV #ERLIST,-(SP) EMT TTYOUT BR DELET ERLIST: .WORD 1 .BYTE 4,1 .WORD 0,0,0,0,ERDATA ERDATA: .WORD 31.,0 .BYTE 12,15 ;#14 .WORD DECTAP ;#15 .WORD BINASC ;#16 .WORD ASCBIN ;#17 .WORD MASK ;#20 .WORD UNMASK ;#21 .WORD ERRTYP ;#22 .WORD DISCIO ;#23 .WORD CREAD ;#24 .WORD LPRNTR ;#25 .WORD GOBACK ;#26 .WORD CKPT ;#27 .WORD NOCKPT ;#30 .WORD GTIME ;#31 .WORD 0 ; PCHR TEMP3: .WORD 0 ; PCHR ; PCHR ; A 'DEFINE' BLOCK PCHR DEFBLK: .WORD 1 ; THREAD WORD PCHR DEFERR: .BYTE 0,0 ; ERROR CODE- NO ERROR TASK PCHR .WORD 0,PACHID ; FILE ID THAN ONE L/P BEQ LPRA20 INC R3 CMP R3,#NLP BLT LPRA00 .ENDC MOV #3,R4 ;AT THIS POINT, THE L/P # IS NOT LEGAL ; LPRA10: MOV R4,ERROR(R0) ;THIS IS AN ERROR EXIT - THE REQUEST JSR PC,LPQERR ;GO QUEUE THE ERROR (IF THERE IS ONE) ; LPRA15: MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; THE MOV (SP)+,R3 ; YOU-KNOW-WHAT .ASCII '** PROTECTED FILE MODIFIED **' .EVEN .END .WORD GDATE ;#32 .WORD SCAN ;#33 .WORD NUMFLD ;#34 .WORD NPARAM ;#35 .WORD BFINIT ;#36 .WORD BFENTR ;#37 .WORD BFOPEN ;#40 .WORD BFCLOS ;#41 .WORD BFDELT ;#42 .WORD BFPACK ;#43 .WORD BFWRIT ;#44 .WORD BFREAD ;#45 .WORD R50PAK ;#46 .WORD R50U PCHR .WORD 200+$OVTYP ; FILE TYPE + CORE DIRECTORY PCHR DEFLEN: .WORD 0 ; REQUESTED LENGTH OF FILE. PCHR .PAGE ; PCHR ; PCHR ; AT LAST WE CAN START PCHR START: ; PCHR MOV S MOV (SP)+,R2 ; . MOV (SP)+,R1 ; . MOV (SP)+,R0 ; . MOV (SP)+,(SP) ;PUT PC ON TOP OF OLD LIST ADDRESS RTS PC ;AND GO, GO, GO - HOME, HOME, HOME ; ; LPRA20: .IFG NLP-1 ;R3 NOW CONTAINS THE L/P INDEX (0,1,...) ASL R3 ;CONVERT IT TO A WORD INDEX (0,2,...) .ENDC MOVB LEVEL(R0),R2 ;NE 15 .EVEN ; .PAGE ; FLIST = . EMT NOCKPT ; SET TASK NOT CHECKPOINTABLE .IFNZ $BATCH TST FLTYPE ; BATCH FILE LIST BMI FLIA70 ; YES .ENDC JSR PC,ROSHDR ; PRINT ROS FILE LIST HEADER MOV FLTYPE,R0 ; GET ARGUMENT PASSED BNE FLIC00 ; LIST SPECIFIED ONE .IFNZ DRESDI MOV #DOD,R1 ; ADDRESS OF FIRSTNP ;#47 .WORD BFWAIT ;#50 .WORD DEFINE ;#51 .WORD DELETE ;#52 .WORD PRTCT ;#53 .WORD UNPRCT ;#54 .WORD SGLOAD ;#55 .WORD CORLOD ;#56 .WORD 0,0,0,0,0,0,0 ; 57,60,61,62,63,64,65 IN ROS3 ******** .WORD GETBUF ; 66 ******** .WORD PUTBUF ;#67 .WORD JULDAT #-1,R1 ; NEED A MINUS 1 FOR A WHILE PCHR EMT $CRLOAD ; GET ADDRESS OF CORLOD TABLE PCHR MOV (SP)+,R0 ; INTO R0. PCHR 20$: CMP (R0)+,(PC)+ ; LET'S FIND TSTAT PCHR .RAD50 /TST/ ; PCHR BNE 50$ ; NOT HERE PCHR CMP (R0)+,(PC)+ ; OW, TEST THE PRIORITY LEVEL BLE LPRA30 ;BRANCH IF ILLEGAL CMP R2,#NLPRTY BLE LPRA40 ;BRANCH IF IT'S OK ; LPRA30: MOV #NLPRTY,R2 ;USER'S VALUE IS ILLEGAL, USE LOWEST ; LPRA40: TST (R1) ;TEST NWORD FOR VALIDITY BGE LPRA50 ;BRANCH IF .GE. 0 AND ASCII .IFZ INEBC MOV #9.,R4 ;BUT, IF EBCDIC ISN'T SYSGENED BR LPRA10 ;NWORD CAN DOD TO SCAN FLIA20: MOVB PDVCE(R1),R2 BIC #177600,R2 ; ISOLATE LOGICAL DEVICE MOVB R2,DEVNO ; SET DEVICE NO. IN LIST MOV (R1),DODID ; SET ID IN LIST FLIA25: CLR RLSECT ; START AT RELATIVE SECTOR 0 FLIA30: MOV #DLIST,-(SP) EMT DISCIO ; READ A SECTOR OF THE DIRECTORY CMP #9.,DERRWD ; FINISHED FILE? BEQ FLIB00 TST DERRWD ; DISC ERROR? BNE FLIB ; 70 ******** .WORD MAGTAP ; 71 ******** .WORD STIME ; 72 1/26/73 .WORD SDATE ; 73 1/26/73 MAXEMT = .-EMTABL/2-1 .PAGE .CSECT .EMTIN ;FORCE INTO IPL GROUP ;[GLOBAL REFERENCES WHICH REMAIN UNDEFINED AT LINK TIME BECAUSE THEY ; WERE NOT INCLUDED IN THE MON PCHR .RAD50 /AT / ; PCHR BNE 51$ ; SECOND HALF WRONG. PCHR MOV (R0)+,TSTADD ; FOUND IT. PCHR BR STAA00 ; GO GET STARTED. PCHR 50$: TST (R0)+ ; BUMP R0 PCHR 51$: TST (R0)+ ; TO NEXT ENTRY IN TABLE PCHR CMP (R'T BE <= 0 .ENDC .IFNZ INEBC .=.-4 BR LPRA10 .ENDC ; LPRA45: MOV #11.,R4 BR LPRA10 ; LPRA50: JSR PC,LPLEVL ;NOW, DETERMINE THE INDEX OF THE .IFLE NLP ;THIS LOGIC NEEDS TO BE CONSIDERED MOV LOGMAX,R4 ; LPRA51: TBIT #AVAIL,PHYDEV(R3) ;SEE IF THIS DEVICE IS AVAILABLE BNE LPRA53 ;BRANCH IF IT IS ; LPRA52: TBIT #A20 ; YES REPORT MOV #BUFFER,R2 ; START BUFFER ADDRESS MOV #120.,R3 ; LENGTH OF SCAN OR SEARCH .ENDC .IFZ DRESDI FLIA40: MOV #FILE,R2 ; START BUFFER ADDRESS MOV #NCRLOC-$ROSFW-$ROSFW,R3 ; LENGTH OF SCAN OR SEARCH .ENDC ADD R2,R3 ; EXTENT OF SEARCH FLIA50: TST (R2) ; FILE ACTIVE? BEQ FLIA60 ; NO MOV FLTYPE,R0 ; GET FILE TYPE ITOR BEING GENERATED WILL BE LOADED WITH ; A ZERO BY THE LOADER. THE FOLLOWING SUBROUTINE WILL BE CALLED BY "IPL" ; TO INITIALIZE THESE ENTRIES TO "EMTERR" IN CASE THEY ARE CALLED.] EMTINIT: ;SUBROUTINE TO REPLACE UNDEFINED VECTOR ELEMENTS ;WITH IMMEDIATE RETURNS. ("HALTS" IN DEBUG VERSION.) MOV #EMTABL,R0 EMTI10: TST (R0)+ ;IS THIS VECTOR ELEMENT UNDEFINED? BNE EMTI20 ;NO MOV #EMTERR,-(R0) ;YES - PUT ERROR R0),R1 ; END OF TABLE. PCHR BNE 20$ ; MORE TO COME PCHR MOV #MES30,R0 ; TELL USER TSTAT NOT FOUND-THIS IS BAD PCHR JSR PC,TTYOUT ; PCHR EMT $EXIT ; AND GO AWAY NEVER TO RETURN. PCHR ; PCHR STAA00: MOV #MESS1,R0 ; PRINT PROMPTER MESSAGE LT,PHYDEV(R3) ;OOPS. BETTER SEE IF WE HAVE BEQ LPRA45 ;AN ALTERNATE. BRANCH IF NO. DEC R4 ; BLE LPRA45 ; MOV ALTDEV(R3),R3 ;GET LOGICAL UNIT NO. OF ALTERNATE ASL R3 ;CONVERT TO WORD INDEX CMPB #LPDEV,PHYDEV(R3) ;SEE IF THE DEVICE IS COMPATIBLE BEQ LPRA51 ;BRANCH IF WE CAN USE IT. BR LPRA52 ;OTHER BEQ FLID00 ; PRINT ALL MOVB FTYPE(R2),R4 ; ISOLATE FILE BIC #177600,R4 ; TYPE CMP R0,R4 ; ONE WE WANT BEQ FLID00 ; YES FLIA60: ADD #10.,R2 ; BUMP FILE ENTRY POINTER CMP R2,R3 ; FINISHED BUFFER? BLT FLIA50 ; NO .IFNZ DRESDI INC RLSECT ; READ NEXT SECTOR BR FLIA30 .ENDC .IFZ ETURN IN IT TST (R0)+ ;...AND ADVANCE IT AGAIN EMTI20: CMP R0,#MAXEMT*2+EMTABL ;REACHED END OF VECTOR YET? BLOS EMTI10 ;NOT YET - KEEP GOING MOV #EMTRAP,30 ;INIT EMT VECTOR MOV #340,32 RTS PC ;ALL DONE .END PCHR JSR PC,TTYOUT ; PCHR JSR PC,TTYIN ; GET AN INPUT (REQUEST) PCHR JSR PC,INTERP ; GO INTERPRET THE REQUEST PCHR BNE STAA20 ; SYNTAX ERROR PCHR MOV #OPTAB,R0 ; GET ADDRESS OF OPCODE TABLE. PCHR 10$: MOV (R0)+,R1 ; GET A LETER & BUMP POINTER TO TABLE PCHR BLT STAA20 WISE, GO TRY NEXT ALTERNATE .ENDC ; LPRA53: MOV @#PSR,-(SP) ;PRIORITY QUEUE. INHIBIT INTERRUPTS. .IFZ $1145 MOV #340,@#PSR .ENDC .IFNZ $1145 SPL 7 .ENDC DEC (R0) ;SEE IF LIST IS THREADABLE BNE LPRA80 ;BRANCH IF NO, CAUSE THAT'S A NO-NO MOV R0,@LPLAST(R2) ;QUEUE IT - MOV R0,LPLAST(R2) ;QUEUE IT ! MOV ACTI DRESDI BR FLIB10 ; DONE .ENDC .IFNZ $BATCH FLIA70: JMP FLBA00 ; FILE LIST FOR BATCH ELEMENTS .ENDC ; ; .IFNZ DRESDI FLIB00 = . TST FLTYPE ; DO THEM ALL? BNE FLIB10 ; NO-FINISHED ADD #10.,R1 ; BUMP TO NEXT DOD CMP (R1),#NDISCS ; DONE ALL OF THEM? BLE FLIA20 ; NO-PRINT THIS ONE TOO .ENDC FLIB10 = ; UPDATE 1/3/73 RQUEST.C02 ; UPDATE 10/18/72 RQUEST.C01 ; UPDATE 6/22/72 RQUEST.S05 ; UPDATE 5/2/72 RQUEST.S04 ; UPDATE 1/18/72 RQUEST.S03 ; UPDATE 1/12/72 RQUEST.S02 ; UPDATE 11/8/71 RQUEST.S01 .TITLE RQUEST ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATI ; NOT IN TABLE - SYNTAX TYPE ERR. PCHR CMPB R1,LETTR ; IS THIS IT? PCHR BNE 10$ ; NO - GO LOOK FOR MORE PCHR SUB #OPTAB,R0 ; GET INDEX INTO JUMP TABLE. PCHR JMP @JMPTAB-2(R0) ; THIS IS IT. GO TO HANDLER REQUIRED. PCHR STAA20: MOV #MESS2,R0 ; ILL REQUEST PCHR JSR PC,TTYOUT ; TELL USER VE,R4 ;SEE IF CALLER IS A TASK BEQ LPRA55 ;BRANCH IF HE ISN'T MOV $CTASK,R4 ;OTHERWISE, GET HIS NUMBER INCB IOSTAT(R4) ;AND INCREMENT THE I/O IN PROGRESS STATUS BYTE ; LPRA55: MOV R4,SYSTEM(R0) ;SAVE TASK NO. (0 =====> NOT A TASK) TST LPBUSY(R3) ;SEE IF IT'S THE FIRST IN THE QUEUE BEQ LPRB00 ;BRANCH IF YES MOV (SP),@#PSR ;ELSTWISE, CLEAR THE INHIBIT ; ; . EMT EXIT ; EXIT FROM TASK ; ; REPORT DISC ERROR ; FLIB20 = . MOV #DISCER,PRTBUF JSR PC,PRINT BR FLIB10 ; EXIT ; ; LIST SPECIFIED FILE TYPES ; FLIC00 = . .IFZ DRESDI BR FLIA40 .ENDC .IFNZ DRESDI MOVB FSTAT(R0),R5 ; GET FILE TYPE STATUS BIC #177740,R5 ; ISOLATE LOGICAL DEVICE MOVB R5,DEVNO ON. RQUEST, CATALOG NO. ; * ;* REQUEST BUTTON INTERRUPT HANDLER * ;* * ;* PURPOSE. THIS INTERRUPT HANDLER SERVES THE PURPOSE * ;* OF QUEUEING THE OPERATOR INPUT PROCESSING TASK 'INPUT' * ;* IN THE ROS TASK QUEUE. * ;* * ;* PROGRAM USAG PCHR BR STAA00 ; TRY AGAIN PCHR .PAGE ; PCHR ; DEFINE A PATCH FILE (MUST NOT EXIST) PCHR ; PCHR DEFINE: ; PCHR TST FLD1F ; DO I HAVE A VALUE PCHR BGT 20$ THIS SECTION RETURNS TO THE CALLER (IF EXIT TYPES 1 OR 3) OR TO ; THE ROS DISPATCHER (IF EXIT TYPE 2); THE LATTER REQUIRES THAT ; THE TASK BE SUSPENDED FIRST. ; LPRA60: CMPB #2,TYPE(R0) ;IS THE EXIT TYPE = 2? BNE LPRA70 ;BRANCH IF NO TST SYSTEM(R0) ;SEE IF THIS IS A TASK CALLING BEQ LPRA70 ;BRANCH IF THE CALLER IS NOT A TASK MOV (SP)+,14.(SP) ;GOOD, HE IS A TASK, PUT HIS PSR ON STACK ASL R5 ; WORD INDEX CLR R4 BISB PHYDEV(R5),R4 ; GET PHYSICAL UNIT INC R4 MOV R4,DODID ; DOD ID TO USE JMP FLIA25 ; START SCAN .ENDC ; ; PRINT FILE DIRECTORY INFORMATION ; FLID00 = . MOVB #NO,OB7 ; SET UP NO RESPONSES MOVB #NO,OB8 ; TO PROTEC AND CORE DIR. MOVB #' ,IFDCLR ; RESET MOVB #' ,IFDCLR+1 E. THE LINKAGE TO THIS INTERRUPT HANDLER * ;* IS VIA THE PDP-11'S HARDWARE/SOFTWARE INTERFACE: * ;* * ;* BR4 * ;* VECTOR = 244 * ;* * ;* PROGRAMMER 54 * ;* DATE ; YES- OK PCHR 10$: JMP STAA20 ; NO -ERROR PCHR 20$: MOV FIELD1,DEFLEN ; SET UP LENGTH PCHR DEC FIELD1 ; CHECK SIZE OF REQUEST 1/26/73 BLE 10$ ; MUST BE >1. 1/26/73 MOV #DEFBLK,-(SP) ; DEFINE THE FILE PCHR EMT $DEFIN ; MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; ALL MOV (SP)+,R3 ; THE MOV (SP)+,R2 ; GENERAL MOV (SP)+,R1 ; REGISTERS MOV (SP)+,R0 ; CLR -(SP) ;SET INVOLUNTARY SUSPEND FLAG JSR PC,QSAVEI ;AND LET QSAVEI SUSPEND 'IM JMP DSPTCH ;THEN GO TO THE SYSTEM DISPATCHER ; LPRA70: MOV R4,ERROR(R0) ;STORE ERROR CODE ; IFD MOVB #' ,IFDCLR+2 ; IN PRINT MOVB #' ,IFDCLR+3 ; BUFFER MOV (R2),R5 ; FILE ID MOV #OB1,R4 ; END EDIT ADDRESS MOV #5.,R0 ; 5 CHARACTERS JSR PC,B2ONTA ; CONVERT AND EDIT MOV SCTR(R2),R5 ; START SECTOR MOV #OB2,R4 ; END EDIT ADDRESS JSR PC,BIN2OC ; CONVERT ALL SIX CHARACTERS MOVB FTYPE(R2),R5 ; FILE T * ;* REVISION * ;* * ;*********************************************************************** .DEF RQUEST .REF QUEUE,RESTOR .DEF LOGMAX,PHYDEV,ALTDEV .CSECT ; ; ; ; RQUEST = . $SAVE ; SAVE ENVIRONMENT-GET SYS. STACK MOV #$INPNO,-(SP) PCHR MOVB DEFERR,R1 ; GET ERROR CODE AND TEST PCHR BNE DELA20 ; YES - GO TO COMMON CODE PCHR MOV #126.,R0 ; NO - LET'S SET UP SECTOR 0. PCHR 40$: CLR SECZ(R0) ; PCHR SUB #2,R0 ; DECREMENT BY A WORD. PCHR BGE 40$ ; MORE TO COME PCHR MOV #200,SECZ MOV (SP)+,@#PSR ;RESTORE CALLER'S PS BR LPRA15 ;AND GO WHERE THE REGISTER CAN BE RESTORED ; LPRA80: INC (R0) ;LIST IS NOT THREADABLE MOV (SP)+,@#PSR MOV #1,R4 BR LPRA10 .PAGE ;********************************************************************** ;* ** ;* AT THIS POINT, THE REQUEST JUST QUEUED IS THE ONLY YPE BPL FLID10 ; NO CORE DIRECTORY ENTRY JSR R5,PUSHR ; SAVE REGISTERS MOV (R2),R0 ; ID TO R0 MOVB PDVCE(R2),WORKWD ; SET DEVICE NO IN BIC #177600,WORKWD ; WORK WORD MOV #WORKWA,R1 ; ADDRESS OF DEVICE-5 SO WE CAN USE CDSRCH JSR PC,CDSRCH ; FIND IFD OF ENTRY MOV R4,R5 ; IFD TO CONVERT MOV #OB9,R4 MOV #4,R0 ; PUSH .IFNZ DPRTY CLR -(SP) ; ARGUMENTS FOR QUEUE .ENDC .IFNZ ARG TST -(SP) ; ONTO .ENDC CLR -(SP) ; STACK JSR PC,QUEUE ; QUEUE INPUT TST (SP)+ ; DISREGARD ERROR JMP RESTOR ; RESTORE ENVIRONMENT & EXIT ; ; PHYSICAL DEVICE TABLE ; LOGMAX: .WORD 12. ; LARGEST VALID LOGICAL DEVICE N ; SET UP WORD ZERO TO POINT TO WORD 0 PCHR JSR PC,WRT0 ; SECTOR1. NOW WRITE IT OUT. PCHR JMP STAA00 ; ALL DONE PCHR .PAGE ; PCHR ; DELETE THE PATCH FILE PCHR ; PCHR DELETE: ; ** ;* REQUEST IN THE QUEUE, SO WE GONNA START THE OUTPUT. ** ;* INTERRUPTS ARE INHIBITED ON ENTRY, AND THE REGISTERS ** ;* ARE SET AS FOLLOWS: ** ;* ** ;* R0 = ADDR(LIST) ** ;* R1 = ADDR(DATA) ** ;* R2 = PRIORITY INDEX JSR PC,B2ONTA MOVB #YES,OB8 ; YES CORE DIRENTORY JSR R5,POPR ; RESTORE REGISTERS FLID10: BIC #177600,R5 ; ISOLATE FILE TYPE MOV #OB3,R4 MOV #3,R0 JSR PC,B2ONTA MOVB PDVCE(R2),R5 ; LOGICAL DEVICE BPL FLID20 MOVB #YES,OB7 ; SET PROTECT = Y FLID20: BIC #177600,R5 ; ISOLATE MOV #OB4,R4 MOV #3,R0 JSR PC,B2ONTA O. PHYDEV = . ; PHYSICAL DEVICE TABLE ******** ; BYTE 0: DEVICE PHY. UNIT NUMBER ******** ; BITS 8-11: DEVICE TYPE ******** ; BIT 14: ALT. DEVICE EXIST IF=1. ******** ; BIT 15: UNIT NOT AVAIL IF=1. ******** .WORD 000000 ; UNIT 0. TTY 0. NO ALT. ******** .WORD PCHR MOV #DEFBLK,-(SP) ; DELETE THE PATCH FILE PCHR EMT $DELET ; PCHR MOVB DEFERR,R1 ; GET ERROR CODE AND TEST PCHR BNE DELA20 ; YES PCHR JMP STAA00 ; NO - ALL DONE PCHR ; PCHR ; COMMON ERROR HANDLING CODE FOR D ** ;* R3 = L/P INDEX ** ;* ** ;********************************************************************** ; ; LPRB00: MOV PC,LPBUSY(R3) ;SET L/P BUSY FLAG MOV (SP),@#PSR ;ENABLE INTERRUPTS MOV R1,LPDATA(R3) ;SAVE DATA BUFFER ADDRESS MOV $EXIT(R0),LPIOCM(R3) ;SAVE EXIT ADDRESS MOV SYSTEM(R0),L MOV LGTH(R2),R5 ; FILE LENGTH MOV #OB5,R4 JSR PC,BIN2OC MOV CKSAVE(R2),R5 ; CKSAVE IF REQUIRED MOV #OB6,R4 JSR PC,BIN2OC MOV #OUTBUF,PRTBUF JSR PC,PRINT ; PRINT LINE JMP FLIA60 ; GET NEXT PRINT LINE ; ; ; DIRECT PRINTING OF BUFFER WHOSE ADDRESS HAS BEEN SET ; IN PRTLST. ; PRINT = . MOV #PRTLST,-(SP) ; I/O LIST TO STACK 000400 ; UNIT 1. DISC 0. NO ALT., ******** .WORD 100000 ; UNIT 2. NOT AVAIL. ******** .WORD 100000 ; UNIT 3. NOT AVAIL. ******** .WORD 140000 ; UNIT 4. TTY1 NOT AVAIL. ALT. AVAIL. ******** .IFZ $DTAPE ; ******** .WORD 100000 ; NO DECTAPES ******** .WORD 100000 EFINE AND DELETE. PCHR DELA20: MOV #MES20,R0 ; SET UP FOR FILE MANAG. ERRORS PCHR SUB #5,R1 ; IS IT? PCHR BLT 40$ ; YES. PCHR DEC R1 ; PCHR BEQ 5$ ; NO - ERR 6 (DIR FULL)? PCHR DEC R1 ; PCHRPTASK(R3) CLR LPCNT(R3) ;CLEAR THE BUFFER INDEX POINTER MOV R2,LPRIOR(R3) ;SAVE PRIORITY INDEX MOV NWORD(R1),LPMAX(R3) ;SAVE MAX NO CHARACTERS .IFNZ INEBC ;'IF EBCDIC CONVERSION' BGT LPRB10 ;BRANCH IF ASCII NEG LPMAX(R3) ;OTHERWISE, FORCE POSITIVE LPRB10: .ENDC CLR LPRTRY(R3) ;SET NO. ATTEMPTS TO ZERO ; LPRB20: JSR .IFNZ NLP EMT LPRNTR ; USE LINE PRINTER DEC PAGCTL BNE PRNT20 .IFNZ $BATCH TST FLTYPE ; ROS OR BATCH BMI PRNT10 ; BATCH .ENDC JSR PC,ROSHDR BR PRNT20 .IFNZ $BATCH PRNT10: JSR PC,BTCHDR .ENDC PRNT20 = . .ENDC .IFZ NLP EMT TTYOUT ; USE TELETYPE .ENDC RTS * ;* COMPRS * ;* * ;* PROGRAM IDENTIFICATION. COMPRS, CATALOG NUMBER ; * ;* COMPRESS A ROS FILE TYPE DISC SECTION. * ;* * ;* PURPOSE. COMPRS IS A ROS SYSTEM TASK THAT WHEN ACTIVATED WILL * ;* COMPRESS A SECTION OF A DISC DEVICE DESIGNAT BEQ 10$ ; NO - ERR 7 ( ALREADY DEFINED)? PCHR DEC R1 ; PCHR BEQ 15$ ; NO - ERR 8 (DISK FILE TYPE FULL)? PCHR DEC R1 ; PCHR BEQ 20$ ; NO - ERR 9 ( FILE NOT DEFINED)? PCHR MOV #MES25,R0 ; NO - MUST BE ERR 15 (DISCIO ERROR) 2/15/73 BR 40$ ; PC,LPRSET ;RESET THE LINE PRINTER MOV #ASCLP,R2 ;GET ADDRESS OF ASCII TO EVEN-PARITY-ASCII .IFNZ INEBC TST NWORD(R1) BGE LPRB30 MOV #EBCLP,R2 ;LOAD EBCDIC TO EVEN-PARITY-ASCII TABLE ADDR ; LPRB30: .ENDC JSR PC,LPCNVT ;CALL LPCNVT TO CONVERT THE USER'S MOV #340,@#PSR ;NEED TO INHIBIT BEFORE I/O CAN START ; LPRB35: ;FIRST LINE OF TEXPC ; IGNORE ERROR AND RETURN ; ; ; SUBROUTINE BINARY TO OCTAL ASCII CONVERSION. ; INPUT R5 = BINARY NUMBER ; R4 = DESTINATION END ADDRESS ; R0 = ITERATION LENGTH IF B2ONTA ENTERED ; BIN2OC = . MOV #6,R0 ; SET UP ITERATION LENGTH B2ONTA: INC R4 B2LOOP: MOVB R5,-(R4) BICB #370,(R4) BISB #060,(R4) ; CHANGE TO ASCII CODE ASR R5 ED BY A FILE TYPE. * ;* COMPRS MAY BE CALLED VIA THE OPERATOR DEMAND TASK 'INPUT' * ;* WITH THE COMMAND: * ;* CM,T * ;* WHERE T IS THE FILE TYPE AREA TO BE COMPRESSED. FILES THAT * ;* ARE COMPRESSED ARE IN ESSENCE ASSIGNED NEW START SECTOR * ;* ADDRESSES AND THE UNUSED DISC SPACES THAT MAY EXIST BETWEEN * ;* THE FILES ARE "SQUEEZED" OUT. PCHR 5$: MOV #MES21,R0 ; PCHR BR 40$ ; PCHR 10$: MOV #MES22,R0 ; PCHR BR 40$ ; PCHR 15$: MOV #MES23,R0 ; PCHR BR 40$ ; PCHR T. JSR PC,LPSIO ;OTHERWISE, START I/O CLR R4 BR LPRA60 ;THEN GO SET UP FOR EXIT ; LPRB40: JMP LPIE00 .PAGE ;********************************************************************** ;* ** ;* L P I N T ** ;* ** ;* LINE PRINTER I ; BEGIN SHIFTING FOR NEXT OCTAL DIGIT BIC #100000,R5 ; PREVENT SIGN PROPAGATION ASR R5 ASR R5 DEC R0 ; MORE TO GO? BGT B2LOOP ; BACK FOR MORE RTS PC ; ; PRINT ROS FILE LIST HEADER AND SET UP PAGE CONTROL ; ROSHDR = . .IFNZ NLP MOV #$NLINE,PAGCTL ; SET UP FOR PAGE CONTROL .ENDC MOV #EJECT,PRTBUF JSR PC,PRINT * ;* * ;* PROGRAM USAGE. TO QUEUE COMPRS BY OPERATOR DEMAND,TYPE * ;* THE COMMAND: * ;* CM,T * ;* WHERE T IS THE FILE TYPE TO COMPRESS. OTHERWISE, QUEUING * ;* COMPRS VIA QUEUE AND PASSING T AS AN ARGUMENT MAY * ;* BE USED 20$: MOV #MES24,R0 ; PCHR 40$: JSR PC,TTYOUT ; PRINT MESSAGE PCHR JMP STAA00 ; GO TRY AGAIN. PCHR .PAGE ; PCHR ; TASK EXIT PCHR ; PCHR EXIT: ; NTERRUPT ROUTINE, ENTERED WHEN THE PRINTER ** ;* IS READY TO ACCEPT ANOTHER LINE OR IF AN ERROR WAS ** ;* DETECTED. ** ;* ** ;********************************************************************** ; LPINT0: $SAVE ;CALL SAVE TO TAKE CARE OF THINGS .IFZ NLP-1 CLR R3 .ENDC .IFGE NLP- ; FORM FEED PRINT DEVICE MOV #HDR1,PRTBUF JSR PC,PRINT ; PRINT MOV #HDR2,PRTBUF JSR PC,PRINT ; FILE LIST MOV #HDR3,PRTBUF JSR PC,PRINT ; HEADER MOV #BLNKLN,PRTBUF JSR PC,PRINT ; SPACE ONE LINE RTS PC ; .IFNZ $BATCH ; ; PRINT BATCH ELEMENT HEADER AND SET UP PAGE CONTROL ; BTCHDR = . .IFNZ NLP * ;* * ;* WHEN COMPRESSION IS COMPLETE, IT WILL TYPE: * ;* * ;* "FILE COMPRESSION COMPLETE" * ;* * ;* APPROPRIATE ERROR MESSAGES WILL ALSO BE TYPED WHEN * ;* ERRORS OCCUR. COMPRS PCHR EMT $EXIT ; PATCHR DOES AN EXIT. PCHR .PAGE ; PCHR ; CANCEL ALL OF A TASKS PATCHES. PCHR ; PCHR CANCEL: ; PCHR TST FLD1F ; ANYTHING SPECIFIED? PCHR 2 MOV #0,R3 ;SET L/P INDEX TO ZERO (FIRST L/P) BR LPIA00 ; LPINT2: $SAVE ;CALL SAVE TO TAKE CARE OF THINGS MOV #2,R3 ;SET L/P INDEX TO SECOND L/P .IFGE NLP-3 BR LPIA00 ; LPINT4: $SAVE ;ET CETERA MOV #4,R3 .IFGE NLP-4 BR LPIA00 ; LPINT6: $SAVE ;...AND ET CETERA MOV #6,R3 MOV #$NLINE,PAGCTL ; SET UP FOR PAGE CPNTROL .ENDC MOV #EJECT,PRTBUF JSR PC,PRINT ; FORM FEED FRINT DEVICE MOV #BTCH1,PRTBUF JSR PC,PRINT ; PRINT MOV #BTCH2,PRTBUF JSR PC,PRINT ; HEADER TO LIST MOV #HDR3,PRTBUF JSR PC,PRINT ; BATCH ELEMENTS MOV #BLNKLN,PRTBUF JSR PC,PRINT ; SPACE ONE LINE RTS WILL THEN BE TERMINATED. * ;* * ;* PROGRAMMER: 54 * ;* DATE * ;* REVISION * ;* * ;*********************************************************************** ; .DEF BGT 20$ ; OK PCHR JMP STAA20 ; NO - BAD PCHR 20$: JSR PC,TASKNO ; GET & CHECK TASK NO. PCHR JSR PC,READ0 ; GET SECTOR ZERO PCHR ASL R2 ; SHIFT INTO A WORD INDEX PCHR CLR SECZ(R2) ; CLEAR THE ENTRY FOR TASK SPECIFIED PCHR JSR PC,WRT0 ; WRITE SECTOR Z .ENDC .ENDC .ENDC ; ; LPIA00: .IFZ $1145 ;CLEAR THE INTERRUPT INHIBIT MOV #LPINH*32.,@#PSR ;INHIBIT INTERRUPTS AT AND BELOW L/P .ENDC .IFNZ $1145 SPL LPINH .ENDC MOV LPRIOR(R3),R2 ;GET CURRENT REQUEST PRIORITY LEVEL MOV LPFRST(R2),R0 ;GET I/O LIST ADDRESS MOV LPDATA(R3),R1 ;GET DATA BUFFER ADDRESS JSR PC,LPSTAT ;GET L/P S PC ; ; ; TWO DIGIT ASCII NO. TO BUFFER ; R1 = BINARY NUMBER ; R3 = TWO DIGIT ASCII ADDRESS ; TOBUFR = . MOV R1,-(SP) MOV #ASCII,-(SP) EMT BINASC MOVB ASCII+4,(R3)+ MOVB ASCII+5,(R3)+ RTS PC ; ; ; LIST BATCH FILE ELEMENTS ; FLBA00 = . JSR PC,BTCHDR ; PRINT BATCH FILE ELEMENT HEADER MOV #$BCHID,DODID ; ID TO USE FOR BATCH MOCMPRHD,COMPRS .REF FSTAT,PHYDEV,NODREQ,CMPTMR,CPRSIP .REF FINIT,PFRITE,FILE,CDSRCH,CDILST .REF DQFRST,DQLAST,NDPRTY,HPRIRQ,CALLED,DIHA50,FMFRST .REF FMLAST,FNEXT,AULIST,DIOA65,IOSTAT,NOFMRQ,FMACTV .REF FLMB00,COMPID NOCKPT = 30 QTIME = 7 SUSPND = 2 UNSPND = 3 TTYOUT = 13 EXIT = 4 BINASC = 16 .PAGE ; ; EQUATES FOR RELATIVE FILE POSITIONS ; SCTR = 2.ERO BACKOUT PCHR JMP STAA00 ; DONE. PCHR .PAGE ; PCHR ; DEFINE A RELOCATABL PATCH PCHR ; PCHR RELPCH: ; PCHR BIC #BYTFLG,FLGWRD ; CLEAR THE BYTE FLAG PCHR BIS TATUS BNE LPRB40 ;BRANCH IF AN ERROR WAS DETECTED JSR PC,LPRSET ;THEN RESET THE L/P .IFNZ INEBC TST (R1) ;HERE'S WHERE WE DECIDE WHETHER THE INTERNAL BGT LPIA04 ;CODE IS ASCII OR EBCDIC MOV #EBCLP,R2 ;MUST BE EBCDIC AT THIS POINT BR LPIA06 ; LPIA03: JMP LPIE00 ; LPIA04: .ENDC MOV #ASCLP,R2 ;INTERNAL FORMAT IS ASCII VB #1.,DEVNO ; SET DEVICE NO. FOR BATCH FILES CLR RLSECT ; START AT SECTOR ZERO FLBA10: MOV #DLIST,-(SP) EMT DISCIO ; READ ONE SECTOR TST DERRWD ; DISC ERROR? BNE FLBA20 ; YES-REPORT MOV #BUFFER,R2 ; DATA BUFFER ADDRESS TST RLSECT ; FIRST SECTOR OF DIRECTORY BNE FLBA16 ; NO-DON'T IGNORE ENTRY 0 FLBA15: ADD #16.,R2 ; BUMP TO EL ; START SECTOR FTYPE = 4. ; FILE TYPE PDVCE = 5. ; PROTECT STATUS AND DEVICE LGTH = 6. ; FILE LENGTH CKSAVE = 8. ; CHECKPOINT SECTOR ADDRESS ; ; ; MISCELLANEOUS EQUATES ; PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 340 ; PRIORITY LOCK-OUT MASK CSTKSZ = 75. ; COMPRS STACK SIZE RDLEV = 3 ; DISC LEVELEADER(R2) ; HEADER ADDRESS SYSI20: ADD #2.,R0 ; BUMP INDEX BLT SYSI00 ; DO FOR ALL .IFNZ NDISCS .REF $TKFLS,PFRITE MOV #$TKFLS,-(SP) ; WRITE TASK TABLE ON DISC JSR PC,PFRITE .ENDC RTS PC ; RETURN TO IPL ; ; .END .IFNZ INEBC ; LPIA06: .ENDC JSR PC,LPCNVT ;AND GO SEE IF THERE'S MORE TEXT BNE LPIA10 ;(DON'T WANT TO LEAVE ANYTHING HANGING) JSR PC,LPSIO ;START 'ER UP AGAIN BOYS, WE GOT A NEW CUSTOMER JMP (R5) ;THEN GET OUT OF HERE (GO TO RESTOR) ; LPIA10: MOV @#PSR,-(SP) ;SAVE CURRENT CPU STATUS LEVEL MOV LPRIOR(R3),R2 ;GET PRIORITY INDEX .IFZ $1145 ;NO DAEMENT DIRECTORY FLBA16: CMP R2,#BUFFER+128. ; DONE WITH THIS BUFFER? BLT FLBB00 ; NO INC RLSECT ; YES/BUMP RELATIVE SECTOR CMP #31.,RLSECT ; SEARCHED COMPLETE BFUP DIRECTORY BGE FLBA10 ; NO-KEEP GOING FLBA17: EMT EXIT ; YES-EXIT FROM FILE LIST FLBA20: MOV #BCHERR,PRTBUF JSR PC,PRINT ; PRINT ERROR MESSAGE EMT EXIT ; ; FLBB00 = . TST (R2) AT WHICH TO READ UDLEV = 1 ; DISC LEVEL AT WHICH TO UPDATE CSS = SCTR ; COMPRESSION START SECTOR LEVEL = 7. ; RELATIVE POSITION OF PRIORITY ; ; LEVEL IN I/O LIST DATA = 12. ; RELATIVE ADDRESS OF I/O BUFFER ; ; IN I/O LIST DUSE3 = 8. ; THIRD RESERVED FOR DISCIO WORD ; ; IN DISC DATA; NO DECTAPES ******** .WORD 100000 ; NO DECTAPES ******** .WORD 100000 ; NO DECTAPES ******** .WORD 100000 ; NO DECTAPES ******** .WORD 100000 ; NO DECTAPES ******** .WORD 100000 ; NO DECTAPES ******** .WORD 100000 ; NO DECTAPES TA LEFT IN USER'S BUFFER MOV #340,@#PSR ;SO, INHIBIT INTERRUPTS SO'S WE CAN .ENDC ;DEQUEUE THE REQUEST .IFNZ $1145 SPL 7 .ENDC MOV (R0),LPFRST(R2) ;PUT NEXT GUY IN THREAD AT TOP OF QUEUE BNE LPIA20 ;BRANCH IF THERE'S MORE IN QUEUE MOV R2,R4 ;OTHERWISE, PLACE THIS PRIORITY'S ADD #LPFRST,R4 ;QUEUE IN THE NOMINAL STATE (NO ENTRIES) MOV R4 ; NAME VALID? BEQ FLBA17 ; NO-DONE WITH LIST ; ; SET UP PRINT BUFFER ; MOV #BENAME,-(SP) ; ASCII STRING ADDRESS MOV R2,-(SP) ; ADDRESS OF RAD50 NAME EMT 39. ; RAD 50 UNPACK MOVB BTYPE(R2),R1 ; GET ELEMNT TYPE BIC #177600,R1 ; ISOLATE ASL R1 ; TIMES TWO ASL R1 ; TIMES FOUR ADD R1,R1 ; TIME BUFFER .PAGE ; ; THE FOLLOWING IS THE TASK HEADER FOR COMPRS ; CMPRHD = . .WORD 1 ; THREAD WORD FMQEP: .WORD COMPRS ; ENTRY POINT-USED AS FILE MGMT. ; ; QUEUE ENTRY POINT DSCQEP: .WORD 0 ; INITIALIZATION ENTRY POINT-USED AS ; ; DISC QUEUE ENTRY POINT .WORD 0 ; MAXIMUM EXECUTION TIME .BYTE CSTKSZ ; TA ******** .ENDC ; ******** .IFNZ $DTAPE ; ******** ; FOR DECTAPES - 1 CONTROLLER .WORD 2000,2001,2002,2003,2004,2005,2006,2007 .ENDC ; ******** ; ALTERNATE DEVICE TABLE ; ; ALTDEV: .WORD 4,0,0,0,0 .WORD 0,0,0,0,0,0,0,0 ; FOR DECTAPES - 1 CONTROLLE,LPLAST(R2) ; LPIA20: MOV #1,(R0) ;SET LIST REASY MOV (SP)+,@#PSR ;UN-INHIBIT THE INTERRUPTS MOV LPTASK(R3),R4 ;GET TASK NO. OF REQUESTOR BEQ LPIA25 ;BRANCH IF NOT A TASK DECB IOSTAT(R4) ;OTHERWISE, DECREMENT HIS I/O IN PROGRESS .IFNZ OVRLAY ;STATUS BYTE BNE LPIA25 ;AND, IF IT BECOMES ZERO, THEN..... MOV R4,-(SP) ;GO THO THE OVERLAY MONITOR SO TS EIGHT MOV BETPTB(R1),BETYPE TST (R1)+ MOV BETPTB(R1),BETYPE+2 ; PUT IN ELEMENT TYHPE TST (R1)+ MOV BETPTB(R1),BETYPE+4 TST (R1)+ MOV BETPTB(R1),BETYPE+6 MOVB STATUS(R2),R1 ; GET STATUS BPL FLBB10 NEG R1 ; SET POSITIVE INC R1 ; BUMP TO MAKE VALID INDEX FLBB10: ASL R1 ASL R1 ADD R1,R1 ; SK'S STACK SIZE .BYTE PRIBKG-1 ; PRIORITY ONE HIGHER THAN BACKGROUND .WORD 0 ; CURRENT TIMER VALUE .IFZ ARG XXXXXXXX COMPRS MUST HAVE A PASSED ARGUMENT .ENDC FLTYPE: .WORD 0 ; PASSED ARGUMENT-CONTAINS FILE TYPE .BYTE 5 ; CPU STATUS - FILE TYPE .BYTE $CPTNO ; COMPRS TASK NUMBER .WORD 0 ; STACK POINTER .WORD 205 R ; .END HE TASK'S JSR PC,RELTSK ;CORE CAN BE RELEASED .ENDC ; LPIA25: CMPB TYPE(R0),#2 ;WAS IT AN EXIT 2 REQUEST? BGT LPIA40 ;BRANCH IF EXIT 3 BLT LPIB00 ;BRANCH IF EXIT 1 MOV LPTASK(R3),-(SP);OK - IT'S EXIT 2 BEQ LPIA30 CLR -(SP) JSR PC,UNSPND ;SO, UNSUSPEND IT ; LPIA30: TST (SP)+ ;POP OFF ERROR BR LPIB00 ; LPIA40TIME EIGHT MOV STTBL(R1),BESTAT TST (R1)+ MOV STTBL(R1),BESTAT+2 TST (R1)+ ; PUT IN ELEMENT STATUS MOV STTBL(R1),BESTAT+4 TST (R1)+ MOV STTBL(R1),BESTAT+6 MOVB BDAY(R2),R1 ; GET BINARY DAY MOV #DATE1,R3 JSR PC,TOBUFR MOVB BMNTH(R2),R1 ; GET BINARY MONTH MOV R1,R3 ASL R1 ADD R3,R1 ; TIMES THREE ; FILE ID . = .+CSTKSZ+CSTKSZ-2 ; TASK STACK ; .PAGE ; ; THE FOLLOWING IS THE LIST AND BUFFER USED FOR DISCIO ; READS, WRITES, AND UPDATES ; DLIST = . .WORD 1 ; THREAD WORD DEVNO: .BYTE 0 ; DEVICE NUMBER-SET DYNAMICALLY EXTYP: .BYTE 0 ; EXIT TYPE-SET DYNAMICALLY IOCOMP: .WORD 0 ; I/O COMPLETE ADDRESS IF EXIT TYPE 3 .BYTE 0 ; NO ERROR T; UPDATE 12/19/72 SYSBLD.S04 ; UPDATE 12/18/72 SYSBLD.S03 ; UPDATE 12/8/72 SYSBLD.S02 .TITLE SYSBLD ; SBLD ;***********************************************************************SBLD ; *SBLD ; S Y S B L D *SBLD ; : MOV R5,-(SP) ;THE TIME HAS COME TO JSR TO THE MOV R3,-(SP) ;I/O COMPLETE SUBROUTINE JSR PC,@LPIOCM(R3) MOV (SP)+,R3 ;RESTORE L/P INDEX AND R5 MOV (SP)+,R5 MOV LPRIOR(R3),R2 ;RESTORE PRIORITY INDEX ; ; ; THIS SECTION CHECKS TO SEE IF ANYBODY ELSE IS WAITING FOR ; THIS LINE PRINTER. IF SOMEONE IS, THEN THE NEW I/O IS ; INITIATED. ; ; LPIB00: MOV #1,R2 ;STA MOVB MNTHTB(R1),DATE2 TSTB (R1)+ MOVB MNTHTB(R1),DATE2+1 ; PUT IN MONTH TSTB (R1)+ MOVB MNTHTB(R1),DATE2+2 MOVB BYEAR(R2),R1 ; GET BINARY YEAR MOV #DATE3,R3 JSR PC,TOBUFR MOVB BHOUR(R2),R1 ; GET BINARY HOUR MOV #TIM1,R3 JSR PC,TOBUFR MOVB BMIN(R2),R1 ; GET BINARY MINUTE MOV #TIM2,R3 JSR PC,TOBUFR MOVB ASK DLVL: .BYTE 0 ; DISC I/O LEVEL DERRWD: .WORD 0 ; DISC ERROR WORD .WORD 0 ; RESERVED FOR SYSTEM .WORD CPRBUF ; BUFFER ADDRESS ; CPRBUF = . .WORD 0 ; FILE ID-SET DYNAMICALLY .BYTE 0 ; USE RLSECT AND NWORD IOFCN: .BYTE 0 ; I/O FUNCTION-SET DYNAMICALLY .WORD 0,0,0 ; RESERVED FOR DISCIO RLSECT: .WORD 0 ; RE *SBLD ; IDENTIFICATION: SYSBLD *SBLD ; *SBLD ; PURPOSE: COPY ROS TO DDC DISK AND PROVIDE A DISK BOOT PROGRAM. *SBLD ; *SBLD ; METHOD: 1. THE BOOT PROGRAM (TO BE READ VIA ROM) IS COPIED TO *SBLD ; DISK IN SECTOR 0. THE PROGRAM IS PART OF *SBLD ; THIS MODULERT WITH TOP PRIORITY .IFZ NLPRTY-1 ;CODE FOR ONLY ONE PRIORITY LEVEL * TST LPFRST(R3) * BEQ LPID00 ;BRANCH IF NOBODY IS IN QUEUE * MOV R3,R2 * .ENDC ******* .IFNZ NLPRTY-1 ;NOW, DO THE SAME THING AGAIN, **** JSR PC,LPLEVL ;BUT FOR > 1 PRORITY LEVEL BSEC(R2),R1 ; GET BINARY SECOND MOV #TIM3,R3 JSR PC,TOBUFR MOV BSTRTS(R2),R5 ; START SECTOR MOV #SS,R4 JSR PC,BIN2OC MOV BLGTH(R2),R5 ; LENGTH MOV #LG,R4 JSR PC,BIN2OC MOV #BTCHBF,PRTBUF JSR PC,PRINT ; PRINT ELEMENT INFO. JMP FLBA15 ; NEXT---- ; .ENDC ; .END LATIVE SECTOR-SET DYNAMICALLY .WORD 64. ; ONE SECTORS LENGTH BUFFER = . . = .+128. ; RESERVE 64 WORD BUFFER. ; ; ; ; TELETYPE I/O PARAMETER LIST ; TTYLST = . .WORD 1 ; THREAD WORD .BYTE 0 ; LOGICAL DEVICE .BYTE 2 ; EXIT TYPE .WORD 0 .BYTE 0 .BYTE 0 ; NORMAL OUTPUT .WORD 0,0 TTYBUF: .WORD . THE ROM WILL LOAD IT STARTING AT *SBLD ; LOCATION 0. *SBLD ; 2. ROS IS COPIED TO DISK STARTING AT SECTOR 1. THE *SBLD ; FIRST WORD TRANSFERED IS THE GLOBAL LABEL 'SBLD'. *SBLD ; THE LAST WORD IS THE GLOBAL 'ROSEND'. SINCE THIS *SBLD ; MODULE IS LINKED WITH ROS, IT WILL KNOW THE SIZE OF *SBLD ; THE AREA TO TRANSFER FROM THE LINKER. * * MOV #NLPRTY,R4 ;R2 = INDEX FOR TOP PRIORITY * ; * LPIB10: ; * TST LPFRST(R2) ;IS THERE A REQUEST FOR THIS * BNE LPIB20 ;PRIORITY LEVEL? BRANCH IF YES * TST (R2)+ ;INCREMENT INDEX * .IFZ $1145  #RELFLG,FLGWRD ; SET THE RELOCATION FLAG PCHR BR PATA00 ; GO TO COMMON PCHR ; PCHR ; DEFINE A BYTE PATCH PCHR ; PCHR BYTPCH: ; PCHR BIS #BYTFLG,FLGWRD ; SET BYTE FLAG  0 ; TELETYPE BUFFER, SET DYNAMICALLY ; ; ; ; COMPRESSION COMPLETE MESSAGE ; CCMSG = . .WORD 35. .WORD 0 .ASCII /COMPRESSION COMPLETE-FILE TYPE / CCEDIT: .ASCII /XXX/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; FILE TYPE NOT VALID MESSAGE ; NVMSG = . .WORD 31. .WORD 0 .ASCII /COMPRS-FILE TYPE / NVEDIT: .ASCII /XXX NOT VALID/ .BYTE SBLD ; 3. TO POSITION 'ROSEND' CORRECTLY, THIS MODULE MUST BE *SBLD ; THE LAST ONE IN THE ROS LOAD MODULE. *SBLD ; 4. ALL CODE IN THIS MODULE, EXCEPT FOR ROSEND, IS *SBLD ; CONTAINED IN THE CSECT 'SYSBLD'. THIS WILL FORCE *SBLD ; IT TO BE LOADED IN ROS'S DYNAMIC AREA. *SBLD ; 5. ONLY REGISTERS R0-R3, & R5 ARE USED. *SBLD ;  * DEC R4 ; ******** BGT LPIB10 ;AND GO BACK FOR ANOTHER * .ENDC * .IFNZ $1145 * SOB R4,LPIB10 .ENDC BR LPID00 ; * LPIB20: ;  PCHR BIC #RELFLG,FLGWRD ; CLEAR RELOCATION FLAG PCHR BR PATA00 ; GO TO COMMON CODE PCHR ; PCHR ; DEFINE A NON-RELOCATABLE PATCH PCHR ; PCHR PATCH: ; PCHR BIC #B 15 ; CARRIAGE RETURN .EVEN ; ; COMPRESS NOT ALLOWED MESSAGE ; NAMSG = . .WORD 33. .WORD 0 .ASCII /COMPRS NOT ALLOWED-FILE TYPE / NAEDIT: .ASCII /XXX/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; DISC DIRECTORY SEARCH ERROR MESSAGE ; DSMSG = . .WORD 35. .WORD 0 .ASCII /COMPRS-DIRECTORY SEARCH DISC ERROR/ .BYTE 15 ; CARR  *SBLD ; DATE: 21 OCT 1972 *SBLD ; PROGRAMMER: 53 *SBLD ; *SBLD ;***********************************************************************SBLD .PAGE ; SBLD .DEF SBLD,ROSEND ; SBLD  * .ENDC ; AT THIS POINT, THERE IS AN ENTRY IN THE QUEUE, AND R2 POINTS ; TO IT. ; MOV LPFRST(R2),R0 ;DATA I/O LIST ADDRESS MOV DATA(R0),R1 ;AND DATA BUFFER ADDRESS JSR PC,LPCHEK ;DOUBLE CHECK VALUES BEQ LPIC00 ;BRANCH IF ALL'S WELL MOV #10.,ERROR(R0) ;TSK, TSK. SOMEBODY DID SOMETHING BR LPIA10 ;WHILE IT WAS IN QUEUE ; ; ; REQUEST IS OK, BEGI YTFLG!RELFLG,FLGWRD ; CLEAR BOTH BYTE & RELOCATION. PCHR PATA00: TST FLD1F ; ALL THREE FLAGS MUST BE +1. PCHR BLE 10$ ; NO PCHR TST FLD2F ; YES - NEXT PCHR BLE 10$ ; NO PCHR TST FLD3F ; YES - LAST PCHR BGT 15$ ; YES -ALL OR IAGE RETURN .EVEN ; ; DISC TRANSFER ERROR MESSAGE ; XEMSG = . .WORD 37. .WORD 0 .ASCII /COMPRS-FILE XFER ERROR-FILE TYPE / XEEDIT: .ASCII /XXX/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; DIRECTORY UPDATE DISC ERROR MESSAGE ; DUMSG = . .WORD 35. .WORD 0 .ASCII /COMPRS-DIRECTORY UPDATE DISC ERROR/ .BYTE 15 ; CARRIAGE RETURN  .REF IPL ; SBLD .CSECT SYSBLD ; FORCE CODE INTO DYNAMIC AREA. SBLD ; EQUATES FOR SYSBLD SBLD ; SBLD ; DISK REGISTER ADDRESSES SBLD DCS = 165300 ; SBLD WC = 165302 ; N PREPARATIONS FOR MESSAGE OUTPUT ; ; LPIC00: MOV R1,LPDATA(R3) ;SAVE VOLATILE STUFF: DATA ADDRESS MOV $EXIT(R0),LPIOCM(R3) ; I/O COMPLETE MOV R2,LPRIOR(R3) ; PRIORITY INDEX MOV SYSTEM(R0),LPTASK(R3) ;STORE THE TASK NUMBER OF CLR LPCNT(R3) ;THE REQUESTING PROGRAM MOV #ASCLP,R2 ; MOV (R1),LPMAX(R PCHR 10$: JMP STAA20 ; NO- ILLEGAL REQUEST PCHR 15$: JSR PC,TASKNO ; GO GET & TEST TASK #. PCHR MOV R2,TTSTAD ; SET UP ADD OF TASK'S TSTAT ENTRY PCHR ADD TSTADD,TTSTAD ; PCHR ASL R2 ; MAKE TASK# A WORD INDEX PCHR BIT #BYTFLG,FLGWRD ; IS THIS A BYTE COMMAND PCHR BEQ 17$  .EVEN ; .PAGE ; HITFLG: .WORD 0 ; USED TO FLAG DIRECTORY SEARCH SUCCESS SBUFLN: .WORD 0 ; SEARCH BUFFER LENGTH-CONTAINS END ; ; ADDRESS OF DIRECTORY SEARCH BUFFER SORTSC: .WORD 0 ; SORT SECTOR-USED TO FIND LOWEST ; ; START SECTOR OF A FILE IN A ; ; FILE TYPE AREA. SORTID: .WORD 0 ; SORT ID-USED TO SAVE ID t SBLD CMA = 165304 ; SBLD DAR = 165306 ; SBLD ; DISK FUNCTION EQUATES SBLD WFCN = 2 ; WRITE FUNCTION SBLD RFCN = 4 ; READ FUNCTION SBLD GO = 1 ; GO FUNCTION SBLD ; MIS3) ; NWORD .IFNZ INEBC BGE LPIC10 MOV #EBCLP,R2 NEG LPMAX(R3) ;SET LPMAX = ABS(NWORD) ; LPIC10: .ENDC CLR LPRTRY(R3) ;CLEAR # ATTEMPTS COUNTER JSR PC,LPCNVT ;SET UP BUFFER, CONVERT TO L/P ASCII JSR PC,LPRSET ;RESET THE L/P JSR PC,LPSIO ;START THE L/P I/O JMP (R5) ;THEN RETURN TO RESTOR, WHO'LL C ; NO - CHECK FOR ODD ADDRESS. PCHR BIT #177400,FIELD3 ; YES - CHECK FOR ONLY 1 BYTE OF DATA. PCHR BNE 10$ ; DATA IN UPPER BYTE - ILLEGAL PCHR BR 20$ ; DATA OK. ALL ADDRESS OK. GO ON. PCHR 17$: BIT #1,FIELD2 ; NO - MUST BE EVEN ADDRESS. PCHR BNE 10$ ; ODD WORD ADDRESS - BAD. PCHR 20$: SPL 7 ; GO TO LOCKOUT TO HANDLE TASK TABRELATED ; ; TO SORTSC ENTRY SORTLN: .WORD 0 ; SORT LENGTH-USED TO SAVE LENGTH ; ; RELATED TO SORTSC ENTRY SORTAD: .WORD 0 ; SORT ADDRESS-USED TO SAVE ADDRESS ; ; IN BUFFER RELATED TO SORTSC ; ; ENTRY ; ; CPDFST: .WORD 0 ; COMPRESS WAIT QUEUE FOR CPDLST: .WORD CPDFST ; DISCIO REQUE VBMO HRPCE AM SHE TDOR TEET BWEO SUT OUN R'SIT; 34TBIN T BL HRPC H.GTEN LNGRISTL TATOE THT UNCO; R5 C DE $:30 HRPC D END ELFID IN FTOR TEUNCOT SE; 2 ,RR3 V MO HRPC . MAOM C AUSPLR HA C 6OR FAX MMPBU; R3 C IN HRPC R.TEACARCH; 0$,1R2 B SO HRPC T AS LSTPA1 G INNTOI PR1E AVLED AN; )+R1,(60#0 VBMO $:10 HRPC S)ROZEI CIASH IT(WLEAR THE INT. ; ; ; NO REQUESTS ARE LEFT IN THE LINE PRINTER'S QUEUE. ; LPID00: JSR PC,LPRSET ;RESET THE LINE PRINTER CLR LPBUSY(R3) ;CLEAR THE BUSY INDICATOR .IFG NLP-1 MOV LPMDAD(R3),-(SP) ;GO STOP THE TIMER .ENDC .IFZ NLP-1 MOV #LPMOD,-(SP) .ENDC JSR PC,IODQTM TST (SP)+ JMP (R5) ;EXIT TO RESTOR .PAGE ;*********LE PCHR MOVB @TTSTAD,SAVTST ; SAVE OLD VALUE TO RESTORE PCHR BEQ 30$ ; QUIESENT - OK PCHR CMP SAVTST,#DISABL ; NOT QUIESENT - IS IT DISABLED? PCHR BEQ 40$ ; YES - ALL IN GOOD SHAPE PCHR SPL 0 ; TASK IS BUSY - ERROR -DON'T NEED LOCK PCHR MOV #MESS8,R0 ; PRINT ERROR MESSAGE PCHR JSR PC,TTYOUT STS ; ; CPFFST: .WORD 0 ; COMPRESS WAIT QUEUE FOR CPFLST: .WORD CPFFST ; FLMGMT REQUESTS ; PHYUNT: .WORD 0 ; USED TO SAVE PHYSICAL UNIT THAT ; ; CONTAINS TYPE TO BE COMPRESSED ; .IFNZ DRESDI DODID: .WORD 0 ; USED TO SAVE DOD ID OF DEVICE ON ; ; WHICH COMPRESSION IS ACTIVE SORTRS: .WORD 0 ; SORT RELATIVE SECTOR - USED TO SAVE ; S ERCTRAHA C 6ROZE; 2 ,RR3 V MO HRPC T LOA D SE U -IX S AVESA; 3 ,R#6 V MO HRPC A RE AGERATO SMPTEF OD.ADT GE; 1 ,RP1EM#T V MO: 00TBIN HRPC 1. #LDIE FOR FUPT SE; R0 R CL HRPC . ORRR ET?OUN RU; 20TBIN Q BE HRPC ITT UNCO; R5 C DE HRPC ORRR E -NO; 20TBIN E ************************************************************* ;* ** ;* THIS SECTION GETS ENTERED FROM THE INTERRUPT ROUTINE IF ** ;* A DEVICE ERROR HAS BEEN DETECTED. ONLY TWO ERROR ** ;* CONDITIONS ARE CONSIDERED: FATAL AND WARNING. PARITY ** ;* ERRORS ARE CONSIDERED FATAL; PAPER LOW, L/P NOT READY, ** ;* ETC., ARE CONSIDERED WARNINGS. FATAL ERRORS ARE ** ;* .TITLE RELTSK .DEF RELTSK .DEF NOCKPT RELTSK: MOV (SP)+,(SP) ; GET RID OF PASED ARGUMENT NOCKPT: RTS PC .END  ; RELATIVE SECTOR OF ENTRY ; ; RELATED TO SORTSC ENTRY UPDFLG: .WORD 0 ; UPDATE FLAG - USED TO DIRECT CONTROL ; ; OF DISC DIRECTORY UPDATE UPDERR: .WORD 0 ; UPDATE ERROR - USED TO FLAG DISC ; ; ERROR DURING DIRECTORY UPDATE .ENDC ; CNVERT = . .WORD 0,0,0 ; SIX BYTE FIELD FOR BINARY TO ; PCHR JMP STAA00 ; AND TRY AGAIN. PCHR 30$: MOVB #DISABL,@TTSTAD ; DISABLE THE TASK. PCHR 40$: SPL 0 ; BACK TO LEVEL 0. PCHR ; PCHR PATB00: JSR PC,READ0 ; READ IN SECTOR 0 PCHR MOV SECZ,R3 ; GET NEXT PATCHES SLOT IF NO DUPLICATES RESTARTED: AFTER A PREDETERMINED NUMBER OF ATTEMPTS, ** ;* AN ERROR MESSAGE IS GENERATED AND THE REQUEST IS ABORTED. ** ;* WARNING CONDITIONS CAUSE LPRNTR TO WAIT A PRESCRIBED ** ;* PERIOD OF TIME, AFTER WHICH THE REQUEST IS ALSO ABORTED. ** ;* HOWEVER, IF IT BECOMES READY DURING THIS PERIOD, THEN I/O ** ;* WILL CONTINUE. ** ;* .TITLE CITDER ; DUMMY FOR CITGO DISK ERROR HANDLER .DEF CITDER CITDER: RTS PC ; GO BACK - DIDN'T DO A THING .END ! ; ; ASCII CONVERSION .PAGE ; COMPRS = . MOV FLTYPE,R0 ; FILE TYPE TO COMPRESS FROM TASK ARG. CMP R0,#$FTMAX ; FILE TYPE VALID? BHIS CMPA70 ; NO, ERROR-CAN'T COMPRESS MOVB FSTAT(R0),R5 ; GET FILE TYPE STATUS BIT #40,R5 ; COMPRESSION ALLOWED? BNE CMPA72 ; NO, ERROR-CAN'T COMPRESS BIC #177740,R5 ; ISOLATE LOGICAL DEVI"PCHR JSR PC,DECODE ; GET SECTOR INTO R4 & WORD INTO R5 PCHR MOV R4,NEXSEC ; SAVE ADDRESS OF 1/26/73 MOV R5,NEXWRD ; NEXT PATCH SLOT. PCHR CLR SNSEC ; MAKE SURE WE START OVER ON THE DATA SEPCHR MOV SECZ(R2),R3 ; GET TASK POINTER PCHR BNE 10$ ; TASK ALREADY HAS PATCH(S) PCHR MOV SECZ,SECZ(R2) # ** ;********************************************************************** ; ; LPIE00: BGT LPIE20 ;BRANCH IF ERROR IS NOT FATAL INC LPRTRY(R3) ;INCREMENT ERROR COUTNER CMP #LPERR,LPRTRY(R3) ;WE CAN ONLY HACK LPERR ERRORS BLE LPIE10 ;BRANCH IF WE MUST GIVE UP LPIE05: JSR PC,LPCLR ;CLEAR THE ERROR JSR PC,LPRSET ;AND RESET THE L/P JSR PC,LPSIO ;START$; UPDATE 1/30/73 SETGET.C02 ; UPDATE 11/6/72 SETGET.C01 ADD JULIAN DATE ; ******************************************************************** ; * * ; * PROGRAM IDENTIFICATION: "SETGET" * ; * SET TIME SET DATE GET TIME GET DATE * ; * * ; * ROUTINES TO SET %CE ASL R5 ; COMPUTE ITS WORD INDEX CLR R1 BISB PHYDEV(R5),R1 ; PHYSICAL DISC UNIT ON WHICH TYPE RESIDES ASL R1 ; COMPUTE WORD INDEX CMPA10: MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT TST NODREQ(R1) ; DEVICE HAVE ANY REQUESTS PENDING? BMI CMPB00 ; NO CMPA20: CLR PSR ; YES-RESET LOCKOUT ; ; NOTE: SINCE THIS IS A TASK, PSR MAY BE RESET WITH PRI. 0 ; &; HERE IF TASK'S FIRST PATCH. SET POINTPCHR ADD #PATSIZ,SECZ ; TO SLOT AND BUMP WORD 0 TO NEXT PAT RCPCHR BCS PATE00 ; CHAIN WORD OVERFLOW PCHR BR PATC20 ; GO GET SECTOR TO PATCH. PCHR 10$: JSR PC,DECODE ; GET LOCATION OF NEXT PATCH PCHR CMP R4,SNSEC ; ONLY READ THE DATA SECTOR IF IT IS PCHR BEQ 15$ ; NOT ALREADY IN CORE. PC' THE I/O AGAIN JMP (R5) ;EXIT TO RESTOR ; LPIE10: MOV #LPARTY,-(SP) JSR PC,LPMSGE ;PRINT 'L/P K PARITY ERROR' MOV #6,ERROR(R1) ;TELL CALLER WHAT HAPPENED JMP LPIA10 ;GO TRY NEXT QUEUED REQUEST ; ; ; LINE PRINTER ERROR IS NOT PERMANENT. PRINT AN OPERATOR NOTIFICATION ; MESSAGE, THEN SET UP ONE SECOND DELAY. ; ; LPIE20: MOV #LPRDY,-(SP) JSR PC,LPMSGE ;PRI(AND GET CURRENT TIME AND DATE * ; * * ; * USAGE: * ; * USED BY GENERAL ROUTINES TO FETCH CURRENT TIME * ; * AND/OR DATE. USED BY OPERATOR INPUT PROGRAM TO SET * ; * TIME AND/OR DATE FROM TTY KEYBOARD. * ; * * ; * CALLING SEQUENCE) MOV #CMPTMR,-(SP) ; THREAD 100 MSEC TIMER MOV #100.,-(SP) ; TIME DELAY EMT QTIME ; SUSPEND FOR 100 MSEC. TST (SP)+ ; IGNORE ERROR BR CMPA10 ; TRY AGAIN ; ; CMPA70: JMP CMPER1 CMPA72: JMP CMPER2 ; ; NO DISC REQUESTS PENDING-START COMPRESSION ; R0 = FILE TYPE ; R1 = PHYSICAL DEVICE WORD INDEX ; R5 = LOGICAL DEVICE WORD INDEX ; CMPB00 = *HR JSR PC,READN ; READ IN THE SPECIFIED SECTOR PCHR 15$: CMP SECN+LOC(R5),FIELD2 ; NEW PATCH FOR SAME LOCATION? PCHR BNE 20$ ; NO PCHR MOV FLGWRD,SECN+FLAG(R5) ; SET NEW FLAG WORD PCHR MOV FIELD3,SECN+VALUE(R5) ; & VALUE PCHR BR PATD00 ; GO WRITE IT OUT. PCHR 20$: MOV SECN+CHAIN(R5),R3 +NT 'L/P K NOT READY' JSR PC,LPRSET ;SET UP MAXIMUM TIME WE'LL WAIT CLR LPRTRY(R3) .IFZ NLP-1 MOV #LPMOD,R4 ;GET TIMER MODULE ADDRESS .ENDC .IFG NLP-1 MOV LPMDAD(R3),R4 ;GET TIMER MODULE ADDRESS .ENDC MOV R4,-(SP) MOV #LPTIME,JSRSUB(R4) MOV #$1SEC,-(SP) ;STORE ONE SECOND DELAY JSR PC,IOQTME ;AND GO START THE TIMER ,S: * ; * MOV NEWHR,-(SP) ;PUSH NEW HOUR * ; * MOV NEWMIN,-(SP) ;PUSH NEW MINUTE * ; * JSR PC,STIME ;CALL "SET TIME" * ; * TST (SP)+ ;POP ERROR WORD * ; * BNE ERROR ;CALL PARAMETERS IN ERROR * ; * ---------------- * ; * - . TSTB FSTAT(R0) ; FILE MANAGEMENT IN PROGRESS? BMI CMPA20 ; YES-WAIT MOV R0,CPRSIP ; NO-SET COMPRESSION IN PROGRESS ; ; FOR THIS TYPE MOV #FMGMTQ,FMQEP ; SET UP RE-QUEUE ENTRY POINTS IN MOV #DISCQ,DSCQEP ; HEADER FOR FLMGMT AND DISCIO EMT NOCKPT ; SET TASK CHECKPOINTABLE FOR ; ; REST OF IT'S EXECUTION . ; GET NEXT CHAIN POINTER, IF ANYPCHR BNE 10$ ; MORE TO COME PCHR ; PCHR PATC00: MOV SECZ,SECN+CHAIN(R5) ; UPDATE LAST PATCH RECORDS PCHR ADD #PATSIZ,SECZ ; LINK WORD & SEC 0 WORD 0. PCHR BCS PATE00 ; CHAIN WORD OVERFLOW PCHR MOV NEXWRD,R5 ; SET REL. WORD OF PATCH RECORD. PCHR / TST (SP)+ ; JMP (R5) ;EXIT TO RESTOR .PAGE ;********************************************************************** ;* ** ;* L P T I M E ** ;* ** ;* THIS ROUTINE IS ENTERED BY TIMER EVERY SECOND. LPTIME ** ;* CHECKS FOR AN 0MOV NEWMTH,-(SP) ;PUSH NEW MONTH * ; * MOV NEWDAY,-(SP) ;PUSH NEW DAY * ; * MOV NEWYR,-(SP) ;PUSH NEW YEAR * ; * JSR PC,SDATE ;CALL "SET DATE" * ; * TST (SP)+ ;POP ERROR WORD * ; * BNE ERROR ;CALL PARAMETERS IN ERROR * ; * ---------------- * ; * 1CLR PSR ; RESET LOCKOUT ASR R5 MOVB R5,DEVNO ; SAVE LOGICAL DEVICE NO. ASR R1 MOV R1,PHYUNT ; SAVE PHYSICAL DISC NO. .IFNZ DRESDI INC R1 ; DOD ID FOR PHYSICAL DEVICE MOV R1,DODID ; SAVE .ENDC MOV #COMPID,R1 ; ADDRESS OF COMPRESSION DIR. ENTRY MOVB DEVNO,PDVCE(R1) ; SET DEVICE NO. IN COMPID MOVB R0,FTYPE(R1) ; SET 2 CMP R4,NEXSEC ; IS NEW PATCH IN OLD PATCHES SECTOR? PCHR BEQ PATC40 ; YES. PCHR JSR PC,WRTN ; WRITE OLD LAST PATCHES SECTOR OUT. PCHR PATC20: MOV NEXSEC,R4 ; GET SECTOR # OF PATCH (WORD SET) PCHR JSR PC,READN ; GET SECTOR TO PATCH. PCHR PATC40: CLR SECN+CHAIN(R5) ; CLEAR CHAIN WORD IN NEW LAST PATCH. PCHR MOV FIELD2,SECN+LOC(R5) ; SE3L/P READY CONDITION SO THAT OUTPUT CAN ** ;* CONTINUE. AFTER LPMXTM SECONDS, LPTIME GIVES UP ON THE ** ;* OPERATOR AND ABORTS THE REQUEST. ** ;* ** ;* ON ENTRY, R1 CONTAINS THE TIMER MODULE ADDRESS. LPTIME IS ** ;* ENTERED BY A JSR PC,LPTIME ** ;* ** ;*************4 JSR PC,GDATE ;CALL "GET DATE" * ; * MOV (SP)+,CURYR ;POP CURRENT YEAR (-1900) * ; * MOV (SP)+,CURDAY ;POP CURRENT DATE * ; * MOV (SP)+,CURMTH ;POP CURRENT MONTH * ; * ---------------- * ; * JSR PC,GTIME ;CALL "GET TIME" * ; * MOV (SP)+,CURHR ;POP CURRENT HOUR * 5APPROPRIATE FILE TYPE IN ENTRY ASL R0 ; FILE TYPE WORD INDEX MOV FINIT(R0),CSS(R1); SET INITIAL SECTOR THIS TYPE AS ASR R0 ; ; COMPRESSION START SECTOR CMPB10 = . MOV #-1.,SORTSC ; INITIALIZE SORT SECTOR CLR HITFLG ; RESET HIT FLAG .IFNZ DRESDI CLR RLSECT ; START AT RELATIVE SECTOR 0 CMPB15: MOVB #2.,EXTYP ; EXIT TYPE 2 DISC I/O6T LOCATION OF NEW PATCH. PCHR MOV FLGWRD,SECN+FLAG(R5) ; SET BYTE & REL FLAGS PCHR MOV FIELD3,SECN+VALUE(R5) ; SET VALUE OF PATCH. PCHR ; PCHR PATD00: JSR PC,WRTN ; WRITE PATCHED SECTOR OUT. PCHR JSR PC,WRT0 ; WRITE UPDATED SECTOR 0 OUT. PCHR MOVB SAVTST,@TTSTAD ; RESTORE THE TASK'S STATUS PCHR 7********************************************************* ; ; LPTIME: MOV INDEX(R1),R3 ;GET L/P INDEX FROM MODULE ARGUMENT MOV R1,-(SP) ;REORGANIZE REGISTERS THE WAY WE LIKE'EM MOV LPDATA(R3),R1 ; R1 = ADDR(DATA) MOV LPRIOR(R3),R2 ; R2 = PRIORITY INDEX MOV LPFRST(R2),R0 ; R0 = ADDR(LIST) ; R3 = L/P INDEX ; R4 = TIMER MUDULE ADDRESS 8; * MOV (SP)+,CURMIN ;POP CURRENT MINUTE * ; * MOV (SP)+,CURSEC ;POP CURRENT SECOND * ; * * ; * PROGRAMMER: 52 * ; * DATE: 12-DEC-71 * ; * VERSION:001.004 * ; * 9 MOVB #RDLEV,DLVL ; DISC I/O PRIORITY MOV DODID,CPRBUF ; SEARCH DISC RESIDENT DIRECTORY CLRB IOFCN ; READ FUNCTION CMPB20: MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,PFRITE ; START DISC I/O CMP #9.,DERRWD ; SEARCHED COMPLETE DIRECTORY? BEQ CMPB80 ; YES-SEE IF WE GOT A HIT TST DERRWD ; DISC ERROR OCCUR? BNE CMPB70 ; YES-DO SOMETHING :JMP STAA00 ; GET NEXT REQUEST. PCHR ; PCHR PATE00: MOV #MESS7,R0 ; CHAIN WORD OVERFLOW PCHR JSR PC,TTYOUT ; PCHR JMP STAA00 ; PCHR .PAGE ; PCHR ; LIST ALL A TASK'S PATCHES ; JSR PC,LPSTAT ;GET L/P STATUS BNE LPTA00 ;BRANCH IF STILL NOT READY TST (SP)+ MOV (SP)+,R5 ;OTHERWISE, SET UP TIMER RETURN MOV LPWORD(R3),R4 ;GET LENGTH OF CURRENT LINE BR LPIE05 ;TO LOOK LIKE RESTOR RETURN ; LPTA00: JSR PC,LPRSET ;AND RESET THE L/P INC LPRTRY(R3) ;INCREMENT #ATTEMPTS COUNTER CMP LPRTRY(R3),#LPMXTM BGE LPTA10 < * ; * G U L F E L E C T R O N I C S Y S T E M S * ; ******************************************************************** .TITLE SETGET .DEF STIME,SDATE,GTIME,GDATE .REF MONTH,MDAY,YEAR,JDATE,SECOND,MINUTE,HOUR .REF TICTOC,DAYTAB,PUSHR,POPR,MXDAYS,JANARY,FEBARY .REF THDTAB,CURTHD .PAGE STIME: ;SUBROUTINE TO SET NEW TIME MOV R0,-(SP) ;SAVE USER'S = MOV #BUFFER,R2 ; START ADDRESS OF SEARCH BUFFER MOV #120.,SBUFLN ; SEARCH 60 WORDS/120 BYTES .ENDC .IFZ DRESDI MOVB #2,EXTYP ; SET EXIT TYPE 2 FOR DISCIO ******** MOVB #RDLEV,DLVL ; DISK IO PRIORITY LEVEL ******** MOV #FILE,R2 ; START ADDRESS OF SEARCH BUFFER MOV #NCRLOC-$ROSFW-$ROSFW,SBUFLN ; SEARCH BUFFER LENGTH ; ; DO> PCHR ; PCHR LIST: ; PCHR TST FLD1F ; ANY PARAMETERS? 2/12/73 BGT 2$ ; YES 2/12/73 MOV #1,FIELD1 ; NO - LIST EVERYTHING - FROM TASK #1 2/12/73 MOV #MAXTSK,FIELD2 ; TO 63. 2/12/73 ? ;BRANCH IF IT'S TIME TO QUIT MOV #$1SEC,-(SP) ;RESTART TIMER FOR ONE SECOND JSR PC,IOQTME TST (SP)+ ;POP OFF ERROR FLAG BNE LPTA10 ;WHAT'S THAT, AN ERROR? THEN BRANCH RTS PC ;RETURN TO TIMER ; ; LPTA10: MOV #7,ERROR(R0) ;SET USER'S ERROR FLAG TST (SP)+ MOV (SP)+,R5 JSR PC,LPQERR ;GO QUEUE THE ERROR TASK, IF THERE IS ONE @MOV 4(SP),R0 ;PULL NEW MINUTE OFF STACK MOV PS,4(SP) ;REPLACE WITH CURRENT STATUS FOR RTI USE CMP R0,#60. ;SEE IF MINUTE WITHIN RANGE BHIS STIM10 ;NO: EXIT IN ERROR CMP 6(SP),#24. ;SEE IF NEW HOUR WITHIN RANGE BLO STIM20 ;YES: PROCEED STIM10: ;ROUTINE EXIT POINT: FOR GOOD AND BAD MOV (SP)+,R0 ;RESTORE USER'S RTI ;RETAN'T LOOK AT SYSTEM ENTRYS .ENDC ADD R2,SBUFLN ; END ADDRESS TO SEARCH IN BUFFER CMPB30: MOVB FTYPE(R2),R3 ; GET FILE TYPE OF ENTRY BIC #177600,R3 ; ISOLATE CMP R0,R3 ; SAME AS FILE TYPE TO COMPRESS? BEQ CMPC00 ; YES CMPB40: ADD #10.,R2 ; BUMP TO NEXT ENTRY IN SEARCH BUFFER CMP R2,SBUFLN ; COMPLETE BUFFER SEARCHED BLT CMPB30 ; NO-KEEP LOOKING B BR 8$ ; 2/12/73 2$: JSR PC,TASKNO ; AT LEAST 1 PARAMETER - LET'S TEST IT. 2/12/73 TST FLD2F ; IT'S OK - A SECOND PARAMETER? 2/12/73 BLE 6$ ; NO 2/12/73 MOV R2,R0 ; YES - SAVE TASK # IN R0. 2/15/73 MOV FIELD2,FIELD1 ; AND CHECK OUT END VALUE. 2/12/73 JSR C JMP LPIA10 ;GO TRY NEXT REQUEST. .PAGE ;********************************************************************** ;* ** ;* L P C N V T ** ;* ** ;* THIS SUBROUTINE FORSM ONE PRINTABLE LINE OF TEXT, ** ;* CONVERTING EACH CHARACTER TO THE L/P EVEN PARITY ASCII DURN AND RESTORE OLD CPU STATUS STIM20: ;HERE WHEN PARAMTERS ARE WITHIN RANGE MOV #340,PS ;LOCK OUT INTERFERENCE FROM CLOCK MOVB R0,MINUTE ;UPDATE CURRENT MINUTE MOVB 6(SP),HOUR ;UPDATE CURRENT HOUR MOV #1,TICTOC ;RESET [TICS] AND [SECOND] COUNTERS CLR 6(SP) ;CLEAR ERROR CODE BR STIM10 ;GO EXIT .PAGE SDATE: ;SUBROUTINE TO UPDATE CURREE .IFNZ DRESDI INC RLSECT ; READ NEXT SECTOR OF DIRECTORY BR CMPB20 ; ; CMPB70: JMP CMPER3 .ENDC CMPB80: JMP CMPD00 ; SEE IF WE GOT A HIT ; ; FOUND AN ACTIVE ENTRY OF APPROPRIATE FILE TYPE. ; DETERMINE IT'S POSITION IN FILE TYPE AREA. ; R0 = FILE TYPE ; R1 = ADDRESS OF COMPID ; R2 = ENTRY'S ADDRESS ; CMPC00 = . TST (R2) ; ENTRY ACTIVE? FPC,TASKNO ; 2/12/73 MOV R0,FIELD1 ; END IS LEGAL. RESTORE START VALUE. 2/12/73 CMP R2,R0 ; IS START <= END? 2/12/73 BGE 8$ ; YES - OK. 2/12/73 MOV #MES11,R0 ; NO - ERROR SO TELL HIM. 2/12/73 JSR PC,TTYOUT ; 2/12/73 JMP STAA00 ; G ** ;* FORMAT. LINKAGE IS: ** ;* ** ;* SET R0 = LIST ADDRESS ** ;* R1 = DATA ADDRESS ** ;* R2 = CONVERSION TABLE ADDRESS ** ;* R3 = L/P INDEX ** ;* JSR PC,LPCNVT HNT MONTH,DAY, AND YEAR JSR R5,PUSHR ;SAVE ALL REGISTERS MOV SP,R0 ;UTILIZE AS SECONDARY STACK POINTER ADD #16,R0 ;POINT TO NEW "YEAR" ON STACK MOV (R0)+,R1 ;REMOVE YEAR MOV (R0)+,R2 ;AND NEW DAY MOV (R0),R3 ;GET MONTH FROM STACK MOV PS,-(R0) ;LOAD CURRENT PSW ON STACK FOR RTI USE MOV -4(R0),-(R0) ;AND MOVE RTN ADDR INTO PROPER PLACE,TOO I BNE CMPC05 ; YES .IFNZ DRESDI BR CMPC30 .ENDC .IFZ DRESDI CLR LGTH(R2) ; NO-SET LENGTH EQUAL TO ZERO SO ; ; DEFINE WON'T USE THE SPACE BR CMPB40 ; KEEP LOOKING .ENDC CMPC05: MOV SCTR(R2),R3 ; GET FILE'S START SECTOR CMP R3,CSS(R1) ; DOES FILE NEED COMPRESSION? BLO CMPB40 ; NO-KEEP LOOKING JAND START OVER. 2/12/73 6$: MOV R2,FIELD2 ; PUT ENDING VALUE INTO FIELD2. 2/12/73 8$: JSR PC,READ0 ; AND GET THE DIRECTORY. 2/12/73 10$: MOV FIELD1,R2 ; GET STARTING TASK #. 2/12/73 CMP R2,FIELD2 ; DONE YET? 2/12/73 BGT 60$ ; YES 2/12/73 MOV R2,R1 ; PUT # INTO R1 K ** ;* BNE ;BRANCH IF NO MORE TEXT ** ;* ** ;********************************************************************** ; ; LPCNVT: ; ; MOV PC,-(SP) ;SET NO DATA FOUND FLAG MOV R0,-(SP) ;SAVE SOME REGISTERS MOV R1,-(SP) ; MOV R5,-(SP) CLR -(SP) ;TAB POSITION COUNTER MOV LPL TST R1 ; CHECK YEAR VALUE 1/30/73 BLE SDAT30 ; ERROR 1/30/73 TST R2 ; CHECK DAY VALUE 1/30/73 BLE SDAT30 ; ERROR 1/30/73 TST R3 ; CHECK MONTH VALUE 1/30/73 BLE SDAT30 ; ERROR 1/30/73 CMP R3,#12MBEQ CMPC10 ; NO-BUT ADJUST CSS CMP R3,SORTSC ; MAYBE-HAVE WE FOUND ONE LOWER? BHI CMPB40 ; YES-KEEP LOOKING INC HITFLG ; FOUND SOMETHING-SET HIT FLAG MOV R3,SORTSC ; SAVE FILE'S START SECTOR MOV (R2),SORTID ; SAVE FILE'S ID MOV LGTH(R2),SORTLN ; SAVE FILE'S LENGTH MOV R2,SORTAD ; SAVE ADDRESS OF ENTRY .IFNZ DRESDI MOV RLSECT,SORTRS ; SAN 2/12/73 MOV #TEMP1,R0 ; AND CONVERT IT; RESULT IN TEMP1-3. 2/12/73 JSR PC,BINOCT ; 2/12/73 MOV TEMP3,TSKNUM ; PUT 2 DIGITS INTO PRINT BUFFER. 2/12/73 MOV #TSKMES,R0 ; AND PRINT TASK# 2/12/73 ASL R2 ; MAKE INTO A WORD INDEX PCHR MOV SECZ(R2),R3 ; GET PATCH CHAIN POINTER PCOBUFR(R3),R0 ; R0 = ADDR L/P BUFFER MOV LPCNT(R3),R5 ; R1 = TEXT DATA BUFFER ADDRESS ADD R5,R1 ; ADD #4,R1 ; R5 = CURRENT INDEX INTO DATA CMP R5,LPMAX(R3) BGE LPCA70 CLR LPMODE(R3) ;SET L/P MODE TO CARRIAGE CONTROL ; ; ; LPCA00: CLR R4 BISB (R1)+,R4 ;GET NEXT CHARACTER FROM TEXT ======>R4 CMP R4,#CR ;IGNORE ALL CARRIAP. ;SEE IF MONTH IS WITHIN RANGE BHI SDAT30 ;ERROR: EXIT MOVB #28.,FEBARY ;RESET FEBRUARY IN PREP FOR NEW YEAR MOV #365.,MXDAYS ;RESET MAX DAYS COUNT BIT #3,R1 ;IS NEW YEAR A LEAP? BNE SDAT40 ;NO: NO EXTRA DAY INCB FEBARY ;YES: ADD FEB 29 INC MXDAYS ;EXTRA DAY IN LEAP YEAR SDAT40: CMPB R2,DAYTAB(R3) ;CHECK DATE FOR PROPER RANGE THIS MONTH QVE RELATIVE SECTOR OF ENTRY .ENDC BR CMPB40 ; SEARCH COMPLETE DIRECTORY ; CMPC10 = . ADD LGTH(R2),CSS(R1); BUMP COMPRESS START SECTOR .IFNZ $TMSLC!CHKPTC BITB #100,FSTAT(R0) ; CKSAVE AREA REQUIRED? BEQ CMPC20 ; NO ADD LGTH(R2),CSS(R1); YES-BUMP CSS BY LENGTH AGAIN .ENDC CMPC20: JMP CMPB10 ; START DIRECTORY SEARCH OVER .IFNZ DRESDI ; ; FOUND A RHR BNE 15$ ; NOT AN EMPTY CHAIN 2/13/73 CMP FIELD1,FIELD2 ; ONLY PRINT 'NO PATCHES' MESSAGE IF 2/13/73 BLT 55$ ; ON LAST TASK TO BE LISTED. 2/13/73 JSR PC,TTYOUT ; FIRST NEED TASK #. 2/13/73 MOV #MESS9,R0 ; EMPTY - TELL USER PCHR JSR PC,TTYOUT ; PCHR BR 55$ SGE RETURNS BEQ LPCA15 CMP R4,#MAXCC ;IS IT A CONTROL CHARACTER? BLE LPCA05 ;BRANCH IF NO CMP R0,LPBUFR(R3) ;IF WE'RE AT THE BEGINNING OF THE BUFFER BNE LPCA10 ;AND THE CHARACTER IS NOT CONTROL, THEN INC LPMODE(R3) ;ASSUME AUTO LINE FEED MODE BR LPCA10 ; LPCA05: CMP #HT,R4 ;SEE IF CHARACTER IS A TAB BEQ LPCA60 ;BRANCH IF 'TIS TBLO SDAT50 ;O.K.: WITHIN RANGE MOVB DAYTAB(R3),R2 ;ERROR: USE LAST DAY RATHER THAN ERR OUT SDAT50: MOV R3,-(SP) ;SAVE MONTH ON STACK FOR USE BELOW MOV #JANARY,R0 ;PREPARE TO CALC JULIAN DAY CLR R4 ;WILL ACCUM TOTAL DAYS SDAT10: DEC R3 ;COUNT DOWN MONTHS BLE SDAT20 ;DONE: EXIT LOOP MOVB (R0)+,R5 ;CAN'T ADD BYTES ADD R5,R4 ;ACCUM DAYS FROM DAYUFILE DIRECTORY ENTRY THAT WAS DELETED. MAKE SURE ; ITS LENGTH IS ZERO SO DEFINE CAN'T USE THE SPACE. ; CMPC30 = . MOV R2,UPDFLG ; SAVE FOR I/O COMPLETE MOVB #3.,EXTYP ; EXIT TYPE MOV #CMPC40,IOCOMP ; FIRST I/O COMPLETE ADDRESS MOVB #UDLEV,DLVL ; HIGHEST PRI. DISC LEVEL MOVB #4.,IOFCN ; UPDATE DISC I/O MOV #DLIST,-(SP) ; START UPDATE JSR PC,PFRITE TST DERRWDV ; GO ON WITH THE LOOP. 2/12/73 15$: JSR PC,TTYOUT ; PRINT TASK # - NONEMPTY CHAIN. 2/13/73 20$: JSR PC,DECODE ; GET LOCATION OF PATCH PCHR JSR PC,READN ; GET THE SECTOR PCHR MOV #LSTBUF,R0 ; GET ADDRESS FOR CHARACTER STRING PCHR MOV SECN+LOC(R5),R1 ; GET BINARY NUMBER PCHR JSR PC,BINOCT ; CONVERT IT W CMP R0,LPBUFR(R3) ;OTHERWISE, IF WE'RE AT THE BEGINNING BNE LPCA20 ;OF THE L/P BUFFER, WE'LL CONTINUE JSR PC,LPSTOR ;FIRST WORD IS CONTROL, TOP BYTE (LEFT) MOVB #' ,R4 ;IS IGNORED BY PER DATA CONTROLLER SUB #2,(SP) ;CONTROL CHARS DON'T COUNT FOR TAB POSIT ; LPCA10: JSR PC,LPSTOR ;CONVERT CHARACTER TO L/P ASCII AND BNE LPCA40 ;BRANCH IF L/P BUFFER IF FULL ; LPCA15: X TABLE BR SDAT10 ;LOOP BACK FOR MORE .PAGE SDAT20: ADD R2,R4 ;ADD TODAY'S DATE MOV #JDATE,R3 ;WILL USE AS POINTER TO DATE BYTES MOV #340,PS ;LOCK OUT INTERFERENCE FROM CLOCK MOV R4,(R3)+ ;LOAD JULIAN DATE MOV (SP)+,(R3) ;LOAD NEW MONTH MOV #THDTAB,CURTHD ;INIT CURRENT THREAD POINTER BITB #1,(R3)+ ;IS MONTH ODD OR EVEN? BNE SDAT25Y ; ERROR IN REQUEST PROCESSING BNE CMPC70 ; YES-REPORT DIR. UPDATE ERROR EMT SUSPND ; SUSPEND THIS TASK ; ; UNSUSPENDED HERE ; TST UPDERR ; DISC ERROR OCCUR DURING DIR. UPDATE? BNE CMPC70 ; YES- REPORT DIR. UPDATE ERROR JMP CMPB15 ; RE-START SEARCH OF PREVIOUS SECTOR ; ; FIRST I/O COMPLETE FOR DELETED ENTRY CLEAN-UP ; CMPC40 = . TST DERRWD Z PCHR MOVB #',,(R0)+ ; PUT IN A COMMA PCHR MOV SECN+VALUE(R5),R1 ; GET # PCHR JSR PC,BINOCT ; CONVERT IT. PCHR MOVB #040,(R0)+ ; CLEAR A BYTE BEFORE THE FLAG CHAR. PCHR BIT #RELFLG,SECN+FLAG(R5) ; RELOCATABLE? PCHR BEQ 30$ ; NO PCHR MOVB #'R,[ INC R5 ;STORE IN L/P BUFFER ; LPCA16: CMP R5,LPMAX(R3) ;IF WE HAVEN'T EXCEEDED MAXIMUM SIZE, BLT LPCA00 ;WE'LL GO BACK FOR MORE ; LPCA20: BIT #1,R0 ;CHECK TO SEE IF THE RIGHTMOST BYTE BEQ LPCA30 ;NEEDS A BLANK MOVB #LPBLNK,(R0)+ ;YES - STORE IT ; LPCA30: ; LPCA40: MOV R5,LPCNT(R3) ;STORE CALLER'S BUFFER POINTER SUB LPBUFR(R3),R0 ;DET\ ;ODD: LEAVE AT THREAD #1 ADD #2,CURTHD ;EVEN: ADVANCE TO THREAD #2 SDAT25: MOVB R2,(R3)+ ;LOAD DAY OF MONTH MOVB R1,(R3) ;LOAD CURRENT YEAR CLR 22(SP) ;CLEAR ERROR WORD FOR GOOD RETURN SDAT30: JSR R5,POPR ;RESTORE ALL REGISTERS TST (SP)+ ;POP THIRD ARGUMENT SINCE RTI NEEDS TWO RTI ;STACK SET TO RETURN AND RESTORE .PAGE ; NOTE: SUBROUT] ; DISC ERROR? BNE CMPC60 ; YES MOV UPDFLG,R2 ; ADDRESS OF ENTRY IN DISC BUFFER CLR LGTH(R2) ; SET IT'S LENGTH TO ZERO MOV #CMPC50,IOCOMP ; NEXT I/O COMPLETE RTS PC ; RETURN TO PFRITE ; ; SECOND I/O COMPLETE FOR DELETED FILE CLEAN-UP ; CMPC50 = . TST DERRWD ; DISC ERROR? BNE CMPC60 ; YES JMP UPD020 ; SET NO(R0)+ ; YES SET 'R' FLAG PCHR BR 50$ ; PCHR 30$: BIT #BYTFLG,SECN+FLAG(R5) ; BYTE? PCHR BEQ 40$ ; NO PCHR MOVB #'B,(R0)+ ; YES - SET FLAG PCHR BR 50$ ; PCHR 40$: MOVB #040,(R0)+ ; CLEAR BYTE _ERMINE NO. WORDS IN L/P BUFFER MOV R0,R4 ASR R4 ;AND LEAVE IT IN R4 ; LPCA50: TST (SP)+ ;POP OFF TAB COUNTER MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R1 MOV (SP)+,R0 TST (SP)+ ;POP OFF FLAG, WHICH SETS THE CONDITION RTS PC ;CODE: ZERO = DATA STORED ; NON-ZERO = NO DATA STORED ; ; LPCA60: `INES "GTIME" AND "GDATE" SHARE THE SAME CODE. ; THE CARRY BIT IS USED AS A SWITCH TO DETERMINE WHETHER TO LOAD TIME ; OR DATE. BY USING THE PSW TO STORE THIS SWTICH, AND BY RUNNING THE ; ROUTINE UNDER LOCKOUT AFTER THE CARRY BIT IS SET/CLEARED, RE-ENTRANCY ; IS MAINTAINED, AND THE POSSIBILITY OF CLOCK ALIASING IS ELIMINATED. GDATE: ;SUBROUTINE TO GET DATE CLC ;MARK TO GET DATE (BELOW) BR GETSB1 ;SHARE ROUTINE GTIME: ;Sa ERROR-UNSUSPEND COMPRS ; CMPC60 = . JMP UPD030 ; SET ERROR-UNSUSPEND COMPRS ; CMPC70: JMP CMPER5 .ENDC ; ; ; DETERMINE IF A FILE WAS FOUND THAT NEEDS TO BE "SQUEEZED" ; TOWARDS FRONT OF FILE TYPE AREA. ; R0=FILE TYPE ; R1=COMPID ADDRESS ; CMPD00 = . TST HITFLG ; FIND SOMETHING TO SQUEEZE BEQ CMPE00 ; NO-DONE WITH COMPRESSION MOV SORTLN,Lb .TITLE PFTRAP FOR CITGO .DEF PFSIPL ; TPS = 177564 ; PUNCH STATUS REGISTER TPB = 177566 ; PUNCH BUFFER REGISTER ; PFCNT: .WORD 0 ; NUMBER OF POWER FAILS SO FAR. ; PFSIPL: MOV #PFAIL,@#24 ; SET UP POWER FAIL MOV #340,@#26 ; TRANSFER VECTOR RTS PC ; PFAIL: INC PFCNT ; COUNT THE NUMBER OF POWER FAIL/RECOVERY MOV #PRECOV,@#24 ; CYCLES. SET UP FOc ;CHARACTER IS A TAB, FILL IN BLANKS CMP R0,LPBUFR(R3) ;IS THIS THE FIRST CHARACTER OF THE LINE BNE LPCA65 ;BRANCH IF NO INC LPMODE(R3) ;OTHERWISE, FORCE TO AUTO-INCREMENT MODE ; LPCA65: MOV #40,R4 ;KEEP STORING BLANKS JSR PC,LPSTOR ;UNTIL WE GET TO A TAB POSITION BNE LPCA40 ;OR UNTIL THE L/P BUFFER IS FULL BIT #7,(SP) BNE LPCA65 ;KEEdUBROUTINE TO GET TIME SEC ;MARK TO GET TIME (BELOW) GETSB1: ;COMMON ENTRY TO "GET" ROUTINE MOV PS,-(SP) ;SAVE CURRENT PSW MOV #340,PS ;LOCK OUT INTERFERENCE FROM CLOCK SUB #12,SP ;NEED FIVE STACK CELLS MOV R0,(SP)+ ;SAVE USER'S SO WE CAN USE IT MOV R1,(SP)+ ;ALSO TST (SP)+ ;PREPARE FOR MOVING PS AND PC MOV SPeGTH(R1) ; SET LENGTH OF FILE TO MOVE CLR RLSECT ; START AT RELATIVE SECTOR 0 CMPD10: CLRB IOFCN ; SET TO READ MOV SORTID,CPRBUF ; READ 1 SECTOR OLD FILE MOV #DLIST,-(SP) ; DISC LIST TO STACK JSR PC,PFRITE ; READ 1 SECTOR OF FILE TST DERRWD ; DISC ERROR OCCUR? BNE CMPD70 ; YES-TAKE CARE OF IT MOVB #3.,IOFCN ; PERFORM WRITE/WRITE CHECK OF SECTOR MOfR POWER UP. HALT ; STOP THE MACHINE. BR PFAIL ; FOR GOOD. ; PRECOV: MOV #PFAIL,@#24 ; SET UP FOR ANOTHER POWER DOWN. MOV #MESS1,R0 ; GET ADDRESS OF FIRST MESSAGE BUFFER PREA10: MOVB (R0)+,@#TPB ; PUT A CHARACTER OUT ON SYSTEM TTY. BEQ PREB00 ; ESCAPE ON A ZERO BYTE. PREA20: TSTB @#TPS ; WAIT UNTIL IT IS DONE. BPL PREA20 BR PREA10 ; DO NEXT CHgP GOING 'TIL WE HIT A MULTIPLE BR LPCA15 ;OF 8 (PLUS ONE) = 1, 9, 17 ; ; LPCA70: TST R5 ;WE GET HERE IF: BNE LPCA50 ; 1. THERE IS NO MORE TO PRINT MOV #SKIP1,R4 ; 2. USER HAS NWORD = 0 BR LPCA10 ;IF (2) IS TRUE, THEN STORE A SINGLE ;LINE SKIP AND PRINT IT .PAGE ;***********************************************************h,R0 ;USE AS SECOND STACK POINTER CMP (R0)+,(R0)+ ;ZIP UP TO POINT TO WHERE PS WAS STORED MOV #MONTH,R1 ;INIT POINTER TO CLOCK AREA FOR DATE MOV (R0)+,(SP) ;MOVE PS TO NEW PLACE IN PREP FOR RTI BIT #1,(SP) ;WHILE HERE CHECK CARRY SET @ ENTRY BEQ GETSB2 ;WAS DATE: LEAVE AS IS MOV #SECOND,R1 ;WAS TIME: RE-INIT FOR TIME GETSB2: ;R1 NOW POINTING TO PROPER PARAMTER LIST iV (R1),CPRBUF ; SET ID FOR NEW FILE-NDISCS+1 - COMPID MOV #DLIST,-(SP) ; DISC LIST TO STACK JSR PC,PFRITE ; WRITE 1 SECTOR OF FILE TST DERRWD ; DISC ERROR OCCUR? BNE CMPD70 ; YES-REPORT INC RLSECT ; BUMP RELATIVE SECTOR OF FILE CMP RLSECT,SORTLN ; MOVED COMPLETE FILE? BLO CMPD10 ; NO-KEEP TRANSFERING .IFNZ DRESDI MOVB #3.,EXTYP ; jARACTER. PREB00: TSTB @#TPS ; WAIT FOR THE NULL TO BE DONE. BPL PREB00 MOV #MESS2,R0 ; GET ADDRESS OF SECOND MEESAGE. PREB10: MOVB (R0)+,@#TPB ; PUT OUT A CHARACTER. BEQ PREC00 ; ESCAPE ON A ZERO CHARACTER. PREB20: TSTB @#TPS ; WAIT UNTIL IT'S DONE. BPL PREB20 BR PREB10 ; GO DO ANOTHER. PREC00: HALT ; STOP. BR PREB00 ; SO HE WANT'S MORk*********** ;* ** ;* L P S T O R ** ;* ** ;* CONVERT THE CHARACTER IN REGISTER R4 TO EVEN PARITY, ** ;* LINE PRINTER ASCII, THEN STORE IT IN THE LINE PRINTER ** ;* BUFFER. THE L/P READS CHARACTERS FROM INCREASING ** ;* MEMORY LOCATIONS, AND FROM LEFT (TOP BYTE) Tl MOV (R0),-(SP) ;ALSO TRANSFER PC CLR (R0) ;ALL UPPER BYTES WILL BE CLEARED... ;...BEFORE DATA LOADED ONTO STACK MOVB (R1)+,(R0) ;LOAD MONTH [OR] SECOND CLR -(R0) ;NEXT STACK CELL MOVB (R1)+,(R0) ;LOAD DAY [OR] MINUTE CLR -(R0) MOVB (R1)+,(R0) ;LOAD YEAR [OR] HOUR CMP -(SP),-(SP) ;MOVE TO POINT AT SAVED REGISTERS MOV mUSE EXIT TYPE 3 MOV #UPDATE,IOCOMP ; I/O COMPLETE SUBROUTINE MOVB #UDLEV,DLVL ; UPDATE DIRECTORY-DISC PRIORITY 1 MOV DODID,CPRBUF ; DISC RESIDENT DIRECTORY ID MOVB #4.,IOFCN ; UPDATE FUNCTION MOV SORTRS,RLSECT ; RELATIVE SECTOR TO UPDATE CLR UPDFLG ; RESET UPDATE FLAG MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,PFRITE ; START UPDATE TST DERRWD E, DOES HE. ; MESS1: .ASCII <15><12><12> .ASCIZ /THIS IS COLOSSUS. ROS IS DEAD. YOU MUST/ MESS2: .ASCIZ <15><12><12>/R E B O O T !/ .END oO RIGHT ** ;* (BOTTOM BYTE). THUS, LPSTOR CANNOT PERFORM A SIMPLE ** ;* INDEXED STORE. ON ENTRY, THE REGISTERS ARE EXPECTED ** ;* TO CONTAIN: ** ;* ** ;* R0 = ADDRESS OF L/P BUFFER ** ;* R2 = ADDRESS OF CONVERSION TABLE ** ;* p (SP)+,R0 ;RESTORE USER'S MOV (SP)+,R1 ;ALSO RTI ;ZAP! RETURN TO CALLER WITH HIS STATUS ; ...AND THREE PARAMETERS ON STACK. .PAGE ; ******** ; CITGO'S JULIAN DATE EMT IS HERE - RETURNS 1 WORD ON STACK ; ******** .REF JDATE ; q ; REQUEST PROCESS ERROR OCCUR? BNE CMPD72 ; YES-DO SOMETHING APPROPRIATE EMT SUSPND ; SUSPEND TASK ; ; UNSUSPENDED HERE AFTER UPDATE ; TST UPDERR ; DISC ERROR DURING DIR.UPDATE? BNE CMPD72 ; YES CMP #2.,UPDFLG ; CORE RESIDENT DIRECTORY EXIST? BNE CMPD30 ; NO ; ; NOTE:R1 CONTAINS ADDRESS OF COMPID AND 5.(R1) ; CONTAINS LOGICAL DEVr; UPDATE 1106/72 ERRTYP.C01 ; UPDATE 12/20/71 ERRTYP.S07 ; UPDATE 12/7/71 ERRTYP.S06 ; UPDATE 12/2/71 ERRTYP.S05 ; UPDATE 11/8/71 ERRTYP.S04 ; UPDATE 11/1/71 ERRTYP.S03 ; UPDATE 10/8/71 ERRTYP.S02 ; UPDATE 9/15/71 ERRTYP.S01 .TITLE ERRTYP ;*********************************************************************** ;* s ** ;* R4 IS DESTROYED, R0 IS UPDATED, AND ALL OTHER REGISTERS ** ;* ARE SAVED. ** ;* ** ;********************************************************************** ; ; LPSTOR: INC 2(SP) ;INCREMENT TAB COUNTER CLR 10.(SP) ;SET 'DATA STORED' FLAG CLR -(SP) ;SET 'L/P BUFFER NOT ******** .DEF JULDAT ; ******** JULDAT = . ; ******** MOV (SP),-(SP) ; MAKE ROOM FOR RETURNED ARG. ******** MOV JDATE,2(SP) ; PUT JULIAN DATE ON STACK FOR CALLER ******** RTS PC ; DONE - BACK TO CALLER ******** .END uICE NUMBER. THUS WE CAN ; USE FLMGMT SUBROUTINE 'CDSRCH' TO FIND CORE ; DIRECTORY ENTRY ADDRESS AND SYSTEM+1(R1) TEST ; WILL WORK ; MOV SORTID,R0 ; FILE ID TO SEARCH FOR JSR PC,CDSRCH ; SEARCH CORE DIRECTORY BEQ CMPD30 ; NOT THERE-IGNORE MOV R3,SORTAD ; SET FOR DIRECTORY CHANGE MOV FLTYPE,R0 ; GET FILE TYPE OF COMPRESSION .ENDC MOV SOv * ;* PROGRAM IDENTIFICATION. ERRTYP, CATALOG NO. ; * ;* TYPE ROS ERROR MESSAGES * ;* * ;* PURPOSE. THIS SUBROUTINE WILL TYPE A SYSTEM ERROR MESSAGE * ;* ON THE SYSTEM OUTPUT DEVICE WITH SPECIFIED ARGUMENTS * ;* GIVEN BY THE CALLER. THIS SUBROUTINE PROVIDES THE CON- * ;* SISTENT ERROR MESSAGE FORMAT: w FULL' FLAG ADD R2,R4 ;ADD TABLE BASE ADDRESS TO ASCII CODE MOVB (R4),(R0)+ ;CONVERT BYT' STORE IN LPBUF ; LPST00: CMP R0,LPBUFR+2(R3) ;IS BUFFER FILLED UP TO HERE? BLT LPST10 INC (SP) ; LPST10: TST (SP)+ ;POP 'BUFFER FILLED' FLAG TO SET RTS PC ;CONDITION CODE, THEN EXIT. .PAGE ;********************************************************************** ;* xS. EQUATES SBLD ERRCNT = 10 ; NUMBER OF TIMES TO TRY OPERATIONS SBLD .PAGE ; SBLD SBLD = . ; PUT THE BOOT ONTO THE DISK. SBLD RESET ; CLEAR EVERYTHING FIRST SBLD ; HERE WE COMPUTE THE SIZE OF ROS. SBLD MOV #ROSEND,R1 ; GET THE ENDINGyRTAD,R2 ; ENTRY'S ADDRESS TO CHANGE JSR PC,CHGDIR ; CHANGE DIRECTORY MOV #CDILST,-(SP) ; UPDATE CORE DIRECTORY IMAGE ON DISC JSR PC,PFRITE ; EXIT TYPE 1-IGNORE ERROR CMPD30: MOV R1,R2 ; BOTH EQUAL TO COMPID ADDRESS JMP CMPC10 ; UPDATE COMPRESS START SECTOR ; ; AND CONTINUE "SQUEEZE" ; CMPD70: JMP CMPER4 CMPD72: JMP CMPER5 ; ; FINISHED WITH COMPRESSION z * ;* * ;* "ERROR (NUMBER) * ;* ARG1 * ;* ARG2 * ;* ARG3 * ;* ARG4" * ;* { ** ;* L P C H E K ** ;* ** ;* THIS SUBROUTINE PERFORMS CHECKS ON THE I/O LIST AND DATA ** ;* BUFFER THAT COULD BOMB LPRNTR. THESE TESTS ARE PERFORMED ** ;* WHEN THE REQUEST IS QUEUED AND WHEN ITS I/O IS STARTED. ** ;* THE REGISTERS MUST CONTAIN: ** | ADDRESS. SBLD SUB #SBLD,R1 ; SUB. THE STARTIND ADD. TO GET BYTE SIZSBLD ASR R1 ; SHIFT INTO WORD COUNT. SBLD BIC #100000,R1 ; CLEARUP SIGN EXTENSION. SBLD ADD #3,R1 ; AND ROUND UP TO NEAREST 4 WORD SBLD BIC #3,R1 ; BOUNDARY. (THIS IS NEEDED BY DISK SBLD ; HARDWARE.) SBLD NEG }OF A FILE TYPE-RELEASE ; DISCIO THEN FLMGMT. ; R0=FILE TYPE ; R1=COMPID ADDRESS ; CMPE00 = . ASL R0 ; FILE TYPE WORD INDEX MOV CSS(R1),FNEXT(R0);SET NEW NEXT SECTOR AVAILABLE MOV #AULIST,-(SP) ; THIS TYPE AND UPDATE FILE JSR PC,PFRITE ; TYPE ALLOCATION DIRECTORY .IF Z DRESDI ; ONLY NEED TO DO THIS IF ALL CORE RES. 3/7/73 MOV #CDILST,-(SP~ * ;* A ROS ERROR LOG SHOULD BE MAINTAINED FOR CLASSIFICATION * ;* LOOK-UP AND MEANING OF ARGUMENTS. IT IS ALSO RECOMMENDED * ;* THAT USER ERROR NUMBERS START AT 500 SUCH THAT ERRORS * ;* 1-499 MAY BE RESERVED FOR ROS. * ;* * ;* PROGRAM USAGE. THE LINKAGE TO ERRTYP IS AS FOLLOWS: * ;*  ;* ** ;* R0 = ADDRESS OF I/O LIST ** ;* R1 = ADDRESS OF DATA BUFFER ** ;* ** ;* ON RETURN, R4 CONTAINS: ** ;* ** ;* 0 = VALID REQUEST  R1 ; NOW CHANGE INTO 2'S COMPLEMENT. SBLD MOV R1,ROSIZE ; AND STORE IN THE BOOT PROGRAM. SBLD ASL R1 ; CHANGE -WORD CNT INTO -BYTE COUNT. SBLD ADD #ROSEND,R1 ; COMPUTE THE STARTING ADDRESS. SBLD MOV R1,ROSTAR ; AND STORE IT IN THE BOOT. SBLD SYSA10: MOV #400,@#DCS ; CLEAR THE DISK FIRST. SBLD MOV #DAR,R0 ; GET ADDRESS OF DAR T) ; MAKE SURE ALL DELETED ENTRIES IN THE 3/7/73 JSR PC,PFRITE ; CORE DIRECTORY ARE UPDATED. 3/7/73 .ENDC ; 3/7/73 CLR CSS(R1) ; RESET START SECTOR TO ZERO FOR DAVE. ******** MOV #400,FTYPE(R1) ; ALSO THE DEVICE TO #1, NONPROTECTED. ******** MOV #-1.,CPRSIP ; RESET COMPRESSION IN PROGRESS MOVB #$CPTNO,R5 ; COMPRS TASK NO. INCB  * ;* MOV MADDR,-(SP) * ;* EMT ERRTYP * ;* * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* CALL ERRTYP(MADDR) * ;* WHERE MADDR IS THE A ** ;* 2 = ILLEGAL LIST OR DATA ADDRESS ** ;* 4 = ILLEGAL RETURN TYPE ** ;* 5 = ILLEGAL I/O COMPLETE ADDRESS ** ;* ** ;********************************************************************** ; ; LPCHEK: CMP R0,#ROSTOP ;TEST LIST ADDRESS BLOS LPKE02 ;CAN'T BE IN ROS CMO USE. SBLD MOV #BOOTOP,-(R0) ; SET ADD. OF FIRST WORD TO TRANSFER. SBLD MOV #-64.,-(R0) ; ALWAYS TRANSFER A FULL SECTOR (OR MORESBLD MOV #WFCN!GO,-(R0) ; START THE WRITE SBLD SYSA20: TSTB (R0) ; WAIT UNTIL DONE. SBLD BPL SYSA20 ; SBLD TST (R0) ; ANY ERRORS? SBLD BMI ERIOSTAT(R5) ; SET IOSTAT SO CANNOT ABORT MOV PHYUNT,R5 ; GET PHYSICAL DISC UNIT MOV R5,R0 ASL R0 ; COMPUTE DCUWX-DISC CONTROLLER ; ; WORD INDEX MOV #-1.,HITFLG ; USED TO COUNT NO. OF REQUESTS CMPE10: MOV DQLAST(R0),R3 ; ADDRESS OF DEVICE'S LAST LIST MOV CPDFST,R1 ; GET A REQUEST THAT IS WAITING BEQ CMPE40 ; NONE LEFT-EMPTY MOV DDRESS OF THE ERROR MODULE: * ;* * ;* WORD 0 = THREAD WORD * ;* WORD 1 = ERROR NUMBER * ;* WORD 2 = ARGUMENT 1 * ;* WORD 3 = ARGUMENT 2 * ;* WORD 4 = ARGUMENT 3 * ;* WORDP R1,#ROSTOP ;TEST DATA ADDRESS BLOS LPKE02 ;CAN'T BE IN ROS EITHER CMP R0,#HICORE ;NOR CAN EITHER BE IN NON-EXISTENT BHIS LPKE02 ;MEMORY CMP R1,#HICORE BHIS LPKE02 BIT #1,R0 ;AND, FINALLY, THE ADDRESSES MUST BNE LPKE02 ;BE EVEN (WORD BOUNDARIES) BIT #1,R1 BNE LPKE02 MOV (R1),R4 ;AND, FINALLY (DID I ALREADY SAY THAT?),ROR ; YES. SBLD MOV #DAR+2,R0 ; NO. GET READY TO WRITE ROS OUT SBLD MOV #1,-(R0) ; START SECTOR IS #1. SBLD MOV R1,-(R0) ; SET THE START ADDRESS. SBLD MOV ROSIZE,-(R0) ; SET WORD COUNT SBLD MOV #WFCN!GO,-(R0) ; START THE WRITE OF ROS. SBLD SYSA30: TSTB (R0) ; WAIT UNTIL DONE.  DATA(R1),R4 ; ADDRESS OF DATA BUFFER CLR DUSE3(R4) ; INITIALIZE SO DIRECTORY SEARCH ; ; IS DONE AGAIN MOVB LEVEL(R1),R2 ; DISC LEVEL OF REQUEST MOV (R1),CPDFST ; PULL REQUEST FROM COMPRS QUEUE BNE CMPE20 ; NOT LAST ONE MOV #CPDFST,CPDLST ; LAST ONE-RESET ; NOTE: NOT NECESSARY TO DO ABOVE UNDER LOCKOUT SINCE ; NO QUEUEING IN CPDFST IS BEING DONE. CMPE20 5 = ARGUMENT 4 * ;* * ;* THE ARGUMENTS WILL BE TYPED AS SIGNED ASCII INTEGERS * ;* OF THE FORM +/-XXXXX. IF ANY ERRORS OCCUR, IT * ;* WILL BE IGNORED. * ;* * ;* PROGRAMMER 54 * ;* DATE BLT LPKA00 ;GET NWORD AND MAKE SURE IT'S REASONABLE NEG R4 ;WITHIN AVAILABLE CORE. ; LPKA00: INC R4 ;CONVERT # CHARACTERS ASR R4 ;TO # WORDS ADD #HICORE,R4 CMP R1,R4 ;CHECK DATA BUFFER TO BE GREATER THAN BHI LPKE02 ;NWORD/2 WORDS FROM TOP OF CORE CMP R0,#HICORE-7-7 ;AND THAT LIST IS MORE THAN SEVEN BHI LPKE02  SBLD BPL SYSA30 ; SBLD TST (R0) ; DONE. ANY ERRORS? SBLD BMI ERROR ; YES. SBLD HALT ; ALLOW THE OPERATOR OPTION OF BOOTING SBLD ; OR NOT. SBLD MOV #DAR+2,R0 ; NO. NO SIMULATE A ROM BOOT TO TEST ITSBLD CLR -(R0) : CLR (R1) ; SET THREAD WORD TO 0 MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT CMPB R2,HPRIRQ(R5) ; WILL THIS BE HIGHEST PRIORITY REQUEST? BHIS CMPE30 ; NO MOVB R2,HPRIRQ(R5) ; YES-SET APPROPRIATELY CMPE30: ASL R2 ; LEVEL WORD INDEX ADD R2,R3 ; GET TO PROPER 'LAST' ADDRESS+1 MOV R1,@-(R3) ; THREAD LIST BACK INTO MOV R1,(R3) ; DISC PRIORITY QUEU * ;* REVISION * ;* * ;*********************************************************************** .DEF ERRTYP,LERTYP .REF PUSHR,POPR,BINASC,TTYOUT ; .CSECT ; ; THE FOLLOWING IS THE FIRST AND LAST DIRECTORY FOR THE ; ERROR TYPE THREAD ; QFIRST: .WORD 0 QLAST: .WORD QF ;WORDS FROM TOP OF CORE ; ; NOW WE'LL CHECK FOR I/O COMPLETE ADDRESS ; CMPB #3,TYPE(R0) ;IS IT EXIT 3? BNE LPKB20 ;BRANCH IF NO MOV $EXIT(R0),R4 ;OTHERWISE, TEST THE ADDRESS CMP R4,#ROSTOP BLOS LPKE05 CMP R4,#HICORE-10. BHIS LPKE05 BIT #1,R4 BNE LPKE05 ; LPKB10: CLR R4 ;SET 'NO ERRORS' RTS PC ;AND EXIT TO ; START AT SECTOR ZERO. SBLD CLR -(R0) ; AND AT LOCATION ZERO. SBLD MOV #-64.,-(R0) ; SET TRANSFER SIZE TO 1 SECTOR. SBLD MOV #RFCN!GO,-(R0) ; READ IN THE BOOT PROGRAM. SBLD SYSA40: TSTB (R0) ; WAIT HERE UNTIL DONE. SBLD BPL SYSA40 ; SBLD TST (R0) ; DONE. ANY ERRORS? E INC NODREQ(R0) ; BUMP NO DISC REQUESTS INC HITFLG ; BUMP REQUEST COUNT CLR PSR ; RESET LOCKOUT BR CMPE10 ; RETHREAD THEM ALL CMPE40: MOV HITFLG,R3 ; GET NO. REQUESTS THAT WAITED BMI CMPF00 ; NONE-CHECK FLMGMT REQUESTS MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT CMP R3,NODREQ(R0) ; ALL REQUESTS MADE BY COMPRS BNE CMPF00 ; NO-WILL REIRST ; IOLUSE: .WORD -1. ; I/O LIST IN USE SWITCH-NO OF REQUESTS ; ; THE FOLLOWING TABLE IS THE I/O LIST FOR THE ; ERROR MESSAGE TYPE-OUT. ; IOLIST = . .WORD 1 ; THREAD WORD .BYTE SYSTTY ; LOGICAL DEVICE-SYSTEM TTY .BYTE 3 ; EXIT TYPE 3 .WORD TTYNXT ; I/O COMPLETE SUBROUTINE .BYTE 0 ; DON'T QUEUE ERROR TASK .BYTE 1 ; USE PRIORIT CALLER ; LPKB20: BLT LPKE04 ;TEST FOR VALID EXIT TYPE CMPB #1,TYPE(R0) BLE LPKB10 ; LPKE04: MOV #4,R4 ;ILLEGAL RETURN TYPE RTS PC ; LPKE02: MOV #2,R4 ;ILLEGAL LIST OR DATA ADDRESS RTS PC ; LPKE05: MOV #5,R4 ;ILLEGAL I/O COMPLETE ADDRESS RTS PC .PAGE ;**********************************************************************  SBLD BMI ERROR ; YES. SBLD JMP @#0 ; NO. TRANSFER TO ZERO (BOOTOP). SBLD ; SBLD ERROR: INC R5 ; COUNT AN ERROR. SBLD CMP R5,#ERRCNT ; MAX # OF ERRORS? S237D BLT SYSA10 ; NO - TRY AGAIN. SBLD HALT COVER BY ITSELF MOVB #-1.,CALLED(R5) ; SET CALLED BY TIME-OUT CLR PSR ; RESET LOCKOUT JSR PC,DIOA65 ; GIVE DISCIO A "PUSH" ; ; DETERMINE IF FLMGMT REQUESTS ARE WAITING ; CMPF00 = . CLR PSR ; MAKE SURE LOCKOUT NOT SET MOV CPFFST,R1 ; GET A REQUEST THAT IS WAITING BEQ CMPF30 ; NONE LEFT-EMPTY MOV (R1),CPFFST ; PULL REQUEST FROM COMPRS QUEUE Y TYPE-OUT QUEUE .WORD 0,0 ; TWO SYSTEM USE WORDS .WORD TYPBUF ; ADDRESS OF OUTPUT BUFFER ; ; THE FOLLOWING IS THE MESSAGE STRING USED BY TTYOUT ; TYPBUF = . .WORD 41. ; NO. OF CHARACTERS TO OUTPUT .WORD 0 ; USED BY TTYOUT .BYTE 15 ; START OFF WITH CR/LF .ASCII /ERROR/ EDIT1: .ASCII / XXXXX/ .BYTE 15 EDIT2: .ASCII /SXXXXX/ ; ARG 1 . ;* ** ;* L P R S E T ** ;* ** ;* THIS SUBROUTINE ISSUES A RESET COMMAND TO THE LINE PRINTER, ** ;* WHICH I SUPPOSE SHOULD CLEAR IT; IN THE EVENT IT NEEDS TO ** ;* BE CLEARED, THAT IS. R3 = L/P INDEX NUMBER. ** ;*  ; YES STOP. SBLD BR SBLD ; BOSS SAYS TO TRY AGAIN. SBLD ; SBLD ; THIS IS THE END OF THE SYSTEM BUILDING ROUTINE. SBLD .PAGE ; SBLD ; THIS IS THE ROUTINE TO BE USED TO DO A ROM BOOT OF ROS. SBLD ; IT RESIDS ON DISK FROM SECTOR 0 AND IS LOADED AT LOCATION 0.  BNE CMPF20 ; NOT LAST ONE MOV #CPFFST,CPFLST ; LAST ONE RESET CMPF20: CLR (R1) ; SET THREAD WORD TO 0 ; NOTE: NOT NECESSARY TO DO ABOVE UNDER LOCKOUT SINCE ; NO QUEUEING IN CPFFST IS BEING DONE. MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV R1,@FMLAST ; PUT REQUEST INTO MOV R1,FMLAST ; FLMGMT THREAD INC NOFMRQ ; BUMP APPROPRIATELY BRASCII / / ; ******** EDIT3: .ASCII /SXXXXX/ ; ARG 2 .ASCII / / ; ******** EDIT4: .ASCII /SXXXXX/ ; ARG 3 .ASCII / / ; ******** EDIT5: .ASCII /SXXXXX/ ; ARG 4 .BYTE 15 .EVEN ; ; THE FOLLOWING EDIT TABLE IS USED TO POINT TO 6 BYTE ASCII ; STRINGS IN THE MESSAGE INTO WHICH BIN ** ;********************************************************************** ; ; LPRSET: .IFZ NLP-1 MOV #CLEAR,@#CMD.1 .ENDC .IFG NLP-1 MOV #CLEAR,@LPCMD(R3) ;CLEAR IT .ENDC RTS PC ;THAT'S ALL, FOLKS! .PAGE ;********************************************************************** ;* ** ;*  SBLD BOOTOP = . ; START OF ROM BOOT. SBLD RESET ; CLEAR EVERYTHING. FIRST. SBLD BOOT10: MOV #400,@#DCS ; FORCE A DISK CLAER FIRST. SBLD MOV #DAR+2,R0 ; GET ADDRESS OF DAR+2 TO SET UP DISK. SBLD MOV #1,-(R0) ; SET START SECTOR TO #1. SBLD MOV (PC)+,-(R0) ; SET THE START ADDRESS. SBLD ROSTAR: .WORD 0 ;  CMPF00 ; RE-THREAD THEM ALL CMPF30: MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT TST FMACTV ; FILE MANAGEMENT CURRENTLY ACTIVE? BNE CMPG00 ; YES-WILL TAKE CARE OF ITSELF TST NOFMRQ ; DID WE PUT ANYTHING IN FLMGMT QUEUE BEQ CMPG00 ; NO MOV #CMPG00,-(SP) ; SET RETURN ON STACK CLR -(SP) ; SET PSR TO RESET LOCKOUT JMP FLMB00 ; GIVE FLMGMT A "PASC WILL PUT THE ; CONVERTED RESULTS. ; EDITBL = . .WORD EDIT1 ; POINTER FOR ERROR NUMBER .WORD EDIT2 ; FPOINTER FOR FIRST ARGUMENT .WORD EDIT3 ; POINTER FOR SECOND ARGUMENT .WORD EDIT4 ; POINTER FOR THIRD ARGUMENT .WORD EDIT5 ; POINTER FOR FOURTH ARGUMENT .WORD 0 ; END OF TABLE ; ; EXITSW: .WORD 0 ; EXIT SWITCH. 0=SUBROUTINE EXIT ;  L P S T A T ** ;* ** ;* THIS SUBROUTINE READS THE STATUS OF THE INDICATED LINE ** ;* PRINTER, THEN SETS THE CONDITION CODES ACCORDINGLY: ** ;* ** ;* ZERO = EVERYTHING'S ALRIGHT ** ;* < ZERO = FATAL ERROR ** ;* CONTAINS THE START ADDRESS. SBLD ; STORED HERE DYNAMICALLY BY SYSBLD. SBLD MOV (PC)+,-(R0) ; AND SET NEG, WORD COUNT. SBLD ROSIZE: .WORD 0 ; CONTAINS NEG. WORD COUNT FOR BOOT. SBLD ; IT IS COMPUTED DYNAMICALLY IN SBLD. SBLD MOV #RFCN!GO,-(R0) ; START THE TRANSFER. SBLD BOOT20: TSTB (R0) ; WAIT HERE UNTIL IT IS DONE. SBLDUSH" ; ; FINISHED-SET UP TO EXIT FROM COMPRS ; CMPG00 = . CLR PSR ; RESET LOCKOUT IF SET MOV #$CPTNO,R0 ; TASK NO. DECB IOSTAT(R0) ; RESET I/O STATUS MOV #CCEDIT,R0 ; PUT FILE TYPE IN JSR PC,MSGEDT ; COMPRESSION COMPLETE MOV #CCMSG,TTYBUF ; MESSAGE CMPG10: MOV #TTYLST,-(SP) ; AND EMT TTYOUT ;  ; 1=I/O COMPLETE SUB EXIT ; ; EQUATES FOR ERRTYP ; SPACE = 40 ; ASCII SPACE ; ; THE FOLLOWING EQUATES ARE FOR THE ERROR MODULE ; THREAD = 0. ; THREAD WORD ERRNUM = 2. ; ERROR NUMBER ARGM1 = 4. ; ARGUMENT 1 ARGM2 = 6. ; ARGUMENT 2 ARGM3 = 8. ; ARGUMENT 3 ARGM4 = 10. ; ARGUMENT 4 ; ; PLOCK = 340  > ZERO = OPERATOR ACTION REQUIRED ** ;* ** ;* ON ENTRY, R3 MUST CONTAIN L/P INDEX. R4 IS DESTROYED ** ;* ** ;********************************************************************** ; ; LPSTAT: .IFZ NLP-1 MOV @#STAT.1,R4 .ENDC .IFG NLP-1 MOV @LPSTS(R3),R4 ;GET S BPL BOOT20 ; SBLD TST (R0) ; DONE - ANY ERRORS? SBLD BMI BOOTER ; YES. SBLD JMP @#IPL ; NO. GO TO IPL AND STRAT ROS. SBLD ; SBLD BOOTER: INC R5 ; COUNT THE ERROR SBLD CMP R5,#ERRCNT ; REACHE TYPE EMT EXIT ; EXIT FROM COMPRS ; ; COMPRESS ERROR 1- FILE TYPE TO COMPRESS NOT VALID ; CMPER1 = . MOV #NVEDIT,R0 ; PUT FILE TYPE JSR PC,MSGEDT ; IN MESSAGE MOV #NVMSG,TTYBUF BR CMPG10 ; TYPE AND EXIT ; ; COMPRESS ERROR2- FILE TYPE NOT ALLOWED COMPRESSION ; CMPER2 = . MOV #NAEDIT,R0 ; PUT FILE TYPE JSR PC,MSGEDT ;  ; PRIORITY LOCK-OUT MASK FOR PSR PSR = 177776 ; ADDRESS OF PROCESSOR STATUS REGISTER ; TEMP: .WORD 0 ; TEMPORARY SAVE AREA FOR LERTYP ; ; LERTYP IS CALLED TO TYPE AN ERROR MESSAGE UNDER LOCKOUT. ; MOV PSR,-(SP) ; MOV MADDR,-(SP) ; JSR PC,LERTYP ; ; LOCKOUT WILL BE RELEASED UPON THREADING THE ERROR MODULE ; LERTYP = . TATUS .ENDC CLR -(SP) ;SET 'OK' CONDITION BIT #PARITY,R4 ;TEST FOR PARITY ERROR BNE LPSA20 ;BRANCH IF PRESENT BIT #PLOW,R4 ; BNE LPSA10 ;BRANCH IF PAPER LOW BIT #ONLINE,R4 BEQ LPSA10 ;BRANCH IF ONLINE ; LPSA00: TST (SP)+ ;SET CONDITION CODE = OK RTS PC ;THEN EXIT ; LPSA10: INC (SP)+ D MAX ERRORS YET? SBLD BLT BOOT10 ; NO. TRY AGAIN. SBLD HALT ; YES. SBLD BR BOOTOP ; OPERATOR SAID TO TRY AGAIN. SBLD . = BOOTOP+128. ; RESERVE A SECTOR SIZED AREA. SINCE ITSBLD ; IN THE IPL AREA, ITS NOT WASTED. SBLD ; SBLD ; IN MESSAGE MOV #NAMSG,TTYBUF BR CMPG10 ; TYPE AND EXIT ; ; COMPRESS ERROR 3- DIR. SEARCH DISC ERROR ; CMPER3 = . MOV #DSMSG,TTYBUF BR CMPG10 ; TYPE AND EXIT ; ; COMPRESS ERROR 4- FILE TRANSFER ERROR ; CMPER4 = . MOV #XEEDIT,R0 ; PUT FILE TYPE JSR PC,MSGEDT ; IN MESSAGE MOV #XEMSG,TTYBUF BR CMPG10 ; TYPE AND EXI MOV 2.(SP),TEMP ; SAVE MODULE ADDRESS UNDER LOCKOUT MOV (SP)+,(SP) ; FOR PROPER RETURN JSR R5,PUSHR ; SAVE ALL REGISTERS MOV 14.(SP),-(SP) ; PUT PSR ON STACK SO COMPATIBLE MOV TEMP,R5 ; ADDRESS OF MODULE BR ERRA05 ; DO IT ; ERRTYP = . JSR R5,PUSHR ; SAVE ALL REGISTERS MOV 14.(SP),R5 ; GET MODULE ADDRESS MOV PSR,-(SP) ; SAVE PR ;OPERATOR ACTION REQUIRED RTS PC ;EXIT ; LPSA20: DEC (SP)+ ;SET PARITY ERROR INDICATOR RTS PC ;AND EXIT .PAGE ;********************************************************************** ;* ** ;* L P S I O ** ;* ** ;* SBLD .CSECT ; PUT ROSEND AT END OF ROS. SBLD .WORD 125252 ; FLAG SBLD .WORD 125252 ; SBLD ROSEND = . ; THE END OF ROS. SBLD .END ; SBLD T ; ; COMPRESS ERROR 5 - DIRECTORY UPDATE ERROR ; CMPER5 = . MOV #DUMSG,TTYBUF BR CMPG10 ; TYPE AND EXIT ; ; ; ; MSGEDT WILL EDIT THE FILE TYPE INTO THE MESSAGES ; COMPRS TYPES ; R0 = START ADDRESS OF THREE BYTE FIELD ; FLTYPE = FILE TYPE ; ; MSGEDT = . MOV FLTYPE,-(SP) ; INTEGER TO CONVERT TO STACK MOV #CNVERT,-(SP) ; SIX BYTE FIELD ADDRESS EMOCESSOR PRIORITY ON STACK MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT ERRA05: DEC (R5) ; IS MODULE THREADABLE BNE ERRA30 ; NO - BUMP BACK AND RETURN TO CALLER MOV R5,@QLAST ; THREAD REQUEST MOV R5,QLAST ; VIA QLAST INC IOLUSE ; BUMP NO. OF REQUESTS BEQ ERRB00 ; FIRST ONE - LET'S DO IT ERRA10: MOV (SP)+,PSR ; RESTORE CPU PRIORITY ERRA20: JSR R5,POPR ;  THIS SUBROUTINE PERFORMS THE ACTUAL OUTPUT FUNCTION TO ** ;* START THE LINE PRINTER. AFTERWARDS, THE TIMER MODULE ** ;* IS ADJUSTED FOR A ONE SECOND TIMEOUT. IF THE MODULE ** ;* ISN'T QUEUED, IT WILL BE WHEN LPSIO GETS DONE WITH IT. ** ;* REQUIREMENTS ON ENTRY: ** ;* ** ;* R4 = L/P WORD COUNT ; UPDATE 12/18/72 UNMASK.C01 ; UPDATE 11/9/71 UNMASK.S03 ; UPDATE 11/8/71 UNMASK.S02 ; UPDATE 10/8/71 UNMASK.S01 .TITLE UNMASK ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. UNMASK, CATALOG NO. ; * ;* MASK SOFTWARE PRIORITY LOCK-OUT OFF. * ;* T BINASC ; CONVERT TO ASCII MOVB CNVERT+3,(R0)+ ; SET ASCII MOVB CNVERT+4,(R0)+ ; FILE TYPE MOVB CNVERT+5,(R0)+ ; IN MESSAGE RTS PC ; RETURN ; ; .IFNZ DRESDI ; ; I/O COMPLETE SUBROUTINE FOR DISC DIRECTORY UPDATE ; UPDATE = . TST DERRWD ; DID DISC ERROR OCCUR? BNE UPD030 ; YES-PROCESS TST UPDFLG ; FIRST OR SECOND TIRESTORE REGISTERS MOV (SP)+,(SP) ; SET STACK UP FOR VALID RETURN RTS PC ; RETURN TO CALLER ; ; CAN'T THREAD ERROR MODULE ; ERRA30 = . INC (R5) ; SET BACK THREAD WORD BR ERRA10 ; RETURN ; ; FIRST REQUEST - START MESSAGE ; ERRB00 = . CLR EXITSW ; CLEAR EXIT SWITCH FOR GOOD RETURN ERRB10: MOV QFIRST,R5 ; GET NEXT REQUEST BEQ ERRB30  ** ;* R3 = L/P INDEX ** ;* R0 = LIST ADDRESS ** ;* IF THE OPERATOR HAS SO NOTIFIED, THE L/P OUTPUT WILL BE ** ;* DIRECTED TO THE TELETYPE VIA TTYOUT. IN THIS CASE, THE ** ;* TIMER WILL NOT BE STARTED. ** ;* ** ;*********************************************************** * ;* PURPOSE. THIS ROUTINE WILL RELEASE THE PRIORITY LOCK-OUT * ;* MFLAG, SET BY MASK. THUS THE ROS TASK PRIORITY * ;* STRUCTURE WILL BE BACK IN AFFECT. UNMASK THEN * ;* CALLS THE DISPATCHER TO SEE IF A HIGHER PRIORITY * ;* TASK IS IN THE ROS SYSTEM QUEUES * ;* * ;* ME THRU? BNE UPD020 ; SECOND MOV SORTAD,R2 ; FIRST-GET ADDRESS OF ENTRY MOV #COMPID,R1 ; ADDRESS OF COMPRESSION DIR. ENTRY MOV FLTYPE,R0 ; FILE TYPE OF COMPRESSION JSR PC,CHGDIR ; CHANGE DIRECTORY APPROPRIATELY TSTB FTYPE(R2) ; CORE RESIDENT ENTRY EXIST? BPL UPD010 ; NO INC UPDFLG ; YES UPD010: INC UPDFLG ; BUMP FOR SECOND TIME  ; NO REQUESTS LEFT MOV (R5)+,QFIRST ; PULL THREAD, RELINK, R5=ADDR. ERRNUM BNE ERRB15 MOV #QFIRST,QLAST ; PULLED LAST REQUEST-RESET QLAST ERRB15: MOV (SP)+,PSR ; RESTORE CPU PRIORITY MOV #EDITBL,R4 ; ADDRESS OF MESSAGE EDIT TABLE MOV (R5)+,-(SP) ; INTERGER TO STACK & BUMP POINTER ******** MOV (R4)+,-(SP) ; EDIT STRING ADDRESS TO STACK JSR PC,BINASC ; CONVERT INTEGER TO ASCI*********** ; ; LPSIO: .IFNZ LPBACK TST LPTTY(R3) ;SEE IF TTY IS TO BE USED BNE LPOB00 ;BRANCH IF YES .ENDC MOV R4,LPWORD(R3) NEG R4 ;L/P NEEDS NEGATIVE WORD COUNT ; LPO000: .IFZ NLP-1 ;THIS CODE IS FOR ONLY L/P IN SYSTEM MOV R4,@#CNT.1 ;STORE LINE PRINTER WORD COUNT TST LPMODE ;SEE WHICH MODE WE'RE IN BEQ LPOA00  PROGRAM USAGE. THE LINKAGE TO ROUTINE UNMASK IS: * ;* * ;* EMT UNMASK * ;* * ;* THE FORTRAN EQUIVALENT CALL IS: * ;* * ;* CALL UNMASK * RTS PC ; RETURN TO PFRITE ; ; SECOND I/O COMPLETE FROM DIRECTORY UPDATE ; UPD020 = . CLR UPDERR ; SET NO ERROR UPD025: MOV #$CPTNO,-(SP) ; UNSUSPEND COMPRS CLR -(SP) ; IMMEDIATE RETURN REQUESTED EMT UNSPND TST (SP)+ ; IGNORE ERROR RTS PC ; RETURN TO PFRITE ; ; DISC ERROR OCCURRED ; UPD030 = . INC UPDERR ; SET I BYTE STRING ERRB20: MOV (R5)+,R3 ; BINARY # - ARG TO OCTAL (AT LAST) ******** MOV (R4)+,R2 ; DESTINATION ADDRESS ******** JSR PC,BIN2OC ; ******** TST (R4) ; BUMP EDIT POINTER BNE ERRB20 ; NO - AGAIN MOVB #SPACE,EDIT1 ; WIPE OUT SIGN IN ERRNUM; SUB #12.,R5 ; R5 = THREAD WORD ADDRESS MOV #1.,(R5)  ;BRANCH IF CARRIAGE CONTROL MOV #AUTOLF,@#LFRG.1 ;OTHERWISE, ISSUE AUTO LINE FEED BR LPOA10 ; LPOA00: CLR @#LFRG.1 ;SET TO CARRIAGE CONTROL MODE LPOA10: MOV #LPBUF,@#LPDT.1 ;STORE MEMORY BUFFER ADDRESS MOV #SB!IE!ID,@#CMD.1 ;START'ER UP .ENDC ; ; .IFG NLP-1 ;AND NOW FOR THE CODE FOR > 1 L/P IN SYSTEM MOV R4,@LPWDCT(R3) ;STORE WORD COUNT TST * ;* * ;* RETURN IS VIA THE DISPATCHER * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* UPDATE ERROR BR UPD025 ; ; .ENDC ; ; CHGDIR WILL CHANGE THE DIRECTORY ENTRY AFTER A FILE ; HAS BEEN COMPRESSED. ; R0 = FILE TYPE ; R1 = COMPID ADDRESS ; R2 = ENTRY ADDRESS TO CHANGE ; ; R5 USED AS WORK REGISTER ; CHGDIR = . MOV CSS(R1),R5 ; CURRENT START SECTOR MOV R5,SCTR(R2) ; SET NEW START SECTOR .IFNZ $TMSLC!CHKPTC BITB #100,FSTAT(R0) ; SET THREADABLE MOV #IOLIST,-(SP) ; I/O LIST ADDRESS ON STACK FOR TTYOUT JSR PC,TTYOUT ; TYPE ERROR MESSAGE ERRB25: TST EXITSW ; CALLED FROM I/O COMPLETE? BEQ ERRA20 ; NO - RETURN TO CALLER RTS PC ; YES-RETURN TO TTYOUT ; ; I/O COMPLETE SUBROUTINE FROM TTYOUT - EXIT TYPE 3 ; TTYNXT = . INC EXITSW ; SET EXIT SWITCH FROM I/O COMPLETE MOV PSR,-(SP) ; S LPMODE(R3) ;SEE WHICH MODE WE'RE IN BEQ LPOA00 ;BRANCH IF CARRIAGE CONTROL MOV #AUTOLF,@LPFEED(R3) ;OTHERWISE, ISSUE AUTO LINE FEED BR LPOA10 ; LPOA00: CLR @LPFEED(R3) ;SET TO CARRIAGE CONTROL MODE ; LPOA10: MOV LPBUFR(R3),@LPADDR(R3) ;STORE BUFFER MEMORY ADDRESS MOV #SB!ID!IE,@LPCMD(R3) ;REV UP THE OLE ENGINE, BOYS .ENDC .IFZ NLP-1 ;NOW, GET  ** ;* 5 ILLEGAL DEVICE NUMBER ** ;* 10 ILLEGAL I/O FUNCTION CODE ** ;* 11 FATAL HARDWARE ERROR, STATUS REG IS IN WORD 13 ** ;* 12 MAGNETIC TAPE TIME OUT ** ;* 14 WRITE COMMAND FOR REAL WITHOUT WRITE RING ** ;* ** ;* COUNT =NUMBER OF ; CKSAVE AREA REQUIRED? BEQ CHGD10 ; NO ADD LGTH(R2),R5 ; START SECTOR OF CKSAVE MOV R5,CKSAVE(R2) ; SET IN ENTRY .ENDC CHGD10: RTS PC ; RETURN TO CALLER ; ; ; ; DISCQ IS CALLED BY DISCIO WHEN A DISC REQUEST IS FOUND ; FOR AN AREA THAT HAS COMPRESSION IN PROGRESS. ; R1 = I/O LIST ADDRESS ; R5 = DISC CONTROLLER UNIT NUMBER ; STACK CONTENTS: ADDRESS TO RETURN TO AFTAVE PROCESSOR PRIORITY MOV #PLOCK,PSR ; SET CPU LOCKOUT LEVEL 7 BR ERRB10 ; SEE IF ANY OTHER REQUESTS AND ; ; PROCESS THEM ACCORDINGLY ; ERRB30: MOV #-1.,IOLUSE ; RESET I/O LIST IN USE SWITCH MOV (SP)+,PSR ; RESTORE CPU PRIORITY RTS PC ; RETURN TO TTYOUT ; CONVERTS A BINARY NUMBER TO OCTAL - USED FOR ARGUMENTS. ******** ; R3 = BINARY NUMBER ADDRESS OF TIMER MODULE MOV #LPMOD,R4 .ENDC .IFNZ NLP-1 ;THIS PART OF THE CODE PERFORMS MOV LPMDAD(R3),R4 .ENDC ; MOV #LPTIME,JSRSUB(R4) MOV R4,-(SP) MOV #$1SEC,-(SP) ;DELAY ONE SECOND JSR PC,IOQTME ;GO START TIMER TST (SP)+ RTS PC ;UND GO HOME, MEIN HERR. ; ; ; THIS SECTION DIVERTS THE LINE PRINTER OUTPUT  WORDS READ BY THE READ COMMAND ** ;* =NUMBER OF RECORDS (+-N) TO SPACE ** ;* =NUMBER OF FILES (+-N) TO SKIP ** ;* =UNUSED FOR ALL OTHER FUNCTIONS ** ;* ** ;* PROGRAMMER: 67 ** ;* DATE 10.04.72 ** ;* ER CFILID-IGNORE ; PSR ; NOTE: CALLED UNDER LOCKOUT ; DISCQ = . ASL R5 ; CALCULATE DCUWX MOV #1.,R2 ; SET R2 FOR PRIORITY LEVEL 1 MOV DQFRST(R5),R0 ; ADDRESS OF THIS DEVICE'S FIRST LIST MOV DQLAST(R5),R4 ; ADDRESS OF THIS DEVICE'S LAST LIST MOVB LEVEL(R1),R3 ; CURRENT PRIORITY OF REQUEST ASL R3 ; DOUBLE FOR WORD ADDRESSING AD ******** ; R2 = DESTINATION ADDRESS ******** ; R0 = ITERATION LENGTH ******** BIN2OC: MOV #6,R0 ; NUMBER OF ITERATION IN LOOP. ******** ADD R0,R2 ; POINT TO LAST CHARACTER. ******** BIA20: MOVB R3,-(R2) ; BUMP R2 TO 1 PAST LAST CHARACTER ******** BICB #370,(R2) ; CLEAR ALL BUT NUMBER BITS TO THE SYSTEM ; TELETYPE. UNLESS, OF COURSE, THIS OPTION WASN'T GENERATED ; INTO THE SYSTEM. IN WHICH CASE, WHAT ARE YOU EVEN DOING ; HERE? ; ; .IFNZ LPBACK ; ; LPOB00: MOV R5,-(SP) ;SAVE R5 MOV LPBUFR(R3),R4 ;FIRST, SAVE LIST IN LPBUF MOV #7,R5 ; LPOB10: MOV (R0)+,(R4)+ .IFZ $1145 DEC R5 BGT LPOB10 .ENDC .IFNZ $1145 SOB R5,LPOB1 ** ;* GULF ELECTRONIC SYSTEMS ** ;* ** ;********************************************************************** ; ; D E F .GLOBL MAGTAP,MTINT ; R E F .GLOBL PUSHR,POPR .GLOBL ACTIVE,$CTASK .GLOBL IOSTAT,DSPTCH .GLOBL RESTOR,RELTSK .GLOBL UNSPND,QSAVEI ; ; D R3,R4 ; ADDRESS OF CURRENT LEVEL'S LAST LIST ADD R0,R3 ; ADDRESS OF CURRENT LEVEL'S FIRST LIST ASR R5 MOV (R1),-(R3) ; PULL REQUEST OUT OF QUEUE THREAD BNE DSCQ10 ; DIDN'T EMPTY PRIORITY LIST MOV R3,-(R4) ; EMPTY-LAST POINTS TO FIRST DSCQ10: TST (R0)+ ; SEARCH DEVICE Q FOR BNE DSCQ20 ; HIGHEST PRIORITY LEFT-GOT IT! INC R2 ;  ******** BISB #060,(R2) ; CONVERT TO A CHARACTER ******** ASR R3 ; SHIFT TO NEXT 3 BITS ******** BIC #100000,R3 ; STOP SIGN EXTENSION ******** ASR R3 ; ******** ASR R3 ; ******** DEC R0 ; COUNT WHICH CHARACTER ******** 0 .ENDC SUB #14.,R0 MOV R3,R4 ;THEN SET UP LIST FOR TTY USE .IFZ $1145 ASL R4 ASL R4 ASL R4 .ENDC .IFNZ $1145 ASH R4,3 .ENDC ADD #LPDONE,R4 MOV R4,$EXIT(R0) ;STORE I/O COMPLETE ADDRESS MOV #3*256.,DEVICE(R0) ;SET DEVICE = 0, TYPE = 3 CLRB LEVEL(R0) ;PRIORITY 0 MOV #1,(R0)  STANDARD REGISTER DEFINITIONS R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 ;STACK POINTER PC = %7 ;PROGRAM COUNTER PS = 177776 ;PROCESSOR STATUS WORD ; ; M A G T A P E Q U A T E P A R A M E T E R S ; THREAD = 0. ;LIST THREAD DEVICE = 2. ;LOGICAL DEVICE TYPE TYPE = 3. ;ECHECK NEXT REQUEST LEVEL CMPB R2,NDPRTY(R5) ; QUEUE EMPTY? BLE DSCQ10 ; NO-SCAN SOME MORE MOV #-1.,R2 ; YES-RESET HPRIRQ DSCQ20: MOVB R2,HPRIRQ(R5) ; UPDATE HPRIRQ APPROPRIATELY CLR (R1) ; SET THREAD WORD EQUAL ZERO MOV R1,@CPDLST ; SET REQUEST IN MOV R1,CPDLST ; COMPRESS DISC QUEUE MOV (SP),PSR ; RESET LOCKOUT MOV (SP)+,(SP) ; SET STAC BGT BIA20 ; MORE TO COME. ******** RTS PC ; ALL DONE. ******** .END  ;MAKE LIST THREADABLE MOV R0,-(SP) JSR PC,TTYOUT ;AND GO DO IT MOV (SP)+,R5 ;RESTORE R5 MOV LPBUFR(R3),R0 RTS PC ; ; ; THIS SECTION IS ENTERED BY TTYOUT WHEN THE MESSAGE HAS BEEN ; COMPLETELY PROCESSED. ; R1 = ADDRESS LIST ; ; LPDONE: MOV #0,R3 ;ENTRY FOR L/P INDEX 0 JMP LPDA00 ; MOV #2,R3 ;ENTRY FOR L/P INDEX 2 JMP XIT TYPE $EXIT = 4. ;I/O COMPLETE ADDRESS DEVNUM = 6. ;DEVICE NUMBER LEVEL = 7. ;I/O PRIORITY ERROR = 8. ;ERROR PARAMETER SYSTEM = 10. ;RESERVED (SAVE TASK NUMBER) DATA = 12. ;ADDRESS OF DATA BUFFER FUNCT = 18. ;FUNCTION CODE NWORD = 20. ;BUFFER SIZE IN WORDS COUNT = 22. ;SEE DEFINITION ABOVE STATUS = 24K FOR DISCIO RETURN ; NOTE: R4 DOES NOT EQUAL ZERO,THEREFORE CALLED BY ; COMPRS IS ESTABLISHED JMP DIHA50 ; SEE IF ANY OTHER REQUESTS PENDING ; ; ; FMGMTQ IS CALLED BY FLMGMT WHEN A FILE MANAGEMENT REQUEST ; IS FOUND FOR AN AREA THAT HAS COMPRESSION IN PROGRESS. ; R1 = FLMGMT LIST ADDRESS ; NOTE: CALLED UNDER LOCKOUT ; FMGMTQ = . MOV (R1),FMFRST ; PULL REQUEST FROM THREAD BN PCHR 50$: MOVB #CR,(R0) ; SET CR ON END OF MESSAGE. PCHR MOV #LSTMES,R0 ; GET ADD. OF MESSAGE PCHR JSR PC,TTYOUT ; PRINT IT. PCHR MOV SECN+CHAIN(R5),R3 ; GET NEXT POINTER PCHR BNE 20$ ; MORE TO COME. PCHR 55$: INC FIELD1 ; BUMP STARTING TASK # AND GO SEE 2/12/73 BR 10$  LPDA00 ; MOV #4,R3 ;ENTRY FOR L/P INDEX 4 JMP LPDA00 ; MOV #6,R3 ;ENTRY FOR L/P INDEX 6 ; .=NLP*8.+LPDONE ; ; ; LPDA00: MOV #14.,R5 ;RESTORE ORIGINAL LIST MOV LPBUFR(R3),R0 ;LPBUF+ ADDRESS ADD R5,R0 ;PLUS 14 SO'S WE CAN RESTORE BACKWARDS ADD R5,R1 ASR R5 ; LPOB20: MOV -(R0),-(R1) ;GET THE LIST FROM THE L/P BUFFER . ;HARDWARE STATUS REGISTER RES1 = 26. ;RESERVED 1 RES2 = 28. ;RESERVED 2 RES3 = 30. ;RESERVED 3 ; MTDVLM = 1 ;HIGHEST LOGICAL DEVICE NUMBER (0 & 1) MTREP = 18. ;MAG TAPE REPEAT COUNT (4N+2) QTIME = 7 DQTIME = 10 ; MTWORD = 167540 ;WORD COUNT REGISTER MTSTAT = 167542 ;STATUS REGISTER MTCOMM = 167544 ;COMMAND RE FMGQ10 MOV #FMFRST,FMLAST ; EMPTIED QUEUE-SET LAST=FIRST FMGQ10: CLR (R1) ; SET THREAD WORD = 0 MOV R1,@CPFLST ; THREAD REQUEST IN MOV R1,CPFLST ; COMPRESS WAIT QUEUE RTS PC ; RETURN TO FLMGMT ; ; .END  ; IF DONE YET? 2/12/73 60$: MOV #MES10,R0 ; PRINT END 2/12/73 JSR PC,TTYOUT ; PCHR JMP STAA00 ; DONE PCHR .PAGE ; PCHR ; SUBROUTINES USED BY PATCHR PCHR ;  .IFZ $1145 DEC R5 BGT LPOB20 .ENDC .IFNZ $1145 SOB R5,LPOB20 .ENDC ; ;NOW, SET UP REGISTERS AS: MOV R1,R0 ; R0 = ADDR LIST MOV LPDATA(R3),R1 ; R1 = ADDR DATA MOV (SP)+,R5 ; R5 = RETURN TO TTYOUT MOV LPRIOR(R3),R2 ; R2 = PRIORITY INDEX JMP LPIA10 ;THEN GO SEE WHAT ELSE IS TO BE DOEGISTER MTMEMO = 167546 ;MEMORY ADDRESS REGISTER ; ; COMMAND CODES FOR MAGNETIC TAPE CONTROLLER READ = 1 WRIT = 2 ;WRITE BUFFER WRFM = 4 ;WRITE FILE MARK WEXG = 10 ;WRITE WITH EXTENDED GAP SPCF = 20 ;SPACE FILE FORWARD BCKF = 40 ;BACK SPACE FILE SPCR = 100 ;SPACE RECORD FORWARD BCKR = 200 ;BACK SPACE RECORD REWDBN HRPC ? ' ',A R TEACARCHT EX NHE TIS; , #'+,4)(R PBCM HRPC . OKD ANE ON DLL A -DECOP OLYON; 00TEIN Q BE HRPC NTOU CTEACARCHC DE; R5 C DE HRPC T.LO STOINE OD COPT PU; R TTLE+,4)(R VBMO HRPC 0. >BET US MNT CR.HA C. RR EAXNTSY; 20TBIN E BL HRPCT RSFIO TTSINPO4 RT. RTOINT UNCOT GE; R5+,4)(R V MO HRPC NGRIST& . NT CR.HA; UPDATE 1/23/73 CORLOD.C06 ; UPDATE 1/20/73 CORLOD.C05 ; UPDATE 1/9/73 CORLOD.C04 ; UPDATE 12/5/72 CORLOD.C03 ; UPDATE 11/10/72 CORLOD.C02 ; UPDATE 10/12/72 CORLOD.C01 ; UPDATE 6/22/72 CORLOD.S04 ; UPDATE 05-MAY-72 CORLOD.S03 ; UPDATE 5/5/72 CORLOD.S02 ; UPDATE 5/3/72 CORLOD.S01 .TITLE CORLOD ;*********************************************NE .ENDC .PAGE ;********************************************************************** ;* L P C L R ** ;* THIS SUBROUTINE CLEARS A LINE PRINTER ERROR BY CLEARING ** ;* THE MEMORY ADDRESS REGISTER, LPDT.K (K = L/P NUMBER) ** ;* ** ;* R3 = L/P INDEV ** ;* JSR PC,LPCLR  = 400 ;REWIND ENAB = 1000 ;ENABLE INTERRUPT OFFL = 2000 ;OFF LINE CLEA = 40000 ;CLEAR CONTROLLER ; ; FIRST AND LAST WORDS FOR LIST THREAD MTFRST: .WORD 0 MTLAST: .WORD MTFRST NMTREQ: .WORD -1 ; ; MAGNETIC TAPE FUNCTION JUMP TABLE MTFCT: .WORD MOPEN ;OPEN .WORD MCLOS ;CLOSE .WORD MREAD ;READ .WORD MWRIT ;WRITE  PCHR ; TTYOUT TYPES A OUTPUT MESSAGE ON THE TTY PCHR ; INPUT R0 = ADDRESS OF MESSAGE BUFFER PCHR ; OUTPUT NONE PCHR ; PCHR TTYOUT: ; PCHR MOV R0,KBADD ; SET ADDRESS INTO I/O LIST PCHR MOV #KBL************************** ;* * ;* USED BY LOADER TO LINK OVERLAY TASKS WITH RESIDENT * ;* CORE LOCATIONS. * ;* * ;*********************************************************************** ; .DEF CORLOD,CORTBL .PAGE CORLOD = . MOV (SP),-(SP) MOV  ** ;* ** ;********************************************************************** ; ; LPCLR: .IFZ NLP-1 CLR @#LPDT.1 ;CLEAR MEMORY ADDRESS FOR ONLY ONE L/P .ENDC .IFG NLP-1 CLR @LPADDR(R3) ;DITTO, BUT FOR MORE THATN ONE L/P .ENDC RTS PC .PAGE ;********************************************* .WORD MWEOF ;WRITE FILE MARK .WORD MREWI ;REWIND .WORD MSPRC ;SPACE +-N RECORDS .WORD MSKFI ;SKIP +-N FILES ; MAGNETIC TAPE RETURN AFTER INTERRUPT JUMP TABLE MTRET: .WORD MOPEN ;OPEN .WORD MCLOS ;CLOSE .WORD MRREA ;READ .WORD MRWRI ;WRITE .WORD MRWEO ;WRITE FILE MARK .WORD MRREW ;REWIND IST,-(SP) ; CALL EMT PCHR EMT $TTYOT ; PCHR TST KBERR ; ERRORS? PCHR BNE 10$ ; YES PCHR RTS PC ; NO PCHR 10$: EMT $EXIT ; YES - EXIT PCHR ;  #CORTBL,2.(SP) ; PUT ADDRESS ON STACK FOR ROSLOD RTS PC ; CORTBL = . .MACRO GENENT NAME ; GENERATE AN ENTRY FOR THE CORLOD TABLE. .REF NAME .RAD50 /NAME/ .WORD NAME .ENDM GENENT ; GENENT TSTAT ; GENENT GTIME ; GENENT GDATE ; GENENT SDATE ; GENENT STIME ; GENENT TASKS ; GENENT HEADER************************* ;* L P L E V L ** ;* ** ;* THIS SUBROUTINE CALCULATES THE INDEX REQUIRED TO ACCESS ** ;* LPFRST AND LPLAST FOR THE SPECIFIED LINE PRINTER AND PRIORITY** ;* LEVEL. LINKAGE IS: ** ;* ;R2 = PRIORITY (1,2,...,NLPRTY) ** ;* ;R3 = .WORD MSPRC ;SPACE +-N RECORDS .WORD MSKFI ;SKIP +-N FILES MTIMV: ; TIME OUT VALUES IN SECONDS .BYTE 0,0 ;OPEN .BYTE 0,0 ;CLOSE .BYTE 5,0 ;READ .BYTE 5,0 ;WRITE .BYTE 5,0 ;WRITE FILE MARK .BYTE 180.,0 ;REWIND .BYTE 5,0 ;SPACE .BYTE 60.,0 ;SKIP MTTLI: ;MAGNETIC TAPE TIMER L PCHR ; TTYIN READS A MESSAGE INTO REQBUF PCHR ; INPUT - NONE PCHR ; OUTPUT - MESSAGE PCHR ; PCHR TTYIN: ; PCHR MOV #REQLST,KBADD ; SET ADDRESS INTO I/O LIST PCHR MOV #KBLIST,-( ; GENENT ; GENENT ; GENENT FSTAT ; GENENT PHYDEV ; GENENT NODREQ ; GENENT CMPTMR ; GENENT CPRSIP ; GENENT FINIT ; GENENT PFRITE ; GENENT FILE ; GENENT CDSRCH ; GENENT CDILST ; GENENT DQFRST ; GENENT DQLAST L/P INDEX ** ;* JSR PC,LPLEVL ** ;* ;RETURN WITH R2 = PRIORITY INDEX ** ;* ** ;********************************************************************** ; ; LPLEVL: .IFZ NLP+NLPRTY-2 CLR R2 .ENDC .IFNZ NLP+NLPRTY-2 MOV R5,-(SP) ;SAVE R5 'CAUSE WE USE IT IST .WORD 1 .BYTE 0 .BYTE 25 .WORD 0 .WORD MTTIM .PAGE ; ; S T A R T O F M A G T A P ; MAGTAP: JSR R5,PUSHR ;SAVE R0-R5 ON STACK MOV 14.(SP),R0 ;R0 = F.W.A. OF LIST MOV #1,R4 ;SET ERROR CODE IN R4 DEC (R0) ;IS THREAD = 1 BNE MTERR ;IF NOT, RETURN MOV FUNCT(R0),RES2(R0) ; IS DEVICE TYPE = 4SP) ; CALL EMT PCHR EMT $TTYIN ; PCHR TST KBERR ; ANY ERRORS? PCHR BNE 10$ ; YES PCHR RTS PC ; NO. PCHR 10$: MOV #MESS6,R0 ; TRY TO PRINT A WARNING MESSAGE PCHR CMP KBERR,#28. ; INPUT TIMEOUT?  ; GENENT NDPRTY ; GENENT HPRIRQ ; GENENT CALLED ; GENENT DIHA50 ; GENENT FMFRST ; GENENT FMLAST ; GENENT FNEXT ; GENENT AULIST ; GENENT DIOA65 ; GENENT IOSTAT ; GENENT NOFMRQ ; GENENT FMACTV ; GENENT FLMB00 ; GENENT COMPID ;  DEC R2 ASL R2 MOV #NLPRTY,R5 ;SET MAXIMUM NUMBER PRIORITY LEVELS ;BASIC EQUATION IS: ; ; PRIORITY INDEX = NLPRTY*R3 + 2*(R2 - 1) ; ;WHERE - R3 = L/P INDEX ; R2 = PRIORITY ; .IFZ $1145 ; LPLA00: DEC  INC R4 ;SET R4 = 2 CMPB DEVICE(R0),#4 BNE MTERR ;RETURN IF NOT 4 ; IS EXIT TYPE 1 OR 2 INC R4 ;SET R4 = 3 MOVB TYPE(R0),R1 ;R1 = EXIT TYPE BLE MTERR ;BRANCH IF .LE. 0 CMP R1,#3 BGE MTERR ;BRANCH IF .GT. 3 ; IS THE LOGICAL DEVICE NUMBER 0 OR1 MOV #5,R4 MOVB DEVNUM(R0),R1 ;PLACE DEVICE NUMBER IN R1  PCHR BEQ 20$ ; YES - THEN JUST EXIT. PCHR JSR PC,TTYOUT ; PCHR 20$: EMT $EXIT ; AND EXIT. PCHR .PAGE ; PCHR ; TASKNO GETS A TASK # FROM FIELD1, CHECKS FOR VALIDTY, AND IF VALID PCHR ; RETURNS IT TO CALLER. PCHR ; INPUT - VALUE IN FIELD GENENT $TKFLS ; GENENT TPRTY ; GENENT PUSHR ; GENENT POPR ; GENENT BSIZE ; GENENT PPTAB ; GENENT CRDON ; GENENT LPON ; GENENT CRDOFF ; GENENT LPOFF ; GENENT LOGMAX ; GENENT DLCST ; GENENT MPQST ; GENENT MSQST ;  R5 ;THIS IS THE WAY THE 11/20 DOES BLT LPLA20 ; NLPRTY*R3 ADD R3,R2 BR LPLA00 ; LPLA10: .ENDC .IFNZ $1145 ;AND THIS IS HOW THE 11/45 DOES IT MUL R3,R5 ;WASN'T THAT QUICK? .ENDC ADD R5,R2 ;THEN ADD IN 2*(R2 - 1) ; LPLA20: MOV (SP)+,R5 ;RESTORE YOU-KNOW-WHO .ENDC RTS PC .PAGE ;***** BLT MTERR ;RETURN IF NEGATIVE CMP R1,#MTDVLM ;IS THE DEVICE NUMBER DEFINED BGT MTERR ;RETURN IF NOT ; IS THE FUNCTION CODE DEFINED MOV #10,R4 ;SET R4 = 8 MOV FUNCT(R0),R1 ;PLACE FUNCTION CODE IN R1 BLE MTERR ;BRANCH IF NEGATIVE CMP R1,R4 BGT MTERR ;BR IF R1 IS MORE THAN 8 CMP R1,#7 BLT MT01 ;BR IF R1 IS 6 OR 1 PCHR ; OUTPUT R2 = TASK # PCHR ; PCHR TASKNO: ; PCHR MOV FIELD1,R2 ; GET VALUE PCHR BLE 10$ ; LESS THAN 1 -BAD PCHR CMP R2,#MAXTSK ; IS IT TO LARGE? 2/ GENENT OUTST ; GENENT RTEST ; GENENT SYDST ; GENENT TETST ; GENENT INVNUM ; GENENT TSKRN ; GENENT BUFST ; GENENT BUFEND ; GENENT BUFCNT ; GENENT BUFERR ; GENENT MTLST ; GENENT MTPST ; GENENT NAKBUF ; GENENT ACKBUF ; GE***************************************************************** ;* ** ;* L P M S G E ** ;* ** ;* THIS SUBROUTINE OUTPUTS THE INDICATED MESSAGE TO THE SYSTEM ** ;* TELETYPE. LPMSGE IS CALLED WHEN AN ERROR HAS BEEN DETECTED ** ;* OR OPERATOR ACTION IS REQUIRED. LINKAGE IS: ** LESS TST COUNT(R0) BEQ MTERR ;BR IF COUNT IS ZERO CLR NWORD(R0) MT01: CLR SYSTEM(R0) ; PLACE LIST IN THREAD MOV @#PS,-(SP) ;INHIBIT INTERRUPTS, SAVE PROGRAM STATUS REG. SPL 7 ;SET PRIORITY TO 7 MOV R0,@MTLAST ;QUEUE IT MOV R0,MTLAST TST ACTIVE ;SEE IF CALLER IS A TASK BEQ MT04 ;BRANCH IF NOT MOV $CTASK,R12/73 BGT 10$ ; YES PCHR RTS PC ; NO - RETURN PCHR 10$: MOV #MESS5,R0 ; GET ILL. TASK # MESSAGE ADDRESS PCHR JSR PC,TTYOUT ; PRINT IT PCHR TST (SP)+ ; GET RID OF CALLERS RETURN ADD. PCHR JMP STAA00 ; AND GO GET ANOTHER REQUEST. PCHR .PAGE ; NENT CANBUF ; GENENT STXBUF ; GENENT SHDST ; GENENT DCRTST ; GENENT CELCNT ; GENENT CELST1 ; GENENT CELST5 ; GENENT CELST ; GENENT ELMCNT ; GENENT ELMST ; GENENT MDCQST ; GENENT SYDTM1 ; GENENT SYDTM2 ; GENENT SYDTM3 ; GENENT  ;* ** ;* ;SET R3 = L/P INDEX ** ;* MOV #DATA,-(SP) ;PUSH DATA BUFFER ADDRESS ** ;* JSR PC,LPMSGE ** ;* BNE ;BRANCH IF LIST WASN'T AVAILABLE ** ;* ** ;* REGISTER R4 IS DESTROYED. 2 INCB IOSTAT(R2) MOV R2,SYSTEM(R0) MT04: MOV (SP)+,@#PS MOV #MTREP,RES1(R0) ; SET REPEAT COUNT AND CLEAR BACK SPACE INC NMTREQ ; BUMP NUMBER OF REQUESTS BNE MTEX2 ;BR IF NOT FIRST IN QUEUE MOV #CLEA,@#MTCOMM ;ISSUE CLEAR TO MAG TAPE CONTROLLER MOV FUNCT(R0),R1 ;RETURN JUMP TO DEC R1 ; DESIRED ASL R1 ; FUNCTIONAL BR ) R0T(UNCO C IN ) R0D(ORNW C DE : I6KFMS I2KFMS BR ) R0T(UNCO C DE ) R0D(ORNW C IN I6KFMS T BG ) R0D(ORNW T TS : I5KFMS PC S RT : I2KFMS E ETPLOM COT N/O IET;S R5 C IN D ANMMCOE IV;G M OMTC#M,@R3 V MO : I4KFMS D ANMMCOE IL FCEPA SCKBAM OR;F R3F,CK#B S BI ) R0D(ORNW C DE NTOU CNTMERENC;I ) R0T(UNCO C IN SYDTM4 ; GENENT SYDTM5 ; GENENT SYDTM6 ; GENENT SYDSK1 ; GENENT SYDSK2 ; GENENT SYDSK3 ; GENENT SYDSK4 ; GENENT SYDSK5 ; GENENT SYDSK6 ; GENENT BUFBEG ; GENENT BUFLST ; GENENT SYDVST ; GENENT ASYTIM ; GENENT ASYTM ; ; .WORD -1 ** ;* ** ;********************************************************************** ; ; LPMSGE: MOV 2(SP),R4 ;GET DATA BUFFER ADDRESS FROM STACK .IFG NLP-1 ADD R3,R4 ;GET ADDRESS OF BUFFER FOR THIS L/P MOV (R4),R4 .ENDC MOV R5,-(SP) ;SAVE R5 .IFZ NLP-1 ;* GET ADDRESS MOV #LPLIST,R5 ;*  JSR PC,@MTFCT(R1) ; ROUTINE CMP RES2(R0),#2 BLE MTXB2 TST R4 BEQ MTEX1 ;BR IF NO ERRORS MTXB2: MOV @#PS,-(SP) SPL 7 MOV (R0),MTFRST MOV #MTFRST,MTLAST DEC NMTREQ MOV (SP)+,@#PS MTERR: INC (R0) MOV R4,ERROR(R0) ;STORE ERROR CODE IN LIST MTEXIT: MOV @#MTSTAT,STATUS(R0) JSR R5,POPR : I3KFMS I4KFMS BR D ANMMCOE IL FIPSKM OR;F R3F,PC#S S BI ) R0D(ORNW C IN ) R0T(UNCO C DE E IVATEG NIFR ;B I3KFMS I BM I2KFMS Q BE ) R0T(UNCO T TS I2KFMS L BP E IZALTINI;I T NITI,MPC R JS I5KFMS I BM R1 L AS 1 ,RATSTMT@# V MO E ETPLOM C/O IET;S R5 R CL I:KFMS ; ) -N(+ ESIL FP KI SE AP TC TINEAG M; E AG.P ; END OF TABLE ; .END  .ENDC ;* OF LINE PRINTER .IFG NLP-1 ;* MOV LPIOLS(R3),R5 ;* I/O LIST .ENDC ;* MOV @#PSR,-(SP) ;SAVE CURRENT CPU LEVEL .IFZ $1145 MOV #340,@#PSR ;11/20 CODE TO INHIBIT INTERRUPTS .ENDC .IFNZ $1145 SPL 7 ;11/45 CODE FOR THE SAME THING .ENDC TST DATA(R5) ;SEE IF THE LIST IS AVAILABLE ;RESTORE REGISTERS MOV (SP)+,(SP) ;MOVE RETURN ADDRESS RTS PC ;RETURN TO CALLE- ; MTEX1: MOV #MTTLI,-(SP) ;ADDRESS OF MAG TAPE TIMER LIST MOV FUNCT(R0),R1 DEC R1 ASL R1 MOV MTIMV(R1),-(SP) ;VALUE OF DELAY MULTIPLE EMT QTIME TST (SP)+ ; THIS SECTION RETURNS TO THE CALLER IF EXIT TYPE 1 OR 3 ; AND TO THE ROS DISPATCHER IF EXIT TYPE 2,(SUSPENDER TASK FMSKFI2 .PAGE ; THIS IS A MAGNETIC TAPE CONTROLLER INITIALIZATION ROUTINE ; CALL IS JSR PC,MTINIT ; RETURNS WITH ; R3 = DEVICE NUMBER SHIFTED FOR A COMMAND INSTRUCTION ; R4 = 0 AND (N) BIT SET IF NO ERROR ; R4 = 1 AND (N) BIT CLEAR IF TIME OUT ERROR ; MTINIT: MOV #CLEA,@#MTCOMM ;ISSUE CLEAR TO MAG TAPE CONTROLLER MOVB DEVNUM(R0),R3 ;OBTAIN DEVICE NUMBER ASH #12.,R3 ;LEST SHIFT 0&1 INTO 12&13 C2PRMS BR ) R0T(UNCO C IN ) R0D(ORNW C DE : C6PRMS C2PRMS BR ) R0T(UNCO C DE ) R0D(ORNW C IN C6PRMS T BG ) R0D(ORNW T TS : C5PRMS PC S RT : C2PRMS E ETPLOM COT N/O IET;S R5 C IN D ANMMCOE IV;G M OMTC#M,@R3 V MO : C4PRMS R3R,CK#B S BI ) R0D(ORNW C DE ) R0T(UNCO C IN : C3PRMS K AC BCEPA SND AN) (NTMERENC I; C4 BNE LPSX00 ;BRANCH IF BUSY MOV R4,DATA(R5) ;IT'S AVAILABLE, SO GRAB IT MOV (SP)+,@#PSR ;ENABLE INTERRUPTS BACK TO WHERE THEY WERE MOV R5,-(SP) ;PUSH LIST ADDRESS JSR PC,TTYOUT ;CALL TTYOUT TO PRINT MESSAGE MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,(SP) ;PUT STACK IN ORDER CLZ ;SET NO-ERROR CONDITION RTS PC ; ; LPSX00: OR TYPE 2) MTEX2: CMPB #2,TYPE(R0) ;TYPE 2 ? BNE MTEXIT ;BR IF NOT TST SYSTEM(R0) ;SEE IF THIS IS A TASK CALLING BEQ MTEXIT ;BR IF THE CALLER IS NOT A TASK MOV @#PS,14.(SP) ;PLACE PS ON STACK JSR R5,POPR ;RESTORE REGESTERS CLR -(SP) ;SET INVOLUNTARY SUSPEND FLAG JSR PC,QSAVEI ;AND LET QSAVI SUSPEND THE TASK JMP DSPTCH ; .P2MOV R3,@#MTCOMM ;STORE UNIT NUMBER IN COMMAND REGISTER BIS #1000,R3 ;SET INTERRUPT ENABLE BIT ; CLEAR BACK SPACE FLAG AND SET DELAY COUNTER TO ZERO CLRB RES1+1(R0) ;CLEAR BACK SPACE FLAG CLR R4 ; TEST READY BIT MTIN1: CMP FUNCT(R0),#1 ;OPEN COMMAND BEQ MTIN3 MOVB @#MTSTAT,R1 ;LOAD WITH BYTE SIGN EXTENDED BGT MTIN2 ;BRANCH IF BIT 7 WAS 0 MTIN3: RTS PC PRMS BR ; R3R,PC#S S BI ) R0D(ORNW C IN ) R0T(UNCO C DE RDWAOR FCEPA SND AN) (NTMEREEC D; E IVATEG NIFR ;B C3PRMS I BM C2PRMS Q BE ) R0T(UNCO T TS C2PRMS L BP E IZALTINI;I T NITI,MPC R JS C5PRMS I BM RKMAE IL FOR FCKHE;C ATSTMT@# T TS E ETPLOM C/O IET;S R5 R CL C:PRMS ; ) -N(+ RDCORE CEPA SE AP TICETGNMA; E AG.PMOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,(SP) ;PUT STACK IN ORDER SEZ ;SET ERROR CONDITION RTS PC ;EXIT TO CALLER ; TYDONE: CLR DATA(R1) ;SET I/O LIST AVAILABLE RTS PC .PAGE ;********************************************************************** ;* ** ;* AGE ; M T I N T ; MAGNETIC TAPE INTERRUPT ROUTINE, THIS ROUTINE IS ENTERED WHENEVER A ; MAGNETIC TAPE INTERRUPT OCCURS ; MTINT: $SAVE MOV R4,@#PS MOV MTFRST,R0 ;PLACE LIST ADDRESS IN R0 BEQ MTEYIT ;BR IF QUEUE IS EMPTY MOV #MTTLI,-(SP) EMT DQTIME TST (SP)+ CLR R4 ; BRANCH ON FUNCTION CODE ON RETURNING FROM AN INTERRUPT MOV FUNCT(R0),R5 ;LOAD FUNCTIO  PCHR ; BINOCT CONVERTS A BINARY # TO 6 OCTAL DIGITS PCHR ; INPUT R0 = ADDRESS OF THE LEFTMOST CHARACTER PCHR ; R1 = BINARY NUMBER PCHR ; PCHR BINOCT: ; PCHR MOV R2,-(SP) ; SAVE R2 PCHR  L P O N / L P O F F ** ;* ** ;* THESE SUBROUTINES ARE CALLED BY OPERATOR INPUT AND ARE ** ;* USED TO SWITCH THE L/P OUTPUT TO THE TELETYPE (LPOFF) ** ;* OR REINSTATE OUTPUT TO THE L/P (LPON). THE LINKAGE IS : ** ;* ** ;* JSR PC,LPON (OR LPOFF) ** N CODE (1 TO 8) DEC R5 ;(0 TO 7) ASL R5 JSR PC,@MTRET(R5) TST R5 BNE MTIN05 ;BRANCH IF I/O NOT COMPLETE ; DEQUEUE THE REQUEST MTINRE: MOV R4,ERROR(R0) MOV @#MTSTAT,STATUS(R0) MOV @#PS,-(SP) ;SAVE CURRENT CPU STATUS REGISTER SPL 7 ;INHIBIT INTERRUPTS MOV (R0),MTFRST ;PUT NEXT GUY IN THREAD AT TOP OF QUEUE MOV  MOV R3,-(SP) ; R3 PCHR MOV R1,R3 ; SET UP FOR THE ASHC PCHR MOV #6,R1 ; SET COUNTER PCHR CLR R2 ; CLEAR THE WORD REGISTER. PCHR ASHC #1,R2 ; GET THE SIGN BIT PCHR BR 20$ ; GO TO THE COMMON CODE AND CONVERT IT. PCHR 10$: ASHC #3,R2 ; GET A ND.E  ;* ** ;* WHERE R3 CONTAINS THE LINE PRINTER NUMBER (1, 2, 3, ..., NLP)** ;* ** ;* R3 IS DESTROYED ON RETURN (IF NLP > 1). ** ;* ** ;********************************************************************** ; ; LPOFF: .IFNZ LPBACK .IFG NLP-1 #MTFRST,MTLAST MOV #1,(R0) ;SET LIST READY MOV (SP)+,@#PS ;UN-INHIBIT THE INTERRUPTS MOV SYSTEM(R0),R2 ;GET TASK NUMBER OF REQUESTOR BEQ MTINT1 ;BRANCH IF NOT A TASK DECB IOSTAT(R2) ;OTHERWISE, DECREMENT THE I/O IN PROGRESS BNE MTINT1 MOV R2,-(SP) ;GO TO OVERLAY MONITOR SO THE TASKS CORE JSR PC,RELTSK ; CAN BE RELEASED ; MTINT1: CMPB TYPE(R0)3 BIT BYTE. PCHR 20$: ADD #060,R2 ; CONVERT TO A NUMBER PCHR MOVB R2,(R0)+ ; PUT A CHARACTER INTO THE STRING. PCHR CLR R2 ; CLEAR THE WORD REGISTER. PCHR SOB R1,10$ ; LOOP TILL DONE PCHR MOV (SP)+,R3 ; RESTORE R3 PCHR MOV (SP)+,R2 ; AND R2 PCHR ; 3 INMT BR R41,#1 V MO 2:INMT N URET;R PC S RT 3:INMT 0AS W 7IT BIFH NCRA;B 2 INMT T BG D DEENXT EGNSIE YT BTHWID OA;L 1 ,RATSTMT@# VBMO 3 INMT Q BE D ANMMCON PE;O #1),R0T(NCFU P CM 1:INMT IT BDYEA RSTTE; R4 R CL AGFLE ACSPK AC BARLE;C 0)(R+1S1RE RBCL O ER ZTOR TEUNCOY LADET SED ANG LA FCEPA SCKBAR EACL; T BIE BLNA EPTRUERNT IET;S R30,00#1  TST R3 ;L/P NO. CAN'T BE <= 0 BLE LPDF10 CMP R3,#NLP ;OR = BGT LPDF10 DEC R3 ASL R3 INC LPTTY(R3) .ENDC ; ; .IFZ NLP-1 INC LPTTY .ENDC ; ; LPDF10: RTS PC .ENDC ; LPON: .IFZ NLP-1 CLR LPTTY RTS PC .ENDC .PAGE ;*******************************************,#2 ;TYPE 2 EXIT BNE MTIN00 MOV SYSTEM(R0),-(SP) ;PLACE TASK NUMBER ON STACK CLR -(SP) ;PUSH 0 ON STACK JSR PC,UNSPND TST (SP)+ ;POP OFF ERROR CODE MTIN00: DEC NMTREQ BMI MTEYIT ;BR IF -1 MOV MTFRST,R0 ;GET NEXT LIST ADDRESS JSR PC,MTINIT BPL MTINRE MOV FUNCT(R0),R1 ;RETURN JUMP TO DEC R1  RTS PC ; RETURN PCHR ; PCHR ; OCTBIN CONVERTS 6 OCTAL DIGITS TO A BINARY # PCHR ; INPUT R0 = LEFT MOST CHARACTERS ADD. PCHR ; OUTPUT R1 = BINARY NUMBER PCHR ; STATUS BIT PCHR ; Z = 1 IF NO SYNTAY ERRORS S BI ERSTGIRED ANMMCON IERMBNUT NI URETO;S M OMTC#M,@R3 V MO 132& 1TOIN1 0&T IFSHT ES;L 3 ,R2.#1 H AS R BEUM NCEVIDEN AIBT;O 3 ,R0)(RUMVNDE VBMO R LEOLTRON CPETAG MAO TARLE CUESS;I MMCOMT@#A,LE#C V MO : ITINMT ; R ROERT OUE IM TIFR EACLT BI) (ND AN1 = 4 R; R ROERO NIFT SET BI) (ND AN0 = 4 R; ONTIUCTRNS INDMAOM C AOR FEDFTHI SERMBNUE ICEV D =R3 ; THWIS RNTURE ; T NITI,MPC R JSS ILLCA ; E INUTRO*************************** ;* ** ;* L P Q E R R ** ;* THIS LITTLE SUBROUTINE QUEUES THE ERROR TASK FOR EXECUTION. ** ;* ON ENTRY, R0 MUST CONTAIN THE ADDRESS OF THE I/O LIST. ** ;* ** ;********************************************************************** ; ; LPQERR: CLR -( ; DESIRED ASL R1 ; FUNCTIONAL JSR PC,@MTFCT(R1) ; ROUTINE CMP FUNCT(R0),#2 ;CHECK FUNCTION TYPE BLE MTYB2 ;BR IF FUNCTION TYPE 1 OR 2 TST R4 BNE MTYB2 MTIN05: MOV #MTTLI,-(SP) MOV FUNCT(R0),R1 DEC R1 ASL R1 MOV MTIMV(R1),-(SP) EMT QTIME TST (SP)+ MTEYIT: JMP RESTOR MTYB2:  PCHR ; Z = 0 IF SYNTAY ERRORS PCHR ; PCHR OCTBIN: ; PCHR MOV R2,-(SP) ; SAVE R2 PCHR MOV #6,R2 ; SET COUNTER PCHR CLR R1 ; CLEAR RESULT PCHR 10$: ASN IOATIZALTINI IERLLRONTCOE AP TICETGNMAA S IISTH; E AG.P I2KFMS BR ) R0T(UNCO C IN ) R0D(ORNW C DE : I6KFMS I2KFMS BR ) R0T(UNCO C DE ) R0D(ORNW C IN I6KFMS T BG ) R0D(ORNW T TS : I5KFMS PC S RT : I2KFMS E ETPLOM COT N/O IET;S R5 C IN D ANMMCOE IV;G M OMTC#M,@R3 V MO : I4KFMS D ANMMCOE IL FCEPA SCKBAM OR;F R3F,CK#B S BI SP) MOVB ERRTSK(R0),(SP) ;GET ERROR TASK NUMBER TST (SP) BEQ LPQA00 ;BRANCH IF AN ERROR TASK IS NOT SPECIFIED CLR -(SP) CLR -(SP) CLR -(SP) JSR PC,QUEUE ;QUEUE THE ERROR TASK ; LPQA00: TST (SP)+ ;POP OFF ERROR PARAMETER AND EXIT RTS PC .PAGE ;********************************************************************** ;*  MOV @#PS,-(SP) SPL 7 MOV (R0),MTFRST MOV #MTFRST,MTLAST DEC NMTREQ MOV (SP)+,@#PS MOV #1,(R0) ;SET THREAD TO 1 MOV R4,ERROR(R0) ;STORE ERROR CODE IN LIST BR MTIN00 .PAGE ; MAGNETIC TAPE TIME OUT ROUTINE MTTIM: JSR R5,PUSHR CLR @#MTCOMM ;CLEAR CURRENT COMMAND MOV MTFRST,R0 BEQ MTTIM2 ; DEQUEUE THE REQUEH #3,R1 ; SHIFT OVER 3 BITS PCHR BCS 30$ ; ONLY ALLOW 16 BITS, NOT 18 IN 6 BYTES.PCHR CLR -(SP) ; SET UP TEMP STORAGE PCHR MOVB (R0)+,(SP) ; GET A CHARACTER PCHR SUB #060,(SP) ; SUBTRACT OFF NUMERIC BASE PCHR BLT 20$ ; NOT A NUMBER PCHR CMP (SP),#7 ; IS IT TOO LARGE ) R0D(ORNW C DE NTOU CNTMERENC;I ) R0T(UNCO C IN : I3KFMS I4KFMS BR D ANMMCOE IL FIPSKM OR;F R3F,PC#S S BI ) R0D(ORNW C IN ) R0T(UNCO C DE E IVATEG NIFR ;B I3KFMS I BM I2KFMS Q BE ) R0T(UNCO T TS I2KFMS L BP E IZALTINI;I T NITI,MPC R JS I5KFMS I BM R1 L AS 1 ,RATSTMT@# V MO E ETPLOM C/O IET;S R5  ** ;* LINE PRINTER INITIALIZATION ROUTINE. THIS ROUTINE: ** ;* ** ;* 1. STORES INTERRUPT VECTOR VALUES ** ;* 2. RESETS AND CLEARS THE LINE PRINTER(S). ** ;* ** ;* LPINIT SHOULD BE CALLED AT SYSTEM INITIALIZATION TIME. ** ;* ST MOV @#MTSTAT,STATUS(R0) MOV #12,ERROR(R0) MOV @#PS,-(SP) ;SAVE CURRENT CPU STATUS REGISTER SPL 7 ;INHIBIT INTERRUPTS MOV (R0),MTFRST ;PUT NEXT GUY IN THRAED AT TOP OF QUEUE MOV #MTFRST,MTLAST MOV #1,(R0) ;SET LIST READY DEC NMTREQ MOV (SP)+,@#PS ;UN-INHIBIT THE INTERRUPTS MOV SYSTEM(R0),R2 ;GET TASK NUMBER OF REQUESTOR BE! PCHR BGT 20$ ; YES PCHR ADD (SP)+,R1 ; NO - A NUMBER PCHR SOB R2,10$ ; GO BACK FOR MORE PCHR MOV (SP)+,R2 ; RESTORE R2 PCHR SEZ ; SET STATUS AS NO SYNTAX ERROR PCHR RTS PC ; PCHR 20$: TST R CL I:KFMS ; ) -N(+ ESIL FP KI SE AP TC TINEAG M; E AG.P C2PRMS BR ) R0T(UNCO C IN ) R0D(ORNW C DE : C6PRMS C2PRMS BR ) R0T(UNCO C DE ) R0D(ORNW C IN C6PRMS T BG ) R0D(ORNW T TS : C5PRMS PC S RT : C2PRMS E ETPLOM COT N/O IET;S R5 C IN D ANMMCOE IV;G M OMTC#M,@R3 V MO : C4PRMS R3R,CK#B S BI ) R0D(ORNW C DE # ** ;********************************************************************** ; ; .CSECT .LPINT LPINIT: .IFZ NLP-1 CLR R3 MOV #LPINT0,@#LPVC.1 ;STORE ADDR OF INTERRUPT ROUTINE MOV #340,@#LPVC.1+2 ;SET TO INHIBIT INTERRUPTS ON ENTRY JSR PC,LPRSET ;RESET THE L/P JSR PC,LPCLR ;AND CLEAR THE L/P .ENDC ; ; .IFG NLP-1 $Q MTTIM1 ;BRANCH IF NOT A TASK DECB IOSTAT(R2) ;OTHERWISE, DECREMENT THE I/O IN PROGRES BNE MTTIM1 MOV R2,-(SP) ;GO TO OVERLAY MONITOR SO THE TASKS CORE JSR PC,RELTSK ; CAN BE RELEASED MTTIM1: CMPB TYPE(R0),#2 ;TYPE 2 EXIT BNE MTTIM2 MOV SYSTEM(R0),-(SP) ;PLACE TASK NUMBER ON STACK CLR -(SP) ;PUSH 0 ON STACK JSR PC,UNSPND TST (SP)%(SP)+ ; POP OF WORK WORD PCHR 30$: MOV (SP)+,R2 ; RESTORE R2 PCHR CLZ ; SET STATUS TO SYNTAX ERROR PCHR RTS PC ; PCHR .PAGE ; PCHR ; READ0 & WRT0 READ OR WRITE THE PATCH FILES SECTOR 0 INTO OR OUT OF PCHR ; THE BUFFER SZHEAD. ) R0T(UNCO C IN : C3PRMS K AC BCEPA SND AN) (NTMERENC I; C4PRMS BR ; R3R,PC#S S BI ) R0D(ORNW C IN ) R0T(UNCO C DE RDWAOR FCEPA SND AN) (NTMEREEC D; E IVATEG NIFR ;B C3PRMS I BM C2PRMS Q BE ) R0T(UNCO T TS C2PRMS L BP E IZALTINI;I T NITI,MPC R JS C5PRMS I BM RKMAE IL FOR FCKHE;C ATSTMT@# T TS E ETPLOM C/O IET;S R5' CLR R3 MOV #NLP,R0 MOV #LPINT0,R1 MOV #340,R2 MOV #8.,R4 ; LPNA00: MOV LPVECT(R3),R5 MOV R1,(R5)+ MOV R2,(R5)+ ADD R4,R1 JSR PC,LPRSET JSR PC,LPCLR TST (R3)+ .IFZ $1145 DEC R0 BGT LPNA00 .ENDC .IFNZ $1145 SOB R0,LPNA00 .ENDC .ENDC MOV (+ ;POP OFF ERROR CODE MTTIM2: JSR R5,POPR ;RESTORE REGISTERS RTS PC ;RETURN TO CALLER .PAGE ; MAGNETIC TAPE OPEN ; MOPEN: JSR PC,MTINIT BR MCL10 ;GO TO COMMON EXIT FOR OPEN/CLOSE ; ; ; MAGNETIC TAPE CLOSE ; MCLOS: CLR R4 MCL10: MOV SYSTEM(R0),R2 ;SET TASK NUMBER IN R2 BEQ MCL20 ;DONE IF NOT A TASK DECB IOSTAT(R2) ) PCHR ; PCHR ; READN & WRTN TRANSFER A DATA SECTOR VIA THE BUFFER SNHEAD. PCHR ; INPUT R4 = SECTOR NUMBER TO TRANSFER PCHR ; PCHR ; FOR ALL FOUR, AN ERROR WILL CAUSE A MESSAGE TO BE PRINTED AND CONTROL PCHR ; RETURNED NOT TO THE CALLER BUT TO THE MAIN PROGRAM TO ASK FOR PCHR ; ANOTHER REQUEST. R CL C:PRMS ; ) -N(+ RDCORE CEPA SE AP TICETGNMA; E AG.P PC S RT E ETPLOM C/O IET;S R5 R CL W:REMR ; D INEW R AERFT AORSSCERO PPTRUERNT IHE TBYD RETEENS INETIOU RISTH ; ; 10CL M P JM ) R02(ES R R CL 2:EWMR PC S RT 1:EWMR M OMTC#M,@R3 V MO R3D,EW#R S BI W2RE M E BN IT BNTOI PADLOT ES;T 2 ,#ATSTMT@# T BI 1 EWMR L BP T NITI,MPC R JS#LPFRST,R0 MOV #LPLAST,R1 MOV R1,R2 ; LPNA10: MOV R0,(R1)+ CLR (R0)+ ;IN THE PRIORITY QUEUES CMP R0,R2 BLO LPNA10 RTS PC .CSECT .ENDC .END , ;DEC I/O COUNT BNE MCL20 ;BR IF SOME I/O IN PROGRESS MOV R2,-(SP) JSR PC,RELTSK MCL20: RTS PC .PAGE ; M A G N E T I C T A P E R E A D ; R0 = ADDRESS OF LIST MREAD: ; INITIAL READ REQUEST JSR PC,MTINIT BPL MREA1 MOV DATA(R0),@#MTMEMO MOV NWORD(R0),@#MTWORD ; FORM READ COMMAND IN R3 BIS #READ,R3 ;INCLUSIVE OR UNIT NUMBER AND CO- PCHR ; PCHR WRT0: ; PCHR MOVB #WRTFN,SZFUN ; SET WRITE FUNCTION PCHR BR REDO10 ; PCHR ; PCHR READ0: ; . * ;*********************************************************************** .DEF UNMASK .REF QSAVE,MFLAG,DSPTCH ; .CSECT PSR = 177776 ; ; UNMASK = . MOV PSR,-(SP) ; PSR TO STACK FOR QSAVE MOV #1.,-(SP) ; SET UP FOR INVOLUNTARY SUSPENSION CLR MFLAG ; RESET THE TASK SOFTWARE PRIORITY ******** ; LOCKOUT BEFORE SUSPENDING THE TASK. ******** I:EWMR ; D N I W E R E P A T C I T E N G A M ; E AG.P ; PC S RT : O2WEMR E ETPLOM COT N/O IET;S R5 C IN : O3WEMR D ANMMCOE IV;G M OMTC#M,@R3 V MO NDMAOM C ; R3R,CK#B S BI AGFLE ACSPK AC BET;S) R01(1+ES,R00#2 VBMO O2WEMR L BP NDMAOM CCEPA SCKBAR FOE IZALTINI;I T NITI,MPC R JS O2WEMR Q BE T UNCOT EAEP RNTMEREEC;D 0)(RS1RE CBDE 0MMAND MOV R3,@#MTCOMM ;GIVE READ COMMAND MREA1: RTS PC ; ; THIS ROUTINE IS ENTERED AFTER A READ ATTEMPT OR A BACK SPACE RECORD ; ; R0 = ADDRESS OF LIST ; BYTE RES1 IS THE REREAD REPEAT COUNT ; BIT 15 OF RES1 IS THE BACK SPACE RECORD FLAG MRREA: CLR R5 ;SET I/O COMPLETE MOV RES1(R0),R1 ;LOAD BACKSPACE FLAG AND REPEAT COUNT BPL MRRE1 ;CONTINUE IF NOT SET 1 PCHR MOVB #RDFN,SZFUN ; SET READ FUNCTION PCHR REDO10: MOV #SZHEAD,DKADD ; SET ADDRESS FOR TRANSFER. PCHR BR IOCA00 ; GO TO COMMON CODE PCHR ; PCHR WRTN: ; PCHR MOVB #WRTFN,SNFUN ; SET WRITE FUNCTION PCHR BR REDN10 JSR PC,QSAVE ; OF CURRENT TASK JMP DSPTCH ; GO TO DISPATCHER TO CLEAN-UP QUEUES ; ; .END R41,#1 V MO O2WEMR L BP IT BGNSIN IIT BORRR ECELA;P 2 ,R#4 H AS 2 ,RATSTMT@# V MO : O1WEMR O3WEMR BR OFWE,MPC R JS T SET NOS IAGFLE ACSPK AC BIFH NCRA;B O1WEMR L BP 1 ,R0)(RS1RE V MO E ETPLOM C/O IET;S R5 R CL O:WEMR ; ONTIRAPE O F O ETERI WERFT AORSSCERO PPTRUERNT IHE TBYD RETEENS INETIOU RISTH; ; PC S RT : F1EOMW D ANMMCOE IV;G M OMTC#M4 JSR PC,MREAD BR MRRE3 MRRE1: MOV @#MTSTAT,R2 BMI MRRE6 ASH #4,R2 ;MOVE ERROR BIT INTO SIGN BIT BMI MRRE2 ;BRANCH IF ERROR SET ; PLACE WORD COUNT AND STATUS IN LIST, RETURN MRRE6: MOV NWORD(R0),R2 ;BUFFER SIZE SUB @#MTWORD,R2 ;MINUS WORD COUNT REGISTER MOV R2,COUNT(R0) ;SAVE IN LIST BR MRRE4 ; MRRE2: MOV #11,R4 DEC 5 ; PCHR ; PCHR READN: ; PCHR MOVB #RDFN,SNFUN ; SET READ FUNCTION PCHR REDN10: MOV R4,SNSEC ; SET SECTOR # TO TRANSFER PCHR MOV #SNHEAD,DKADD ; SET ADDRESS FOR TRANSFER. PCHR ; ;RETURN MTIN2: MOV #11,R4 BR MTIN3 ; .END ,@R3 V MO D ANMMCO ; R3M,RF#W S BI G LA FORRR EARLE;C R4 R CL NGRIE ITWRO NIFR ;B F1EOMW S BC T BIY RRCAN I 0IT BCELA;P R2 R AS 2 ,RATSTMT@# V MO DECO ORRR EET;S R44,#1 V MO F1EOMW L BP T NITI,MPC R JS F:EOMW ; K R A M E L I FE T I R W E P A T C I T E N G A M ; E AG.P ; PC S RT 3:WRMR E ETPLOM COT N/O8 RES1(R0) ; DEC REPEAT COUNT BEQ MRRE4 MRRE5: JSR PC,MTINIT BPL MRRE4 MOVB #200,RES1+1(R0) ;SET BACK SPACE FLAG BIS #BCKR,R3 ;R3 =BACK SPACE COMMAND MOV R3,@#MTCOMM ;GIVE BACK SPACE COMMAND MRRE3: INC R5 ;SET I/O NOT COMPLETE MRRE4: RTS PC .PAGE ; M A G N E T I C T A P E W R I T E ; R0 = ADDRESS OF LIST ; BYTE9 PCHR IOCA00: ; COMMON DISK I/O CODE PCHR MOV #DKLIST,-(SP) ; CALL EMT FOR TRANSFER. PCHR EMT $DSKIO ; PCHR TST DKERR ; ANY ERRORS PCHR BNE 10$ ; YES PCHR RTS PC ; NO - BACK TO CALLER PCHR 10$: MOV #MESS4,R0 ; COFD ADT GE; R4T,CNEQ#R V MO HRPC DECOOPE THR EACL; R TTLE R CL HRPC ; F D3FL R CL HRPC . NGNIEA MIN1 =- 0ESLUVA2 Y NL OTHWI; F D2FL R CL HRPC S.AGFLD ELFIE THR EACL; F D1FL R CL HRPC ; : RPTEIN HRPC + IET;S R5 C IN 5:WRMR D ANMMCOE IV;G M OMTC#M,@R3 V MO ; R3R,CK#B S BI AGFLE ACSPK AC BET;S) R01(1+ES,R00#2 VBMO O ER ZNENOH NCRA;B 3 WRMR L BP NDMAOM CCEPA SCKBAR FOE IZALTINI;I T NITI,MPC R JS 4:WRMR 3 WRMR Q BE T UNCOT EAEP RNTMEREEC;D 0)(RS1RE CBDE R41,#1 V MO 2:WRMR TERI WSTLAN OORRR E; 3 WRMR BR USATSTE AV;S ) R0S(TUTA,SATSTMT< RES1 IS REWRITE REPEAT COUNT ; BIT 15 OF RES1 IS BACK SPACE RECORD FLAG ; MWRIT: JSR PC,MTINIT BPL MWRI1 MOV #14,R4 ;SET ERROR CODE MOV @#MTSTAT,R2 ASR R2 ;PLACE BIT 0 IN CARRY BIT BCS MWRI1 ;BR IF NO WRITE RING CLR R4 ;CLEAR ERROR FLAG MOV DATA(R0),@#MTMEMO MOV NWORD(R0),@#MTWORD ; IS THIS THE FOURTH TRY MOV =YES- ERRORS DONE HERE. PCHR CMP DKERR,#9. ; FILE FULL? PCHR BNE 20$ ; NO. PCHR MOV #MESS3,R0 ; YES. TELL THE USER. PCHR 20$: JSR PC,TTYOUT ; PRINT ERROR MESSAGE PCHR TST (SP)+ ; GET RID OF CALLERS RETURN ADDRESS PCHR JMP STAA00 ; AND ASK FOR NEXT REQUES PCHR ; HRPC T.SER TTLE& S AGFLD ELFI& D ELFI UTTPOU ; HRPC UFQBREN INGRISTR TEACARCHT ESQURE T PUIN ; HRPC ; HRPC . ESLUVAT ULFADEF OSE UHE TID ATOD NEIGES DISD AND DEADE BAN CISTH; HRPC D.ELFID OI V ANGTIENESPRRE' '0H IT WRYIARTTEE BTOD NEIGES DEYTH; HRPC ; HRPC @# V MO 0)(RNTOU,CRDWOMT@# B SU T UNCOE AV;S ) R0T(UNCO),R0D(ORNW V MO T IS LINS TUTA SND ANTOU CRDWOE ACPL; ORRR EIFH NCRA;B 2 WRMR I BM IT BGNSIN IIT BORRR ECEAL;P 2 ,R#4 H AS 2 ,RATSTMT@# V MO 1:WRMR 5 WRMR BR ITWR,MPC R JS ET SOT NISE ACSPK AC BHE TIFH NCRA;B 1 WRMR L BP 1 ,R0)(RS1RE V MO E ETPLOM C/O IET;S R5 R CL I:WRMR RES1(R0),R2 ;LOAD REPEAT COUNT IN R2 BIC #177774,R2 BEQ MWRI2 ;BRANCH TO ISSUE WRITE WITH EXTENDED GAP ; ISSUE NORMAL WRITE BIS #WRIT,R3 ;OR IN WRITE COMMAND BR MWRI3 MWRI2: BIS #WEXG,R3 ;OR IN WRITE WITH EXTENDED GAP MWRI3: MOV R3,@#MTCOMM ;STORE IN COMMAND REGISTER MWRI1: RTS PC .PAGE ; THIS ROUTINE IS ENTERED BY THE INTERRUPT PROCESSOR AFTER WRITE COMMANDS ; .PAGE ; PCHR ; INTERP IS USED TO DECODE AN OPERATOR REQUEST INTO IT'S OPCODE AND PCHR ; FIELD VALUE(S). SYNTAX ERRORS ARE REPORTED TO THE CALLING ROUTINE, PCHR ; NOT THE TTY. PCHR ; THE FIELD FLAGS ARE USED CURRENTLY AS BINARY VALUES. PCHR ; = -1 IF NO VALUE IN THE RELATED FIELD PCHR ; = +1 IF THERE IS A VALUE ST READY BIT MTIN1: CMP FUNCT(R0),#1 ;OPEN COMMAND BEQ MTIN3 MOVB @#MTSTAT,R1 ;LOAD WITH BYTE SIGN EXTENDED BGT MTIN2 ;BRANCH IF BIT 7 WAS 0 MTIN3: RTS PC ;RETURN MTIN2: MOV #11,R4 BR MTIN3 ; .END .WORD SYDTM4 .RAD50 /SYDTM5/ .WORD SYDTM5 .RAD50 /SYDTM6/ .WORD SYDTM6 .RAD50 /SYDSK1/ .WORD SYDSK1 .RAD50 /SYDSK2/ .WORD SYDSK2 .RAD50 /SYDSK3/ .WORD SYDSK3 .RAD50 /SYDSK4/ .WORD SYDSK4 .RAD50 /SYDSK5/ .WORD SYDSK5 .RAD50 /SYDSK6/ .WORD SYDSK6 .RAD50 /BUFBEG/ .WORD BUFBEG .RAD50 /BUFLST/ .WORD