;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ; .TITLE RMON1 ;RESIDENT MONITOR VERSION 1 3 JULY 70 ; (REVISED 7 JULY TO ALLOCATE SYSTEM VECTORS 40-57 ;  AND ASSOCIATED CHANGES) ; (REVISED 6 OCT TO SEGMENT FOR RELOCATABLE ;  ASSEMBLY & LINKAGE. CURRENT ;  MODIFICATIONS INCORPORATED) ; .GLOBL SVT.,S.XIT,S.RSAV,S.RRES .GLOBL S.CDB,S.CDQ,S.GTB,S.RLB,RM.TRP ; ;VECTORS FOR DIRECT ACCESS TO MONITOR SEGMENTS: .=.+40 .WORD SVT.  ;START OF;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ; .TITLE RMON1 ;RESIDENT MONITOR VERSION 1 3 JULY 70 ; (REVISED 7 JULY TO ALLOCATE SYSTEM VECTORS 40-57 ;  AND ASSOCIATED CHANGES) ; (REVISED 6 OCT TO SEGMENT FOR RELOCATABLE ;  ASSEMBLY & LINKAGE. CURRENT ;  MODIFICATIONS INCORPORATED) ; .GLOBL SVT.,S.XIT,S.RSAV,S.RRES .GLOBL S.CDB,S.CDQ,S.GTB,S.RLB,RM.TRP ; ;VECTORS FOR DIRECT ACCESS TO MONITOR SEGMENTS: .=.+40 .WORD SVT.  ;START OF;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ; .TITLE RMON1 ;RESIDENT MONITOR VERSION 1 3 JULY 70 ; (REVISED 7 JULY TO ALLOCATE SYSTEM VECTORS 40-57 ;  AND ASSOCIATED CHANGES) ; (REVISED 6 OCT TO SEGMENT FOR RELOCATABLE ;  ASSEMBLY & LINKAGE. CURRENT ;  MODIFICATIONS INCORPORATED) ; .GLOBL SVT.,S.XIT,S.RSAV,S.RRES .GLOBL S.CDB,S.CDQ,S.GTB,S.RLB,RM.TRP ; ;VECTORS FOR DIRECT ACCESS TO MONITOR SEGMENTS: .=.+40 .WORD SVT.  ;START OF;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ; .TITLE RMON2 ;EMT HANDLER VERSION 1 ; RESIDENT MONITOR ROUTINE TO LINK USER ; TO OTHER MONITOR SERVICES ;NOTES:- ; 1. CONTENTS OF REGISTERS 0-5 SAVED ON STACK ; 2. IF ROUTINE IS RESIDENT, CONTROL WILL ; BE TRANSFERRED TO IT IMMEDIATELY ; 3. IF ONLY AVAILABLE ON DISK, ROUTINE WILL BE ; BROUGHT INTO MONITOR SWAP BUFFER WHEN ; CONVENIENT TO DO SO ; 4. I/O CALLS HOWEVER WILL ONLY BE HAND RESMON .WORD S.XIT  ;START OF COMMON EXIT .WORD S.RSAV  ;START OF REGISTER SAVE .WORD S.RRES  ;START OF REGISTER RESTORE .WORD S.CDB  ;START OF DRIVER QUEUE .WORD S.CDQ  ;START OF DRIVER DEQUEUE .WORD S.GTB  ;START OF GET BUFFER .WORD S.RLB  ;START OF RELEASE BUFFER ;TRAP FOR NON-INITIALISED HARDWARE VECTORS: .=.+374-60 JMP RM.TRP ; SYSTEM VECTOR TABLE (SVT) ; THIS TABLE CONTAINS SYSTEM CO RESMON .WORD S.XIT  ;START OF COMMON EXIT .WORD S.RSAV  ;START OF REGISTER SAVE .WORD S.RRES  ;START OF REGISTER RESTORE .WORD S.CDB  ;START OF DRIVER QUEUE .WORD S.CDQ  ;START OF DRIVER DEQUEUE .WORD S.GTB  ;START OF GET BUFFER .WORD S.RLB  ;START OF RELEASE BUFFER ;TRAP FOR NON-INITIALISED HARDWARE VECTORS: .=.+374-60 JMP RM.TRP ; SYSTEM VECTOR TABLE (SVT) ; THIS TABLE CONTAINS SYSTEM CO RESMON .WORD S.XIT  ;START OF COMMON EXIT .WORD S.RSAV  ;START OF REGISTER SAVE .WORD S.RRES  ;START OF REGISTER RESTORE .WORD S.CDB  ;START OF DRIVER QUEUE .WORD S.CDQ  ;START OF DRIVER DEQUEUE .WORD S.GTB  ;START OF GET BUFFER .WORD S.RLB  ;START OF RELEASE BUFFER ;TRAP FOR NON-INITIALISED HARDWARE VECTORS: .=.+374-60 JMP RM.TRP ; SYSTEM VECTOR TABLE (SVT) ; THIS TABLE CONTAINS SYSTEM CO LED IF ; PREVIOUS ACTION ON THE REQUIRED DATA-SET ; HAS BEEN COMPLETED ; (OTHERWISE TREATED AS .WAIT (Q.V. BELOW) ; 5. INCLUDES WAIT PROCESSORS (CALLED BY EMT 0 & 1) ; A) RETURNS TO USER IF DATASET NOT BUSY ; B) ON BUSY, .WAITR RETURNS TO USER SPECIFIED ; BUSY ADDRESS, WITH THE STACK CLEARED ; C) .WAIT LOOPS WITHIN MONITOR UNTIL FREE ; PARAMETERS ON THE STACK WILL NOT BE AFFECTED. ; 6. IN GENERAL, PRIORITY OF HANDLER WILL BE THAT ; OF CALLER EXCEPT WHEN POSSIBILIT NSTANTS ; AND POINTERS TO VARIOUS MAJOR SYSTEM AREAS, ; WHERE THESE MAY BE ACCESSED INDIRECTLY THRU ; VECTOR AT 40 ; THE SVT IS LOCATED AT THE BEGINNING ; OF THE MONITOR (NORMALLY LOC 400). ; ALL NAMES OF SVT ELEMENTS WILL BE ; EXTERNALLY DEFINED. ; .GLOBL SVT.,EOM,TOB,CSA,PLA,SCW,BAT,DCO .GLOBL MUS,OSW,PSA,DSA,RSA,WRA,DAT,TOD .GLOBL UIC,PGN,MRT,DDL,SSP,ENDM,MRT.,DDL. .GLOBL BFS,BFE,BF.STR,BF.END,WTL,KBA,MSB,MSB. ; SVT.: EOM: .WORD ENDM  ; END OF PERMANENT MNSTANTS ; AND POINTERS TO VARIOUS MAJOR SYSTEM AREAS, ; WHERE THESE MAY BE ACCESSED INDIRECTLY THRU ; VECTOR AT 40 ; THE SVT IS LOCATED AT THE BEGINNING ; OF THE MONITOR (NORMALLY LOC 400). ; ALL NAMES OF SVT ELEMENTS WILL BE ; EXTERNALLY DEFINED. ; .GLOBL SVT.,EOM,TOB,CSA,PLA,SCW,BAT,DCO .GLOBL MUS,OSW,PSA,DSA,RSA,WRA,DAT,TOD .GLOBL UIC,PGN,MRT,DDL,SSP,ENDM,MRT.,DDL. .GLOBL BFS,BFE,BF.STR,BF.END,WTL,KBA,MSB,MSB. ; SVT.: EOM: .WORD ENDM  ; END OF PERMANENT MNSTANTS ; AND POINTERS TO VARIOUS MAJOR SYSTEM AREAS, ; WHERE THESE MAY BE ACCESSED INDIRECTLY THRU ; VECTOR AT 40 ; THE SVT IS LOCATED AT THE BEGINNING ; OF THE MONITOR (NORMALLY LOC 400). ; ALL NAMES OF SVT ELEMENTS WILL BE ; EXTERNALLY DEFINED. ; .GLOBL SVT.,EOM,TOB,CSA,PLA,SCW,BAT,DCO .GLOBL MUS,OSW,PSA,DSA,RSA,WRA,DAT,TOD .GLOBL UIC,PGN,MRT,DDL,SSP,ENDM,MRT.,DDL. .GLOBL BFS,BFE,BF.STR,BF.END,WTL,KBA,MSB,MSB. ; SVT.: EOM: .WORD ENDM  ; END OF PERMANENT MY OF ; INTERRUPT MUST BE ELIMINATED ; 7. PARAMETERS OF CALL ARE EXPECTED TO BE ON THE ; STACK & WILL BE THE RESPONSIBILITY OF ; THE CALLED ROUTINE, NOT THE HANDLER ; 8. NEVERTHELESS, ON TRANSFER OF CONTROL TO THE ; ROUTINE, REGISTER CONTENT WILL BE AS FOLLOWS:- ; ; R0:- ADDRESS OF DDB FOR DATASET (I-O ONLY) * ; R1:- ADDRESS TO 1ST CALL PARAMETER ON STACK ; R2:- ADDRESS OF CALL IN USER PROGRAM ; R3:- (IRRELEVANT) ; R4:- (IRRELEVANT) ; R5:- ADDRESS OF PROONITOR TOB: .WORD ENDM+14  ; END OF BUFFER AREA CSA: .WORD 37776  ; LAST ADDRESS IN AVAILABLE CORE PLA: .WORD 0  ; PROGRAM LOAD ADDRESS SCW: .WORD 1  ; SYSTEM CONFIGURATION INDICATORS BAT: .WORD 0  ; POINTS TO DYNAMIC ASSIGNMENT TABLE DCO: .WORD 0  ; CHAIN OF INITED DDBS MUS: .BYTE 0,0  ; MONITOR USER SWITCH OSW: .WORD 0  ; OTHER SWITCH PSA: .WORD 0  ; PROGRAM START ADDRESS DSA: .WORD 0  ; DDT STARTING ADDVESS RSA: .WORD 0  ; RESTART ADDRESS WRA: .WONITOR TOB: .WORD ENDM+14  ; END OF BUFFER AREA CSA: .WORD 37776  ; LAST ADDRESS IN AVAILABLE CORE PLA: .WORD 0  ; PROGRAM LOAD ADDRESS SCW: .WORD 1  ; SYSTEM CONFIGURATION INDICATORS BAT: .WORD 0  ; POINTS TO DYNAMIC ASSIGNMENT TABLE DCO: .WORD 0  ; CHAIN OF INITED DDBS MUS: .BYTE 0,0  ; MONITOR USER SWITCH OSW: .WORD 0  ; OTHER SWITCH PSA: .WORD 0  ; PROGRAM START ADDRESS DSA: .WORD 0  ; DDT STARTING ADDVESS RSA: .WORD 0  ; RESTART ADDRESS WRA: .WONITOR TOB: .WORD ENDM+14  ; END OF BUFFER AREA CSA: .WORD 37776  ; LAST ADDRESS IN AVAILABLE CORE PLA: .WORD 0  ; PROGRAM LOAD ADDRESS SCW: .WORD 1  ; SYSTEM CONFIGURATION INDICATORS BAT: .WORD 0  ; POINTS TO DYNAMIC ASSIGNMENT TABLE DCO: .WORD 0  ; CHAIN OF INITED DDBS MUS: .BYTE 0,0  ; MONITOR USER SWITCH OSW: .WORD 0  ; OTHER SWITCH PSA: .WORD 0  ; PROGRAM START ADDRESS DSA: .WORD 0  ; DDT STARTING ADDVESS RSA: .WORD 0  ; RESTART ADDRESS WRA: .WCESSOR STATUS REGISTER ; (** FOR .INIT, WILL NORMALLY BE 0. NON-0 SIGNIFIES ; NEW .INIT ON ALREADY ESTAB. DATASET) ;ASSOCIATED INFORMATION: ; 1. MONITOR RESIDENCY TABLE FORMAT:- ; 1 WORD PER ENTRY RELATIVE TO CALL CODE ; CONTAINING:- ; A) MEMORY ADDRESS OF ROUTINE (INDICATED BY ; 0 IN JUNIOR BIT ; B) DISK INFORMATION FOR NON-RESIDENT ; ROUTINE (JUNIOR BIT = 1) ; C) 0 IN BITS 1-15, 1 IN BIT 0 IF ROUTINE IS ; NON-EXISTENT (CALLS ERROR DIAGNOSTIC) ; 2. SWAP AREA MORD WTL  ; WAIT RETURN ADDRESS DAT: .WORD 0  ; DATE IN JULIAN - 70,000 TOD: .WORD 0,0  ; TIME OF DAY CLOCK CELLS UIC: .WORD 0  ; USER IDENTIFICATION CODE PGN: .WORD 0,0  ; PROGRAM NAME (MOD 40) MRT: .WORD MRT.  ; START OF RESIDENCY TABLE DDL: .WORD DDL.  ; START OF DEVICE LIST SSP: .WORD 0  ; STACK POINTER SAVE (DUMP) BFS: .WORD BF.STR  ; START OF BUFFER ALLOC. TABLE BFE: .WORD BF.END  ; END OF BUFFER ALLOC TABLE WTL: BR .  ; WAIT LOOP FOR WAITS KBA: ORD WTL  ; WAIT RETURN ADDRESS DAT: .WORD 0  ; DATE IN JULIAN - 70,000 TOD: .WORD 0,0  ; TIME OF DAY CLOCK CELLS UIC: .WORD 0  ; USER IDENTIFICATION CODE PGN: .WORD 0,0  ; PROGRAM NAME (MOD 40) MRT: .WORD MRT.  ; START OF RESIDENCY TABLE DDL: .WORD DDL.  ; START OF DEVICE LIST SSP: .WORD 0  ; STACK POINTER SAVE (DUMP) BFS: .WORD BF.STR  ; START OF BUFFER ALLOC. TABLE BFE: .WORD BF.END  ; END OF BUFFER ALLOC TABLE WTL: BR .  ; WAIT LOOP FOR WAITS KBA: ORD WTL  ; WAIT RETURN ADDRESS DAT: .WORD 0  ; DATE IN JULIAN - 70,000 TOD: .WORD 0,0  ; TIME OF DAY CLOCK CELLS UIC: .WORD 0  ; USER IDENTIFICATION CODE PGN: .WORD 0,0  ; PROGRAM NAME (MOD 40) MRT: .WORD MRT.  ; START OF RESIDENCY TABLE DDL: .WORD DDL.  ; START OF DEVICE LIST SSP: .WORD 0  ; STACK POINTER SAVE (DUMP) BFS: .WORD BF.STR  ; START OF BUFFER ALLOC. TABLE BFE: .WORD BF.END  ; END OF BUFFER ALLOC TABLE WTL: BR .  ; WAIT LOOP FOR WAITS KBA: ANAGER:- ; CALLED TO HANDLE NON-RESIDENT ROUTINES:- ; A) REGISTERS WILL HAVE CONTENTS AS IN 8. ABOVE ; B) DISK INFO FROM MRT. WILL BE ON TOP OF STACK ; C) WILL USE I/O BUSY EXIT IF SWAP BUFFER IS ; NOT AVAILABLE R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL EMT.,S.RSAV,S.RRES,MRT.,M.IOMX,M.EMAX ;GENERAL ENTRY AT PRIORITY LEVEL 7: EMT.: JSR R5,S.RSAV ;SAVE REGISTERS ON STACK E.BRTN: CLR R5 ;.WORD 0  ; POINTER TO KB IN DDL MSB: .WORD MSB.  ; POINTER TO MAIN SWAP AREA ; .EOT ;MONITOR RESIDENCY TABLE: ; RESIDENT TABLE SHOWING CURRENT LOCATION OF ;  MONITOR SERVICE ROUTINES ;FORMAT:- ; 1 WORD FOR EACH ENTRY WITH THE POSITION OF EACH ;  BEING RELATIVE TO THE EMT CALL CODE ; 1) ROUTINE IS CORE-RESIDENT: ; ;  CORE ADDRESS (BIT 0 =0) ; ; 2) ROUTINE IS ONLY AVAILABLE IN DISK LIBRARY: ; ;  NO. OF B.WORD 0  ; POINTER TO KB IN DDL MSB: .WORD MSB.  ; POINTER TO MAIN SWAP AREA ; .EOT ;MONITOR RESIDENCY TABLE: ; RESIDENT TABLE SHOWING CURRENT LOCATION OF ;  MONITOR SERVICE ROUTINES ;FORMAT:- ; 1 WORD FOR EACH ENTRY WITH THE POSITION OF EACH ;  BEING RELATIVE TO THE EMT CALL CODE ; 1) ROUTINE IS CORE-RESIDENT: ; ;  CORE ADDRESS (BIT 0 =0) ; ; 2) ROUTINE IS ONLY AVAILABLE IN DISK LIBRARY: ; ;  NO. OF B.WORD 0  ; POINTER TO KB IN DDL MSB: .WORD MSB.  ; POINTER TO MAIN SWAP AREA ; .EOT ;MONITOR RESIDENCY TABLE: ; RESIDENT TABLE SHOWING CURRENT LOCATION OF ;  MONITOR SERVICE ROUTINES ;FORMAT:- ; 1 WORD FOR EACH ENTRY WITH THE POSITION OF EACH ;  BEING RELATIVE TO THE EMT CALL CODE ; 1) ROUTINE IS CORE-RESIDENT: ; ;  CORE ADDRESS (BIT 0 =0) ; ; 2) ROUTINE IS ONLY AVAILABLE IN DISK LIBRARY: ; ;  NO. OF BGET STATUS REGISTER POINTER MOV SP,R1 ;SET PTR TO CALL PARAMS. ADD #14,R1 MOV (R1)+,R2 ;GET RETURN ADDRESS MOV (R1)+,-(SP) ;SAVE CALL PRIORITY FOR LATER BIC #177437,@SP ;... ALL GARBAGE REMOVED! MOV @SP,-(R5) ;DROP TO IT NOW TSTB @R5 ;NOW STATUS SET ... BPL .+4 ;... CHECK PRL MOVB @PC,@R5 ;IF >4, REDUCE TO 4 MOV -(R2),R4 ;USE RTN. ADDR. TO GET CALL MOV #1402,R3 ;PREPARE FOR ERROR CMPB R4,#M.EMAX ;CALL WITHIN RANGE? BHI E.NOGO CLR RLOCKS (BITS 15-14 - 0:=4) ;  DISK START BLOCK (BITS 13-1) ;  NON-CORE RESIDENT SWITCH (BIT 0 = 1) ; ; 3) ROUTINE IS NOT AVAILABLE: ; ;  000001 ; ;GENERATED AT SYSTEM BUILD TO SHOW CORE RESIDENCY OF ; ONLY THOSE ROUTINES FORMING PART OF THE ; PERMANENTLY RESIDENT MONITOR ;USED BY:- ; 1) RUN-TIME LOADER: ;  ENABLES MODIFICATION OF THE RESIDENT ;  MONITOR TO MEET USER PROGRAM SPECIFICATIONS ;  (TABLE IS UPDATED TO SHOW CURRENT SITUATION) ; 2) EMT HANDLER: ;  USED AS A DLOCKS (BITS 15-14 - 0:=4) ;  DISK START BLOCK (BITS 13-1) ;  NON-CORE RESIDENT SWITCH (BIT 0 = 1) ; ; 3) ROUTINE IS NOT AVAILABLE: ; ;  000001 ; ;GENERATED AT SYSTEM BUILD TO SHOW CORE RESIDENCY OF ; ONLY THOSE ROUTINES FORMING PART OF THE ; PERMANENTLY RESIDENT MONITOR ;USED BY:- ; 1) RUN-TIME LOADER: ;  ENABLES MODIFICATION OF THE RESIDENT ;  MONITOR TO MEET USER PROGRAM SPECIFICATIONS ;  (TABLE IS UPDATED TO SHOW CURRENT SITUATION) ; 2) EMT HANDLER: ;  USED AS A DLOCKS (BITS 15-14 - 0:=4) ;  DISK START BLOCK (BITS 13-1) ;  NON-CORE RESIDENT SWITCH (BIT 0 = 1) ; ; 3) ROUTINE IS NOT AVAILABLE: ; ;  000001 ; ;GENERATED AT SYSTEM BUILD TO SHOW CORE RESIDENCY OF ; ONLY THOSE ROUTINES FORMING PART OF THE ; PERMANENTLY RESIDENT MONITOR ;USED BY:- ; 1) RUN-TIME LOADER: ;  ENABLES MODIFICATION OF THE RESIDENT ;  MONITOR TO MEET USER PROGRAM SPECIFICATIONS ;  (TABLE IS UPDATED TO SHOW CURRENT SITUATION) ; 2) EMT HANDLER: ;  USED AS A D 0 ;ZERO I/O SWITCH CMPB R4,#M.IOMX ;I/O CALL? BHI E.GO ;NO - OMIT NEXT SEQUENCE ;I/O CALL - CHECK IF DATASET FREE: TST -(R3) ;CHANGE ERROR TO I/O FAIL MOV @(R1)+,R0 ;GET DDB ADDRESS IF ANY BEQ E.VINT BISB #340,@R5 ;SET LEVEL 7 PRIORITY TST @R0 ;DATASET BUSY? BNE E.BSY BITB R5,R4 ;.WAIT/.WAITR? (R5 = 177776) BEQ E.NBSY ;NOT BUSY, SO EXIT MOV R2,@R0 ;OTHERWISE CLAIM DATASET MOVB @SP,@R5 ;RESTORE PRIORITY CMP (R3)+,-(R1) ;... !ESPATCH TABLE TO RESIDENT ;  ROUTINES OR TO PROVIDE ARGUMENTS FOR CALL ;  TO SWAP AREA MANAGER. ;  (NON-EXISTENT ROUTINES GIVE ERROR DIAGNOSTIC) ; 3) SWAP AREA MANAGER: ;  INFO RECEIVED FROM EMT HANDLER IS USED AS ;  CONTROL DATA FOR CHECKING CURRENT OCCUPANCY ;  OF MONITOR SWAP BUFFER AND FOR DISK INWARD ;  TRANSFER ; (N.B. COPY OF BASIC TABLE (PERMANENT RESIDENT MONITOR ONLY) ;  WILL BE HELD ON DISK FOR RESTORATION ;  OF CORE IMAGE AT PROGRAM TERMINATION) "ESPATCH TABLE TO RESIDENT ;  ROUTINES OR TO PROVIDE ARGUMENTS FOR CALL ;  TO SWAP AREA MANAGER. ;  (NON-EXISTENT ROUTINES GIVE ERROR DIAGNOSTIC) ; 3) SWAP AREA MANAGER: ;  INFO RECEIVED FROM EMT HANDLER IS USED AS ;  CONTROL DATA FOR CHECKING CURRENT OCCUPANCY ;  OF MONITOR SWAP BUFFER AND FOR DISK INWARD ;  TRANSFER ; (N.B. COPY OF BASIC TABLE (PERMANENT RESIDENT MONITOR ONLY) ;  WILL BE HELD ON DISK FOR RESTORATION ;  OF CORE IMAGE AT PROGRAM TERMINATION) #ESPATCH TABLE TO RESIDENT ;  ROUTINES OR TO PROVIDE ARGUMENTS FOR CALL ;  TO SWAP AREA MANAGER. ;  (NON-EXISTENT ROUTINES GIVE ERROR DIAGNOSTIC) ; 3) SWAP AREA MANAGER: ;  INFO RECEIVED FROM EMT HANDLER IS USED AS ;  CONTROL DATA FOR CHECKING CURRENT OCCUPANCY ;  OF MONITOR SWAP BUFFER AND FOR DISK INWARD ;  TRANSFER ; (N.B. COPY OF BASIC TABLE (PERMANENT RESIDENT MONITOR ONLY) ;  WILL BE HELD ON DISK FOR RESTORATION ;  OF CORE IMAGE AT PROGRAM TERMINATION) $& ERROR CODE ;CALL O.K. - DESPATCH TO IT: E.GO: ASL R4 ;USE CALL CODE TO BUILD ADD #MRT.-EMT-EMT,R4 ;.... MRT. POINTER MOV @R4,R4 ;GET TABLE ENTRY MOV R4,@SP ;STORE ON STACK TO CHECK ROR R4 ;.... IF CORE ADDRESS BCS SAM. ;IF NOT, TRY IF ON DISK MOV (SP)+,PC ;OTHERWISE GO TO IT ;NO DDB FOR I/O - CHECK FOR .INIT: E.VINT: CMPB R4,#6 ;MUST BE .INIT IF NO DDB BEQ E.GO-2 ;IF IT IS, CONTINUE% .GLOBL MRT.,EMT.,SAM.,M.IOMX,M.EMAX ; SECTION A - I/O CALLS .GLOBL RWN,RWR,INR,RLS,TRA,BLO,SPC,STT .GLOBL DIR,ALO,OPN,CLS,REN,DEL,APP,GAR,PRO MRT.: .WORD EMT. ;.WAITR (IN EMT HANDLER) 0 .WORD EMT. ;.WAIT (IN EMT HANDLER)  1 .WORD RWN ;.WRITE  2 .WORD RWR ;.RLWR (NYA) 3 .WORD RWN ;.READ  4 .WORD RWR ;.RLRD (NYA) 5 .WORD INR ;.INIT  6 .WORD RLS ;.RLSE  7 .WORD TRA ;.TRAN  & .GLOBL MRT.,EMT.,SAM.,M.IOMX,M.EMAX ; SECTION A - I/O CALLS .GLOBL RWN,RWR,INR,RLS,TRA,BLO,SPC,STT .GLOBL DIR,ALO,OPN,CLS,REN,DEL,APP,GAR,PRO MRT.: .WORD EMT. ;.WAITR (IN EMT HANDLER) 0 .WORD EMT. ;.WAIT (IN EMT HANDLER)  1 .WORD RWN ;.WRITE  2 .WORD RWR ;.RLWR (NYA) 3 .WORD RWN ;.READ  4 .WORD RWR ;.RLRD (NYA) 5 .WORD INR ;.INIT  6 .WORD RLS ;.RLSE  7 .WORD TRA ;.TRAN  ' .GLOBL MRT.,EMT.,SAM.,M.IOMX,M.EMAX ; SECTION A - I/O CALLS .GLOBL RWN,RWR,INR,RLS,TRA,BLO,SPC,STT .GLOBL DIR,ALO,OPN,CLS,REN,DEL,APP,GAR,PRO MRT.: .WORD EMT. ;.WAITR (IN EMT HANDLER) 0 .WORD EMT. ;.WAIT (IN EMT HANDLER)  1 .WORD RWN ;.WRITE  2 .WORD RWR ;.RLWR (NYA) 3 .WORD RWN ;.READ  4 .WORD RWR ;.RLRD (NYA) 5 .WORD INR ;.INIT  6 .WORD RLS ;.RLSE  7 .WORD TRA ;.TRAN  ( E.NOGO: MOV R2,@SP ;OTHERWISE ERROR ..... MOV R3,-(SP) ;GIVE CALL AS EVIDENCE IOT ;... & CALL DIAG PRT. ;I/O BUSY - MUST WAIT: E.BSY: NEGB R4 ;SET BUSY SW. (.WAITR STILL 0) MOV @R1,R2 ;SET BUSY ADDRESS FOR RETURN BR .+4 ;.... & CONTINUE BELOW ;WAIT CALLED BUT NOT BUSY: E.NBSY: TST (R2)+ ;SET UP NORMAL RETURN MOV (SP)+,(R5)+ ;RESTORE CALL PRIORITY TST -(R1) ;GO BACK TO 1ST CALL ARG. MOV R1,R0 ;SET SECOND POINTER ASRB R4 ;COME FROM E.)10 .WORD BLO ;.BLOCK (NYA) 11 .WORD SPC ;.SPEC (NYA) 12 .WORD STT ;.STAT (NYA) 13 .WORD DIR ;.DRECT  14 .WORD ALO ;.ALLOC  15 .WORD OPN ;.OPEN  16 .WORD CLS ;.CLOSE  17 .WORD REN ;.RENAM  20 .WORD DEL ;.DELET  21 .WORD APP ;.APPND  22 .WORD GAR ;.GRBGE  23 .WORD PRO ;.PRTCT  24 .WORD 1,1,1 ;(SPARES) 25-7 M.IOMX=27  ;MAX. I/O EMT CODES ; SECTION B *10 .WORD BLO ;.BLOCK (NYA) 11 .WORD SPC ;.SPEC (NYA) 12 .WORD STT ;.STAT (NYA) 13 .WORD DIR ;.DRECT  14 .WORD ALO ;.ALLOC  15 .WORD OPN ;.OPEN  16 .WORD CLS ;.CLOSE  17 .WORD REN ;.RENAM  20 .WORD DEL ;.DELET  21 .WORD APP ;.APPND  22 .WORD GAR ;.GRBGE  23 .WORD PRO ;.PRTCT  24 .WORD 1,1,1 ;(SPARES) 25-7 M.IOMX=27  ;MAX. I/O EMT CODES ; SECTION B +10 .WORD BLO ;.BLOCK (NYA) 11 .WORD SPC ;.SPEC (NYA) 12 .WORD STT ;.STAT (NYA) 13 .WORD DIR ;.DRECT  14 .WORD ALO ;.ALLOC  15 .WORD OPN ;.OPEN  16 .WORD CLS ;.CLOSE  17 .WORD REN ;.RENAM  20 .WORD DEL ;.DELET  21 .WORD APP ;.APPND  22 .WORD GAR ;.GRBGE  23 .WORD PRO ;.PRTCT  24 .WORD 1,1,1 ;(SPARES) 25-7 M.IOMX=27  ;MAX. I/O EMT CODES ; SECTION B ,BSY? BMI E.BRTN ;IF SO LOOP (NOT .WAITR) BCS .+4 ;BUILD INDEX (.WAIT=0) CMP (R5)+,(R0)+ ; (.WAITR=2) MOV -(R1),@R0 ;MOVE STATUS UP STACK MOV R2,-(R0) ;SET RETURN ADDRESS MOV R5,-(R1) ;STORE INDEX JSR R5,S.RRES ;RESTORE REGISTERS ADD (SP)+,SP ;ADJUST SP BY INDEX RTI ;RETURN TO CALLER ;SWAP AREA MANAGER VERSION 1 ; RESIDENT-- CALLS USING SUBSIDIARY SWAP AREA ; .GLOBL SM.SPE,KBL,EDP,KBI,GNM ; .WORD SM.SPE ;SAM CALL FOR KBI. OVLY 30 .WORD KBL ;KBD CMD LISTENER 31 .WORD EDP ;DIAGNOSTIC PRINT 32 .WORD KBI ;KBD CMD INTERPRETER 33 .WORD GNM ;GET NEW BIT-MAP (R/W) 34 .WORD 1,1,1 ;(SPARES)  35-7 ; SECTION C - OTHER MONITOR SERVICES ; .GLOBL GUT,CVT,FOP,FCR,FCL .GLOBL LUK,LBA,GMA,CBA,CKX,DLN,DCN,AP2 .GLOBL CSX,CSM,XIT,LDR,LD2,MTO ; .WORD SM.SPE ;SAM CALL FOR MSB OVLY 40.- CALLS USING SUBSIDIARY SWAP AREA ; .GLOBL SM.SPE,KBL,EDP,KBI,GNM ; .WORD SM.SPE ;SAM CALL FOR KBI. OVLY 30 .WORD KBL ;KBD CMD LISTENER 31 .WORD EDP ;DIAGNOSTIC PRINT 32 .WORD KBI ;KBD CMD INTERPRETER 33 .WORD GNM ;GET NEW BIT-MAP (R/W) 34 .WORD 1,1,1 ;(SPARES)  35-7 ; SECTION C - OTHER MONITOR SERVICES ; .GLOBL GUT,CVT,FOP,FCR,FCL .GLOBL LUK,LBA,GMA,CBA,CKX,DLN,DCN,AP2 .GLOBL CSX,CSM,XIT,LDR,LD2,MTO ; .WORD SM.SPE ;SAM CALL FOR MSB OVLY 40/- CALLS USING SUBSIDIARY SWAP AREA ; .GLOBL SM.SPE,KBL,EDP,KBI,GNM ; .WORD SM.SPE ;SAM CALL FOR KBI. OVLY 30 .WORD KBL ;KBD CMD LISTENER 31 .WORD EDP ;DIAGNOSTIC PRINT 32 .WORD KBI ;KBD CMD INTERPRETER 33 .WORD GNM ;GET NEW BIT-MAP (R/W) 34 .WORD 1,1,1 ;(SPARES)  35-7 ; SECTION C - OTHER MONITOR SERVICES ; .GLOBL GUT,CVT,FOP,FCR,FCL .GLOBL LUK,LBA,GMA,CBA,CKX,DLN,DCN,AP2 .GLOBL CSX,CSM,XIT,LDR,LD2,MTO ; .WORD SM.SPE ;SAM CALL FOR MSB OVLY 400 MONITOR ROUTINE TO CONTROL THE USAGE ; OF THE MONITOR SWAP BUFFER ; CALLED BY THE EMT HANDLER IN RESPONSE TO A ; USER PROGRAM REQUEST FOR A MONITOR ROUTINE ; AVAILABLE ONLY ON DISK ; MACHINE STATE AT CALL:- ; REGISTER 1 WILL CONTAIN STACK ADDRESS OF ; CALL PARAMETERS ; REGISTER 2 WILL CONTAIN CALL ADDRESS ; CONTENTS OF REGISTERS 3-4 ARE IRRELEVANT ; REGISTER 5 WILL CONTAIN STATUS REG. ADDR. ; REGISTER 0 WILL CONTAIN DDB ADDRESS (VALID ; ONLY IF CALL IS I/O AN1 .WORD GUT ;GENERAL UTILITY 41 .WORD CVT ;GENERAL CONVERSION 42 .WORD FOP ;FILE OPEN (I,E,U,C) 43 .WORD FCR ;FILE OPEN (O)  44 .WORD FCL ;FILE CLOSE  45 .WORD LUK ;FILE KOOK-UP  46 .WORD LBA ;FILE BLOCK ALLOC 47 .WORD GMA ;FILE GET BIT-MAP 50 .WORD CBA ;FILE CONTIG ALLOC 51 .WORD CKX ;FILE CHECK ACCESS 52 .WORD DLN ;FILE DELETE LINKED 53 .WORD DCN ;FILE DELETE CONTIG 54 .WORD AP2 ;FILE APPEND PART II 55 .WORD CSX ;COMMAM2 .WORD GUT ;GENERAL UTILITY 41 .WORD CVT ;GENERAL CONVERSION 42 .WORD FOP ;FILE OPEN (I,E,U,C) 43 .WORD FCR ;FILE OPEN (O)  44 .WORD FCL ;FILE CLOSE  45 .WORD LUK ;FILE KOOK-UP  46 .WORD LBA ;FILE BLOCK ALLOC 47 .WORD GMA ;FILE GET BIT-MAP 50 .WORD CBA ;FILE CONTIG ALLOC 51 .WORD CKX ;FILE CHECK ACCESS 52 .WORD DLN ;FILE DELETE LINKED 53 .WORD DCN ;FILE DELETE CONTIG 54 .WORD AP2 ;FILE APPEND PART II 55 .WORD CSX ;COMMAM3 .WORD GUT ;GENERAL UTILITY 41 .WORD CVT ;GENERAL CONVERSION 42 .WORD FOP ;FILE OPEN (I,E,U,C) 43 .WORD FCR ;FILE OPEN (O)  44 .WORD FCL ;FILE CLOSE  45 .WORD LUK ;FILE KOOK-UP  46 .WORD LBA ;FILE BLOCK ALLOC 47 .WORD GMA ;FILE GET BIT-MAP 50 .WORD CBA ;FILE CONTIG ALLOC 51 .WORD CKX ;FILE CHECK ACCESS 52 .WORD DLN ;FILE DELETE LINKED 53 .WORD DCN ;FILE DELETE CONTIG 54 .WORD AP2 ;FILE APPEND PART II 55 .WORD CSX ;COMMAM4D NOT 1ST .INIT) ; DISK INFO FROM MRT. FOR REQUIRED ROUTINE ; WILL BE ON TOP OF STACK FOLLOWED BY ; USER REGISTER CONTENTS ; REQUEST WILL BE HONOURED AS FOLLOWS:- ; A) IF CURRENT OCCUPANT OF SWAP BUFFER ; WILL SATISFY THE NEW REQUEST AND IT ; IS IDLE OR IS RE-ENTRANT (BECAUSE IT ; DOES NOT ITSELF CALL OTHER ROUTINES STORED ; ON DISK), CONTROL WILL PASS TO IT ; IMMEDIATELY WITH REGISTERS SET UP AS ON ENTRY ; B) IF THE SWAP BUFFER IS FREE OR THE ; CURRENT 5D SYNTAX ANALYSIS 56 .WORD CSM ;COMMAND STRING MANIPUL. 57 .WORD XIT ;.EXIT PROCESSOR 60 .WORD LDR ;PROGRAM LOADER  61 .WORD LD2 ; - " - ,PT 2  62 .WORD MTO ;SEQ. MAGTAPE OPEN 63 .WORD 1,1,1,1 ;(SPARE)  64-67 M.EMAX=67  ;MAX. EMT CODES (RE-ASSIGN IF EXTENDED) ; .EOT ;DEVICE DRIVER LIST VERSION 1 17 JUN 70 ; RESIDENT TABLE SHOWIN6D SYNTAX ANALYSIS 56 .WORD CSM ;COMMAND STRING MANIPUL. 57 .WORD XIT ;.EXIT PROCESSOR 60 .WORD LDR ;PROGRAM LOADER  61 .WORD LD2 ; - " - ,PT 2  62 .WORD MTO ;SEQ. MAGTAPE OPEN 63 .WORD 1,1,1,1 ;(SPARE)  64-67 M.EMAX=67  ;MAX. EMT CODES (RE-ASSIGN IF EXTENDED) ; .EOT ;DEVICE DRIVER LIST VERSION 1 17 JUN 70 ; RESIDENT TABLE SHOWIN7D SYNTAX ANALYSIS 56 .WORD CSM ;COMMAND STRING MANIPUL. 57 .WORD XIT ;.EXIT PROCESSOR 60 .WORD LDR ;PROGRAM LOADER  61 .WORD LD2 ; - " - ,PT 2  62 .WORD MTO ;SEQ. MAGTAPE OPEN 63 .WORD 1,1,1,1 ;(SPARE)  64-67 M.EMAX=67  ;MAX. EMT CODES (RE-ASSIGN IF EXTENDED) ; .EOT ;DEVICE DRIVER LIST VERSION 1 17 JUN 70 ; RESIDENT TABLE SHOWINHOCCUPANT HAS COMPLETED, THE NEW ROUTINE ; WILL BE BROUGHT IN FROM THE DISK. THE SWAP AREA ; MANAGER WILL RETAIN CONTROL UNTIL IT IS ; IN CORE, THEN HAND IT OVER WITH REGISTER ; CONTENT AS ON ENTRY. ; C) EDR, KBI & ASSOC RTNS WILL HOWEVER SHARE USE ; OF RESIDENT KBI AREA WITH SIMILAR RESTRICTION ; IF THE REQUEST CANNOT BE SATISFIED IMMEDIATELY ; BECAUSE EITHER THE CURRENT OCCUPANT IS NOT THE ; ONE TO MEET THE REQUEST OR IT WILL DO SO ; BUT IS NOT RE-ENTRANT, THE SWAP EG AVAILABILITY OF ;  DEVICE DRIVERS AND THEIR CURRENT ;  LOCATION ;FORMAT:- ; 4 WORDS PER ENTRY (POSITION IMMATERIAL EXCEPT ;  THAT THE ENTRY FOR THE SYSTEM DISK ;  MUST BE FIRST) ; GENERAL FORM: ; ;  WORD 1: DEVICE NAME (PACKED RADIX 50) ;  WORD 2: CORE LOAD ADDRESS OR 0 ;  WORD 3: INTERRUPT VECTOR ADDRESS ;  WORD 4: DISK START BLOCK (BITS 15 - 6) ;   NO. OF 16 WORD BLOCKS (BITS 5 - 0) ; ENTRY FOR SYSTEM DISK: ; (MUST BE IN FIRST 1024 BLOFG AVAILABILITY OF ;  DEVICE DRIVERS AND THEIR CURRENT ;  LOCATION ;FORMAT:- ; 4 WORDS PER ENTRY (POSITION IMMATERIAL EXCEPT ;  THAT THE ENTRY FOR THE SYSTEM DISK ;  MUST BE FIRST) ; GENERAL FORM: ; ;  WORD 1: DEVICE NAME (PACKED RADIX 50) ;  WORD 2: CORE LOAD ADDRESS OR 0 ;  WORD 3: INTERRUPT VECTOR ADDRESS ;  WORD 4: DISK START BLOCK (BITS 15 - 6) ;   NO. OF 16 WORD BLOCKS (BITS 5 - 0) ; ENTRY FOR SYSTEM DISK: ; (MUST BE IN FIRST 1024 BLOGG AVAILABILITY OF ;  DEVICE DRIVERS AND THEIR CURRENT ;  LOCATION ;FORMAT:- ; 4 WORDS PER ENTRY (POSITION IMMATERIAL EXCEPT ;  THAT THE ENTRY FOR THE SYSTEM DISK ;  MUST BE FIRST) ; GENERAL FORM: ; ;  WORD 1: DEVICE NAME (PACKED RADIX 50) ;  WORD 2: CORE LOAD ADDRESS OR 0 ;  WORD 3: INTERRUPT VECTOR ADDRESS ;  WORD 4: DISK START BLOCK (BITS 15 - 6) ;   NO. OF 16 WORD BLOCKS (BITS 5 - 0) ; ENTRY FOR SYSTEM DISK: ; (MUST BE IN FIRST 1024 BLO""""""" ""DDDDDDD@DD""""""""""DDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""" """" """ """""""" """DDDDDD """""""""DD!""@DD """""DDDDDD133ADDB Cr^\4dUrc\4dVr[\4dWr\4dlr\4dYr\4dZnr\4d[ x4dp|4dr4d x4d&t4d;vr ]4d:4dsr4d 4d o4d|4dCy4dy4dN`4dY4dP/4d74d;o4dT4d]y-4dz D4d}K4d K4d`T4dsE4d5f4df4dM4d 4d 4d!$DB8a ͋,L w:B ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * BICKS) ;  WORDS 1 - 3: AS ABOVE ;  WORD 4: ADDRESS OF LOCATION AFTER TABLE END ;   (USED FOR SEARCH CONTROL) ;GENERATED AT SYSTEM BUILD TIME ;USED BY:- ; 1) .INIT ROUTINE TO DETERMINE WHEN & WHENCE TO ;  LOAD A DRIVER REQUIRED BY THE USER ; 2) .RLSE ROUTINE TO CHECK CURRENT USAGE OF A ;  RESIDENT DRIVER BEFORE RECLAIMING ;  CORE IT OCCUPIES ; 3) KBD WAIT ROUTINE TO CHECK FOR I/O UNDERWAY .GLOBL DDL.,DF,KB,PJCKS) ;  WORDS 1 - 3: AS ABOVE ;  WORD 4: ADDRESS OF LOCATION AFTER TABLE END ;   (USED FOR SEARCH CONTROL) ;GENERATED AT SYSTEM BUILD TIME ;USED BY:- ; 1) .INIT ROUTINE TO DETERMINE WHEN & WHENCE TO ;  LOAD A DRIVER REQUIRED BY THE USER ; 2) .RLSE ROUTINE TO CHECK CURRENT USAGE OF A ;  RESIDENT DRIVER BEFORE RECLAIMING ;  CORE IT OCCUPIES ; 3) KBD WAIT ROUTINE TO CHECK FOR I/O UNDERWAY .GLOBL DDL.,DK,KB,PKCKS) ;  WORDS 1 - 3: AS ABOVE ;  WORD 4: ADDRESS OF LOCATION AFTER TABLE END ;   (USED FOR SEARCH CONTROL) ;GENERATED AT SYSTEM BUILD TIME ;USED BY:- ; 1) .INIT ROUTINE TO DETERMINE WHEN & WHENCE TO ;  LOAD A DRIVER REQUIRED BY THE USER ; 2) .RLSE ROUTINE TO CHECK CURRENT USAGE OF A ;  RESIDENT DRIVER BEFORE RECLAIMING ;  CORE IT OCCUPIES ; 3) KBD WAIT ROUTINE TO CHECK FOR I/O UNDERWAY .GLOBL DDL.,DC,KB,PLMANAGER WILL ; LOOP ON THE REQUEST BY RETURNING TO AN ; APPROPRIATE POINT IN THE EMT HANDLER. ; THE SWAP AREA MANAGER MUST RAISE PROCESSOR PRIORITY ; TO LEVEL 7 WHILE IT IS CHECKING BUFFER ; AVAILABILITY SINCE INTERRUPTS MIGHT POSSIBLY ; CORRUPT RESULTS. HOWEVER THE LEVEL WILL BE ; RETURNED TO THAT OF CALL AS SOON AS IT IS ; SAFE TO DO SO. ;(N.B. 1) SWAPPABLE ROUTINES ARE EXPECTED TO FOLLOW ; THE FORMAT:- ; RTN: .BYTE 0 ;IN USE SWITCH - MAY ; ;BE SET TO MR,PP,LP,DT,CR,MT,DK,DC ; ;SYSTEM DISK: DDL.: .RAD50 'DF'  ;NAME - PACKED 'DF ' .WORD DF  ;CORE ADDRESS .WORD 204  ;I.V. ADDRESS .WORD DDL.ND  ;END OF TABLE ;TELEPRINTER: .RAD50 'KB'  ;NAME - PACKED 'KB ' .WORD KB  ;NORMALLY NON-RESIDENT .WORD 60  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;P/T READER: .RAD50 'PR'  ;NAME - PACKED 'PR ' .WORD PR  ;NORMALLY NON-RESIDENT .WORD 70  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;P/T PUNCH: .RAD50 NR,PP,LP,DT,CR,MT,DF,DC ; ;SYSTEM DISK: DDL.: .RAD50 'DK'  ;NAME - PACKED 'DK ' .WORD DK  ;CORE ADDRESS .WORD 220  ;I.V. ADDRESS .WORD DDL.ND  ;END OF TABLE ;TELEPRINTER: .RAD50 'KB'  ;NAME - PACKED 'KB ' .WORD KB  ;NORMALLY NON-RESIDENT .WORD 60  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;P/T READER: .RAD50 'PR'  ;NAME - PACKED 'PR ' .WORD PR  ;NORMALLY NON-RESIDENT .WORD 70  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;P/T PUNCH: .RAD50 OR,PP,LP,DT,CR,MT,DK,DF ; ;SYSTEM DISK: DDL.: .RAD50 'DC'  ;NAME - PACKED 'DC ' .WORD DC  ;CORE ADDRESS .WORD 210  ;I.V. ADDRESS .WORD DDL.ND  ;END OF TABLE ;TELEPRINTER: .RAD50 'KB'  ;NAME - PACKED 'KB ' .WORD KB  ;NORMALLY NON-RESIDENT .WORD 60  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;P/T READER: .RAD50 'PR'  ;NAME - PACKED 'PR ' .WORD PR  ;NORMALLY NON-RESIDENT .WORD 70  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;P/T PUNCH: .RAD50 PNO OF USERS ; .BYTE 0 ;OR -1 TO SHOW RE-ENTRANT/ ; ;NOT RE-ENTRANT ; RTN.GO: ................. ; ; 2) THE CALLED ROUTINE MAY RETURN TO THE USER ; IF IT BECOMES I/O BOUND. HOWEVER ; IT MUST CLEAN UP THE STACK BEFORE ; SO DOING. IT MUST ALSO DECREMENT ; THE IN USE SWITCH ON FINAL EXIT) .GLOBL SAM.,MSB.,KBI.,S.CDB,S.CDQ,S.RRES,S.XIT .GLOBL SM.SPE,S.DDB ;ENTRY FOR BUFFER OVERLAY CALL: ; PROVIQ'PP'  ;NAME - PACKED 'PP ' .WORD PP  ;NORMALLY NON-RESIDENT .WORD 74  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;LINE PRINTER: .RAD50 'LP'  ;NAME - PACKED 'LP ' .WORD LP  ;NORMALLY NON-RESIDENT .WORD 200  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;DECTAPE: .RAD50 'DT'  ;NAME - PACKED 'DT ' .WORD DT  ;NORMALLY NON-RESIDENT .WORD 214  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;CARD READER: .RAD50 'CR'  ;NAME - PACKED 'CR' .WORD CR  ;NORMALR'PP'  ;NAME - PACKED 'PP ' .WORD PP  ;NORMALLY NON-RESIDENT .WORD 74  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;LINE PRINTER: .RAD50 'LP'  ;NAME - PACKED 'LP ' .WORD LP  ;NORMALLY NON-RESIDENT .WORD 200  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;DECTAPE: .RAD50 'DT'  ;NAME - PACKED 'DT ' .WORD DT  ;NORMALLY NON-RESIDENT .WORD 214  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;CARD READER: .RAD50 'CR'  ;NAME - PACKED 'CR' .WORD CR  ;NORMALS'PP'  ;NAME - PACKED 'PP ' .WORD PP  ;NORMALLY NON-RESIDENT .WORD 74  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;LINE PRINTER: .RAD50 'LP'  ;NAME - PACKED 'LP ' .WORD LP  ;NORMALLY NON-RESIDENT .WORD 200  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;DECTAPE: .RAD50 'DT'  ;NAME - PACKED 'DT ' .WORD DT  ;NORMALLY NON-RESIDENT .WORD 214  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;CARD READER: .RAD50 'CR'  ;NAME - PACKED 'CR' .WORD CR  ;NORMALTDES DIRECT CALL TO SAM. EXPECTS R0 ; SET TO DISK INFO FOR ROUTINE REQD. AS IN MRT. SM.SPE: MOV @SP,-(SP) ;SET STACK AS ON NORM ENTRY ;CHECK DISK INFO GIVEN IS VALID: SAM.: BIT R5,@SP ;ROUTINE ON DISK? (R5=177776) BEQ E.NOGO ;IF NOT SIGNAL ERROR MOV #MSB.,R4 ;SET POINTERS TO SWAP BUFFER MOV (R4)+,R3 ;... & SYSTEM DDB CMPB @R2,#30 ;THIS CALL FOR KBI AREA? BLO SM.CHK CMPB @R2,#40 BHIS SM.CHK MOV #KBI.,R4 ;IF SO SET UP TO USE IT ;CHECK IF SAM. WAITING: SULY NON-RESIDENT .WORD 230  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;MAGNETIC TAPE: .RAD50 'MT'  ;NAME - PACKED 'MT' .WORD MT  ;NORMALLY NON-RESIDENT .WORD 224  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;DISK PACK: .RAD50 'DK'  ;NAME - PACKED 'DK' .WORD DK  ;NORMALLY NON-RESIDENT .WORD 220  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;SMALL DISK: .RAD50 'DC'  ;NAME - PACKED 'DC' .WORD DC  ;NORMALLY NON-RESIDENT .WORD 210  ;I.V. ADDRESS .WVLY NON-RESIDENT .WORD 230  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;MAGNETIC TAPE: .RAD50 'MT'  ;NAME - PACKED 'MT' .WORD MT  ;NORMALLY NON-RESIDENT .WORD 224  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;LARGE FIXED DISK: .RAD50 'DF'  ;NAME - PACKED 'DF' .WORD DF  ;NORMALLY NON-RESIDENT .WORD 204  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;SMALL FIXED DISK: .RAD50 'DC'  ;NAME - PACKED 'DC' .WORD DC  ;NORMALLY NON-RESIDENT .WORD 210  ;I.V. WLY NON-RESIDENT .WORD 230  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;MAGNETIC TAPE: .RAD50 'MT'  ;NAME - PACKED 'MT' .WORD MT  ;NORMALLY NON-RESIDENT .WORD 224  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;DISK CARTRIDGE: .RAD50 'DK'  ;NAME - PACKED 'DK' .WORD DK  ;NORMALLY NON-RESIDENT .WORD 220  ;I.V. ADDRESS .WORD 0  ;DISK ADDRESS ;LARGE FIXED DISK: .RAD50 'DF'  ;NAME - PACKED 'DF' .WORD DF  ;NORMALLY NON-RESIDENT .WORD 204  ;I.V. ADXM.CHK: BISB @PC,@R5 ;STOP INTERRUPTS DURING CHECK MOV (R3)+,-(R3) ;WAITING ON SYS DDB? (******) BNE SM.BIU ;IF SO WAIT UNTIL DONE ;CHECK IF SWAP BUFFER OCCUPANT IS ONE REQUIRED: CMP @SP,(R4)+ ;CURRENT OCCUPANT REQUIRED? BNE SM.MOR ;NO - GO CHECK IF FINISHED TST @R4 ;YES - RE-ENTRANT? BPL SM.GO ;YES - GO USE AGAIN TSTB @R4 ;NO - IDLE THEN? BNE SM.BIU ;NO - MUST WAIT! SM.GO: INC (R4)+ ;YES - SET IN USE SWITCH MOV -(R1),@SP ;GET CALL PRIORORD 0  ;DISK ADDRESS DDL.ND: .END ADDRESS .WORD 0  ;DISK ADDRESS DDL.ND: .END DRESS .WORD 0  ;DISK ADDRESS DDL.ND: .END \ITY BIC @PC,@SP ;REMOVE ANY TRACE BIT CMP R0,(R1)+ ;RESET R1 (******) MOVB (SP)+,@R5 ;RESTORE CALL PRIORITY MOV R4,PC ;... & GO USE ROUTINE ;OCCUPANT NOT ONE REQUIRED - CHECK IF STILL BUSY: SM.MOR: TSTB @R4 ;OCCUPANT IN USE? BNE SM.BIU ;YES - MUST WAIT! MOV @SP,-(R4) ;SET DISK INFO AS IDENTIFIER MOV R0,-(SP) ;SAVE CURRENT R0 (I/O SW.) MOV R3,R0 ;HOLD SYS. DDB ADDRESS MOV R2,(R3)+ ;CLAIM SYS DSET FOR THIS CALL MOVB #200,@R5 ;DROP PRIORITY - S];COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ; .TITLE RMON3 ;RESIDENT MONITOR SUBROUTINES: ; 1) REGISTER SAVE & RESTORE ; 2) DRIVER QUEUE & DEQUEUE ; 3) BUFFER ALLOCATE & RELEASE ; ;MONITOR SAVE & RESTORE REGISTER ROUTINES: ; USED GENERALLY - THEREFORE DEEMED ESSENTIALLY ; RESIDENT ; ENTERED BY JSR R5,XXXXXX ; WHERE XXXXXX IS EFFECTIVE ADDRESS S.RSAV ; OR S.RRES (NON-RESIDENT ROUTINES ACCESS ; VIA LOCATIONS 44 & 46) ; ;THE SA^;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V000B .TITLE RMON4 ;DISK DRIVER (RF11) VERSION 1 ; RESIDENT MONITOR ROUTINE FOR SYSTEM USAGE ;  CONTAINS SET UP & TRANSFER ROUTINES ONLY R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL DF,S.RSAV,S.XIT ;TABLE OF STANDARDS AND POINTERS DF: .WORD 0  ;CURRENT DDB ADDRESS (0 IF IDLE) .BYTE 37  ;STANDARD FACILITY INDICATOR .BYTE 200  ;(NORMAL & FILE-BASED) .BYTE 4  ;STANDARD BUFF_;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C .TITLE RMON5 ;MINIMAL TELETYPE DRIVER VERSION 1 MAY 70 ; REVISED 1/12/70 TO PROVIDE FULL DRIVER INTERFACE ; ; RESIDENT MONITOR ROUTINE TO ALLOW OPERATOR ;  CONSOLE CONTROL ; ;OPERATIONS: ; 1) MONITORS ALL INTERRUPTS FROM CONSOLE TELEPRINTER ; 2) IF AN INPUT CHARACTER IS SEEN TO BE CTRL/C, WHICH ;  IS NOT PRECEDED BY ESC [OR ALT MODE], THE ;  FOLLOWING INPUT LINE UP TO 'RETURN' IS PASSED ;  `TOP KBD INT ;(****** - CARE!!!! USED AS LITERAL BY PREVIOUS INSTR.) ;CURRENT OCCUPANT DONE - GET NEW ROUTINE FROM DISK: MOV (R3)+,R1 ;SET DVR TFR RTN PTR(10 IN DDB) MOV (R4)+,@R3 ;GET DISK INFO. BIC #140001,@R3 ;EXTRACT DISK BLOCK NO. ... ASR (R3)+ ;(FROM BITS 1-13) MOV R4,(R3)+ ;FOLLOWED BY MEM ADDR MOV -(R4),@R3 ;GET BACK DISK INFO. BIC #37777,@R3 ;EXTRACT NO. OF BLOCKS ... BNE .+4 ;(FROM BITS aVE ROUTINE ALSO PERFORMS THE STACK MONITORING ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL S.RSAV,S.RRES,TOB,DDL.,MSB. ; S.RSAV: MOV R4,-(SP) ;PUSH REGISTER CONTENTS MOV R3,-(SP) ;(R5 SAVED BY ENTRY) MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) CMP SP,TOB ;VERIFY STACK VALIDITY BLOS S.SERR CMP @TOB,#107070 BNE S.SERR S.RSXT: MOV R5,PC ;XIT WITHOUT POP ; S.RRES: INC (SP)+ ;SCRAP ENTRY R5 MOV (SP)+,R0 ;... WITHOUT EFFECT ON C BIT bER SIZE/16 .BYTE DF.INT-DF ;T.V. CONTENT .BYTE 240  ;PRIORITY FOR T.V. .BYTE 0  ;DESPATCH TABLE .BYTE DF.TFR-DF ;SHOWS TFR RTN ONLY .BYTE 0 .BYTE 0 .BYTE 0  ;SPARE DF.NAM: .RAD50 'DF' .WORD DF.DIR  ;MFD BLOCK .WORD 0  ;REQUIRED FOR BIT MAP INFO ;TRANSFER INITIATE DF.TFR: MOV @PC,DF.RTC ;ZERO RETRY COUNT DF.RPT: MOVB @PC,@#DF.DCS+1 ;CLEAR DISK IN CASE OF ERROR MOV DF,R0  ;GET DDB ADDRESS CMP (R0)+,(R0)+ ;BUMP POcFOR PROCESSING TO A NOW SEPARATE LISTENING ;  ROUTINE CALLED INTO THE SUBSIDIARY SWAP ;  BUFFER (UNLESS ALREADT RESIDENT THEREIN). THE ;  LINE ITSELF WILL BE STORED IN A BUFFER OUTSIDE ;  THE SWAP AREA BASED ON POINTERS SET IN ;  REGISTERS BEFORE THE LISTENER IS CALLED. ; 3) DURING THE ACCEPTANCE OF THIS LINE, ALL OUTPUT ;  INTERRUPTS ARE PASSED TO THE LISTENER FOR ;  ECHO PROCESSING. ; 4) ON COMPLETION OF THE LINE, THE LISTENER WILL ;  CALL THE INTERPRETER TO PROCESS THE d14-15 (0:=4)) INC @R3 SWAB @R3 ;SWAP GIVES NO. OF WORDS NEG @R3 ;TWO'S COMP REQD. JSR PC,S.CDB ;GO GET ROUTINE MOV (SP)+,R0 ;GET BACK OLD R0 SM.BIU: MOV R0,(SP)+ ;TIDY UP STACK BEQ .+4 ;... & TEST IF I/O CALL CLR @R0 ;IF SO TEMP. FREE DATASET BR E.BRTN ;... & WAIT TILL IN ;RETURN AFTER ROUTINE IN SWAP BUFFER: SM.DUN: CLR -(SP) ;PREPARE FOR ERROR TST 12(R0) ;IS THERE ANY? BMI E.NOGO+4 ;IF SO WHAT ELSE???!!! MOV R0,@SP ;OTHERWISEe MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 RTS R5 ;RETURN WITH ALL REGS. ; ;STACK OVERFLOW: S.SERR: CMP @DDL.+2,MSB. ;SYS DSK WORKING FOR SYS? BEQ S.RSXT ;IF SO MUST LET THRU MOV 14(SP),R1 ;OTHERWISE ... MOV TOB,SP ; PROTECT FROM REPEAT ADD #100,SP ; OVERFLOW MOV #107070,@TOB MOV R1,-(SP) MOV #1401,-(SP) ;RETURN ADDR IS EVIDENCE IOT .EOT fINTER TO BLOCK NO. MOV #DF.DCS+12,R2 ;SET HWR POINTER MOVB @PC,R3  ;SET UP BLOCK CONVERSION MOV (R0)+,R4 ;GET BLOCK NUMBER (******) ASL R4  ;CONVERT TO WORDS ROLB R3 BCC .-4 MOV R3,-(R2) ;SET UP DISK ADDRESS & EXT. MOV R4,-(R2) MOV (R0)+,-(R2) ;MOVE IN WORD COUNT ... MOV (R0)+,-(R2) ;& MEMORY ADDRESS MOV (R0)+,R1 ;GET FUNCTION BISB @PC,R1  ;ADD INT ENB & GO BIC #177470,R1 ;REMOVE OTHER GARBAGE (******) MOV R1,-(R2) ;SEND TO CONTROL gASSUMED ;  MONITOR COMMAND. UNTIL THIS HAS BEEN EXECUTED ;  NO FURTHER INTERRUPTS FROM KEYBOARD OR PRINTER ;  WILL BE ALLOWED. ; 5) AT ALL OTHER TIMES, INTERRUPTS FROM EITHER SIDE ;  WILL BE BE PASSED TO THE FULL DRIVER ;  PROVIDED THAT IT IS KNOWN TO BE IN CORE. ;  THE INTERRUPT WILL BE IGNORED OTHERWISE. ;  (ESC (ALT MODE) WILL ONLY BE EFFECTIVE FOR ;  USER PROGRAM OPERATIONS - IT WILL HAVE NO ;  SIGNIFICANCE FOR MONITOR COMMANDS!!) ; ;ON ENTRY, THE C BIT WILL BE SET TOh SAVE DDB ADDR ... JSR PC,S.CDQ ;... WHILE FREE SYSTEM DISK CLR @(SP)+ ;....& SYSTEM DDB BR .+6 ;COMMON EXIT - CALLED BY ROUTINES POSS. IN MSB. S.XIT: DECB MSB.+4 ;REDUCE IN USE SWITCH JSR R5,S.RRES ;RESTORE USER REGS. RTI ;MONITOR DATASET DATA BLOCK: ; REQUIRED FOR USE OF SWAP AREA MANAGER ; THEREFORE ALWAYS RESIDENT ; NOT INCLUDED IN DDB CHAIN DDB.: .WORD 0 ;Q LINK (MON LINK NOT REQ.) .BYTi;MONITOR QUEUE & DEQUEUE DRIVER ROUTINES: ; REQUIRED BY SAM. FOR DISK SWAPPING OPERATIONS ; WILL HOWEVER BE USED BY ALL CALLS ; FOR DEVICE DRIVER SERVICES ;A) CHECK DRIVER BUSY: ; ENTERED VIA PC ; IF DRIVER IDLE, DESPATCHES TO REQUIRED SERVICE ; ROUTINE HAVING SET UP CALLER RETURN ; IF DRIVER BUSY, SETS CURRENT CALL INTO QUEUE ; BY PRIORITY & RETURNS TO CALLER ; EXPECTS THE FOLLOWING REGISTER CONTENTS:- ; A) R0jRTS PC  ;RETURN TO MONITOR FOR NOW ;(******) - CARE!!!! USED AS LITERAL BY PREVIOUS INSTRUCTION ;INTERRUPT SERVICE DF.INT: JSR R5,S.RSAV ;GO SAVE REGISTERS MOV #DF.DCS,R1 ;ERROR CAUSE INTERRUPT? MOV (R1)+,R2 BMI DF.ERR  ;YES - GO FIND CAUSE MOV DF,R0  ;GET DDB ADDRESS DF.XIT: MOV 14(R0),PC ;RETURN MONITOR ;ERROR ROUTINE: DF.ERR: BIT #11000,R2 ;PARITY OR MISSED? BEQ DF.OFF DF.AGN: ASL #0  ;YES - RETRIED 8 TIMES? DF.RTC=.-2 BCS Dk DIFFERENTIATE BETWEEN ; INPUT [0] & OUTPUT [1] ; ;ON EXIT TO USER DRIVER, THE C BIT WILL BE SIMILARLY SET &:- ; 1) INTERRUPT FOR APPROPRIATE SIDE WILL BE DISABLED ; 2) FOR INPUT, R0 WILL CONTAIN 8-BIT BYTE FROM ;  KEYBOARD BUFFER ; 3) INTERRUPT REGISTERS WILL BE STORED ON TOP ;  OF PROCESSOR STACK .GLOBL KBD.,KBI.,S.RSAV,S.XIT,MUS,KBA R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;COMMON ENTRY FOR ALL CONSOLE INTERRUPTS: .WORD K.IBF  ;REQD lE 0,0 ;CALL PRIORITY/DVR RTN PTR .WORD 0 ;DRIVER ADDRESS S.DDB: .WORD 0 ;BUSY FLAG (CALL ADDR IN USE) .WORD 10 ;USED TO DVR TFR RTN (*) .WORD 0 ;DEVICE START BLOCK .WORD MSB. ;BUFFER ADDRESS .WORD 0 ;WORD COUNT (2'S COMP) .BYTE 4,0 ;FUNCTION/UNIT ETC. .WORD SM.DUN ;COMPLETION RETURN .WORD 0 ;(*) - NORMALLY USED FOR USER LINE ADDR. (NOT REQD FOR SYS) ; ;MONITOR SWAP BUFFER: MSB.: .WORD S.DDB ;USED TO ACCESS SYSTEM DDB .WORD 0 ;Sm:- DDB ADDRESS ; B) R1:- POSITION OF ROUTINE ; REQUIRED IN DRIVER TABLE RELATIVE TO ; DRIVER START ADDRESS ; OPERATES AT CALL PRIORITY EXCEPT WHEN ; INTERRUPTS MIGHT INVALIDATE RESULT R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL S.CDB,S.CDQ ;CHECK DRIVER BUSY & DESPATCH IF IDLE: S.CDB: CLR R5 ;SET UP STATUS REGISTER ADDR. MOV -(R5),-(SP) ;SAVE PRIORITY (ONLY Z BIT SET) S.DVFA: MOV R0,R2 ;GET DRIVER ADDRESS MOV -(R2),R3 CLRB -(R2) ;CLEnF.PER  ;IF SO FORCE CONTINUE JSR PC,DF.RPT ;OTHERWISE TRY AGAIN DF.REC: JMP S.XIT+4  ;TAKE COMMON EXIT DF.PER: BIS #100000,12(R0) ;RETURN PARITY FAIL FLAG TST @R1  ;ALREADY AT BLOCK END? BEQ DF.XIT  ;IF SO EXIT NOW TST DF.RTC  ;OTHERWISE CHECK IF 2ND TIME BEQ DF.OFF  ;IF SO NO POINT IN MORE INC -(R1)  ;CONTINUE DISK TRANSFER BR DF.REC  ;... VIA COMMON EXIT ;ERROR IS NOT IMMEDIATELY RECOVERABLE: DF.OFF: CLR DF  ;FREE DISK FOR EDP MOV -(R1),-(SP)oFOR USE OF TMON KBD.: RORB K.CSAV  ;SAVE C BIT - SHOWS I OR O JSR R5,S.RSAV ;SAVE USER REGISTERS MOV #K.IBF,R5 ;SET PTR TO CONSTANT STRING MOV (R5)+,R1 ;USE IT TO GET PTRS:- MOV (R5)+,R2 ;...INPUT, ECHO ... MOV (R5)+,R3 ;... & PRINT MOV R5,-(SP) ;SAVE POSITION FOR EXIT MOV (R5)+,R4 ;THEN SET HWR PTR TSTB (R5)+  ;CHK ORIGINAL C BIT BMI K.TPGO  ;GO ELSEWHERE IF OUTPUT ;KEYBOARD CALL - CHECK DESTINATION: MOV -(R4),R0 ;GET INPUT BYTE & SAVE MOVB R0TORE FOR DISK INFO AS IDENT .WORD 0 ;IN USE/SHARABLE SWITCHES .=.+776 ;FIRST WORD ENTERED FROM DISK .END qAR QUEUE SWITCH BISB #340,@R5 ;RAISE PRIORITY FOR CHECK S.EQGO: MOV @R3,R4 ;IS DRIVER BUSY? BNE S.DBSY ;YES - R4 = DDB USING IT MOV R0,@R3 ;NO - CLAIM IT FOR THIS CALL MOVB (SP)+,@R5 ;SAFE NOW! DROP PRIORITY ADD R3,R1 ;BUILD POINTER TO DVR ENTRY BISB @R1,R4 ;(R4 CLEAR HERE) ADD R4,R3 ;GET ENTRY ADDRESS MOV R3,PC ;GO TO DRIVER ;DRIVER BUSY: S.DBSY: MOVB R1,@R2 ;SAVE IN DDB FOR L ;DISK STATUS IS EVIDENCE MOV #DF.ENO,-(SP) ;SET UP ERROR NO. IOT   ;GO TO DIAG. PRT. ;DEFINITIONS: DF.DCS=177460 DF.DIR=1 DF.ENO=1426 .END s,@R5  ;... & SET FOR CHECK BICB #200,@R5 ;STRIP ANY PARITY BEQ K.ESW  ;... & IGNORE NULLS TST R1  ;COMMAND INPUT ALREADY U/W? BNE K.KBGO  ;YES - MUST CONTINUE K.ESW: BR .+2  ;ESC SEEN LAST TIME? BR K.NESC  ;NO - NORMAL CHECK CLRB K.ESW  ;YES - CLEAR SWITCH MOV @KBA,R1  ;FULL DRIVER IN CORE? BNE K.DINC  ;IF SO GO TO IT K.NESC: CMPB @R5,#3  ;OTHERWISE IGNORE ... BNE K.TRYP  ;... & LOOK FOR CTL/C ;INTERPRETER ENTRY & EtuATER: MOVB @SP,-(R2) ;DRIVER POINTER & PRIORITY MOV R3,-(SP) ;SAVE DRIVER ADDRESS S.GETQ: MOVB @R2,@R5 ;DROP PRIORITY FOR NOW ADD #-6,R4 ;GET Q LINK IN ADDRESSED DDB MOV R4,R3 ;HOLD POINTER TO IT BISB #340,@R5 ;AGAIN STOP INTERRUPTS MOV @R4,R4 ;WHILE CHECK IF OTHERS IN Q BEQ S.NTRQ CMPB -4(R4),@R2 ;IF SO CHECK PRIORITY OF NEXT BHIS S.GETQ ;IF HIGHER, TRY AGAIN S.NTRQ: TST @(SP)+ ;CHECK IF DVR STILL BUSY BEQ S.DVFA ;IF NOT TAKE IT NOW (v;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003B .TITLE DF ;DISK DRIVER (RF11) VERSION 1 ; RESIDENT MONITOR ROUTINE FOR SYSTEM USAGE ;  CONTAINS SET UP & TRANSFER ROUTINES ONLY R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL DF,S.RSAV,S.XIT ;TABLE OF STANDARDS AND POINTERS DF: .WORD 0  ;CURRENT DDB ADDRESS (0 IF IDLE) .BYTE 37  ;STANDARD FACILITY INDICATOR .BYTE 200  ;(NORMAL & FILE-BASED) .BYTE 4  ;STANDARD BUFFER wXIT: K.KBGO: MOV #K.OBF,R0 ;STORE OUTBUFF START IF FND .. EMT .KBL  ;... & CALL LISTENER K.CMXT: MOV (SP)+,R5 ;GET BACK CONTROL PTR ... MOV R3,-(R5) ;... & USE TO SAVE THE REST MOV R2,-(R5) MOV R1,-(R5) JMP S.XIT+4  ;RETURN TO INTERRUPTED PROG. ;TRY USER PROGRAM CALL: K.TRYP:  MOV @KBA,R1  ;DRIVER IN CORE? BEQ K.CMXT  ;IGNORE CALL IF NOT INCB @R5  ;NOW CHK FOR ESC THIS TIME CMPB @R5,#176 ;... INCLUDING ALT MODE BGT .+10  ;... BUT NOT RUBOUT x;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V000A y*) MOV R4,-(R2) ;OTHERWISE THIS ONE GOES IN MOV R0,@R3 ;ADJUST LINKAGE ACCORDINGLY S.CXIT: MOVB (SP)+,@R5 ;RESTORE PRIORITY RTS PC ;RETURN TO CALLER UNTIL FREE ; ; (*) THE DRIVER MAY POSSIBLY FINISH DURING Q SEARCH! ;B) DRIVER HAS FINISHED - CHECK IF OTHERS WAITING: ; ENTERED VIA PC ; IF NO QUEUE, RETURNS TO CALLER ; OTHERWISE CLAIMS DRIVER FOR NEXT CALL IN LINE ; USING S.CDB TO SET UP DRIVER OPERATION zSIZE/16 .BYTE DF.INT-DF ;T.V. CONTENT .BYTE 240  ;PRIORITY FOR T.V. .BYTE 0  ;DESPATCH TABLE .BYTE DF.TFR-DF ;SHOWS TFR RTN ONLY .BYTE 0 .BYTE 0 .BYTE 0  ;SPARE DF.NAM: .RAD50 'DF' .WORD DF.DIR  ;MFD BLOCK .WORD 0  ;REQUIRED FOR BIT MAP INFO ;TRANSFER INITIATE DF.TFR: MOV @PC,DF.RTC ;ZERO RETRY COUNT DF.RPT: MOVB @PC,@#DF.DCS+1 ;CLEAR DISK IN CASE OF ERROR MOV DF,R0  ;GET DDB {CMPB @R5,#34 BNE .+6 INCB K.ESW  ;SET SWITCH IF FOUND DECB @R5  ;RESTORE ORIGINAL CHAR. ;COMMON EXIT TO USER PROGRAM CALL: K.DINC: CLR @SP  ;BUILD INTERRUPT ENTRY MOVB 5(R1),@SP ADD R1,@SP CLR -(R4)  ;DISABLE INTS FOR NOW ROLB -(R5)  ;SET C BIT FOR I OR O JMP @(SP)+  ;... & GO TO DRIVER ;PRINTER CALL - ALSO CHECK DESTINATION: K.TPGO: CLRB @R5  ;MAYBE USED AS SWITCH CLR (R4)+  ;DISABLE PRINT INTS TST R1  ;COMMAND I| .GLOBL CLOCK,TOD .TITLE CLK ; RESIDENT CLOCK SERVICE }; & THEN RETURNS TO CALLER ; EXPECTS R0 TO CONTAIN ADDRESS OF DDB JUST SERVICED ; OPERATES WITH SAME PRIORITY CONSTRAINTS AS S.CDB ;CHECK IF OTHERS WAITING: S.CDQ: CLR R5 ;SET UP STATUS REGISTER ADDRESS MOV 22(SP),-(SP) ;GET CALL PRIORITY BIC #177437,@SP MOV @SP,-(R5) ;DROP PRIORITY FOR MOMENT MOV -(R0),R3 ;GET DRIVER ADDRESS BISB @PC,@R5 ;RAISE PRIORITY TST -(R0) ;BUMP POINTER (******) CLR @R3 ;FREE DRIVER MOV -(R0),R2 ;CHECK IF Q WAITING BEQ ~ADDRESS CMP (R0)+,(R0)+ ;BUMP POINTER TO BLOCK NO. MOV #DF.DCS+12,R2 ;SET HWR POINTER MOVB @PC,R3  ;SET UP BLOCK CONVERSION MOV (R0)+,R4 ;GET BLOCK NUMBER (******) ASL R4  ;CONVERT TO WORDS ROLB R3 BCC .-4 MOV R3,-(R2) ;SET UP DISK ADDRESS & EXT. MOV R4,-(R2) MOV (R0)+,-(R2) ;MOVE IN WORD COUNT ... MOV (R0)+,-(R2) ;& MEMORY ADDRESS MOV (R0)+,R1 ;GET FUNCTION BISB @PC,R1  ;ADD INT ENB & GO BIC #177470,R1 ;REMOVE OTHER GARBAGE (******) NPUT U/W? BNE K.KBGO  ;IF SO GO TO KBL CMP R3,#K.OBF ;PRINT PTR AT START? BNE K.KBGO  ;NO - MUST BE FINISHING OFF! MOVB @R3,R0  ;DONE ANY COMMAND PRINT AT ALL? BEQ K.TRYP  ;IF NOT GO TRY USER PROG CLRB @R3  ;OTHERWISE CANCEL CURRENT USE MOV R0,-(R4) ;RESET TPS AS AT START BR K.CMXT  ;ALLOW INT TO RESTORE USER ;DATA AREA: K.IBF: .WORD 0  ;INPUT POINTER VALUE .WORD K.OBF+1  ;ECHO PTR STORE .WORD K.OBF  ;PRINT PTR STORE .WORD 177564  ;HWR ROUTINE ; INCREMENTS TOD FOR EVERY LINE INTERRUPT ; TOD IS TREATED AS TWO 15 BIT WORDS ; CLOCK: INC TOD+2  ; INCREMENT TIME OF DAY BVC CLOCKN INC TOD  ; DOUBLE PRECISION CLR TOD+2  ; RESET LOW ORDER CLOCKN: TST @#177546 ; RE-ENABLE INTERRUPT RTI .END S.CXIT ;NONE SO GO OUT VIA S.CDB EXIT CLR @R0 ;CLEAR Q LINK FROM THIS DDB MOV R2,R0 ;GET ADDRESS OF NEXT IN Q MOVB -3(R0),R1 ;RESTORE DVR ENTRY PTR BR S.EQGO ;USE S.CDB TO SET UP ACTION ;(******) - CARE!!!! USED AS LITERAL BY PREVIOUS INSTRUCTION .EOT ;BUFFER ALLOCATE & RELEASE ROUTINES: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=% MOV R1,-(R2) ;SEND TO CONTROL RTS PC  ;RETURN TO MONITOR FOR NOW ;(******) - CARE!!!! USED AS LITERAL BY PREVIOUS INSTRUCTION ;INTERRUPT SERVICE DF.INT: .IFDF SYSDV JSR R5,S.RSAV ;GO SAVE REGISTERS .ENDC .IFNDF SYSDV MOV @#V.RSAV,-(SP) JSR R5,@(SP)+ .ENDC MOV #DF.DCS,R1 ;ERROR CAUSE INTERRUPT? MOV (R1)+,R2 BMI DF.ERR  ;YES - GO FIND CAUSE MOV DF,R0  ;GET DDB ADDRESS DF.XIT: MOV 14PTR BASE K.CSAV: .BYTE 0  ;STORES ENTRY C BIT .=K.IBF+80. K.OBF: .BYTE 0  ;STORES USER TPS IF CMD INPUT .=.+7 .BYTE -1  ;STOP FOR ECHO STORAGE .BYTE 0  ;RESERVED FOR MARKER (./$) .WORD K.OBF ;SECONDARY SWAP BUFFER: ; NORMALLY OCCUPIED BY COMMAND INTERPRETER KBI.: .WORD 0  ;USED TO IDENTIFY OCCUPANT .BYTE 0,0  ;USED AS SWITCHES .=.+376 DECB KBI.+2  ;ALLOWS OCCUPANT TO FREE S/B EMT .SAM  ;CALLED FOR OVERLAY .SAM=30 .KBL=31  .TITLE DK ;DISK DRIVER (RK11) VERSION V003B ;COPYRIGHT DIGITAL EQUIPMENT CORPORATION ;MAYNARD, MASSACHUSETTS JUNE 1971 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 PC=%7 RKDS=177400 RKER=177402 RKCS=177404 RKWC=177406 RKBA=177410 RKDA=177412 RKDIR=1 S.RSAV=44 S.XIT=42 PS=177776 .GLOBL DK ;STANDARD DOS INTERFACE TABLE DK: .WORD 0  ;0 IF IDLE, DDB PTR OTHERWISE .WORD 102037 7 ;A) BUFFER ALLOCATE: ;CALLED BY:- ; MOV #N,-(SP) ; JSR R5,S.GTB ;OR '@54' ; ; WHERE 'N' IS THE NUMBER OF CONTIGUOUS ; 16-WORD BUFFERS REQUIRED. ; ;ON RETURN, STARTING ADDRESS OF BUFFER WILL BE ; ON TOP OF THE STACK. IF NONE AVAILABLE, ; 0 WILL REPLACE THIS ADDRESS. ; .GLOBL S.GTB,S.RSAV,S.RRES,EOM,BFS,BFE,TOB ; ;SET UP CHECK: S.GTB: JSR R5,S.RSAV ;SAVE CALLER REGISTERS MOV EOM,-(SP) ;GET START OF BUFFERS MOV #20,R0 ;SET MAGIC CONSTANT MOV SP,R5 ;G(R0),PC ;RETURN MONITOR ;ERROR ROUTINE: DF.ERR: BIT #11000,R2 ;PARITY OR MISSED? BEQ DF.OFF DF.AGN: ASL #0  ;YES - RETRIED 8 TIMES? DF.RTC=.-2 BCS DF.PER  ;IF SO FORCE CONTINUE JSR PC,DF.RPT ;OTHERWISE TRY AGAIN DF.REC: .IFDF SYSDV JMP S.XIT+4  ;TAKE COMMON EXIT .ENDC .IFNDF SYSDV MOV @#V.XIT,R5 JMP 4(R5) .ENDC DF.PER: BIS #100000,12(R0) ;RETURN PARITY FAIL FLAG TST @R1  ;ALREADY AT BLOCK END? BEQ DF.XIT  ;IF SO EXIT NOW TST DF.RTC .END  ;FACILITES WORD .BYTE 20  ;STD BUFFER SIZE IS 256. WORDS .BYTE DKINT-DK ;OFFSET TO INTERRUPT HANDLER .BYTE 240  ;PRIORITY LEVEL 5 .BYTE 0  ;NO OPEN ROUTINE .BYTE DKSTRT-DK ;OFFSET TO TRANSFER HANDLER .BYTE 0  ;NO CLOSE ROUTINE .BYTE 0  ;NO SPECIAL FUNCTIONS .BYTE 0  ;CURRENTLY UNUSED DKNAM: .RAD50 /DK/  ;DEVICE NAME .WORD RKDIR  ;FIRST MFD BLOCK .WORD 0,0,0,0,0,0,0,0 ;BIT MAP POINTERS DKSTRT: CLR DKREPT  ;CLEAR RETRY INDICATOR DKRTRYET CALL ARGUMENT PTR ADD R0,R5 ASL R0 ;NOW GET CONSTANT 40 MOV BFS,R4 ;GET ALLOC TABLE START MOV @R5,R3 ;SET BUFFER NO. CNT MOVB @PC,R2 ;.... & BIT MASK ;LOOK FOR FREE BUFFER: S.GBA: MOV (R4)+,R1 ;GET TABLE ENTRY (******) S.GBB: ADD R0,@SP ;TRACK END OF BUFFER CMP @SP,SP ;STACK TOO LOW? BHIS S.GBX ;IF SO ERROR!! BIT R2,R1 ;APPROP. BUFFER FREE? BEQ S.GBD ;IF SO LOOK FOR CONTIGUITY MOV @R5,R3 ;RESET COUNT (= NEW CHAIN) S.GBC: AS ;OTHERWISE CHECK IF 2ND TIME BEQ DF.OFF  ;IF SO NO POINT IN MORE INC -(R1)  ;CONTINUE DISK TRANSFER BR DF.REC  ;... VIA COMMON EXIT ;ERROR IS NOT IMMEDIATELY RECOVERABLE: DF.OFF: .IFDF SYSDV CLR DF  ;FREE DISK FOR EDP .ENDC MOV -(R1),-(SP) ;DISK STATUS IS EVIDENCE MOV #DF.ENO,-(SP) ;SET UP ERROR NO. IOT   ;GO TO DIAG. PRT. ;DEFINITIONS: DF.DCS=177460 DF.DIR=1 DF.ENO=1426 V.XIT=42 V.RSAV=44 .END ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V000B ; .TITLE DC ;DISK DRIVER (RC11) VERSION 1 ; IF RC11 IS THE SYSTEM DISK, A SHORT FORM OF THIS ; DRIVER MAY BE OBTAINED BY INCLUDING A DEFINITION ; FOR 'SYSDV'. FOR A SYSTEM BASED ON A DIFFERENT ; DISK, THIS DRIVER MAY BE ASSEMBLED WITH A ; DEFINITION AND RC11 MAY THEN BE TREATED AS JUST ; ANOTHER DEVICE. ; ; THIS VERSION CONTAINS SET-UP & TRANSFER ; ROUTINES ONLY. ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%: MOVB 13(R0),R1 ;GET UNIT IN R1(13-15) BIC #177770,R1 .IFDF MIXED .IFNDF LOWDEN MOV R1,R4  ;SAVE UNIT FOR LATER USE .ENDC .ENDC ROR R1  ;NOTE: 'C' STILL CLEAR HERE ROR R1 ROR R1 ROR R1  ;UNIT NOW AS DESIRED CMP (R0)+,(R0)+ ;POINTER DDB+BLOCK MOV (R0)+,R2 .IFDF MIXED .IFNDF LOWDEN MOV #1,R3 DKIN00: DEC R4 BMI DKIN05  ;GET HIGH/LOW DENSITY MASK ASL R3 BR DKIN00 DKIN05: BITB R3,DENIND ;IS THIS UNIT HIGH DENSITY? BEQ L R2 ;ADJUST MASK BCC S.GBB ;CONTINUE UNLESS NEW TABLE WD ROL R2 ;OTHERWISE RESET MASK CMP R4,BFE ;AT TABLE END? BLO S.GBA ;NO BUFFER AVAILABLE: S.GBX: CLR @SP ;IF SO NO BUFFER AVAILABLE BR S.GBF ;EXIT NOW! ;(****** - CARE!!!! USED AS LITERAL BY PREVIOUS INSTR.) ;CHECK FOR REQUIRED CONTIGUITY: S.GBD: DEC R3 ;REQD. NO. OF BUFFER UNITS? BNE S.GBC ;IF NOT CONTINUE SEARCH TST -(R4) 4 R5=%5 SP=%6 PC=%7 .GLOBL DC,S.RSAV,S.XIT ;TABLE OF STANDARDS AND POINTERS DC: .WORD 0  ;CURRENT DDB ADDRESS (0 IF IDLE) .BYTE 37  ;STANDARD FACILITY INDICATOR .BYTE 200  ;(NORMAL & FILE-BASED) .BYTE 4  ;STANDARD BUFFER SIZE/16 .BYTE DC.INT-DC ;T.V. CONTENT .BYTE 240  ;PRIORITY FOR T.V. .BYTE 0  ;DESPATCH TABLE .BYTE DC.TFR-DC ;SHOWS TFR RTN ONLY .BYTE 0 .BYTE 0 .BYTE 0  ;SPARE DC.NAM: .RAD50 'DC' .WORD DC.DIR  ;MFD BLOCK .WODKIN10  ;YES - BRANCH ASL R2 .ENDC .ENDC .IFDF LOWDEN ASL R2 .ENDC DKIN10: CMP R2,#4800. ;IS BLOCK WITHIN BOUNDS? BLO DKIN15  ;YES - BRANCH MOV -(R0),-(R6) ;OUTPUT ILLEGAL BLOCK NUMBER MOV #1435,-(R6) ;AND F035 IOT DKIN15: MOV #172000,R3 MOV #210,R4  ;CONVERT BLOCK NUMBER DKST00: ADD R3,R2  ;TO DISK ADDRESS BCS DKST05 SUB R3,R2 DKST05: ROL R2 ASL R4 BCC DKST00 MOV R2,R3 ASR R3 CLRB R3 SWAB R3 DKST10: ASL R2 ;GO BACK TO LAST TABLE ENTRY ;ADJUST TOP OF BUFFER MARK IF NECESSARY: MOV #TOB,R3 ;GET CURRENT TOP ADDRESS CMP @SP,@R3 ;NEW BUFFER BEYOND? BLO S.GBE MOV @SP,R1 ;IF SO GET NEW TOP ADD R0,R1 MOV @(R3)+,@R1 ;SET NEW STOPPER.... CLR @-(R3) ;.... & CLEAR OLD MOV R1,@R3 ;STORE NEW TOP ADDRESS ;ALLOCATE BUFFER UNITS: S.GBE: CLC ;PLAY SAFE WHILE .... BIS R2,@R4 ;ALLOCATE BUFFER UNIT ROR R2 ;ADJUST BIT MASK BCC .+6 ROR R2 ;IF NEXT ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003B ; .TITLE RWN ;READ/WRITE PROCESSOR VERSION 1 25/8/70 ; (REVISED 1/12/70 TO SATISFY REQUIREMENTS ; FOR COMPATIBILITY WITH PTS/IOX) ; ;THIS ROUTINE MUST CURRENTLY BE CORE-RESIDENT ; WHEN REQUIRED FOR USE. CHANGES MADE TO ; ALLOW NON-RESIDENCY IN AN EARLIER REVISION ; OF 7/9/70 HAVE BEEN REMOVED IN FAVOUR OF ; THE NEW REQUIREMENT. ; ; TRANSFERS USER DATA, LINE BY LINE, ; IN EITHER ASCII OR BINARRD 0  ;REQUIRED FOR BIT MAP INFO ;TRANSFER INITIATE DC.TFR: MOV @PC,DC.RTC ;ZERO RETRY COUNT MOV DC,R0  ;GET DDB ADDRESS DC.RPT: CMP (R0)+,(R0)+ ;BUMP POINTER TO BLOCK NO. MOV #DC.DCS-4,R2 ;SET HWR POINTER MOV (R0)+,@R2 ;MOVE IN BLOCK NO. ... ASL @R2  ;...MODIFIED ADD #10,R2  ;STEP TO MEMORY STORE MOV (R0)+,@R2 ;MOVE IN ADDR REQD. ... MOV (R0)+,-(R2) ;& WORD COUNT MOV (R0)+,R1 ;GET FUNCT ASL R4 BCC DKST10 BIC #160000,R2 ADD R3,R2 ADD R2,R1  ;PUT IN UNIT MOV #RKDA,R4 MOV R1,@R4  ;SET UP DISK ADDRESS MOV (R0)+,-(R4) ;SET UP MEMORY ADDRESS MOV (R0)+,-(R4) ;SET UP WORD COUNT MOV (R0)+,R1 ;PUT IN THE FUNCTION BISB @PC,R1  ;SET I.D.E. AND GO BITS BIC #177460,R1 ;CLEAR GARBAGE -*****- MOV R1,-(R4) ;SEND FUNCTION TO CONTROL RTS PC ; -*****- USED AS LITERAL BY THE PREVIOUS INSTRUCTION TABLE WORD.... TST -(R4) ;... ADJUST ACCORDINGLY SUB R0,@SP ;BUILD BUFFER START ADDR DEC @R5 ;MORE ALLOCATIONS? BNE S.GBE ;ALLOCATION COMPLETE - EXIT: S.GBF: MOV (SP)+,@R5 ;GIVE START ADDR TO CALLER JSR R5,S.RRES ;RESTORE HIS REGS. RTS R5 ;... & EXIT ;B) BUFFER RELEASE: ;CALLED BY:- ; MOV #ADDR,-(SP) ; MOV #N,-(SP) ; JSR R5,S.RLB ;OR '@56' ; ; WHERE 'ADDR' IS THE STARTING ADDRESY MODES, ; TO OR FROM AN INTERNAL DEVICE BUFFER. ; WHEN SUCH BUFFER REQUIRES DEVICE ACTION,THIS ; IS DONE IMMEDIATELY WITH A TEMPORARY RETURN ; TO THE USER FOR HIS ALTERNATIVE PROCESSING. ; ;CALLED BY FOLLOWING SEQUENCE:- ; MOV #LINE,-(SP) ; MOV #DDB,-(SP) ; EMT X (WHERE X= 2(WRITE) OR 4(READ) ; ;WHERE 'LINE' IS THE ADDRESS OF THE USER'S BUFFER ; PRECEDED BY 3-WORD HEADER (4 FOR DUMP MODE):- ; ; WORD 1:- MAX. LINE LENGTH (IGNORED ON WRITE; ; USER SUPPLIED ON READ) ; WION BISB @PC,R1  ;ADD INT ENB & GO BIC #177470,R1 ;REMOVE OTHER GARBAGE (******) MOV R1,-(R2) ;SEND TO CONTROL RTS PC  ;RETURN TO MONITOR FOR NOW ;(******) - CARE!!!! USED AS LITERAL BY PREVIOUS INSTRUCTION ;INTERRUPT SERVICE DC.INT: .IFDF SYSDV JSR R5,S.RSAV ;GO SAVE REGISTERS .ENDC .IFNDF SYSDV MOV @#V.RSAV,-(SP) JSR R5,@(SP)+ .ENDC MOV DC,R0  ;GET DDB ADDRESS MOV #DC.DCS-2,R1  ; INTERRUPT PROCESSOR DKINT: MOV @#S.RSAV,-(R6) JSR R5,@(R6)+ ;SAVE THE REGISTERS MOV DK,R0  ;GET THE DDB MOV #RKDS,R5 MOV (R5)+,R1 ;SAVE RKDS AND RKER FOR LATER MOV (R5)+,R2 MOV (R5)+,R4 ;SAVE RKCS CMP (R5)+,(R5)+ MOV @R5,R5  ;GET RKDA TST R4  ;ERROR? BMI DKERP  ;YES - BRANCH BIT #10,R4  ;WAS LAST FCN A DRIVE RESET? BNE DKER00  ;YES - BRANCH DKXIT: JMP @14(R0)  ;EXIT DKERP: ASL R4  ;HARD ERROR? S OF ; THE BUFFER AND 'N' IS THE NO. OF ; CONTIGUOUS 16-WORD UNITS IN THE BUFFER ; ;ON RETURN THE ARGUMENTS WILL BE REMOVED FROM THE ; STACK. NO ACTION WILL HAVE BEEN TAKEN IF ; THE ARGUMENTS PROVIDE INVALID REFS. ; .GLOBL S.RLB,S.RSAV,S.RRES,EOM,TOB,BFS,BFE ; ;FIND TOP OF BUFFER: S.RLB: JSR R5,S.RSAV ;SAVE CALLER REGS. MOV #20,R5 ;SET MAGIC CONSTANT MOV SP,R0 ;SET PTR TO CALL ARGS ADD R5,R0 MOV @R0,R1 ;GET BUFF START ADDR MOV EOM,R2 ;... STRT ADDR ORD 2:- ; BYTE COUNT (USER SUPPLIED ON WRITE; ; ADJUSTED BY SYSTEM TO SHOW ; ACTUAL COUNT ON RTN FOR BOTH) ; BYTE 1: STATUS (RETURNED BY READ PROCESSOR) ; WORD 3:- BYTES ACTUALLY TRANSFERRED (FROM SYSTEM) ; (WORD 4:- POINTER TO DUMP AREA (USER SUPPLIED)) ; ;AND 'DDB' IS THE ADDRESS OF POINTER TO DATASET DDB ;MODES: 0 FORMAT ASCII - INPUT LINE TERMINATED BY ; FORM CONTROL CHAR (NULLS & R/O ; ;GET PTR TO H/W REGS. MOV (R1)+,R3 ;SAVE ERROR STATUS REGS. BMI DC.AGN  ;IF DATA LATE SET TRY AGAIN MOV (R1)+,R2 ;ANY ERRORS SEEN? BMI DC.ERR  ;YES - GO FIND CAUSE DC.XIT: JMP @14(R0)  ;RETURN MONITOR ;ERROR ROUTINE: DC.ERR: ASL R2  ;CHECK ERROR CAUSE ... BPL DC.OFF  ;FOR DATA FAILURE ... ASL (PC)+  ;.... ALREADY RETRIED 8 TIMES? DC.RTC: .WORD 0 BCS DC.PER  ;IF SO FORCE CONTINUE DC.AGN: JSR PC,DC.RPT ;OTHERWISE TRY AGAIN DC.REC: .IFDF SYSDV J BMI DKHER  ;YES - BRANCH DKER00: SEC ROLB (PC)+  ;TRIED 8 TIMES? DKREPT: .WORD 0 BCS DKER10  ;YES - BRANCH DKER02: JSR PC,DKRTRY ;TRY AGAIN DKER05: MOV @#S.XIT,R5 CMP (R5)+,(R5)+ ;TAKE COMMON EXIT JMP @R5 DKER10: BIS #100000,12(R0) ;SET FAILURE FLAG TST @#RKWC  ;HAS WORD COUNT REACHED 0? BEQ DKXIT  ;YES - GO EXIT DKER15: MOV R2,-(R6) ;OUTPUT RKER MOV #1427,-(R6) ;AND F027 .IFDF SYSDV CLR DK  ;SET DRIVER FREE BIT #160000,R5 ;WAOF BUFF AREA SUB R2,R1 ;SET UP FOR TABLE PTR BMI S.RBX ;IF TOO LOW IGNORE CALL ASL R5 ;NOW GET 40 ADD R5,R2 ;GET TOP OF BUFFER COUNTER MOV -(R0),R3 ;GET COUNT OF BUFFER UNITS BLE S.RBX ;AGAIN IGNORE IF INVALID ADD R5,R1 ;GO TO TOP UNIT DEC R3 BNE .-4 ADD R1,R2 ;COMPLETE T.O.B. ADDR SUB R5,R1 ;ADJUST TOP UNIT PTR (START) ;DETERMINE BIT IN ALLOCATION MAP: INC R3 ;SET BIT MASK MOV R1,R4 ;HOLD TOP UNIT PTR CLRB R1 ;FIND DISCARDED); AN OUTPUT LINE ; IS TERMINATED ON BYTE COUNT. ; (HORIZ TAB FOLL. BY RUBOUT & ; VERT FORM CTL BY NULLS) ; 1 FORMAT BINARY - HDRS 2 & 3 INCL. ; IN DATA (BYTE CNT CONTROLS ; TRANSFER);LONGTITUDINAL ; CHECKSUM BUILT UP ON WRITE ; & VERIFIED ON READ ; 2 UNFORMATTED ASCII - NO CHECKING; ; WHOLE LINE TRANSFERRED (7-BITS) ; 3 UNFORMATTED BINARY - AS UNF ASC (8-BITS) ; 4-7 DUMP - AS MODES 0-3 BUT FROM ; MP S.XIT+4  ;TAKE COMMON EXIT .ENDC .IFNDF SYSDV MOV @#V.XIT,R5 JMP 4(R5) .ENDC DC.PER: ASL R3  ;IF DATA SYNC ERR. NOW ... BPL DC.OFF  ;... TREAT AS FATAL BIS #100000,12(R0) ;RETURN PARITY FAIL FLAG TST @R1  ;ALREADY AT BLOCK END? BEQ DC.XIT  ;IF SO EXIT NOW MOV @PC,DC.RTC ;NO MORE REPEAT TRIES NOW INC -(R1)  ;CONTINUE DISK TRANSFER BR DC.REC  ;... VIA COMMON EXIT ;ERROR IS NOT IMMEDIATELY RECOVERABLE: DC.OFF: .IFDF SYSDV CLR DC  S THIS UNIT 0? BNE DKER20  ;NO - BRANCH CLR @R6 .ENDC DKER20: IOT   ;OUTPUT THE MESSAGE DKHER: MOV #RKCS,R3 MOV #1,@R3  ;CLEAR THE CONTROL DKHR00: TSTB @R3  ;DONE YET? BPL DKHR00  ;NO - LOOP BIT #1000,R1 ;IS IT SEEK INCOMPLETE? BEQ DKHR05  ;NO - BRANCH BIC #17777,R1 ;GET RID OF GARBAGE, AND MOVB #115,R1  ;SET UP FOR DRIVE RESET MOV R1,@R3 BR DKER05  ;TAKE INTERIM EXIT DKHR05: BIT #11400,R2 ;CAN WE POSSIBLY GO ON? BNE DKER00  ; WORD IN TABLE SWAB R1 ;(I.E. DIVIDE BY 256X2) BIC R3,R1 ADD BFS,R1 ;USE TO SET TABLE PTR BIC #177000,R4 ;FIND BIT IN WORD BEQ S.RBA ;I.E. DIVIDE BY 16X2 ... ASL R3 ;...& SHIFT BIT TO POSITION) SUB R5,R4 BGT .-4 BLT S.RBX ;IF REMAINDER ADDR INVALID ;CHECK TOP OF BUFFER: S.RBA: CMP R2,TOB ;LAST BUFFER ALLOCATED? BHI S.RBX ;IF TOO HIGH ADDR ERROR BLO .+6 MOV #TOB,R4 ;A NON-ADJACENT BUFFER. ; SPECIAL TREATMENT WITHIN THESE MODES IS ; PROVIDED AS FOLLOWS:- ; ; BIT 3 [+10] - FORMATTED ASCII ALSO INCLUDES ; PARITY GENERATION OR CHECKING; IN ; UNFORMATTED ASCII 8-BITS RATHER THAN ; 7 ARE CONSIDERED ; BIT 4 [+20] - ON INPUT, EXCESS ON LINE ; OVERFLOW IN FORMATTED MODES (LOST IN ; NORMAL MODE) IS RETAINED FOR ; USER ACCESS ON NEXT READ. (FOR FORMAT ; BINARY, BYTE COUNT RETURNED IS FULL ; INPUT LINE SIZE); ON;FREE DISK FOR EDP .ENDC MOV -(R1),-(SP) ;DISK STATUS IS EVIDENCE MOV #DC.ENO,-(SP) ;SET UP ERROR NO. IOT   ;GO TO DIAG. PRT. ;DEFINITIONS: DC.DCS=177446 DC.DIR=1 DC.ENO=1426 V.RSAV=44 V.XIT=42 .END YES - BRANCH BIT #20000,R2 ;IS IT WRITE LOCK OUT? BEQ DKER15  ;NO - BRANCH .IFDF SYSDV  ;WHEN USED FOR SYSTEM ... MOV DK,-(R6) ;... SAVE BUSY FLAG CLR DK  ;CLEAR TO ALLOW EDP .ENDC MOV DKNAM,-(R6) ;OUTPUT NAME MOV #402,-(R6) ;AND A002 IOT .IFDF SYSDV  ;ON RETURN PERHAPS ... MOV (R6)+,DK ;... RESTORE BUSY FLAG .ENDC BR DKER02  ;GO DO IT AGAIN .IFDF MIXED .IFNDF LOWDEN DENIND: .BYTE CONFIG  ;DENSITY INDICATOR    ;ONE (1) SET SWITCH FOR LATER ;RELEASE BUFFER: S.RBB: BIC R3,@R1 ;FREE BUFFER UNIT SUB R5,R2 ;REDUCE TOB PTR ROR R3 ;ADJUST BIT MASK BCC S.RBC ROR R3 ;GO TO NEXT TABLE WORD TST -(R1) ;... WHEN NECESSARY S.RBC: DEC @R0 ;FREED ALL UNITS? BGT S.RBB ;DE-ALLOCATE FURTHER IF POSSIBLE: TST R4 ;THIS LAST BUFFER? BEQ S.RBE ;IF SO EXIT NOW CMP R1,BFS ;ALL BUFFERS GONE? BLO S.RBD BIT R3,@R1 ;IF NOT NEXT UNIT FREE? BEQ S.RBB+2 ;IF SO GO T OUTPUT, FORMATTED ; ASCII LINES TERMINATE AT DELIMITER. ; BIT 7 [+|200] - SIGNIFIES ECHO SUPPRESS AT ; TERMINAL DEVICE. ;STATUS: BIT 7:-DEVICE PARITY ERROR ; BIT 6:- E.O.M. ; BIT 5:- E.O.F. ; BIT 3-4:- (SPARE) ; BIT 2:- CHARACTER PARITY ERROR ; BIT 1:- CHECKSUM ERROR ; BIT 0:- INVALID LINE ERROR ;ON ENTRY, EXPECTS USER REGISTERS ON TOP OF STACK, ; R0 = DDB ADDRESS, R1 = STACK ADDRESS OF DDB POINTER ; & R5 = -2 ;ON EXIT, USER REGISTERS RESTORED & STACK ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V004A .TITLE RMON6 .GLOBL S.RSAV,S.RRES,S.CDB,S.CDQ,S.DDB,EOM,BFE .GLOBL DDL.,MRT.,EMT.,CSA,KBD.,MUS,TOB,DAT .GLOBL BF.STR,RM.TRP,BF.END,ENDM,CLOCK,KBA SP=%6 ; UNINITIALIZED VECTORS SERVICE ROUTINE ; ALL SUCH ARE SET TO TRAP TO THIS ROUTINE WITH A CODE IN ; BITS 1,2,3 OF THE STATUS WORD AS FOLLOWS: ; ; 1 -- ERROR TRAP 4 ; 2 -- RESERVED INSTRUCTION TRAP 10 ; 3 -- TRACE TRAP 14 ; 4 -- POWER FAIL TRAP MEANS LOW DENSITY    ;E.G.,IF BIT 3=1,THEN UNIT    ;3 IS LOW DENSITY. THE    ;RIGHTMOST BIT, BIT 0,    ;IS FOR UNIT 0 .ENDC .ENDC .END O NEXT ;ALL DONE - ADJSUT TOB MARKER & EXIT: S.RBD: MOV @(R4)+,@R2 ;SET NEW STOP MARK CLR @-(R4) ;... & CLEAR OLD MOV R2,@R4 ;SET NEW LIMIT S.RBE: JSR R5,S.RRES ;RESTORE CALLER REGS. MOV (SP)+,@SP ;CLEAR ARGS OFF STACK MOV (SP)+,@SP RTS R5 S.RBX=S.RBE .END CLEARED; ; USER LINE TRANSFERRED AND STATUS & BYTE ; COUNT RECORDED IN HEADER. ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;COMMON ROUTINES FOR BOTH READ & WRITE PROCESSING: ; ; ; 1) GENERAL INITIALISATION: ; ;OPERATIONS: ; 1) COLLECTS CALL ARGS & SAVES IN DDB ; 2) CLEARS STACK TO ENABLE INTERMED. USER RTNS. ; ;ON ENTRY, REGISTERS ARE EXPECTED AS FOLLOWS: ; R0 = ADDRESS OF DDB ; R1 =24 ; 5 -- TRAP INSTRUCTION TRAP 34 ; 7 -- UNEXPECTED INTERRRUPT ; RM.TRP: MOV @#177776,-(SP) ; CODE FROM STATUS MOVB #3,1(SP) ; FATAL ERROR CMP -(SP),-(SP) ; FAKE IOT ; ; ; ; SYSTEM ERROR ROUTINE S.ERR: TST 4(SP) BEQ S.DERR  ; SYS DISK FAILURE EMT 32  ; GO DIAGNOSE OTHERWISE S.DERR: MOV #125252,%0 HALT   ; HALT ON DISK FAILURE BR .-2  ; HANG ; ; ; BUFFER ALLOCATION TABLE BF.STR: .WORD 0,0,0,0,0,0,0,0 ; 128 BUFFERS FOR NOW BF.END: ENDM=. R0=%0 ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V002A ; .TITLE INR .GLOBL INR R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; INIT PROCESSOR ; POTENTIALLY NON RESIDENT ; THIS ROUTINE IS CALLED UPON BY THE USER AS THE ; FIRST ACTION ON A DATASET TO ENSURE DRIVER RESIDENCE ; AND SET UP A DDB. ; ; CALLING SEQUENCE ; MOV #LINKBLK,-(SP) ; EMT 6 ; ; WHERE THE LINKBLK HAS THE FORMAT ; .WORD ERROR ; .WORD 0 (DDB) ; .RAD50 [LOGICAL NAME;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V000B .TITLE RLS .GLOBL RLS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; RELEASE ROUTINE TO RELEASE DDB AND DRIVER ; ; CALL SEQUENCE ; MOV #LINK BLOCK,-(SP) ; EMT 7 ; ; THE LINK BLOCK IS USED ONLY AS THE DDB POINTER ; RL.UCT: .BYTE 0,-1   ; NOT REENTRANT (FOR SAM) ;CHECK IF CLOSE DONE: RLS: MOV R1,R2  ;SAVE USER LINK ADDRESS MOV (R2)+,2(R0) MOV -(R1),-(R2) ;... & REMOVE ADDRESS ON STACK OF 1ST CALL ARG ; R2 = ADDRESS OF CALL IN USER PROGRAM ; R5 = ADDRESS OF PROCESSOR STATUS (I.E. -2) ; ;ON EXIT, R0 WILL BE THE SAME, OTHERS ARE IRRELEVANT ; .GLOBL RWN ; RW.: .BYTE 0,-1 ;IN USE/SHARABLE SWITCH ; ;COLLECT ARGS & STORE - CLEAR STACK RWN: ADD PC,R5 ;SAVE THIS ADDRESS MOV R1,R3 ;SAVE ARG POINTER CMP (R3)+,(R0)+ ;SAVE USER LINE ADDR MOV (R3)+,@R0 ;.... & CALL ADDR MOV -(R0),-(SP) MOV @R1,-4(R0) ;.... & USER LINK ADDR MOV R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .=ENDM+500   ; LEAVE ROOM FOR STACK .EVEN   ; ... & BUFF TABLE EXT. ; ; PDP-11 DISK MONITOR INITIALIZATION ROUTINE ; THIS ROUTINE IS LOADED BY THE BOOTSTRAP ROUTINE ; AND CONTROL IS GIVEN TO IT AT THAT POINT ; THE FOLLOWING TABLES ARE INITIALIZED ; DDL ; MRT ; VECTORS ; STACK PROTECTION ; ; AT SUCCESSFUL TERMINATION, THE MONITOR ; IS READY TO ACCEPT A KEYBOARD ] ; .BYTE 1-DEVICE SPECIFIED OR 0-NONE SPECIFIED ; .BYTE UNIT ; .RAD50 [DEFAULT DEVICE] ; ; ON ENTRY EXPECTS REGISTERS AS FOLLOWS (SET BY EMT HANDLER):- ; R1 = STACK ADDRESS OF CALL ARGS. ; R2 = PROGRAM CALL ADDRESS ; R5 = PROCESSOR STATUS REGISTER ADDRESS (-2) ; IN.UCT: .BYTE 0  ;USE COUNT .BYTE -1  ;AT PRESENT, NOT REENTRANT ;SET-UP INIT & CHECK IF DDB ALREADY: INR: MOV @R1,R4  ;GET LINK BLOCK ADDRESS MOV -(R1),2(R1) ;REMOVE FROM STACK CMP R1,SP BNE .-6 FROM STACK CMP R1,SP BNE .-4 MOV -(R0),R2 ;GET DRIVER ADDRESS CMP (R0)+,(R2)+ ;GET DRIVER TYPE INDICATOR MOV R0,R4  ;SET VARIABLE DDB PTR MOV #10,R1 ADD R1,R4  ;ADVANCE IT .... MOV -(R4),(SP)+ ;... TO CHECK IF ALL CLOSED BEQ RL.GO MOV @R2,-(R4) ;IF NOT, DEVICE FILE-STRUCTURED? BMI RL.ERR  ;IF SO CANNOT COPE ;CLOSE NOT DONE - EXECUTE FOR SIMPLE DEVICES: ADD R1,R4  ;GO TO COMPLETION ADDRESS JSR PC,RL.CG ;... & CALL D -(R1),-(R3) ;CLEAR ARGS OFF STACK CMP R1,SP BNE .-4 CMP (SP)+,(SP)+ ; 2) ROUTINE TO SET UP TRANSFER: ; ;OPERATIONS: ; 1) CHECKS MODE & FUNCTION OK FOR DRIVER ; 2) CHECKS IF FILE CORRECTLY OPEN IF F/S DEVICE ; 3) CLAIMS BUFFER IF NOT ALREADY AVAILABLE ; 4) SETS APPROPRIATE ENTRIES INTO DDB ; ;ON ENTRY, EXPECTS DDB ADDRESS ON TOP OF STACK ; ;EXITS TO APPROP READ OR WRITE ROUTINE TO GET NEXT BYTE ; WITH REGISTECOMMAND ; ; INITIALIZATION BEGINS HERE BG.BGN: MOV PC,SP  ; SET STACK POINTER TST -(SP) MOV #200,@#177776 ; INITIALIZE STATUS MOV #EMT.,@#30 ; SET EMT VECTOR MOV #340,@#32 MOV #BG.BET,@#4 ; DETERMINE CORE SIZE MOV #40,@#6 MOV #40000,R1 ; 8K BG.ETS: TST (R1)  ; POSSIBLE TO FAIL ADD #20000,R1 ; TRY 4K MORE BR BG.ETS BG.BET: MOV R1,R0  ; USE CORE SIZE TO ... SWAB R0  ; ... DETERMINE BUFF SPACE ASR R0 ADD #BF.STR,R0 ; (HALF AVAILABLE) MOV R2,@SP  ;SAVE CALL ADDRESS NEG R5  ;NOW CONTAINS 2 IN.REC: MOV @#IN.SVT,R3 ;GET DDB CHAIN POINTER ADD #IN.DCO,R3 MOV @R4,R0  ;DDB ALREADY? BEQ IN.GO  ;IF NOT CONTINUE LATER ;DDB ALREADY ASSIGNED - CLEAR IT: MOV R3,R2  ;SUPPOSED DDB IN MONITOR CHAIN? BR .+12 IN.CMC: MOV @R2,R2 BEQ IN.GO  ;IF NOT IGNORE IT!!! SUB #10,R2 CMP R0,@R2 BNE IN.CMC  ;IF SO CHECK SOME MORE MOV @#IN.RLB,R2 ;MAYBE RELEASE REQD. MOVRIVER IF NEC MOV R0,-(SP) ;IF CALLED WILL RETURN HERE MOV @#RL.CDQ,-(SP) ;SO SAVE DDB ADDRESS ... JSR PC,@(SP)+ ;... & DEQUEUE DRIVER CLR @(SP)+  ;CLEAR DDB BUSY FOR WAIT BELOW CLR R5  ;FOR NOW, EXIT IN CASE ... BR RL.XIT  ;... OTHER INTERRUPTS UP RL.CG: MOV (SP)+,@R4 ;USE RETURN ADDR AS COMPLETION BIT #2,-(R4) ;LAST OP = WRITE? BEQ RL.CD CMP -4(R4),4(R4) ;IF SO ANY IN BUFF? BHIS RL.CD MOV R0,-(SP) ;IF SO SAVE DDB ADDRESS MOV SP,R2  ;... & RS SET AS FOLLOWS:- ; R0 = BYTE COUNT IN DDB ; R1 = POINTER TO NEXT BYTE IN DEVICE BUFFER ; (IF 0 BUFFER NEEDS PROCESSING) ; R2 = POINTER TO USER HEADER BYTE COUNT ; R3 = DATA MODE ; R4 = POINTER TO 1ST DATA WORD IN USER LINE ; R5 = SPARE ; ;ERROR ENTRIES WILL BE TAKEN:- ; 1) ERROR DIAGNOSTIC PRINT FOR INCORRECT MODE ; OR FUNCTION, FILE NOT AVAILABLE ON F/S ; DEVICE ; 2) USER ERROR RETURN IF NO BUFFER AVAILABLE ; ;CHECK MODE & FUNCTION: RW.MC: MOV #M.ERR,-(SP) ;PR MOV R0,BFE  ; SET TABLE END ACCORDINGLY CLR (R0)+  ; LEAVE BAT LINK WORDS CLR (R0)+ MOV #EOM,R2  ; ALSO ADJUST MONTOP MOV R0,(R2)+ ADD #40,R0  ; ... & STACK STOP MOV R0,(R2)+ MOV #107070,@R0 TST -(R1)  ; STORE CORE TOP ... MOV R1,@R2  ; ... AS LAST WORD ADDR MOV #DAT,R0  ; NOW PICK UP DATE & TIME CLRB R1  ; (STORED BY FINISH) MOV (R1)+,(R0)+ MOV (R1)+,(R0)+ MOV (R1)+,(R0)+ -(R0),R5 ;DRIVER ATTACHED? BEQ IN.RLL MOV 30(R0),R1 ;FIB ALSO? BEQ IN.RLD MOV R1,-(SP) ;YES - MAYBE BIT-MAP LINKED ADD #32,R1 MOVB 15(R0),-(SP) ;SO GET DEVICE UNIT BIC #177770,@SP ASL @SP  ;... & USE TO GET BM PTR ADD R5,@SP ADD #20,@SP MOV SP,R5  ;CHECK IF FIB IN CHAIN IN.RLM: MOV @R5,R5 BEQ IN.RLF  ;IF NOT, NO MATTER CMP R1,@R5 BNE IN.RLM MOV @R1,@R5  ;OTHERWISE DELINK FIB IN.RLF: MOV #1,@SP  ;... & RELEASE IT JSR R5,@PRESENT SP MOV @R0,-(SP) ;NOW SAVE BUSY FLAG MOV R2,-(SP) ;... & USE STACK NOW AS LINK MOV @#RL.CDB,-(SP) ;DESPATCH TO DRIVER JSR PC,@(SP)+ MOV 4(SP),R0 ;RESET WITH DDB ADDRESS EMT .WAIT  ;WAIT HERE TILL DONE MOV (SP)+,@(SP)+ ;RESTORE BUSY FLAG RL.CD: MOV -(R0),R2 ;GET BACK DRIVER ADDRESS CMP (R0)+,(R2)+ MOV 6(R0),-(SP) ;RELEASE DATA BUFFER CLR -(SP) MOVB 2(R2),@SP ;USING DVR STD SIZE MOV @#RL.RLB,-(SP) JSR R5,@(SP)+ EPARE FOR ERROR? MOV -(R0),R3 ;GET DEVICE DVR ADDR CMP (R0)+,(R3)+ MOVB @(R0)+,R5 ;GET FUNC FROM CALL CODE MOV (R0)+,R4 ;GET USER LINE ADDR BIC @PC,R5 ;ERASE REAL OP FROM FUNC MOVB @PC,R1 ;SET MAGIC 20 (******) CMP (R4)+,(R0)+ ;ADJUST POINTERS (******) ADD R1,R0 ;...& GO TO DDB FILE LINK BITB @PC,(R4)+ ;ASCII OR BINARY? BEQ .+4 ; (******) ASR R1 ;ADJ. MAGIC CONST. ACCORDINGLY ADD R5,R1 ;ADD IN FUNC CLRB @R4 ;REMOVE OLD STA; SET ALL DEVICES TO ERROR TRAP MOV #374,R0  ; RM.TRP POINTER MOV #356,R1  ; STATUS CODE 7 MOV #60,R2  ; START MOV #63,R3  ; LENGTH BG.AVS: MOV R0,(R2)+ ; SETUP MOV R1,(R2)+ DEC R3 BNE BG.AVS ; SET UP ERROR VECTORS MOV #RM.TRP,R0 ; TRAP LOCATION MOV #4,R1 MOV #342,R2  ; CODE AND STATUS MOV R0,(R1)+ MOV R2,(R1)+ MOV R0,(R1)+ ; RESERVED INSTR ADD #2,R2 MOV R2,(R1)+ MOV R0,(R1)+ ; TRACE ADD #2,R2 MOV R2,(R1)+ R2 MOV @R0,R5  ;GET BACK DRIVER ADDR IN.RLD: MOV 10(R0),R1 ;CHECK IF DATA BUFFER BEQ IN.RLL MOV R1,-(SP) ;IF SO RELEASE THAT TOO CLR -(SP) MOVB 4(R5),@SP JSR R5,@R2 IN.RLL: TST (R0)+  ;GET BACK DDB ADDRESS MOV R0,R1  ;... & BUILD DDB TOP ADDR SUB #6,R1 MOV #2,R5  ;RESTORE ORIGINAL CONTENT BR IN.CLD  ;O.K. USE SAME DDB BUT CLR IT ;NORMAL INIT. BEGINS: IN.GO: MOV R5,-(SP) ;GET BUFFER FOR DDB ASR @SP MOV @#IN.GTB,; FIND DRIVER IN DDL RL.GO: TST -(R2)   ; SET DRIVER ADDRESS MOV R2,R1   ; ... & POSS. T/P COMP. SUB #16,R1 MOV @#RL.SVT,R3  ; GET DDL ADDRESS MOV RL.DDL(R3),R4 MOV 6(R4),R5  ; END RL.CLP: CMP R2,2(R4)  ; THIS DRIVER ? BEQ RL.OKA   ; YES CMP R1,2(R4)  ; OR T/P COMP. BEQ RL.OKB ADD #10,R4 CMP R4,R5 BNE RL.CLP RL.ERR: MOV @R0,-(SP)  ; CLOSE ERROR MOV #1405,-(SP)  ; TELL USER IOT ; CHECK CHAIN FOR OTHERTUS BITS BICB (R3)+,R1 ;CHECK MODE/FUNC OK FOR DVR BNE RW.MER TSTB (R3)+ ;DEVICE FILE-STRUCTURED? BPL RW.MCA MOV @R0,R1 ;IF SO, FILE OPEN? BEQ RW.MER BITB R5,2(R1) ;... & OPEN CORRECTLY? BEQ RW.MER ;(****** CARE!!!!! USED AS LITERAL BY PREV INSTR) ;INITIALISE DATA-SET DDB: RW.MCA: CMP -(R0),(SP)+ ;ADJUST DDB PTR/CLR STACK CLR -(R0) ;CLEAR CHECKSUM STORE ... CLR -(R0) ;... & BYTE COU MOV #S.ERR,(R1)+ MOV #340,(R1)+ ; IOT TRAPS TO S.ERR FOR PRINT MOV R0,(R1)+ ; POWER FAIL ADD #2,(R2) MOV R2,(R1)+ CMP (R1)+,(R1)+ ; SKIP EMT MOV R0,(R1)+ ; TRAP ADD #2,R2 MOV R2,(R1)+ MOV #BG.BGN,SP ; REINITIALIZE STACK CLR @#177776 ; AND STATUS ; INITIALIZE DRIVERS MOV #DDL.,R0 ; SYSTEM DISK ENTRY MOV 4(R0),R1 ; SET UP VECTORS MOV 2(R0),R2 ; CORE ADDRESS TO R2 MOV R2,S.-(SP) JSR R5,@(SP)+ MOV (SP)+,R0 ;GET ITS ADDRESS BEQ IN.NOB  ;... IF ANY AVAILABLE MOV R0,R1  ;GET TRUE DDB ADDRESS ADD #10,R0 MOV @R3,(R1)+ ;... & LINK TO MONITOR CHAIN MOV R0,@R3 IN.CLD: CLR (R1)+  ;...CLEAR IT OUT ASL R5 BCC .-4 MOV R0,(R4)+ ;SET USER LINK ;CHECK FOR DEVICE: MOV (R4)+,R2 ;GET LOGICAL NAME MOV R3,R1  ;.... & TRY D.A.T. TST -(R1) IN.CAT: MOV @R1,R1  ;.... IF ANY BNE IN.CAI IN.CUL: MOV R4,R1  ;IF NOT TRY US USERS OF DRIVER RL.OKA: CMP @R4,(PC)+  ; CHECK FOR CONSOLE T/P .RAD50 'KB' BNE .+6 ADD #34,R1   ; IF HERE MUST BE KB RL.OKB: MOV RL.DCO(R3),R5  ; CHAIN ORIGIN BEQ RL.NON   ; END, NO USER RL.CPL: CMP R0,R5   ; IS IT THIS DONE? BEQ RL.NXT   ; YES - IGNORE CMP R2,-(R5)  ; SAME DRIVER ? BEQ RL.DDB   ; YES CMP R1,(R5)+  ; OR CORR. TP COMP. BEQ RL.DDB RL.NXT: MOV -10(R5),R5  ; NEXT DDB BNE RL.CPL   ; END OF CHAIN? NT IN DDB MOV -(R0),R1 ;SET BUFFER PTR TST -(R0) ;GO BACK TO FUNC BYTE BIC #17,-(R0) TSTB -(R4) ;ECHO SUPPRESS? BPL .+6 BIS #10,@R0 ;IF SO STORE IN DDB BIS R5,@R0 ;... & STORE PRESENT FUNC BITB @PC,@R4 ;ADD ASC/BIN MARKER BEQ .+4 ; (******) INC @R0 CMP -(R0),-(R0) ;RETURN TO BUFF ADDR IN DDB ;IF NO DATA BUFFER GET ONE NOW: RW.MCB: MOV (R0)+,-(SP) ;ANY BUFFER YET? BNE RW.MCC CLR R1 ;IF NONE CLEAR POINTER MOVB @R3,@SP ;DDB-2 ; ... & THENCE TO SYS DDB CLR R3 BISB 5(R2),R3 ; INTER. ROUTINE OFFSET ADD R2,R3 MOV R3,(R1)+ ; INTO VECTOR CLR R3 BISB 6(R2),R3 ; INTERRUPT LEVEL MOV R3,(R1)+ MOV 6(R0),R5 ; DDL END POINTER BG.DLL: ADD #10,R0 CMP R0,R5 BEQ BG.DMT  ; END ENCOUNTERED CMP (R0),(PC)+ ; TT ? .RAD50 'KB' BNE BG.DLC TST (R0)+  ; IF SO STORE PTR TO ENTRY ... MOV R0,KBA  ; ... FOR MINIMAL DVR BENEFIT TST -(R0) TST 2(R0)  ; IS IT RESIDENT? ER LNK BLK TSTB @R4  ;IF NONE THERE EITHER .... BNE IN.DVG IN.INR: CMP -(R4),-(R4) ;TELL OPERATOR MOV R4,-(SP) ;... WITH LNK BLK AS EVIDENCE MOV #403,-(SP) IOT BR IN.REC  ;ON RETURN TRY AGAIN IN.CAN: MOVB 4(R1),R5 ;IF D.A.T. GET NEXT ENTRY ASL R5 ADD #6,R5 ADD R5,R1 IN.CAI: CMP (R1)+,#-1 ;END OF D.A.T.SECTION? BEQ IN.CAT  ;IF SO GO FOR NEXT SECTION TST -(R1)  ;AT TABLE END? BEQ IN.CUL  ;GO TRY LNK BLK IF SO CMP R2,@R1  ;THIS THE D; RELEASE DRIVER IF NO OTHER USER RL.NON: CMP R4,RL.DDL(R3)  ; SYSTEM DRIVER? BEQ RL.DDB   ; YES - LEAVE IT TST 6(R4)   ; PERMANENTLY RESIDENT? BEQ RL.DDB   ; LIKEWISE! MOV (R4)+,R1  ; SAVE DRIVER NAME MOV (R4)+,-(SP)  ; START ADDR TO STACK CMP R1,(PC)+  ; DEVICE = CONSOLE T/P? .RAD50 'KB' BEQ RL.RDB   ; IF SO LEAVE VECTOR MOV @R4,R5   ; OTHERWISE CLEAR OUT MOV #RL.INT,(R5)+ MOV #RL.STS,@R5 RL.RDB: CLR -(R4) GET BUFF SIZE FROM DVR MOV #20000,@R0 ;CONVERT TO WD CNT SUB @SP,@R0 ASL @R0 BCC .-2 MOV @#V.GTB,-(SP) ;GO FOR BUFFER JSR R5,@(SP)+ RW.MCC: MOV (SP)+,-(R0) ;STORE ADDRESS IN DDB BNE RW.MCD ;(IF ANY AVAILABLE!) MOV -12(R0),R4 ;GET USER LINK ADDR TO .... MOV -(R4),16(SP) ;EXIT TO USER ERROR RTN BNE RW.DUN ;(IF ANY SUPPLIED!) RW.BER: MOV #B.ERR,-(SP) ;OTHERWISE TREAT AS FATAL! RW.MER: IOT ;... & GIVE DIAGNOSTIC PRINT V.GTB=54 B.ERR=1407 M.ER BEQ BG.DNR  ; NO - GET DISK DATA BR BG.DLL  ;YES - BUT LEAVE VECTOR ALONE BG.DLC: TST 2(R0)  ; DRIVER RESIDENT? BEQ BG.DNR MOV 2(R0),R1 ; IF SO, GET ADDRESS MOV 4(R0),R2 ; VECTOR CLR R4 BISB 5(R1),R4 ADD R1,R4  ; INTERRUPT ENTRY MOV R4,(R2)+ CLR R4 BISB 6(R1),R4 ; STATUS WORD MOV R4,(R2)+ ; FOR VECTOR BR BG.DLL BG.DNR: CLR 6(R0)  ; NO DISK INFO YET BR BG.DLL ; INITATASET? BNE IN.CAN  ;NO - TRY NEXT ENTRY IN.DFD: MOV R1,24(R0) ;HURRAY - REMEMBER FOR OPEN TST 2(R1)  ;... BUT CHECK IF DEVICE INCL. BEQ IN.CUL  ;IF NOT TRY LINK BLOCK ;SEARCH DDL FOR DRIVER IN.DVG: TST (R1)+  ;SET POINTER AT DEVICE MOV @R1,R5  ;LOOK FOR CONSOLE 'PT' CMP @R1,(PC)+ .RAD50 'PT' BNE .+6 MOV (PC)+,R5 ;USE NAME 'KB' FOR SEARCH .RAD50 'KB' MOV IN.DDL(R3),R2 ;D.D.L. ADDRESS CMP -(R0),(R2)+ ;GET SYS DISK DVR  ; CLEAR DDL ENTRY CLR -(SP)   ; MOVE SIZE TO STACK MOVB 5(R4),@SP ASR @SP ASR @SP MOV @#RL.RLB,-(SP)  ; ... & RELEASE BUFFER JSR R5,@(SP)+ ; RELEASE DDB RL.DDB: CLR @2(R0)   ; CLEAR LINK BLOCK CLR @R0   ; CLEAR FLAG (JUST IN CASE) ADD #RL.DCO,R3  ; GET CHAIN ADDR BR RL.NDC RL.NDN: MOV R5,R3   ; GET NEXT LINK SUB #10,R3 RL.NDC: MOV @R3,R5 BEQ RL.ERR   ; IF END SUMMAT UP! CMP R5,R0   ; THIS DDB? R=1410 ;(****** CARE!!!!! USED AS LITERAL BY PREVIOUS INSTR!) ;COMPLETE TRANSFER INITIALISATION: ; (USED ALSO AFTER DEVICE TRANSFER DONE) RW.MCD: MOV (R0)+,R3 ;BUILD BUFF END ADDR SUB @R0,R3 SUB (R0)+,R3 CMP (R0)+,(R0)+ ;STEP TO BUFF PTR IN DDB MOV R3,(R0)+ ;STORE BUFF END ADDR MOV R4,R2 ;SET HDR PTR FOR LINE CMP (R4)+,(R4)+ ;... & MOVE TO DATA AREA BIT #4,@R2 ;AND IF DUMP ... BEQ .+4 MOV IALIZE THE MRT BG.DMT: MOV #MRT.+4,R4 ; SET ALL ZERO BG.SOL: TST (R4)  ; MRT ENTRYS BNE BG.NCR  ; TO -1 INC (R4) BG.NCR: TST (R4)+ CMP R4,#DDL. BNE BG.SOL JSR R5,BG.MDI ; GO MODIFY WITH DISK INFO ; INITIALIZE CLOCK, IF PRESENT MOV #CLOCK,R2 BEQ BG.NCK  ; NO CLOCK IF ZERO MOV #BG.NCK,@#4 ; SET TIME OUT CLR @#6  ; VECTOR MOV #100,R1 MOV R1,@#177546 ; ENABLE CLOCK MOV R2,(R1)+ ; IF NO TRAP-OUT ... MOV #300,@R1 ; SET CLOCK VECTOR ADDR MOV @R2,(R0)+ ; (REQD IF DVR LOAD NEEDED) MOV 4(R2),R2 ;GET LIST END ADDRESS IN.CPL: SUB #10,R2  ;GO TO NEXT ENTRY CMP R2,IN.DDL(R3) ;AT DDL END YET? BLO IN.INR  ;IF SO DEVICE UNKNOWN! CMP R5,@R2  ;MATCH ? BNE IN.CPL  ;NOT THIS TIME! TST (R2)+  ;DEV FOUND IN DDL MOV @R2,R5  ;ALREADY IN CORE? BEQ IN.LDD  ;NO - LOAD DVR ;CHECK FOR OTHER USERS OF DRIVER: BIT 2(R5),#1 ;MULTI-USER? BNE IN.INC  ;YES, O.K. MOV @R3,R3  ;OTHERWISE CHEC BNE RL.NDN SUB #10,R0   ; YES - RESET LINKAGE MOV @R0,@R3 MOV R0,-(SP)  ; RETURN DDB MOV #1,-(SP)  ; TO FREE CORE MOV @#RL.RLB,-(SP) JSR R5,@(SP)+ CLR R5   ;SET UP EXIT TSTB RL.UCT   ;... ALLOWING FOR NON-RES. BNE .+4 RL.XIT: CMP (R5)+,(R5)+ ADD @#RL.SXT,R5 MOV R5,PC ; CONSTANTS, ETC. RL.SVT=40 RL.SXT=42 RL.CDB=50 RL.CDQ=52 RL.RLB=56 RL.DCO=14 RL.DDL=50 RL.INT=374 RL.STS=356 .WAIT=1 .END @R4,R4 ;... ADJUST AGAIN! ADD @R0,R4 ;THEN GET BYTE TO ACTION NEXT MOV (R2)+,R3 ;GET DATA MODE MOV PC,@SP ;BUILD ADDR OF SPECIAL RTN ADD #RW.IN-.,@SP ;... FOR READ OR WRITE RW.INA=.-2 ADD R5,@SP TST R5 ;RE-INIT AFTER DEV TFR? BLE RW.XFD ;IF SO FORCE END CHK RW.MCE: JSR PC,@(SP)+ ;OTHERWISE NORMAL INIT! ; 3) ROUTINE TO ADJUST BYTE FOR TRANSFER: ; RECALLED FOR EITHER DIRECTION ; BY:- J BG.NCK: MOV #RM.TRP,@#4 MOV #342,@#6 ; RESET VECTOR ; SET UP TTY VECTORS MOV #60,R1 MOV #KBD.,(R1)+ MOV #200,(R1)+ MOV #KBD.,(R1)+ MOV #201,@R1 JSR R5,BG.MSG ; PRINT HEADER MESSAGE .BYTE 15,12 .ASCII 'MONITOR V004A' .BYTE 15,12 BG.MSG: TSTB @#177564 ; PRINTER BUSY? BPL BG.MSG TSTB @R5  ; IF NOT END OF HEADER? BMI BG.XIT MOVB (R5)+,@#177566 ; IF NOT OUTPUT CHAR. BR BG.MSG BG.XIT: EMT 60  ; CALL TMON VIA .XIT K CHAIN BEQ IN.LDD  ;... IF ANY! IN.DVL: CMP -(R3),R5 IN.DVE: BEQ IN.INR  ;ANOTHER USER - MUST BE ERROR MOV -6(R3),R3 BNE IN.DVL  ;IF NONE COULD BE RE-INIT    ;SO TRY & LOAD NEW COPY! ;DRIVER LOADER: IN.LDD: MOV 4(R2),R3 ;GET DISK INFO. ... BEQ IN.INC  ;IF NONE DVR RESIDENT MOV R0,R5  ;SET VARIABLE DDB PTR CMP (R5)+,(R5)+ ;... & BUMP TO BLOCK STORE MOV R3,@R5  ;BUILD DISK BLOCK NO. BIC #176000,(R5)+ ;... & STORE FOR TR;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C ; .TITLE TRA ;.TRAN HANDLER VERSION 1 15 JUN 70 ; SWAPPABLE MONITOR ROUTINE TO PROVIDE ;  BASIC DRIVER ACCESS. ; REVISED OCT 70 TO USE RELOCATABLE ASSEMBLER ; & LINKER & TO AMEND ERROR RETURNS TO USER. ; ; EXPECTS AS CALL PARAMETERS:- ;  1) ADDRESS OF DDB FOR DATASET ;  2) ADDRESS OF CONTROL BLOCK:- ;  WORD 0: DEVICE BLOCK ;  WORD 1: CORE START ADDRESS ;  WORD 2: # OF WORDS FOR TRANSFESR PC,@(SP)+ ; ;OPERATIONS: ; 1) GENERATES PARITY ON BYTE IF REQD. (SEE BELOW) ; 2) CHECKS FOR FORMAT/PARITY ASCII DELIMITER ; & FORCES EXIT AFTER RETURN ; 3) COUNTS BYTES TRANSFERRED ; 4) BUILDS CHECKSUM (VALID FOR FORMAT BIN ONLY) ; ;ON ENTRY, EXPECTS REGISTERS AS FOLLOWS:- ; R0 = ADDRESS OF BYTE COUNT IN DDB ; R2 = ADDRESS OF BYTE COUNT IN USER HEADER ; R3 = DATA MODE ; R5 = BYTE FOR TRANSFER ; ;RETURNS TO SPECIAL READ/WRITE ROUTINES FOR FURTHER ; PROCESSING WITH ADJUST; THE FOLLOWING TABLE CORRESPONDS WITH THE ; MRT STARTING WITH EMT 2 -- READ BG.MRT: .RAD50 /RWN/  ; 2 .RAD50 /RWR/  ; 3 .RAD50 /RWN/  ; 4 .RAD50 /RWR/  ; 5 .RAD50 /INR/  ; 6 INIT -I/O .RAD50 /RLS/  ; 7 RELEASE .RAD50 /TRA/  ; 10 TRANS .RAD50 /BLO/  ; 11 BLOCK .RAD50 /SPC/  ; 12 SPEC .RAD50 /STT/  ; 13 STATUSES (STATII) .RAD50 /DIR/  ; 14 DIRECTORY LOOKUP .RAD50 /ALO/  ANSFER BIC #1777,R3 ;NOW GET BUFFER SIZE FOR DVR SWAB R3 MOV R3,-(SP) ASR @SP ASR @SP MOV @#IN.GTB,-(SP) ;GET BUFFER FOR IT JSR R5,@(SP)+ MOV (SP)+,(R5)+ ;STORE ADDRESS IN DDB BNE IN.LDG  ;... UNLESS NONE AVAILABLE CMP -(R4),-(R4) ;IN WHICH CASE GET BACK LINK ADDR IN.NOB: MOV #1407,@SP ;ASSUME WILL BE FATAL ERROR MOV -(R4),16(SP) ;... UNLESS USER SUPPLIED ADDR BNE IN.WNT  ;GO TO IT IF SO IOT   ;OTHERWISE CALL HALT IN.LDG: SUB R3,@R5  R ;  WORD 3: BYTE 0: TRANSFER DIRECTION ;    (2 = WRITE:4 = READ) ;   BYTE 1: 10 IF DEVICE = DECTAPE ;    AND TAPE MOTION IS REVERSE ;  WORD 4: 0 [USED BY PROCESSOR TO SHOW ;    WORDS NOT TRANSFERRED.] ; ; ON ENTRY FROM EMT HANDLER, ;  REGISTER 0 CONTAINS DDB ADDRESS ;  REGISTER 1 POINTS TO DDB ADDRESS ON STACK ;  REGISTER 2 CONTAINS CALL ADDRESS ;  REGISTER 5 CONTAINS STATUS REG ADDR ;  USER REGISTERS ARE ON TOP OF STACK ; ON EXIT TO CHECK DRIVER BUSY ROUTED BYTE IN R5. ; ;GET BYTE & CHECK FOR ASCII LINE DELIMITER: RW.XF: MOVB R3,-(SP) ;LOOK FOR ASCII MODES ASRB @SP BCS RW.XFC BICB #372,@SP ;... & ELIM. 8-BIT UNF. ASRB @SP BEQ .+4 BCS RW.XFC MOVB R5,@SP ;FOR REST, STORE FULL BYTE BICB #200,R5 ;... & REMOVE PARITY BIT BCS RW.XFC ;THEN LOSE 7-BIT UNF. CMPB R5,#12 ;CHECK FOR LINE-FEED... BLO RW.XFA ;... VERT. TAB ... CMPB R5,#14 ;... OR FORM FEED BHI RW.XFA CLR @R2 ;IF FOUND S; 15 ALLOCATE .RAD50 /OPN/  ; 16 OPEN .RAD50 /CLS/  ; 17 CLOSE .RAD50 /REN/  ; 20 RENAME .RAD50 /DEL/  ; 21 DELETE .RAD50 /APP/  ; APPEND .RAD50 /GAR/  ; GARBAGE COLLECT DIRECTORY .RAD50 /PRO/  ; 24 PROTECT .WORD 0,0,0  ; 25-27 SPARE .WORD 0  ; 30 CORE RESIDENT .RAD50 /KBL/  ; 31 KEYBOARD LISTEN .RAD50 /EDP/  ; 32 DIAGNOSTIC PRINT .RAD50 /KBI/  ; 33 KBD INTERPRET .RAD50 /GNM/  ; 34 GET NEW MAP .WORD 0,0,0  ; 35-37 SPARE ;COMPUTE & STORE WORD COUNT ASL @R5 ASL (R5)+ MOV #4,(R5)+ ;SET FUNC = READ MOV @#IN.SXT,@R5 ;SET RETURN ADDRESS ... SUB #IN.XAJ,(R5)+ ;... AS FOR SAM. MOV @SP,@R0  ;SET DDB BUSY MOV R0,-(SP) ;SAVE SIGNIF. REGS. MOV R1,-(SP) MOV R2,-(SP) MOV #10,R1  ;SET DVR TFR RTN PTR MOV @#IN.CDB,-(SP) ;LOAD DRIVER JSR PC,@(SP)+ MOV (SP)+,R2 ;START REGISTER RESTORE MOV (SP)+,R1 MOV SP,R5  ;BUT USE SAVED R0 .... MOV R5,-(SP) EMT .WAIT  ;.INE, ;  REGISTER 0 WILL CONTAIN DDB ADDRESS ;  REGISTER 1 WILL CONTAIN 10 (RELATIVE ;  POSITION OF POINTER TO DRIVER TRANSFER) ; ON INTERIM RETURN FROM DEVICE DRIVER, ;  CONTENTS OF REGISTERS ARE UNSPECIFIED ; ON COMPLETION RETURN, ;  REGISTER 0 SHOULD CONTAIN DDB ADDRESS ;  DEVICE PARITY ERROR WILL BE SHOWN ;  IN BIT 17 OF DDB+12 & ANY WORDS NOT ;  ABLE TO BE TRANSFERRED WILL BE SHOWN ;  IN DDB+16. ;  DATA SET & DRIVER ARE STILL BUSY ;  USER REGISTERS ARE ON TOP OF STET EOL SWITCH ;GENERATE PARITY IF REQUIRED: RW.XFA: BITB R3,#10 ;PARITY REQUIRED? BEQ RW.XFC RW.XFB: ASLB @SP ;IF SO BUILD NEW PARITY BIT BVC .+6 ADD #200,R5 ASLB @SP BNE RW.XFB ;DO MISC. TIDY UP: RW.XFC: CMP (SP)+,(R0)+ SUB R5,@R0 ;BUILD C/S (FORMAT BIN) INC -(R0) ;COUNT BYTES MOVED RW.XFD: JSR PC,@(SP)+ ;RETURN TO SPECIAL RTN ; ;NOTE ON PARITY OPERATION: ;------------------------ ; .WORD 0  ; 40 CORE RESIDENT .RAD50 /GUT/  ; 41 GENERAL UTILITIES .RAD50 /CVT/  ; 42 CONVERSIONS .RAD50 /FOP/  ; 43 FILE STRUCTURED OPEN .RAD50 /FCR/  ; 44 F. S. OPEN O .RAD50 /FCL/  ; 45 F. S. CLOSE .RAD50 /LUK/  ; 46 LOOKUP .RAD50 /LBA/  ; 47 CONTIGUOUS ALLOCATOR .RAD50 /GMA/  ; 50 GET MAP .RAD50 /CBA/  ; 51 CONTIGUOUS .RAD50 /CKX/  ; 52 CHECK ACCESS .RAD50 /DLN/  ; 53 DELETE LINKED .RAD50 /DCN/  ; 54 DELETE CONTIG. .RAD50 /.. AS LINK BLOCK FOR WAIT ;TIDY UP AFTER DRIVER LOAD: MOV (SP)+,R0 ;WHEN DVR IN RESTORE DDB ADDR MOV 6(R0),R5 ;GET START OF LOAD AREA CLR 6(R0)  ;REMOVE FROM DDB MOV R5,(R2)+ ;STORE IN DRIVER LIST CMP -4(R2),(PC)+ ;DEVICE = CONSOLE TP? .RAD50 'KB' BEQ IN.INC  ;IF SO OMIT VECTOR SETUP MOV @R2,R3  ;GET VECTOR ADDRESS FROM LIST CLR @R3  ;STORE INT'RUPT ADDR MOVB 5(R5),@R3 ADD R5,(R3)+ CLR @R3  ;... & PRIORITY MOVB 6(RACK ; CONTROL WILL RETURN TO THE USER WITH THE ; STACK CLEARED OF CALL PARAMETERS. ; ; ERRORS WILL BE TREATED AS FOLLOWS:- ;  1) INCORRECT FUNCTION FOR DEVICE ;  WILL BE TREATED AS FATAL AND WILL ;  RESULT IN DIAGNOSTIC PRINT. ;  2) PROGRAMMABLE ERRORS WILL BE RETURNED ;  TO THE USER IN BYTE 1 OF WORD 3 OF THE ;  USER CONTROL BLOCK AS: ;  BIT 7: DEVICE PARITY ERROR ;  BIT 6: E.O.M. (WORD 4 OF CTL BLK WILL ;    SHOW WORDS NOT TRANSFERRED) ;  BIT 5: INVALID CALL ( ; READ:- ON EXIT PARITY BIT WILL BE STRIPPED IF ; CORRECT ORIGINALLY ; WRITE:- ON ENTRY PARITY BIT MUST BE CLEAR ; FOR CORRECT OUTPUT ; 4) ROUTINE TO CHECK FOR DEVICE TRANSFER & IF O.K.: ; RECALLED FOR BOTH DIRECTIONS ; BY:- JSR PC,@(SP)+ ; ;OPERATIONS: ; 1) CHECKS IF BUFFER READY FOR TRANSFER; IF ; NOT GOES TO CHECK LINE DONE ; 2) IF EOM OR EOF SEEN EXITS TO USER ; WITH APPROP STATUS SET ; 3) OTHEAP2/  ; 55 APPEND PT II .RAD50 /CSX/  ; 56 COMD SYN ANAL .RAD50 /CSM/  ; 57 COMD STRG MANIP. .RAD50 /XIT/  ; 60 EXIT .RAD50 /LDR/  ; 61 PROGRAM LOADER .RAD50 /LD2/  ; 62 PROG LDR PT 2 .RAD50 /MTO/  ; 63 MAGTAPE OPEN .WORD 0,0,0,0  ; 64-67 SPARE .WORD 0,0,0,0,0,0,0,0 ; 70-77 SPARE .EOT ;INITIALIZATION SUB-ROUTINES: ; CALLED 5),@R3 IN.INC: MOV R0,R3  ;STORE DVR ADDR IN DDB MOV R5,-(R3) BEQ IN.DVE  ;IF STILL NONE - ERROR! CMP @R1,(PC)+ ;ADJUST FOR 'PT' .RAD50 'PT' BNE .+6 ADD #16,@R3 ;FINALISE DDB MOV 24(R0),R2 ;CHK IF ANY ASSIGNMENT BEQ IN.STU  ;IF NOT USE UNIT IN LNK BLK TST (R2)+  ;SIMILARLY IF ASSIGNMENT ... CMP R1,R2  ;... CONTAINS NO DEVICE BNE .+4 CMP (R1)+,(R1)+ ;OTHERWISE USE THAT IN D.A.T. IN.STU: MOVB -(R1),13(R0) ;... & STORE IN DDB IN.WNT: CLR ZERO WORD COUNT OR ;    IMPROPER FUNCTION) .GLOBL TRA ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;SET UP SEQUENCE: .BYTE 0,0  ;IN USE/SHARABLE SWITCH TRA: MOV R0,R3  ;HOLD DDB ADDRESS MOV -(R0),R4 ;GET DRIVER ADDRESS CMP (R0)+,(R4)+ ;STEP TO FACILITY BYTE IN DVR MOV R1,R2  ;COLLECT ARGS CMP (R2)+,(R3)+ ;ACTUALLY IGNORE LINK MOV (R2)+,@R3 ;... BUT STORE T/BLK MOV -(R1),-(R2) ;REMOVE FROM STARWISE RETURNS TO SPEC ROUTINE ; TO START DEVICE TRANSFER ; ;ON ENTRY, EXPECTS REGISTERS AS FOLLOWS:- ; R0 = ADDRESS OF BYTE COUNT IN DDB ; R1 = ADDRESS OF NEXT BYTE IN BUFFER ; R2 = ADDRESS OF BYTE COUNT IN USER LINE ; R3 = DATA MODE & STATUS AT PRESENT ; OTHERS ARE IRRELEVANT ; ;CHECK IF BUFFER READY & IF SO WHETHER EOM OR EOF SEEN: RW.DX: CMP R1,-2(R0) ;PTR AT BUFF END? BLO RW.EC RW.DXA: MOV -6(R0),R1 ;CHECK IF EOM OR EOF SEEN BIC #137777,R1 ;IF SO, TELL USER BEFOR DISK OPERATIONS TO SET UP ; MRT. & DDL. FOR LIBRARY BASED ROUTINES ; (CAN BE REPLACED BY DUMMY SEQUENCES FOR ; WHOLLY CORE-RESIDENT MONITOR USAGE) ; ; ANY DISK ERROR WILL CAUSE A HALT AT BG.DER BG.DER: HALT   ; DISK ERROR -- SYSTEM DISK BR BG.DER BG.LLB: .=.+512.  ; LIBRARY SEARCH BUFFER ; MONITOR LIBRARY SEARCH FOR DDL. AND MRT. ENTRIES ; CALL SEQUENCE: ; JSR R5,BG.MDI ; ; REPLACES VACANT ENTRIES IN THE MRT. WITH ; DISK INFO FOR ROUTINES CONTAINED ; IN THE LIBRARY INR5  ;SET UP EXIT MOVB IN.UCT,(SP)+ ;ALLOWING FOR NON-RES. BNE .+4 CMP (R5)+,(R5)+ ADD @#IN.SXT,R5 JMP @R5 ;MISCELLANEOUS DEFINITIONS: IN.SVT=40 IN.SXT=42 IN.SAV=44 IN.RES=46 IN.CDB=50 IN.CDQ=52 IN.GTB=54 IN.RLB=56 IN.DCO=14 IN.DDL=50-IN.DCO .WAIT=1 IN.XAJ=22 .END CK CMP R1,SP BNE .-4 CMP (SP)+,(SP)+ MOV (R3)+,R2 ;GET BACK T/BLK ADDR MOV (R2)+,(R3)+ ;MOVE INTO DDB: DEVICE BLOCK MOV (R2)+,(R3)+ ;MEMORY START ADDRESS, MOV (R2)+,@R3 ;WORD COUNT BEQ T.CER  ;IF NONE, EXIT NOW! NEG (R3)+ MOV @R2,R1  ;CHECK IF VALID FUNCTION BIC #177771,R1 BIT R1,@R4  ;... FOR DRIVER BEQ T.DER  ;IF NOT TELL USER ADD R5,R1  ;CHECK DIRECTION (R5=-2) BEQ .+6 ADD R5,R1 BNE T.CER  ;IF NOT 2 OR 4, EXIT NOW! BQ RW.DXB BIS R1,R3 CLR R1 ;SET TO CLEAR BUFFER PTR TST @R0 ;ANY TRANSFER DONE AT ALL? BEQ RW.XT ;IF NOT IGNORE CMP @R0,@R2 ;LINE COMPLETED? BHI RW.XT BLO RW.EXT BITB R3,@PC BNE .+6 ;CARE!!!USED AS LITERAL**** RW.EXT: BIS #400,R3 ;IF NOT SIGNAL SHORT LINE ;SET UP COMMON EXIT: RW.XT: MOV @R0,@R2 ;NOW EXIT - SHOW BYTE CNT MOV R1,-(R0) ;SAVE BUFFER PTR CMP -(R0),-(R0) ;GO BACK TO FUNC BYTE TST @R0 ;DEVICE PARITY ERROR? BPL . THE FOLLOWING FORMAT: ; BITS 15-14: NO OF 64-WORD UNITS ; BITS 13-1: START BLOCK NO. ; BIT 0:  1 ; CALCULATES DISK INFO FOR DISK RESIDENT DRIVERS: ; BITS 15-10: NO OF 16 WORD UNITS ; BITS 9-0: DISK BLOCK ADDRESS ; BG.MDI: MOV #4,BG.DDB+4 ; REINIT LIB SEARCH MOV #BG.LLB,BG.DDB+6 CLR R2  ; CALCULATE BLOCK LENGTH MOV DDL.+2,R3 ; FROM RESIDENT DRIVER INFO MOV R3,BG.DDB-2 ; SET DRIVER ADDRESS BISB 4(R3),R2 ASL R2 ASL R2 ASL R2  ; INFO IS IN 16 WORD;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001B .TITLE BLO .GLOBL BLO ; BLOCK INPUT/OUTPUT ROUTINE ; THIS TOUTINE IS INTENDED FOR RANDON ACCESS TO ; CONTIGUOUS FILES, BUT SUCH ACCESS TO LINKED ; FILES COULD BE ADDED. LINKED FILE RANDOM ACCESS ; WOULD BE PAINFULLY SLOW, HOWEVER, HENCE IS NOT ; INCLUDED IN THIS VERSION ; ; CALL SEQUENCE ; MOV #BLOCK,-(SP) ; MOV #LINKBLOCK,-(SP) ; EMT 11 ; ; BLOCK IS THE BLOCK BLOCK AS SHOWN BELOW ; IC #163400,@R2 ;REMOVE ERROR/UNIT BITS IN TCB BIC #174377,@R3 ;GET UNIT FROM DDB ADD (R2)+,(R3)+ ;MOVE IN FUNCTION CLR @R2  ;EMPTY ERROR INFO IN TCB MOV PC,@R3  ;SET UP COMPLETION RETURN ADD #T.DUN-.,(R3)+ CLR @R3  ;ZERO COUNT OF WORDS TFRD. MOV #10,R1  ;SET TO CALL DVR TFR ROUTN MOV @#V.CDB,-(SP) ;GET ADDR OF CALL DVR SUBR. JSR PC,@(SP)+ ;GO TO IT! CLR R5  ;UNTIL DONE .... BR T.RTN  ;... RETURN TO USER ;COMPLETION RET+6 BIS #20000,R3 ;IF SO TELL USER CMP -(R0),-(R0) ;GO BACK TO BUFF ADDR IN DDB MOV R3,-(R2) ;GIVE STATUS TO USER RW.DUN: CLR -6(R0) ;FREE DATA-SET JMP RW.RTU ;...& EXIT TO USER RW.DXB: TST (SP)+ ;FOR DEVICE TRANSFER ... JSR R5,RW.TF ;TIDY STACK & GO SET UP ; 5) ROUTINE TO RE-INITIALISE AFTER DEV TFR: ; CALLED BY DRIVER WHEN DONE ; ;OPERATIONS: ; 1) CALLS MONITOR ROUTINE S.CDQ TO CHECK IF ; UNITS ASL R2  ; LENGTH NOW IN WORDS NEG R2  ; NEGATE FOR DDB MOV R2,BG.DDB+10 NEG R2  ; POSITIVE AGAIN CLR R4 BG.DVL: SUB #7,R2  ; CALCULATE NUMBER OF LIBRARY BMI BG.ZFS  ; ENTRYS PER BLOCK INC R4  ; IN R4 BR BG.DVL BG.ZFS: MOV R4,BG.ECT ; STORE FOR SEARCH CLR BG.NTR+2 ; ZERO FIRST TIME SWITCH BG.SMT: JSR R5,BG.LRR ; READ ONE LIBRARY RECORD MOV (PC)+,R4 ; ENTRYS BG.ECT:.WORD 0 MOV #BG.LLB+2,R3 ; LIB BLOCK BG.SEL: MOV #DDL.,R1 .WORD FUNCTION FUNCTION AS SHOWN BELOW ; .WORD BLOCK #  RELATIVE BLOCK TO BE ACTIONED ; .WORD ADDRESS  ADDRESS AND LENGTH OF BLOCK ; .WORD LENGTH  (TO BE) ACTIONED. ;    SET BY G COMMAND FOR OUTPUT ; FUNCTION WORD ; BIT 0 ON GET (G) BUFFER ADDR AND LINGTH FOR OUTPUT ; 1 OUTPUT ; 2 INPUT ; 9 ILLEGAL FUNCTION ; 10 FILE IS LINKED PR NON FILE DEVICE ; 11 BLOCK OUT OF FILE REAND ERROR ; 12 FILE NOT OPENED ; 13 PROTECTION VIOLATION ;; 14 END OF DATA ; 15 URN FROM DRIVER: T.DUN: MOV R0,-(SP) ;SAVE POINTER TO DDB MOV @#V.CDQ,-(SP) ;DEQUEUE DRIVER JSR PC,@(SP)+ MOV (SP)+,R0 ;RESTORE DDB PTR MOV 2(R0),R2 ;GET USER CTL BLK ADDR ADD #6,R2  ;STEP TO STATUS WORD TST 12(R0)  ;DEVICE PARITY ERROR? BPL .+6 BIS #100000,@R2 ;IF SO TELL USER TST (R2)+  ;RETURN NO. OF WORDS NOT DONE MOV 16(R0),@R2 BEQ .+10 NEG @R2  ;... AS POSITIVE VALUE IF ANY BIS #40000,-(R2) ;... & E.O.M. SET T.XIT: CLR @R0  ;FOTHER CALLS WAITING ON DVR ; 2) RESTORES REGISTERS TO STATE PRIOR TO DVR CALL ; 3) RECALLS RW.MC TO COMPLETE INITIALISATION ; ;ON ENTRY, USER REGISTERS WILL BE STORED ON ; TOP OF STACK BY DRIVER & R0 = DDB ADDRESS ; ;ON EXIT TO SPECIAL READ/WRITE FOR RE-INIT ; (VIA RW.MC), REGISTERS WILL BE AS FOLLOWS:- ; R0 = ADDRESS OF BUFFER POINTER IN DDB ; R1 = POINTER TO NEXT BYTE IN DEVICE BUFFER ; R2 = ADDRESS OF BYTE COUNT IN USER LINE HDR ; R3 = DATA MODE & CURRENT STATUS OF TRANSFER ; MOV 6(R1),R0 ; DDL END BG.DVB: ADD #10,R1  ; NEXT ENTRY CMP R1,R0 BEQ BG.SMR  ; END TEST TST 2(R1)  ; DRIVER RESIDENT ? BNE BG.DVB  ; YES CMP @R1,@R3  ; THIS LIB ENTRY = THIS DVR. ? BNE BG.DVB  ; NO MOV 6(R3),-(SP) ADD #17,@SP  ; LENGTH ROUNDED TO 16 ASR @SP ASR @SP  ; CONVERT TO BLOCKS SWAB @SP  ; BITS 15 THRU 10 BIC #1777,@SP BIS 4(R3),@SP ; SET START BLOCK MOV (SP)+,6(R1) BR BG.NXN  ; NEXT ? BG.SMR: MOV #2,R0  ;DEVICE PARITY ERROR R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .BYTE 0,0  ; REENTRANT BLO: MOV R1,R3  ; GET BLOCK BLOCK ADDR TST (R3)+ MOV (R3)+,R4 ; INTO R4 MOV -(R1),-(R3) ; REMOVE ARGS CMP R1,SP BNE .-4 CMP (SP)+,(SP)+ CLRB 1(R4)  ; RESET ERRORS MOV #10000,R5 ; SET BUF ADDR AND LENGTH MOV 6(R0),4(R4) ; ADDRESS BEQ BL.ERR  ; NOT OPENED MOV -2(R0),R3 ; DRIVER ADDRESS CLR R1 BISB 4(R3),R1 ; NO.REE DAT-SET CLR 6(R0)  ;REMOVE BUFFER POINTER CLR R5  ;SET UP EXIT VIA SYSTEM TSTB TRA-2  ;... ALLOWING FOR NON-RES. BNE .+4 T.RTN: CMP (R5)+,(R5)+ ADD @#V.XIT,R5 MOV R5,PC ;ILLEGAL FUNCTION ERROR: T.DER: MOV @R0,-(SP) ;SHOW CALL ADDR AS EVIDENCE MOV #1403,-(SP) ;GIVE ERROR DIAGNOSTIC IOT   ;GO TO DIAGNOSTIC PRINT ;INVALID CALL ERROR: T.CER: BIC #160000,@R2 ;CLEAR ANY PREV. ERROR BIS #20000,(R2)+ ;SET CALL ERROR CLR @R2 BR T.XIT  ;... &R4 = ADDRESS OF NEXT DATA BYTE IN USER LINE ; RW.XD: MOV R0,-(SP) ;SAVE DDB ADDRESS MOV @#V.CDQ,R5 ;CHECK DRIVER QUEUE JSR PC,@R5 MOV @SP,R0 ;GET BACK DDB ADDRESS MOV R0,R3 MOV -(R3),R3 ;GET DRIVER ADDRESS CMP (R0)+,(R3)+ ;BUMP POINTERS MOV (R0)+,R4 ;... TO GET USER LINE CMP (R0)+,(R4)+ ;AGAIN BUMP POINTERS CMP (R0)+,(R0)+ ;STEP ON TO FUNC BYTE MOVB @R0,R5 ;GET FUNC & ADJUST ... BIC #177771,R5 ;FOR READ/WRITE RETURN TST 6(R0) ;ACTUALLY EMT 2 MOV #BG.MRT,R1 ; INTERNAL EMT TABLE BG.LML: TST (R1)  ; IMPLEMENTED ? BEQ BG.NOT  ; NO CMP (R1),(R3) ; SEARCH MRT FOR NAME BEQ BG.FLB  ; FOUND BG.NOT: TST (R1)+  ; FIX REGS INC R0  ; AND KEEP LOOKING CMP R1,#BG.DER BNE BG.LML BG.NXN: ADD #16,R3  ; TRY NEXT ENTRY DEC R4  ; NEED ANOTHER BLOCK ? BNE BG.SEL BR BG.SMT  ; YES ; LIBRARY READ AND WRITE BACK ROUTINE BG.NTR: .WORD 0,0  ; NEXT, FIRST FLAGS BG.LRR: MOV #BG.DDB,R0 ; OF BUFFS ASL R1 ASL R1 ASL R1 ASL R1 MOV R1,6(R4) ; BLOCK LENGTH CMP @R4,#1  ; GET BUF ONLY ? BNE BL.FST  ; NO ; FINAL EXIT BL.FXT: CLR R5 CLR @R0  ; CLEAR DDB BUSY TSTB BLO-2  ; RESIDENT ? BNE .+6 BL.IXT: MOV #4,R5  ; INTERMEDIATE EXIT ENTRY ADD @#S.XIT,R5 MOV R5,PC  ; GO OUT ; BLOCK REQUEST BL.FST: MOV #2000,R5 BIT 2(R3),#100000 ; FILE STRUCTURED ? BEQ BL.ERR  ; NO ASR R5  ; MAKE ERROR = 1000 MOVB @R4,R1  ; EXIT V.RRES=46 V.CDB=50 V.CDQ=52 V.XIT=42 .END  STARTED YET? BEQ .+4 ;IF NOT INIT AGAIN CMP -(R5),-(R5) ;OTHERWISE FORCE RE-INIT MOV 4(R0),R2 ;GET DVR WD CNT BEQ .+6 ;IF NONE ALL DONE BIS #40000,@R0 ;OTHERWISE EOM -REMEMBER! SUB R2,-(R0) ;ADJUST WD CNT ACCORDINGLY MOV -(R0),R1 ;COLLECT BUFFER POINTER TST @R3 ;IF DVCE FILE-STRUCTURED,... BPL RW.MCD ;.... MAY NEED ADJUSTMENT V.CDQ=52 ;FILE STRUCTURED OPERATIONS: MOV 20(R0),R2 ;SO SET PTR TO DDB MOV #10,R1  ; ... & TO DVR TFR RTN TST BG.NTR+2 ; READ YET ? BEQ BG.FTT  ; NO, SKIP WRITE MOV #BG.DNE,14(R0) MOV #2,12(R0) JSR R5,S.RSAV ; SAVE CURRENT REGS. JSR PC,S.CDB BR .  ; WAIT FOR WRITE BG.DNE: BIT 12(R0),#100000 ; ANY ERROR ? BEQ .+6 JMP BG.DER TST -(SP)  ; SIMULATE R0 SAVE JSR PC,S.CDQ ; DEQUEUE ADD #22,SP  ; TIDY UP STACK JSR R5,S.RRES ; GET BACK SAVED REGS. MOV BG.NTR,4(R0) BEQ BG.MDN  ; NEXT I GET CODE ROR R1  ; MOVE BITS 2/3 TO C & N ROR R1 ROR R1 BVC BL.ERR  ; IF BOTH OR NEITHER ILLEGAL MOV 26(R0),R1 ; FIB POINTER MOV #20000,R5 ; ACCESS ALLOWED ? CMP 2(R1),#1 ; I.E. OPEN(U) IN EFFECT BEQ BL.TAL CMP @R4,#4  ; IF READ ONLY .... BNE BL.ERR CMP 2(R1),@R4 ; IS IT OPENI? BNE BL.ERR BL.TAL: MOV #4000,R5 MOV 2(R4),R2 ; REQUESTED RELATIVE BLOCK CMP R2,14(R1) ; COMPARE WITH LENGTH BGE BL.ERR  ; BLOCK OUT OF RANGE ASR R5;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ; .TITLE XIT ;EXIT PROCESSOR VERSION 1 DEC 70 ; ; CALLED FROM USER PROGRAM AT END OF JOB BY:- ; EMT 60 ; ; MERELY LOADS TRANSIENT MONITOR (TMON) INTO ; TOP OF MEMORY, ON THE ASSUMPTION THAT THIS ; IS STORED AS THE SECOND ENTRY IN THE MONITOR ; LIBRARY ON DISK. A SATISFACTORY LOAD CAUSES ; TRANSFER OF CONTROL TO TMON. ; ; TMON WILL BE RESPONSIBLE FOR USER PROGRAM TIDY-UP ; AND FOR ACCEPTANCGET FIB PTR MOV -(R0),@R2 ;SAVE OLD BLOCK INC (R0)+ ;ASSUME CONTIG. FILE SUB 16(R2),@R2 ;... GET NEXT NO. & CHK IF END TST 6(R2) ;FILE LINKED TYPE? BMI .+6 MOV @R1,@R2 ;IF SO STORE LINK CLR (R1)+ ;... & CLEAR FOR NEXT TIME TST @R2 ;END OF FILE REACHED? BNE .+10 BIS #40000,4(R0) ;IF SO SET MARKER JMP RW.MCD ;REJOIN COMMON OPERATION ; 6) ROUTINE TO CHECK LINE END: ; ;OPERATIS ZERO, SO DONE BG.FTT: INC BG.NTR+2 ; KILL FIRST TIME SWITCH MOV #BG.DON,14(R0) MOV #4,12(R0) ; READ CODE JSR R5,S.RSAV ; SAVE REGS. FOR TFR JSR PC,S.CDB ; READ BR . BG.DON: BIT 12(R0),#100000 ; ERROR ? BEQ .+6 JMP BG.DER TST -(SP)  ; SIMULATE R0 SAVE JSR PC,S.CDQ ; DEQUEUE ADD #22,SP JSR R5,S.RRES ; GET BACK SAVED REGS. MOV BG.LLB,BG.NTR ; CHAIN NEXT RTS R5  ; AND RETURN BG.FLB: ASL R0  ; MAKE EMT CODE = BYTES BIT #1,MRT.(R0)  ;MAKE ERROR CODE 2000 TST 6(R1)  ; IS FILE LINKED ? BPL BL.ERR  ; YES, CURRENTLY ERROR ADD 12(R1),R2 ; COMPUTE ABSOLUTE BLOCK MOV R2,4(R0) ; PREPARE DDB BL.TRN: MOV 4(R4),6(R0) ; FOR TRANSFER MOV 6(R4),10(R0) NEG 10(R0)  ; 2 S COMPLEMENT COUNT MOV #100000,R5 BIC #164006,12(R0) ; CLEAR ERROR, ETC. BITS BISB @R4,12(R0) ; SET READ OR WRITE MOV PC,R2  ; COMPUTE RETURN ADDRESS ADD #BL.CPR-.,R2 MOV R2,14(R0) BL.ENQ: MOV #10,R1  ; TRANSFEE OF NEXT TASK VIA KEYBOARD ; COMMAND. ; ; ON EXIT TO TMON, THE STACK WILL BE SET IMMEDIATELY ; BELOW ITS LOAD POINT & R5 WILL BE SET TO SVT.+14(DCO) ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; .GLOBL XIT .BYTE 0,-1 ;IN USE/NO SHARE SWITCHES. ;MAIN SEQUENCE - CALLS MONLIB DIRECTORY FROM DISK ; & HANDLES POST-TRANSFER OPERATIONS: XIT: JSR PC,X.SET ;SET UP TFR OF MONLIB DIR. ONS: ; 1) CHECKS FOR END OF LINE (FLAG OR BYTE CNT) ; & RETURNS FOR ANOTHER BYTE IF NOT ; 2) IF EOL FLAG, EXITS TO USER ; 3) IF BYTE COUNT DONE, EXITS TO USER FOR ; UNFORMATTED MODES AND FOR FORMATTED ; ASCII (SHORT LINE FLAG FOR LATTER) ; 4) FOR FORMATTED BINARY, GOES BACK TO ; SPECIAL READ/WRITE FOR CHECKSUM ACTION ; ;ON ENTRY, REGISTERS WILL BE AS FOR ENTRY TO RW.DX ; ;ON EXIT TO SPECIAL READ/WRITE FOR FORMAT BIN, ; R0 = ADDRESS OF CHECKSUM IN DDB ; IN ADDITION, DDB BYT ; ROUTINE ALREADY RESIDENT? BEQ BG.FLX  ; IF SO LEAVE PRESENT ENTRY MOV 4(R3),R2 ; START BLOCK ASL R2 MOV 6(R3),-(SP) ; LENGTH ADD #63.,(SP) ; ROUNDED (64 WORD BLOCKS) CMP R0,#60  ; LOOK FOR SUBSID SWAP RTNS BLO BG.FLC CMP R0,#100 BHIS BG.FLC CMP @SP,#128. ; ... & ENSURE MAX NOT > 128 BLT BG.FLC MOV #128.,@SP BG.FLC: SWAB (SP)  ; HIGH ORDER BITS INDICATE BIC #37777,(SP) ; NUMBER OF BLOCKS (0=4) BIS (SP)+,R2 BIS #1,R2  ; INDICATR ENTRY TO DRIVER MOV R4,2(R0) ; SAVE BLOCK ADDRESS IN DDB MOV @#S.CDB,-(SP) ; ENQUEQE JSR PC,@(SP)+ BR BL.IXT  ; TAKE INTERMEDIATE EXIT BL.CPR: MOV R0,-(SP) ; COMPLTEION RETURN MOV @#S.CDQ,-(SP) ; DEQUEQE JSR PC,@(SP)+ MOV (SP)+,R0 MOV 2(R0),R4 ; RESTORE BLOCK ADDRESS MOV 12(R0),R5 ; STATUS BIC #37777,R5 ; INFORM USER OF PARITY OR EOD BNE BL.ERR ; ERROR OCCURRED BR BL.FXT ; ERROR ROUTINE BL.ERR: BIS R5,@R4  ; ERROR SET BR BL.FXT ; MOV R0,-(SP) ;ON RETURN SAVE DDB PTR ... MOV @#V.CDQ,-(SP) ;... WHILE FREE DRIVER JSR PC,@(SP)+ MOV (SP)+,R0 ;THEN RESTORE MOV R0,R2 ;USE TO GET INFO SAVED IN DDB MOV (R2)+,R1 ;... PTR TO DVR TFR ROUTINE MOV (R2)+,R5 ;... & PTR TO SVT (CSA) TST (R2)+ ;SKIP BLOCK FOR NOW MOV @R5,@R2 ;GET TOP OF CORE ... BIC #17777,@R2 ;... & BUILD LOAD ADDR ADD 46(R2),@R2 ;... FROM DIR DATA MOV R2,R3 ;SAVE PTR HERE FOR LATER MOV (R2)+,SP ;MOVE STACK BELOE COUNT REDUCED TO SHOW ; DATA BYTES ONLY AND USER LINE BYTE COUNT CLEARED ; AS EOL FLAG TO ALLOW RETURN TO RW.DX FOR ; DEVICE ACTION IF NOW NECESSARY ; RW.EC: TST @R2 ;EOL SET? BEQ RW.XT ;IF SO LEAVE NOW CMP @R0,@R2 ;COMPARE BYTE COUNTS BNE RW.MCE ;RETURN TO SPEC RTN IF DIFF. MOVB R3,R5 ;IF SAME, LOOK FOR .... RORB R5 RORB R5 BCS RW.XT ;... UNFORM MODES & LEAVE BPL RW.MCE ;...OR FORMAT ASCII - RETRY CLR @R2 ;FOR FORMAT BIN, SET EOL FLAE NON RESIDENT MOV R2,MRT.(R0)  ; MRT ENTRY SET BG.FLX: ASR R0 MOV R0,12(R3) ; EMT CODE BACK IN LIBRARY JMP BG.NXN  ; NEXT ? ; INIT; TABLE COMPLETE - STORE COPY ON DISK: BG.MDN: MOV #BG.DDB,R0 ; WRITE OUT MRT MOV #10,R1  ; SET UP DDB MOV #BG.FIN,14(R0) MOV #2,12(R0) ; WRITE CODE MOV #MRT.,R3 ; START ADDRESS MOV R3,6(R0) SUB #DDL.,R3 ;SET WORD COUNT ASR R3 MOV R3,10(R0) MOV #5,4(R0) ; START BLOCK JSR PC,S.CDB BR . BG.FIN: BIT 12(ERROR SET IN BLOCK ; CONSTANTS AND ETC. S.XIT=42 S.CDB=50 S.CDQ=52 .END W THIS CLR -(SP) ;IF NOW EXIT, STATUS TO BE MT MOV 36(R2),@R2 ;GET TMON SIZE FROM DIR NEG (R2)+ ;... TO SET WORD COUNT TST @R2 ;CHK DISK TFR O.K. BPL .+4 IOT ;IF NOT, THAT'S YER LOT!! MOV @R3,-(SP) ;OTHERWISE SET EXIT ADDR ADD R1,R5 ;MOVE SVT PTR TO DCO CMP @R2,-(R3) ;READ TMON IN YET? BNE X.TGO ; (BLOCK=READ=4) MOV 32(R2),@R3 ;IF NOT SET BLOCK NOW X.W8A: MOV @R5,R4 ;THEN WAIT I/O COMPLETE BEQ X.GET ;... IF USER HAS NOT RLSED G ADD #2,@SP ;SET UP EOL RTN FOR C/S OPS BR RW.XFD ;FORCE COME BACK AT CHK BUFF ; ; .EOT ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003B ; ;ROUTINES CALLED BY COMMON PROCESSOR TO PERFORM ; FUNCTIONS WHICH ARE UNIQUE TO READ OR WRITE ; ;CALL:- JSR PC,@(SP)+ WHERE COMMON PROCESSOR ; HAS SET UP APPROP. ADDR ; ;ENTRY POINTS FROM COMMON PROCESSOR (BASED ON VALUE IN R5) ; R0),#100000 ; ERROR ? BEQ .+6 JMP BG.DER TST -(SP)  ; SIMULATE R0 SAVE JSR PC,S.CDQ ADD #22,SP  ; TIDY UP STACK MOV (SP)+,R5 ; GET BACK ENTRY PC RTS R5  ; MRT. COMPLETE - EXIT ;INITIALISE DDB: .WORD 0,0 .WORD 0 BG.DDB: .WORD 0,0,0 .WORD BG.LLB .WORD -64. .BYTE 4,0 .WORD 0 .WORD 0,0,0,0 ; .END BG.BGN ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ; .TITLE SPC ; ; SPECIAL DRIVER FUNCTIONS ROUTINE ; ; CALLING SEQUENCE ; MOV #DATA,-(SP) ; MOV #LINKBLOCK,-(SP) ; EMT 12 ; WHERE 'DATA' IS EITHER:- ; (A) A CODE, < 256., SHOWING SPECIAL FUNCTION REQD. ; (B) THE ADDRESS OF A SPECIAL FUNCTIONS BLOCK ; WITHIN THE CALLING PROGRAM. THE FIRST WORD OF THIS ; BLOCK MUST CONTAIN THE CODE REQD.; THIS MAY BE ; FOLLOWED BY OTHERS AS NEEDED FOR THE FUNCTI  CLR R3 ;FIRST SET SW. X.W8B: TST @R4 ;CHECK IF DATASET BUSY BEQ .+4 INC R3 ;IF SO COUNT MOV -10(R4),R4 ;IF MORE DDB'S ... BNE X.W8B ;... REPEAT TST R3 ;OTHERWISE CHECK SW. BNE X.W8A ;IF ANY FND BUSY TRY AGAIN X.GET: MOV @#V.CDB,-(SP) ;IF NOT DO SO NOW JSR PC,@(SP)+ BR . ;WAIT TILL IN - WILL RTN ;.... TO XIT+4 WHEN DONE ;EXIT TO TMON: X.TGO: CLR R0 ;RAISE PRIORITY ... BIS #340,-(R0) CLRB XIT-2 ;... WHILE PERHAPS FRE  A) FOR RE-INITIALISATION AFTER DRIVER TRANSFER: BR WR.IN1 ;WRITE ENTRY RW.IN: BR RD.IN6 ;READ ENTRY ; B) FOR START INITIALISATION: BR WR.IN ;WRITE ENTRY RD.IN: ;READ ENTRY ; 1) READ OPERATIONS ; ;A) COMPLETE INITIALISATION: ; ; SETS UP BYTE COUNT IN USER LINE FROM MAX BYTE ; COUNT & EXITS IF 0. IF BUFFER PTR 0, RETURNS ; TO COMMON PROCESSOR TO FILL BUFFER BEFORE ; READ BEGINS (UNLESS EOM OR EOF ALREADY SEEN) ; FOR FORMAT BINARY OPERATIONS ONLY READS ; HEA  ON. ; ; THIS ROUTINE WILL CALL THE APPROPRIATE DRIVER ; TO ACTION THE SPECIAL FUNCTION, PROVIDED THAT ; THE DRIVER ITSELF CONTAINS THE NECESSARY ROUTINE ; AS SHOWN BY BIT 5 OF ITS FACILITY INDICATOR WORD ; WHEN THE DRIVER IS CALLED, WORD 2 OF THE DDB ; WILL CONTAIN THE ADDRESS OF THE CODE FOR THE ; FUNCTION - IF PASSED BY METHOD (A) ABOVE THIS ; WILL IN FACT BE WORD 20 OF THE DDB, IF BY (B) ; IT WILL BE THE ACTUAL ADDRESS PASSED. ; IT WILL BE THE RESPONSIBILITY OF THE DRIVER ; TO DE E MSB RTI ;THEN GO TO TMON FOR REST ;DDB FOR DISK OPERATIONS: .WORD 0,0 ;RESERVED FOR Q LINKAGE .WORD 0 ;SET TO ADDR OF SYSDSK DVR .WORD 10 ;NO FLAG REQD. SETS R1 .WORD 0 ;NO LINE PTR. SAVES SVT PTR .WORD 4 ;FIRST BLK OF MONLIB DIR. .WORD V.SVT ;SETS R5; BUFF ADDR ENTERED .WORD -15. ;ENUF WORDS FROM MONLIB DIR. .WORD 4 ;READ ONLY NECESSARY ;SET UP ROUTINE FOR TRANSFER - OVERLADER INFO. SEPARATELY & CHECKS VALIDITY ; BEFORE COMMENCING READ PROPER. ; MOV -4(R2),@R2 ;GET BYTE COUNT BEQ RW.EXT ;IF NONE EXIT NOW! TST R1 ;ANY BUFFER POINTER? BEQ RW.DXA ;IF NOT FILL BUFFER FIRST CMP R1,-2(R0) ;ALSO IF BUFFER NOW EMPTY BEQ RW.DXA MOVB R3,R5 ;LOOK FOR FORMAT BINARY BICB #34,R5 DECB R5 BNE RD.A2 ;IF ELSE, START READ PROPER ;SPECIAL OPERATIONS BEFORE FORMAT BINARY;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V000A TERMINE WHETHER THE CODE ITSELF IS ONE ; THAT IT IS ABLE TO ACTION. ; ; ON RETURN TO THE CALLING PROGRAM, THE CALL PARAMETERS ; WILL BE REMOVED FROM THE STACK. IF THE FUNCTION ; REQUIRES A RETURN OF DATA TO THE USER, THIS WILL ; BE PASSED VIA THE SPECIAL FUNCTIONS BLOCK. ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL SPC .BYTE 0,0 ; SWAPPABLE REENTRANT SPC: MOV -(R0),R4 ; GET DRIVER ADDRESS ID BY MONLIB DIR. X.SET: MOV PC,R0 ;SET DDB PTR MOV R0,R1 ;... & HOLD AS BUFF PTR TST (R1)+ ;... LEAVING SPARE FOR DK: MOV (SP)+,-(R0) ;USE RTN AS COMPLETION EXIT CMP -(R0),-(R0) ;GO UP TO BUFF ADDR STORE MOV @-(R0),R5 ;SET SVT POINTER ... MOV R1,@R0 ;... & STORE BUFF ADDR ADD -(R0),R5 ;MOVE TO CSA IN SVT MOV R5,-(R0) ;SAVE SVT PTR FOR NOW MOV -(R0),R1 ;SET PTR TO DVR TFR ROUTINE MOV V.DDL-V.CSA(R5),R2 ;GET ADDR OF SYS DISK DVR CMP (R2)+,-(R READ: SUB 2(R0),R4 ;ADJUST DATA PTR FOR HDR OPS. RD.IN1: TST (R0)+ ;MOVE TO C/S IN DDB CMP @R0,#-4 ;SEEN BOTH HDR WORDS YET? BEQ RD.IN4 ;IF SO GO PROCESS MOVB (R1)+,R5 ;FIND FIRST NON-0 BYTE BNE .+6 TST @R0 ;... UNLESS ALREADY PAST IT BEQ RD.IN2 MOVB R5,(R4)+ ;SAVE FOR THE MOMENT DEC @R0 ;... & COUNT BYTES STORED RD.IN2: CMP -(R0),-(R0) ;GO BACK TO LINE END STORE CMP R1,(R0)+ ;... & CHECK IF BUFFER DONE BNE RD.IN1 RD.IN3: BR RW.DXA ; DRIVER STATUS ROUTINE -- STT ; WHEREBY THE CALLER OBTAINS (USUCMP (R0)+,(R4)+ ; ... & MOVE TO FAC. INDIC. MOV R1,R3 ; ARGUMENT POINTER IN R1 CMP (R3)+,(R0)+ MOV (R3)+,(R0)+ ; 2ND ARG PLACED IN DDB MOV -(R1),-(R3) ; REMOVE ARGS FROM STACK CMP R1,SP BNE .-4 CMP (SP)+,(SP)+ MOV #14,R1 ; SET CONSTANT FOR DVR RTN MOV R0,R3 ; SET VARIABLE DDB PTR ADD R1,R3 ; ... & BUMP TO CODE STORE MOV -(R0),@R3 ; MOVE USER ARG IN TSTB 1(R0) ; CHECK IF CODE ... BNE .+4 MOV R3,@R0 ; ... & SET PTR IF SO CMP 0) ;... USING DDL ENTRY MOV @R2,(R0)+ BR X.GET ;GO DO TRANSFER ;MISC. DEFINITIONS: V.SVT=40 V.CSA=4 V.DDL=50 V.CDB=50 V.CDQ=52 .END  ;IF SO GET REFILL RD.IN4: ADD @R0,-(R4) ;WHEN HDRS GATHERED ... ADD @R4,R5 ;... REMOVE FROM COUNT INC R5 ;... & COMPUTE C/S SUB R5,@R0 ;STORE IN DDB TST -(R0) ;... & RESET PTR AT BYTE COUNT MOV @R4,@R2 ;SET INPUT COUNT IN LINE BLE RD.IN5 ;IF NONE, IT'S AN ERROR DEC -(R4) ;SIMILARLY IF 1ST WORD NOT 1 BEQ RD.A2 ;OTHERWISE GO READ PROPER RD.IN5: BIS #2000,R3 ;UNLESS NOTHING LEFT BR RW.XT ;IN WHICH CASE EXIT IN ERROR ;ENTRY FOR RE-INITALLY UNNEEDED) INFO ; ABOUT THE MYSTERIOUS DRIVER WHICH HAS BEEN INITED ; TO HIS LINKBLOCK (DATASET). ; ; CALL SEQUENCE: ; MOV #LINKBLOCK,-(SP) ; EMT 13 ; ; INFO RETURNED ON THE STACK IS AS FOLLOWS: ; (SP) DRIVER FACILITIES ; DEVICE NAME ; BUFFER SIZE IN WORDS ; ; REGISTERS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .TITLE STT .GLOBL STT .BYTE 0,0  ; REENTRANT STT: MOV SP,R5 CMP -(SP),-(SP) ; MAKE ROOM FO-(R0),-(R1) ; ADJUST POINTERS TST -(R3) MOV R0,-(SP) ; SAVE DDB ADDR IN CASE NOW EXIT BITB @R4,#40 ; WILL DVR SUPPORT SPEC? BEQ SPFDUN ; NO, IGNORE MOV PC,-(R3) ; SET COMPLETION RETURN ADD #SPFRTN-.,@R3 MOV @#V.CDB,@SP ; GO TO DRIVER JSR PC,@(SP)+ CLR R5 ; RETURN USER TILL DONE BR SPFDN2 SPFRTN: MOV R0,-(SP) ; ON COMPLETION SAVE DDB ADDR MOV @#V.CDQ,-(SP) ; ... WHILE DEQUEUE DRIVER JSR PC,@(SP)+ SPFDUN: CLR @(SP)+ ; CLEAR BUSY C;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003B ; .TITLE OPN ;COMMON OPEN PROCESSOR VERSION 1 OCT 70 ; NON-RESIDENT MONITOR ROUTINE TO PROVIDE SET-UP ; FOR ALL FORMS OF OPEN AND ALL TYPES OF DEVICE. ; AMENDED TO INCLUDE MAGTAPE OPS. MAY 71 ; ;OPERATIONS: ; 1) CHECKS IF OPEN ALREADY ON DATASET & IF SO ; TELLS USER ; 2) SAVES CALL ARGUMENTS IN DDB AND REMOVES FROM STACK ; 3) IF NO DATA BUFFER, CLAIMS ONE IF AVAILABLE AND ; SETS ADIALISATION: RD.IN6: TST @R2 ;ALREADY SEEN LINE-END? BEQ RD.D ;IF SO IGNORE FOLL. CHECK CMP @R0,@R2 ;ALREADY IN OVERFLOW? BLOS RD.D SUB @R0,R4 ;IF SO READJUST BYTE PTR ADD @R2,R4 BR RD.D ;... BEFORE PROCEEDING ;B) TRANSFER BYTE & TAKE MODE ACTION: ; ; RECALLS COMMON PROCESSOR TO ADJUST BYTE & ON ; RETURN MOVES IT TO USER UNLESS:- ; 1) NULL (ALL ASCII MODES) ; 2) RUBOUT (FORMATTED ASCIR MOV SP,R3 MOV (R5)+,(R3)+ ; RETURN ARGUMENTS CMP R1,R5  ; BY MOVING STACK BNE .-4 MOV -(R0),R2 ; DRIVER ADDRESS CLR R3 BISB 4(R2),R3 ; BUFFER SIZE ASL R3  ; CONVERTED TO WORDS ASL R3 ASL R3 ASL R3 MOV R3,@R1 MOV 14(R2),-(R1) ; DRIVER NAME MOV 2(R2),-(R1) ; AND FACILITIES CLR 2(R0)  ; CLEAR DATASET BUSY CLR R5 TSTB STT-2  ; RETURN BNE .+4 CMP (R5)+,(R5)+ ADD @#S.XIT,R5 MOV R5,PC ; S.XIT=42 .END LR R5 ; EXIT (REMOVE REGS) TSTB SPC-2 BNE .+4 SPFDN2: CMP (R5)+,(R5)+ ADD @#V.XIT,R5 MOV R5,PC ; CONSTANTS V.CDB=50 V.CDQ=52 V.XIT=42 .END DRESS, SIZE & POINTER IN DDB. ; 4) IF DEVICE NOT FILE-STRUCTURED, MAY CALL DRIVER TO ; PERFORM INITIALISING ACTION ; 5) IF DEVICE FILE-STRUCTURED, SETS UP F.I.B. IF ; NONE ALREADY AND THEN CALLS RELEVANT ; PART OF FILE MANAGER TO COMPLETE ; OPEN PROCESSING ; 6) IF DEVICE IS SEQUENTIAL MAGNETIC TAPE, ; CALLS SPECIAL HANDLER TO ; POSITION TAPE AS REQD. ; ;ON ENTRY FROM RESIDENT MONITOR EXPECTS REGISTERS AS FOLLOWS: ; R0 = ADDRESS OF DATASET DDB ; R1 = STAI) ; ERROR IN PARITY ASCII CAUSES FLAG IN USER HDR ; EXITS TO COMMON PROCESSOR FOR END LINE CHECK ; & BUFFER REFILL IF REQD. ; RD.A1: DEC R4 ;LINE O'FLOW - OVERLAY TILL END BIS #400,R3 ;SHOW TO USER RD.A2: MOVB (R1)+,R5 ;GET NEXT BYTE FROM BUFFER JSR PC,@(SP)+ ;GET ADJUSTMENT MOVB R5,(R4)+ ;GIVE TO USER BNE RD.B1 ;IGNORE NULLS .... BIT R3,#1 ;... IN ALL ASCII MODES BEQ RD.C RD.B1: BIT R3,#3 ;FOR FORMATTED ASCII MODES ... BNE RD.D TSTB R5 !CK ADDRESS OF CALL ARGUMENTS ; R5 = ADDRESS OF PROCESSOR STATUS REGISTER (I.E. -2) ; USER REGISTERS STORED ON TOP OF STACK ; ;ON EXIT TO USER, ORIGINAL REGISTERS WILL BE RESTORED AND ; THE STACK WILL BE CLEARED. ; ;ON TRANSFER TO FILE MANAGER, REGISTERS WILL BE ; STORED ON TOP OF THE STACK; STORED CONTENTS ; WILL BE:- ; R0 = ADDRESS OF DDB ; R1 = ADDRESS OF CALL ARGS (IN FIB) ; R2 = ADDRESS OF FILE TYPE CODE IN USER FILE BLOCK ; R4 = ADDRESS OF FIB ; THE OTHER REGISTER CONTENT" ;... CHECK PARITY (0 IF F/A) BPL RD.B2 ;... & TELL USER IF WRONG BIS #2000,R3 CLR R5 RD.B2: TST @R2 ;IF ALREADY DONE LINE ... BEQ RW.EC ;... EXIT NOW (****) INCB R5 ;LOOK FOR RUBOUT BPL RD.D RD.C: DEC @R0 ;IGNORE IF FOUND DEC R4 RD.D: JSR PC,@(SP)+ ;RETURN FOR END CHECK BR RD.E ;ON RETURN MORE CHECKING! ; ;(****) - THIS MAY MEAN A BUFFER IS NOT REFILLED IN ; READINESS FOR NEXT READ. HOWEVER BECAUSE SUCH REFILL ; MIGHT BE DEPENDENT UPON #;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003B .TITLE GUT ; GENERAL UTILITIES OVERLAY ; THIS OVERLAY CONTAINS SEVERAL GENERAL FUNCTIONS ; GROUPED UNDER ONE EMT CALL ; THE FUNCTIONS AND THEIR CALLING IS AS FOLLOWS: ; ; SET TRAP VECTOR (34) ; MOV #ADDR,-(SP) ; DESIRED ADDRESS ; MOV #STATS,-(SP) ; DESIRED STATUS ; MOV #1,-(SP) ; CODE ; EMT 41 ; ; SET RESTART ADDRESS ; MOV #ADDR,-(SP) ; DESIRED RESTART ADDRESS ; MOV #2,-(SP) ; EMT $;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V000A %S SAVED ARE IRRELEVANT ;THESE ARE FOLLOWED ON STACK BY:- ; 1) CALL TO FILE MANAGER ; 2) USER REGISTERS. ;USER CALL ARGUMENTS WILL BE SAVED AS FOLLOWS:- ; DDB: USER CALL ADDRESS ; FIB+34: USER LINK BLOCK ADDRESS ; FIB+36: USER FILE BLOCK ADDRESS ;ON TRANSFER TO SPECIAL HANDLER FOR MAGTAPE, REGISTERS ; WILL BE AS FOLLOWS (AGAIN STORED ON STACK):- ; R0 = ADDRESS OF DDB ; R1 = ADDRESS OF CALL ARGS IN DDB ; R2 = ADDRE&INPUT FROM A TERMINAL WHEN ; THE OPERATOR IS NOT YET READY TO PROVIDE SAME, IT ; IS NECESSARY TO GET THE DATA THRU TO THE USER AS ; SOON AS POSSIBLE. ;C) FORMATTED BINARY LINE DONE - VERIFY CHECKSUM: ; ; TAKES NEXT BYTE FROM BUFFER & COMPARES ; WITH ACCUMULATED CHECKSUM. RETURNS TO ; COMMON PROCESSOR FOR EXIT TO USER WITH ; STATUS SET WITH COMPARE RESULT ; CMPB (R1)+,2(R0) ;DO C/S VERIFY BEQ .+6 BIS #1000,R3 ;'41 ; ; OBTAIN THE CORE SIZE ; MOV #100,-(SP) ; EMT 41 ; THE TOP ADDRESS OF AVAILABLE CORE (CORE SIZE-Z) ; WILL BE RETURNED ON TOP OF THE STACK ; ; OBTAIN THE RESIDENT MONITOR SIZE ; MOV #101,-(SP) ; EMT 41 ; THE STACK POINTER WILL GIVE THE PERMANENT MONITOR ; SIZE ; ; OBTAIN THE CURRENT FULL MONITOR SIZE ; MOV #102,-(SP) ; EMT 41 ; GIVE THE CURRENT TOTAL MONITOR AREA SIZE ; ON THE TOP OF THE STACK ; ; OBTAIN THE CURRENT DATE ; MOV #103,-(SP) ; EMT ( .TITLE CLS ;COMMON CLOSE PROCESSOR  VERSION 1 OCT 70 ; NON-RESIDENT MONITOR ROUTINE TO SHUT-DOWN ; ON ALL TYPES OF )SS OF CALL FILE BLOCK ; R4 = ADDRESS OF DRIVER ;USER CALL ARGUMENTS WILL BE SET IN DDB AS FOLLOWS:- ; DDB+2 LINK BLOCK ADDRESS ; DDB+4 FILE BLOCK ADDRESS ; ;ERROR EXITS WILL BE TAKEN:- ; 1) IF FILE ALREADY OPEN. ; USER ERROR RETURN TAKEN IF SUPPLIED ; (WITH ERROR CODE 0); OTHERWISE EDP ; 2) IF TYPE OF OPEN NOT SUITABLE FOR DEVICE ; CONSIDERED FATAL - EDP ; 3) IF NO BUFFER AVAILABLE FOR DATA OR F.I.B. ; USER ERROR RETURN TAKEN IF SUPPLIED; ; OTHERWISE EDP. R0=%0 R*IF NOT SET STATUS BR RD.D ;GO CHK IF BUFF NOW EMPTY ; ;D) CHECK IF MORE TO COME: ; ; RETURNS HERE IF END OF LINE NOT YET SEEN ; IF STILL ROOM IN USER BUFFER CONTINUES, ; OTHERWISE OVERLATS LAST BYTE IN NORMAL ; MODES OR EXITS IN SPECIAL. ; RD.E: CMP @R0,-4(R2) ;LINE FULL YET? BLT RD.A2 BITB R3,#20 ;IF SO THIS SPECIAL MODE? BEQ RD.A1 MOV @R2,@R0 ;IF SO SHOW FULL LINE SIZE RD.XT: JMP RW.EXT ;... & TAKE ERROR EXIT +41 ; DATE RETURNED ON TOP OF STACK ; ; OBTAIN THE TIME IN TICKS ; MOV #104,-(SP) ; EMT 41 ; TOP 2 CELLS OF STACK WILL GIVE TIME WITH ; LEAST SIGNIFICANT ON TOP ; OBTAIN CURRENT UIC ; MOV #105,-(SP) ; EMT 41 ; UIC RETURNED ON TOP OF STACK ; OBTAIN NAME OF SYSTEM DEVICE ; MOV #106,-(SP) ; EMT 41 ; RAD50 NAME FOR SYSTEM DEVICE ON TOP OF STACK ; ; ON ENTRY EXPECTS R1 TO POINT TO TOP ARGUMENT ON ; STACK & R2 TO CONTAIN PROGRAM CALL ADDRESS ,DEVICE ; ;OPERATIONS: ; 1) CHECKS IF ANYTHING IN BUFFER IF LAST ;  OPERATION OUTPUT; IF SO PERFORMS ;  LAST WRITE ; 2) IF DEVICE NOT FILE-STRUCTURED, CHECKS ;  WHETHER DRIVER CONTAINS CLOSE SEQUENCE; ;  CALLS DRIVER TO ACTION IF SO & MAKES ;  INTERIM RETURN TO USER UNTIL DONE. ; 3) ON COMPLETION, RELEASES DATA BUFFER & RETURNS ;  TO USER WITH FILE OPEN FLAG CLEAR. ; 4) IF DEVICE FILE STRUCTURED, CALLS CLOSE ROUTINE ;  IN FILE MANAGER TO EFFECT DIRECTORY OPERATIONS ; ;O-1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL OPN ; .BYTE 0,-1 ;IN USE/SHARABLE SWITCHES ;OPEN PROCESSING FOR ALL DEVICES: ; ; A) SAVE CALL ARGS & CHECK CALL VALIDITY: OPN: ADD PC,R5 ;SAVE ENTRY POINT MOV R0,R3 ;SET VARIABLE POINTER TO DDB MOV R2,-(SP) ;STACK CALL ADDR FOR ERROR CMP -(R5),-(R3) MOV (R3)+,R4 ;GET DRIVER ADDRESS CMP (R3)+,(R4)+ ;MOVE TO DVR FACILITY PATTERN MOV R1,R2.; 3) WRITE OPERATIONS ; ;1) COMPLETE INITIALISATION: ; ; CHECKS USER BYTE COUNT AND IF 0 EXITS IMMEDIATELY ; OTHERWISE ADJUSTS COUNT FOR FORMAT BIN. ; ALSO CHECKS BUFFER PTR: IF 0, ZEROES BUFFER ; AND SETS POINTER TO START (UNLESS EOM OR EOF ; ALREADY SEEN. RETURNS TO COMMON PROCESSOR FOR ; ADJUSTMENT OF BYTE. ; WR.IN: TST @R2 ;CHECK USER BYTE COUNT BEQ RD.XT ;IF NONE EXIT NOW TST R1 ;ANY BUFFER PTR? BNE WR.IN1 MOV -12(R0),R1 ;IF NOT G/ R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; .GLOBL GUT ; ;IN USE/RE-ENTRANCY SWITCH: UT.UCT: .BYTE 0,0 ;ACCEPT FUNCTIONS - CODES 0-77: GUT: MOV R1,R0 ;SET VARIABLE ARG PTR MOV #40,R3 ;... & TO SYSTEM VECTORS MOV R3,R4 MOV (R4)+,R5 ;GET SVT.ADDRESS DEC (R0)+ ;CODE #1? BNE UT.RSA MOV (R0)+,-(R3) ;IF SO SET TRAP VECTOR MOV (R0)+,-(R3) UT.XT1: MOV -(R1),-(R0) ;REMOVE CALL ARG0N ENTRY FROM RESIDENT MONITOR, EXPECTS REGISTERS AS FOLLOWS: ; R0 = ADDRESS OF DATASET DDB ; R1 = STACK ADDRESS OF USER CALL ARGS. ; USER REGS. STORED ON TOP OF STACK ; ;ON EXIT TO USER, ORIGINAL REGISTERS WILL BE RESTORED ; AND STACK CLEARED. IF DRIVER ACTION CALLED ; HOWEVER, DATASET WILL NOT BE FREED UNTIL ; SUCH ACTION IS COMPLETED. ; ;ON EXIT TO FILE MANAGER,REGISTERS WILL BE STORED ON STACK; ; RELEVANT CONTENTS WILL BE:- ; R0 = ADDRESS OF DDB ; R2 = ADDRESS OF FIB ; R3 = 1 ;GET CALL ARGUMENTS MOV (R2)+,(R3)+ MOV (R2)+,@R3 MOV -(R1),-(R2) ;REMOVE FROM STACK CMP R1,SP BNE .-4 CMP (SP)+,(SP)+ MOV (R3)+,R2 ;GET USER FILE BLK ADDR CLRB -(R2) ;USE TO CLEAR ERROR BYTE TSTB -(R2) ;OPEN CODE VALID? BEQ O.TER CMPB @R2,#4 BLOS .+10 CMPB @R2,#13 BNE O.TER ;IF NOT, TELL USER MOV (R4)+,R1 ;FILE-STRUCTURED DEVICE? BMI OP.A ;IF SO IGNORE TYPE CHECK BIC #371,R1 ;IF NOT, IS TYPE OK FOR DEVICE? BITB 2ET BUFF START WR.IN1: BIT -6(R0),#40000 ;EOM OR EOF SEEN ALREADY? BNE RD.IN3 ;IF SO EXIT NOW! MOV R0,R5 ;CLEAR OUT BUFFER MOV -(R5),R5 ;... FROM BOTTOM! CLRB -(R5) CMP R5,R1 BNE .-4 TST @R0 ;JUST STARTING? BEQ WR.IN2 ;IF NOT, RELOOK AT LAST BYTE BITB R3,#3 ;UNLESS BINARY OR UNFORM. BEQ WR.B2 BR WR.D WR.IN2: MOVB R3,-(SP) ;FOR JUST STARTING ... BIC #34,@SP ;... FORMAT BINARY ... DECB (SP)+ BNE WR.A1 BIC #1,R1 ;ENSURE3S FROM STACK CMP R1,SP BNE .-4 MOV R0,SP UT.XT2: MOV @R4,R5 ;GET SYSTEM EXIT ADDRESS TSTB UT.UCT ;IN SWAP BUFFER? BNE .+4 CMP (R5)+,(R5)+ ;IF NOT NO USER COUNT JMP @R5 UT.RSA: DEC @R1 ;CODE #2? BNE UT.GET MOV (R0)+,26(R5) ;IF SO STORE RESTART ADDR BR UT.XT1 ;... & EXIT AS ABOVE ;TRANSMIT FUNCTIONS - CODES 100-177: UT.GET: MOV #76,R3 ;USE CODE TO FORM INDEX SUB @R1,R3 B4ADDRESS OF DRIVER ; R4 = HOW OPEN CODE - 2 ; THESE WILL BE FOLLOWED ON STACK BY CALL TO FILE ; MANAGER AND STORED USER REGS. CALL ARG FROM USER ; WILL BE REMOVED. ;N.B. FILE MANAGER MUST FREE BUFFER & RELEASE ;  DATASET ON COMPLETION!! ; ;NO ERROR EXITS ARE CURRENTLY ENVISAGED. ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL CLS ; ;TIDY STACK & INITIALISE: CL.: .BYTE 0,-1  ;IN USE/SHARABLE SWITCH5@R2,R1 BEQ O.TER ;IF NOT, STOP NOW OP.A: CMP (R3)+,(R3)+ ;GO TO FUNC BYTE IN DDB MOVB @R3,R1 ;... & CHECK IF FILE OPEN ALRDY BMI O.OER ;IF SO, ALSO STOP ; B) GET DATA BUFFER & INITIALISE DDB: MOV #4,-(SP) ;REMEMBER TRANSFER DIRECTION BITB @R2,@SP BNE .+4 ASR @SP BISB (SP)+,@R3 MOV #10000,R1 ;SET BUFFER WORD COUNT BISB @R4,R1 ;.... USING STD DVR SIZE ASL R1 BCC .-2 MOV 6 PTR EVEN ADD #10,R1 ;... & ALLOW INTERLINE GAP MOV R1,R5 ;CHECK FOR BUFFER ROOM CMP (R5)+,(R5)+ ;... FOR HEADERS. CMP R5,-2(R0) ;IF INSUFFICIENT ... BHIS RD.IN3 ;... EMPTY BUFFER FIRST SUB R1,R5 ;GIVES CONSTANT 4 ADD (R2)+,R5 ;... TO ADJUST BYTE COUNT INC (R1)+ ;SET HEADER MODE WORD ... MOV R5,(R1)+ ;... & COUNT MOVB -(R2),-(SP) ;START CHECKSUM BUILD CMPB (R5)+,-(R2) ;... INCL 1 FOR MODE ADD (SP)+,R5 SUB R5,2(R0) ;STORE IN DDB 7GT UT.ERR ;... & CHECK RANGE O.K. CMP R3,#-6 BGE UT.GIV UT.ERR: MOV R2,-(SP) ;IF NOT REJECT CALL ... MOV #1402,-(SP) ;... AS FATAL ERROR IOT ;CALL ADDRESS IS EVIDENCE .BYTE 0,50,40,34,32,2,0,4 ;TABLE OF SVT. OFFSETS UT.GIV: ADD PC,R3 ;USE INDEX TO EXTRACT OFFSET CMPB -(R3),-(R3) MOVB -(R3),R3 ADD R3,R5 ;... & GET SVT. ENTRY CMP R3,#50 ;SYSTEM DEVICE REQD.? BNE .+4 ;IF SO ENTRY IS PTR TO DDL MOV @R5,R5 ;...FIRST WORD OF THIS IS ONE 8ES CLS: MOV -(R1),2(R1) ;CLEAR CALL ARG FROM STACK CMP R1,SP BNE .-6 MOV #10,R1  ;ASSUME DEVICE ACTION REQD. MOV R0,R2  ;SET VARIABLE PTR TO DDB CMP (R2)+,(SP)+ MOV -(R0),R4 ;GET DRIVER ADDRESS CMP (R0)+,(R4)+ ;GET FACILITY INDICATOR MOV @R4,(R2)+ ;HOLD IN DDB MOV R2,R4  ;SET 2ND DDB PTR .... ADD R1,R4  ;... AT COMP RTN ENTRY JSR PC,CL.E  ;... & GO GET REQD. ADDR. ;RETURN FROM DRIVER ACTION (CALLED BY INTERRUPT): MOV R0,-(SP) ;SAVE DDB PTR9R1,-(R3) ;STORE IN DDB NEG @R3 ASL R1 ;HOLD AS BYTES FOR LATER MOV @#V.GTB,R2 ;PREPARE TO GET BUFFER MOV -(R3),-(SP) ;...IF NONE ALREADY! BNE OP.B MOVB @R4,@SP JSR R5,@R2 OP.B: MOV @SP,@R3 ;STORE ADDRESS ON RETURN BEQ O.BER ;... IF ANY AVAILABLE ADD @SP,R1 ;CLEAR BUFFER OUT CLR -(R1) CMP R1,@R3 BNE .-4 ; C) TAKE DEVICE ACTION NECESSARY: MOV #10,R1 ;SET DVR TFR ROUTINE PTR ADD R1,R3 ;STEP TO BUFFER POINTER MOV (SP)+,@R3:;B) TRANSFER BYTE & TAKE MODE ACTION: ; ; RECALL COMMON PROCESSOR TO ADJUST BYTE ; & PASSES IT TO DEVICE BUFFER. FOR FORMATTED ; ASCII FOLLOWS HORIZ. TAB WITH RUBOUT AND ; VERT. FORM CONTROL WITH NULLS. RETURNS TO ; COMMON PROCESSOR FOR BUFFER AND LINE CHECKS ; WR.A1: CMP @R0,@R2 ;LINE NOT TERMINATED? BEQ RD.XT ;TAKE ERROR EXIT IF NOT WR.A2: MOVB (R4)+,R5 ;GET USER BYTE BITB R3,#3 ;FOR FORM. ASCII ... B UT.XT3: MOV (R5)+,-(R0) ;STORE IN LIEU OF ARG. CMP R3,#34 ;TIME REQD? BNE UT.XT2 MOV SP,R1 ;IF SO EXTRA STACK SPACE ... MOV SP,R3 ;... FOR DOUBLE WORD MOV (R1)+,-(SP) ;SO MOVE UP CONTENT MOV (R1)+,(R3)+ CMP R1,R0 BNE .-4 BR UT.XT3 ;RETURN FOR SECOND WORD .END < MOV @#V.CDQ,-(SP) ;DEQUEUE DRIVER JSR PC,@(SP)+ MOV (SP)+,R0 ;GET BACK DDB PTR TST (R0)+  ;... & RE-INIT AS ABOVE MOV #10,R1  ;NEW DRIVER CALL MAYBE MOV R0,R4  ;GO TO FUNC BYTE IN DDB ADD R1,R4 TSTB @R4  ;... & CHECK IF LAST CALL BPL CL.B  ;IF SO GO RELEASE DATA BUFF V.CDQ=52 ;CHECK ON DEVICE: IF REQD. GET CLOSE ACTION: CL.A: BIC #174371,@R4 ;CLEAR OPEN SWITCH ASL @R0  ;FILE-STRUCTURED DEVICE? BCS CL.= ;..& STORE BUFF START ADDR TST -(R4) ;FILE-STRUCTURED DEVICE? BMI OP.F BIT #20000,@R4 ;... OR SEQ. MAGTAPE? BNE OP.I JSR PC,OP.D ;GO INITIATE DEVICE ACTION ;PROCESSING FOR SIMPLE DEVICES: ; ; A) ON INPUT OPEN, FILL FIRST BUFFER: MOV R0,-(SP) ;ON DVR RETURN, SAVE DDB ADDR MOV @#V.CDQ,-(SP) ;... WHILE DEQUEUE DVR JSR PC,@(SP)+ MOV (SP)+,R0 ;RESTORE DDB ADDR MOV #10,R1 ;RESET MAGIC CON>NE WR.C BICB #200,R5 ;STRIP PARITY BIT MOV @R2,2(R0) ;SAVE USER BYTE COUNT FOR LATER JSR PC,@(SP)+ ;GET BYTE ADJUSTMENT MOVB R5,(R1)+ ;STORE IN BUFFER TST @R2 ;IF AT LINE END ... BNE WR.B2 BIT #20,R3 ;...IS THIS SPECIAL ASCII? BNE WR.B1 ADD 2(R0),R5 ;IF NOT RESTORE BYTE CNT CMP R5,@R0 ;... UNLESS AT END ANYWAY BNE WR.B2-2 WR.B1: MOV -22(R0),R5 ;IF SO, IS DEVICE A TERMINAL? BITB 3(R5),@PC BEQ .+4 ; (CARE!!! USED AS LITERAL***) ? .TITLE CSM .GLOBL CSM ;COMMAND SEMANTIC PASSER CSMFLG: .WORD 0 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 PC=%7 UNIT=-1 EXT=4 UIC=6 COMMA=', ABRKT='< CR=15 DOT='. LBRKT='[ ASTRSK='* COLON=': DOLLAR='$ SWER=2 FIL=2 CSM: CLR -(R6) ;SET UP ITEM COUNTER CLR -(R6) ;SET UP RETURN PARAM (STATUS) MOV @R1,R1 ;GET ADDRESS OF PARAMS MOV (R1)+,R3 ;BUFFER ADDRESS IN R3 MOV (R1)+,R2@X  ;IF SO CALL FILE MANAGER INC R1  ;OTHER DEVICE ACTION? TSTB @R0 BMI CL.F  ;IF SO GO DO IT ;CLOSE ACTION COMPLETE - RELEASE DATA BUFFER: CL.B: CMP -(R0),-(R0) ;GO BACK FOR DVR ADDR MOV (R0)+,R2 CMP -(R4),-(R4) ;GET BUFF ADDR TST @R4 BEQ CL.C  ;(IF ANY STILL ALLOCATED) MOV @R4,-(SP) CLR @R4  ;SHOW NOW GONE CLR -(SP)  ;GET BUFFER SIZE MOVB 4(R2),@SP MOV @#V.RLB,-(SP) ;... & RELEASE IT JSR R5,@(SP)+ ;EXIT TO USER: CL.C: CLR @R0  ASTANT MOV R0,R3 ;RESET VARIABLE DDB PTR ADD R1,R3 ;... STEP TO FUNC BYTE CMP (R3)+,(R3)+ OP.C: BIS #200,-(R3) ;SET OPEN SWITCH BIT #4,@R3 ;OPEN FOR INPUT? BEQ OP.XT CMP (R3)+,(R3)+ ;IF SO, STEP TO BUFF PTR MOV R3,R2 ;SET SECOND PTR TO BUFF ADDR SUB R1,R2 MOV @R3,R4 ;POINTER STILL SET? BEQ OP.XT-2 ;IF NOT READ DONE CLR @R3 ;CLEAR PTR AS SWITCH MOV -(R0),R5 ;TERMINAL DEVICE? CMP (R0)+,(R5)+ BIT #400,@R5 BNE OP.XT ;IF SBADD @PC,R1 ;IF SO FORCE OUTPUT CLR R5 ;... & ENSURE EOL FLAG SET MOV R5,@R2 ;... AT THIS POINT WR.B2: CMP R1,-2(R0) ;FOR THE REST, ROOM IN BUFFER? BHIS WR.D ;IF NOT, WAIT THIS TIME CLR R5 ;OTHERWISE CHECK BYTE BISB -1(R4),R5 ASLB R5 CMPB R5,#30 ;... FOR FORM FEED BEQ WR.B3 SUB #22,R5 ;... OR HORIZ. TAB BNE WR.D COMB @R1 ;FOLLOW HORIZ TAB WITH R/O BITB R3,#10 ;(AC CMP (R2)+,(R2)+ CLRB 1(R2) ;CLEAR THE UNIT FIELD MOV (R2)+,R4 ;GET NUMBER WORDS TO FOLLOW MOV R2,R5 ;CLEAR DEVICE FIELD, AND CLR (R5)+ ;POINTER THE SWITCHES DEC R4 ;IS THERE ANY SWITCH SPACE? BLE CSMI00 ;NO - BRANCH CLR @R5 ;SET FIRST SWITCH NOT IN USE CSMI00: MOV @R1,R1 ADD #12,R1 CLR -(R1) ;CLEAR PROTECT WORD CLR -(R1) ;CLEAR THE [UIC],EXTENT, AND CLR -(R1) ;FILE NAME FIELDS IN THE FB CLR -(R1) ;AND POINT R1 AT THE D;FREE DATASET CLR R5  ;GET EXIT ADDRESS TSTB CL.  ;... DEPENDING ON RESIDENCY BNE .+4 CL.D: CMP (R5)+,(R5)+ ADD @#V.XIT,R5 ;(IF IN MSB MUST CLEAR IN USE) MOV R5,PC V.RLB=56 V.XIT=42 ;ROUTINES TO PRODUCE DEVICE ACTION: ; 1) IF OUTPUT REMAINING, DESPATCH: CL.E: MOV (SP)+,@R4 ;STORE COMPLETION RETURN CMP (R0)+,(R2)+ ;ADJUST DDB PTRS. BIT #2,-(R4) ;LAST OPERATION OUTPUT? BEQ CL.A  ;IF NOT CLOSE ONLY REQD. CMP @REO OMIT BUFFER FILL CMP (R2)+,R4 ;STILL AT BUFFER START? BEQ OP.E ;IF SO MUST DO READ NOW SUB R4,(R2)+ ;OTHERWISE READ INCOMPLETE BIS #40000,@R2 ;MUST BE EOM CMP -(R2),-(R2) MOV @R2,@R3 ;RESET POINTER ; B) COMMON EXIT ROUTINE: OP.XT: CLR @R0 ;FREE DATASET CLR R5 ;PREPARE TO LEAVE TSTB OPN-2 ;THIS ROUTINE IN MSB.? BNE .+6 ;IF SO MUST FREE MSB. OP.XTX: MOV #4,R5 ;OTHERWISE OMIT ADD @#V.XIT,R5 ;GET SYTEM EXIT ADDR MOV R5,PC ;... FLLOWING FOR PARITY) BNE .+4 CLC RORB (R1)+ WR.B3: ADD R5,R1 ;FOLLOW FORM CTL WITH NULLS BR WR.D WR.C: JSR PC,@(SP)+ ;FOR OTHER MODES, PROCESS BYTE MOVB R5,(R1)+ ;... & STORE WITHOUT ADO WR.D: JSR PC,@(SP)+ ;GO BACK FOR END CHECKS BR WR.A1 ;IF RTN, ANOTHER BYTE! ; ;C) FORMAT BINARY LINE DONE - OUTPUT CHECKSUM: ; ; CALLED WHEN BINARY LINE COUNT IS DONE. ; SETS COMPLEMENT OF CHECKSUM JUNIOR BYTE ; (FOLLOWED BY NULLS) IN BUFFER & RETURNS ; COMMON PROCESSOR GHEAD OF IT CLR -(R1) MOV (R3)+,R0 ;GET CODE WORD ADD R0,R3 ;GET START ADDRESS MOV @R3,R3 ;IF ZERO, DEFAULT BEQ CMLN00 ;TO TERMINATOR BR CSM000 CMCM00: ;COMMA IDENTIFIED INC R3 ;SKIP PAST COMMA BR CSMXIT ;GO EXIT CMDT00: ;.EXT IDENTIFIED INC R3 ;SKIP PAST THE DOT JSR PC,CMOD40 MOV R0,EXT(R1) ;PACK AND ENTER CMDT05: DEC R3 CMDT10: JSR PC,CSICHR BGE CMDT10 ;FLUSH EXTRA CHARACTERS BR CSM000 ;EXIT CMLB00: H2,4(R4) ;ANYTHING LEFT IN BUFFER? BHIS CL.A TST @R2  ;ANY BUFFER STILL OPEN? BEQ CL.A MOV @R0,R5  ;DEVICE FILE-STRUCTURED? BPL CL.F  ;IF NOT, JUST OUTPUT BIT #60000,10(R0) ;EOM OR EOF ALRDY SEEN? BNE CL.A  ;IF SO LAST BLK GONE MOV 24(R0),R3 ;LINKED FILES? TST 6(R3) BMI CL.F  ;IF NOT AGAIN JUST O/P MOV @R3,-(R2) ;GET BLOCK NO. INC 14(R3)  ;ADD LAST BLK TO LENGTH CLR @2(R2)  ;CLEAR LAST LINK ASL R5  ;DECTAPE? BPL CL.F BIC #4I& TAKE IT ; C) SET UP DRIVER ACTION: OP.D: MOV (SP)+,-(R3) ;STORE EXIT ADDR AS COMP RTN MOVB @R4,(SP)+ ;DVR CONTAIN OPEN ROUTINE? BPL OP.C DEC R1 ;IF SO GO TO IT OP.E: MOV @#V.CDB,-(SP) JSR PC,@(SP)+ BR OP.XTX ;TAKE TEMP EXIT TO USER ;ERROR ROUTINES: O.TER: MOV #T.ERR,-(SP) ;TYPE WRONG FOR DEVICE IOT ;TREAT AS FATAL!!! O.OER: MOV #O.ERR,-(SP) ;FILE ALREADY OPEN MOV 4(R0),R2 ;ERROR REJFOR BUFFER FULL CHECK ; MOVB 2(R0),(R1)+ ;GET CHECKSUM BYTE BR WR.D ;COMMON ROUTINE TO INITIATE DEVICE ACTION: ; PREPARES TRANSFER INFO FOR DVR ;OPERATIONS: ; 1) SAVES RETURN ADDRESS IN DDB ; 2) IF DEVICE FILE-STRUCTURED & USING LINKED ; FILES, PROVIDES FOR CORRECT LINKAGE ; ON BOTH READ & WRITE ; 3) CALLS MONITOR DEVICE QUEUE HANDLER ; TO START DEVICE IN ACTION IF AVAILABLE ; 4) RETURNS TO USER PROGRAM DURIK ;[UIC] IDENTIFIED CMPB (R3)+,(R1)+ ;SKIP BUFFER POINTER PAST [ ;& PREPARE TO STORE GROUP ID CMLB05: JSR PC,CMA2O MOVB R0,UIC(R1) CMLB10: CMPB #COMMA,(R3)+ BNE CSM000 DEC R1 ;PREPARE TO STORE USER ID BR CMLB05 CSM000: CMPB #COMMA,@R3 BEQ CMCM00 ;COMMA CMPB #ABRKT,@R3 BEQ CMAB00 ;ANGLE BRACKER CMPB #CR,@R3 BGE CMLN00 ;LINE TERMINATOR INC 2(R6) ;MUST BE AN ITEM: BUMP COUNT CMPB #DOT,@R3 BEQ CMDT00 ;DOT, HENCE EXTEL000,@R4 ;IF SO MUST SET DIRECTION TST @R3  ;...DEPENDING ON SIGN OF BLK BPL CL.F NEG @R2  ;IF REVERSE GET TRUE BLK NO. BIS #4000,@R4 ;... & SET TRAVEL MARKER ;EXIT ROUTINE TO DRIVER: CL.F: TST -(R0)  ;GET DDB ADDR MOV @#V.CDB,-(SP) ;GO TO DVR IF POSS. JSR PC,@(SP)+ CLR R5  ;RETURN TO USER TILL DONE BR CL.D V.CDB=50 ;FILE-STRUCTURED DEVICE - CALL FILE MANAGER: CL.X: MOV PC,R5  ;SET UP RESIDENCY CHECK ADD #CL.MTURN GIVEN? TST -(R2) MOV -(R2),20(SP) ;... & TAKE IT BEQ O.TER+4 ;OTHERWISE FATAL! CMP (SP)+,(SP)+ BR OP.XT O.BER: MOV #B.ERR,@SP ;NO BUFFER AVAILABLE CLRB 12(R0) ;CLEAR OPEN SWITCH MOV 2(R0),R2 ;SET UP TO TAKE RETURN BR O.OER+12 ;... USING PREV.SEQ. ;FILE-STRUCTURED OPERATIONS: ; 1) GET F.I.B. IF NONE ALREADY: OP.F: ADD R1,R3 ;STEP TO DDB FIB LINK ASL R1 ;MAKE CONSTANT NOW 40 NNG TRANSFER ; ;ON ENTRY REGISTERS WILL BE SET AS FOR RW.DX: ON EXIT ; ALL CONTENTS WILL BE LOST BUT WILL BE RECLAIMED ; ON RETURN TO PROCESSOR FROM INFO STORED IN DDB ; & USER LINE HEADERS. ; ;SET-UP SEQUENCE - ALL DEVICES: RW.TF: MOV R3,-(R2) ;SAVE PRESENT STATUS CLR -(R0) ;CLEAR BUFF PTR STORE MOV R5,-(R0) ;SET COMPLETION RETURN MOV R0,R3 ;SAVE CURRENT DDB PTR BIC #100000,-(R0) ;CLEAR DEVICE PARITY BIT MOV #10,R1 ;SET PTR TO DVR TFR RTN MOV -14(R0),R2 ;GONT CMPB #LBRKT,@R3 BEQ CMLB00 ;LEFT BRACKET, HENCE UIC DEC R3 JSR PC,CSICHR BGE CMLT00 ;LETTER, HENCE DEVICE OR FILE CMPB #ASTRSK,@R3 BEQ CMFL05 ;ASTERISK, HENCE FILE BR CMSL00 ;MUST BE A SWITCH CMLN00: ;LINE TERMINATOR IDENTIFIED CMAB00: ;ANGLE BRACKET IDENTIFIED INCB @R6 ;SET SIDE TERMINATOR FLAG CSMXIT: MOV @24(R6),R4 ;GET COMMAND BUFFER POINTER MOV (R6)+,22(R6) ;PUT STATUS WORD THERE MOV (R4)+,R1 ;CODE IN R1 ADD RP-.,R5 MOV 14(R4),R2 ;GET FIB ADDRESS BEQ CL.B  ;IF NONE, EXIT NOW CMP -(R0),(R2)+ ;RESTORE DDB ADDR MOV @R2,R4  ;GET HOW OPEN CODE SUB #2,R4  ;MAKE OPNO = 0 MOV -(R0),R3 ;GET DVR ADDR CMP (R0)+,-(R2) ASL R1  ;GET CHECKSUM STORE IN DDB ADD R0,R1  ;... & USE IT TO STORE MOV #EMT+.FMC,@R1 ;.... CALL TO F/M TSTB @R5  ;THIS ROUTINE RESIDENT? BEQ .+6 MOV (PC)+,-(R1) ;IF NOT MUST ALSO FREE MSB. DECB @R5 MOV R1,PC  ;EXECUTE IN DDB .FMQASL R1 MOV @R3,R4 ;... & CHECK IF ANY FIB YET BNE OP.G MOV #1,-(SP) ;GET BUFFER IF NONE JSR R5,@R2 MOV @SP,@R3 ;STORE LINK IN DDB BEQ O.BER ;... IF ANY AVAILABLE MOV (SP)+,R4 ;CLEAR OUT ADD R1,R4 CLR -(R4) CMP R4,@R3 BNE .-4 ; 2) ARRANGE DATA FOR FILE MANAGER: OP.G: MOV -(R0),R2 ;GET DRIVER ADDRESS CMP (R0)+,(R2)+ ;STEP TO FACILITY INDIC. CMP (R0)+,(R0)+ ;GO TO END OF CALL ARGS IN DDB ADD R4,R1 ;GET END OF FIB MOV @R0,-(RRET DVR ADDR CMP -(R0),(R2)+ ;DEVICE FILE-STRUCTURED? MOV @R2,R5 BPL RW.TFX ;IF NOT CONTINUE LATER ;LOOK FOR LINKED FILES: MOV 16(R0),R2 ;GET FIB ADDR TST 6(R2) ;LINKED FILE? BMI RW.TFX ;NO - NO FURTHER ACTION ;LOOK FOR DECTAPE TURN AROUND: MOV #10000,@SP ;SET ROT. CNT FOR LATER CLR R4 ;CLEAR DEVICE TYPE FLAG ASL R5 ;DEVICE = DECTAPE? BPL RW.TFF ;NO - ALL DONE HERE THEN MOV @SP,R4 ;REMEMBER IT'S DECTAPE BICB R1,-(R3) ;REMOVE TRAVEL S1,R4 MOV R3,@R4 ;UPDATE CURRENT POSITION CMP (R4)+,(R4)+ ;POINT AT PROPER DEVICE TST (R6)+ ;ANY ITEMS SEEN? BEQ CSMX10 ;NO - EXIT TST @R2 ;WAS A DEVICE SEEN? BEQ CSMX05 ;NO - BRANCH MOV @R2,@R4 ;UPDATE DEFAULT DEVICE CMP (R4)+,(R4)+ MOVB UNIT(R2),@R4 ;AND UNIT BR CSMX10 CSMX05: MOV @R4,@R2 ;USE DEFAULT DEVICE CMP (R4)+,(R4)+ MOVB @R4,UNIT(R2) ;AND UNIT CSMX10: MOV @#42,R5 ;TAKE COMMON MONITOR EXIT TSTB CSMFLG ;IN THE C=45 .END U1) ;MOVE CALL ARGS THERE MOV -(R0),-(R1) MOV @R2,@R0 ;STORE FAC. IND. IN DDB ASL (R0)+ ;WITH DECTAPE MARK ACCESSIBLE MOV @R0,R2 ;GET USER LINE ADDR CMP -(R0),-(R0) CMP -(R2),(R4)+ ;GO TO HOW-OPEN IN FIB TST @R4 ;RE-INIT BEEN DONE? BMI .+4 MOV @R2,@R4 ;STORE HOW OPEN CODE CMP -(R4),-(R3) ;RESTORE POINTERS ; 3) GET FILE MANAGER: MOV #EMT+.FMR,@SP ;SET UP EXIT CALL CMP @R2,#2 ;... DEPENDING ON CALL CODE BNE .+4 INC @SP OP.H: MVMARK TST @R2 ;THIS BLOCK IN REVERSE? BPL RW.TFF NEG @R2 ;IF SO GET PROPER NO. NEG R4 ;REMEMBER IT'S BACKWARDS BISB R1,@R3 ;SET TRAVEL MARK ACCORDINGLY RW.TFF: MOV @R2,-4(R0) ;STORE THIS BLOCK NO. BITB @PC,2(R0) ;WRITE REQUIRED? BNE RW.TO BR RW.TFX ;IF NOT OMIT CALL BLOCK ALLOC. ;FILE BLOCK ALLOCATOR: ; LOOKS FOR NEXT VACANT BLOCK STARTING ; AT CURRENT BLOCK ADJUSTED BY AN ; INTERLEAVWSWAP BUFFER? BNE CSMX15 ;YES - BRANCH CMP (R5)+,(R5)+ CSMX15: MOV R5,PC CMFL00: ;FILE IDENTIFIED MOV (R6)+,R3 ;RESTORE BUFFER POINTER CMFL05: JSR PC,CMOD40 MOV R0,@R1 JSR PC,CMOD40 ;PACK AND ENTER FILE NAME MOV R0,FIL(R1) BR CMDT05 ;FLUSH EXTRA CHARACTERS CMDV00: ;DEV: IDENTIFIED MOV @R6,R3 CMDV05: JSR PC,CSICHR BGT CMDV05 ;SEARCH FOR UNIT NUMBER BLT CMX .TITLE CSX .GLOBL CSX ;COMMAND SYNTAX ANALYZER A ='A ABRKT ='< ASTRSK ='* BLANK =40 COLON =': COMMA =', CR =15 DDL =50 DOLLAR ='$ DOT ='. HILT =14 LBRKT ='[ LOWLT =12 MAXDEV =3 NINE ='9 PC =%7 RBRKT ='] RUBOUT =177 R0 =%0 R1 =%1 R2 =%2 R3 =%3 R4 =%4 R5 =%5 R6 =%6 SLASH ='/ SVTADR =40 TAB =11 Z ='Z ZERO ='0 CSINIT: .WORD 0 ;INITIALIZE REGISTERS CSX: MOV @R1,R3 ;R3 POINTS TO BUFFER CLR @R1 ;SET UP OK CODE YOV (SP)+,-(R3) ;STORE IN DDB TSTB @R5 ;THIS ROUTINE RESIDENT? BEQ .+6 MOV (PC)+,-(R3) ;IF NOT MUST CLEAR MSB. DECB @R5 MOV R3,PC ;EXECUTE IN DDB ;MAGNETIC TAPE PROCESSING EXIT: OP.I: MOV R0,R1 ;GET VARIABLE DDB PTR CMP (R1)+,(R1)+ ;... SET AT STORED FILE BLK MOV @R1,R2 ;PICK UP FOR HANDLER CLR (R3)+ ;REMOVE BUFFER PTR CMP -(R1),(R3)+ ;ADJUST PTRS ... CMP (R3)+,-(R4) ;... AS REZE FACTOR APPROP. TO DEVICE ; (TAKING ACCOUNT OF TRAVEL DIRECTION IF ; DECTAPE). IF FIRST REQD. BLOCK IS ; ALREADY TAKEN, BLOCKS IMMEDIATELY ; ADJACENT AS COVERED BY SAME BIT MAP BYTE ; ARE CHECKED INDIVIDUALLY. IF NONE OF THESE ; IS FREE, BIT MAP IS SEARCHED ON A BYTE ; BASIS UNTIL ONE IS FOUND TO CONTAIN SOME ; 0 BIT. THIS BYTE IS THEN SEARCHED BIT BY ; BIT UNTIL THE VACANT BLOCK CAN BE ; DETERMINED. IF DURING THE BYTE SEARCH ; EITHER END OF THE BIT MAP IS REACHED, ; A RESTART IS [DV10 ;NONE THERE COMB @R3 ;MASK FIRST DIGIT CMDV10: MOV (R6)+,R3 JSR PC,CMOD40 ;PACK AND ENTER DEVICE MOV R0,@R2 TSTB (R3)+ ;WAS THERE A UNIT NUMBER? BPL CSM000 ;NO - EXIT COMB -(R3) ;UNMASK FIRST DIGIT JSR PC,CMA2O MOVB R0,UNIT(R2) ;CONVERT AND ENTER BR CMLB10 ;GO CHECK NEXT ITEM CMSL00: ;SWITCH IDENTIFIED INC R3 ;SKIP POINTER PAST THE SLASH CLR -(R6) MOV #1,R1 ;INITIALIZE WORD COUNT MOVB @R3,@R6 ;STACK FIRS\TST (R3)+ MOV R3,R0 ;R0 POINTS TO INPUT ADDRESS CLR (R3)+ ;SET NO INPUT MOV R3,@R3 ADD #20,(R3)+ ;INITIALIZE OUTPUT ADDRESS MOV @#SVTADR,R4 ADD #DDL,R4 ;INITIALIZE INPUT AND OUTPUT MOV @(R4)+,@R3 ;DEVICES TO SYSTEM DISK MOV (R3)+,(R3)+ CLR (R3)+ CLR (R3)+ ADD #6,R3 ;POINT AT FIRST DATA BYTE CLR -(R6) ;SET < NOT SEEN YET CLR R1 ;SET LAST STATE TO ZER0 MOV R3,R4 MOV R3,R5 CSIN00: MOVB (R5)+,@R4 CMPB #BLANK,@R4 ;COLLAPSQD BY HANDLER MOV #EMT+.MTO,@SP ;SET UP CALL ... BR OP.H ;... & EXIT AS FOR F/S OPS. ;MISCELLANEOUS DEFINITIONS: V.XIT=42 V.CDB=50 V.CDQ=52 V.GTB=54 .FMR=43 .MTO=63 T.ERR=1411 O.ERR=1412 B.ERR=1407 .END ^MADE AT THE START OF THE MAP ; IF THE DEVICE IS DISK, OR AT THE CURRENT ; BLOCK IN THE OPPOSITE DIRECTION IF DECTAPE. ; A SECOND ARRIVAL AT THE MAP END WILL REQUEST ; THE ENTRY OF A NEW MAP FROM THE DEVICE IF ; SUCH IS AVAILABLE. ; ;ON ENTRY, REGISTERS WILL BE AS FOLLOWS:- ; R0 = ADDRESS OF WORD COUNT IN DDB ; R1 = 10 (POINTER TO DVR TFR RTN) ; R2 = ADDRESS OF FIB ; R4 = 0 IF DEVICE = DISK ; 10000 IF DECTAPE AND CURRENT BLOCK ; IS TO BE WRITTEN FORWARD ; -10000 IF WRI_T TWO CHARACTERS. IF JSR PC,CSICHR ;ONLY ONE, STACK IT AND NULL BLT CMSL10 MOVB @R3,1(R6) CMSL05: JSR PC,CSICHR ;FLUSH LETTERS AND DIGITS BGE CMSL05 CMSL10: CMPB #COLON,@R3 ;VALUE INDICATOR? BNE CMSL15 ;NO - BRANCH MOV R3,-(R6) ;STACK ADDRESS OF FIRST CHAR INC @R6 ;OF THE VALUE INC R1 ;INCREASE STACKED WORD COUNTER BR CMSL05 CMSL15: CMPB #DOT,@R3 ; . AND $ ARE LEGAL IN VALUES BEQ CMSL05 CMPB #DOLLAR,@R3 BEQ CMSL05 CMSL20: SUB R1,R4`E BUFFER SO THAT BEQ CSIN00 ;TABS, SPACES, NULLS, AND CMPB #TAB,@R4 ;RUBOUTS DISAPPEAR BEQ CSIN00 CMPB #RUBOUT,@R4 BEQ CSIN00 TSTB @R4 BEQ CSIN00 CMPB #LOWLT,@R4 ;BEGIN SYNTAX CHECK AFTER BGT CSIN05 ;COLLAPSING, I.E., WHEN CMPB #HILT,@R4 ;LINE TERMINATOR IS ENCOUNTERED BGE CSTX00 CSIN05: INC R4 BR CSIN00 CSCM00: ;COMMA IDENTIFIED INC R3 ;SKIP POINTER PAST COMMA Ja;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003B ; .TITLE EDP .GLOBL EDP ; ERROR DIAGNOSTIC PRINT MODULE ; THIS ROUTINE EXPECTS THE FOLLOWING STACK: ; ADDITIONAL INFO ; MESG. CODE ; IOT VECTOR ; EMT VECTOR ; SP USER REGISTERS ; ; THE ROUTINE PRINTS THE ERROR CODE AND FOR CODES 1 OR 3, ENTERS ; THE WAIT STATE. AN OPERATOR REQUEST WILL CAUSE AN ; EXIT FOR FATAL ERRORS (3), OR PROGRAM CONTINUATION FOR CODE 1. ; CODES 2 AND 4 CAUSE MESSAGE PRIbTE TO DECTAPE IS BACKWARD ;SET UP BIT MAP SEARCH: EMT .GNM ;REQD. FOR GET ANOTHER BIT MAP RW.TO: ADD #26,R2 ;GO TO BIT MAP AREA OF FIB MOV (R2)+,4(R2) ;COLLECT INTERLEAVE FACTOR MOV (R2)+,R3 ;.... & MAP ADDRESS CMP (R3)+,(R2)+ ;IGNORE MAP LINKS ADD (R3)+,R4 ;GET MAP NO. BPL .+4 ;FOR DECTAPE IN REVERSE... NEG @R2 ;... ADJUST I.F. ADD (R3)+,@SP ;GET NO. OF WORDS ... ASL @SP ; ... & COc ;ENOUGH ROOM FOR THIS SWITCH? BLE CMSL30 ;NO-BRANCH MOV R1,(R5)+ CMSL25: DEC R1 ;STORE SWITCH IN CALLERS AREA BLT CMSL27 MOV (R6)+,(R5)+ BR CMSL25 CMSL27: DEC R4 BLE CSM000 ;IF ROOM FOR MORE SWITCHES, CLR @R5 ;SET NEXT ONE NOT IN USE BR CSM000 CMSL30: ASL R1 ADD R1,R6 ;CLEAN UP STACK BISB #SWER,@R6 ;SET SWITCH FLAG BR CSM000 CMLT00: ;LETTER IDENTIFIED MOV R3,-(R6) ;SAVE THE BUFFER POINTER CMLT05: JSR PC,CSICHR BGEdMP CSSTCK ;CHECK LEGALITY CSDT00: ;.EXT FIELD IDENTIFIED CLR R4 ;CLEAR COUNTER CSDT05: JSR PC,CSICHR ;CHECK THIS CHARACTER BLT CSDT15 ;NEITHER LETTER NOR DIGIT CSDT10: INC R4 ;INCREMENT COUNTER BR CSDT05 CSDT15: CMPB #ASTRSK,@R3 ;IS IT AN *? BNE CSSTCK ;NO - GO CHECK LEGALITY JSR PC,CSAST ;GO TO ASTERISK CHECKER BR CSSTCK ;CHECK LEGALITY CSLB00: ;[UIC] FIELD IDENTIFIED CLR R2 ;SET COMMA NOT SEEN CSLB05: CLR R4 ;CLEAR DIGeNT AND PROCEED ONLY. ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .BYTE 0,-1 ; NOT RE-ENTRANT EDP: ; THIS ROUTINE CURRENTLY GRABS CONTROL OF THE TTY AS SOON AS IT ; IS IN THE READY STATE. THIS WILL CAUSE POTENTIAL FRAGMENTATION ; OF USER OUTPUT. MOVB @#DP.TTS,#0 ;SAVE TELEPRINT STATUS DP.TTF=.-2 JSR R5,DP.WT4 ; ENSURE PRINTER FREE DP.CUT: MOV 24(SP),#0 ; CONVERT AND PRINT MESSAGE DP.MSG=.-2 JSR R5,DP.CLF ; PRINT CR-LF CLR R1 BISB DP.MSG+1,R1 ; GET fNVERT TO BLOCKS BCC .-2 ;(USING PRESET 10000 AS CNT) SUB @SP,@-(R0) ;BUILD FIRST BLOCK OF MAP ADD @SP,@(R0) ;(MAP NO. STARTS AT 1) DECB R4 BNE .-6 INC R3 ;GO TO START ADDRESS OF MAP MOV R3,-(SP) ;... & SAVE IN SWITCH ;CHECK BLOCK ON MAP & ADJUST IF SEARCH GOES OFF: RW.TOA: ADD -2(R0),@R2 ;... & BUILD BLOCK REQD. SUB @(R0),@R2 ;GET BLK RELATIVE TO MAP START BMI RW.TOB CMP @R2,2(SP) ;BLOCK WITHIN MAP RANGE BLT RW.TOC RW.TOB: CLR @R2 ;IF NOT Og CMLT05 ;IF THE TERMINATOR IS A COLON, CMPB #COLON,@R3 ;THEN A DEVICE; OTHERWISE, BEQ CMDV00 ;A FILE BR CMFL00 CMA2O: ;ASCII OCTAL TO BINARY CLR R0 ;RESULT GOES IN R0 CMPB #ASTRSK,(R3)+ BNE CMAO05 ;THIS AN ASTERISK? COM R0 ;YES - SET CODE AND RETURN CMAO00: RTS PC CMAO05: CMPB -(R3),-(R3) CMAO10: JSR PC,CSICHR ;GET NEXT CHARACTER BNE CMAO00 ;DONE IF NOT A DIGIT CLR -(R6) MOVB @R3,@R6 hIT COUNTER CSLB10: ;POINT TO NEXT CHARACTER JSR PC,CSICHR ;EXAMINE IT BNE CSLB15 ;BRANCH IF NOT A DIGIT INC R4 ;INCREMENT COUNTER BR CSLB10 CSLB15: CMPB #COMMA,@R3 ;IS IT A COMMA BNE CSLB20 ;NO - BRANCH TST R2 ;WAS A COMMA ALREADY SEEN? BNE ERROR ;YES - ERROR INC R2 ;SET COMMA SEEN TST R4 ;ANYTHING BEFORE THE COMMA? BNE CSLB05 ;YES - BRANCH BR ERROR ;ERROR CSLB20: CMPB #ASTRSK,@R3 ;IS IT AN ASTERISK? BNE CSLB25 iMESG. PREFIX ADD PC,R1 ; RELOCATE ADD #DP.COD-.,R1 CLR R3 BISB @R1,R3 ; AND PRINT IT JSR R5,DP.PRT MOV #9.,R0 ; SET UP FOR CHAR PRINT MOV R0,R5 ; TOTAL PRINT CHARS CLR R2 BISB DP.MSG,R2 ; MSG NO. MOV 26(SP),R4 ; ADDITIONAL INFO DP.CVP: MOV #3,R1 ; BITS PER CHAR CLR R3 DP.INL: ASL R4 ; GENERATE CHAR IN R3 ROLB R2 ROL R3 DEC R0 ; SPECIAL BIT COUNT ? BEQ DP.RGP CMP R0,#7 ; BLANK NEEDED ? BEQ DP.RGP DEC R1 jN THIS MAP ... MOV @SP,R3 ;... START AT BEGINNING BEQ RW.TO-2 ;UNLESS ALREADY DONE SO CLR @SP ;OTHERWISE STOP AT NEXT PASS NEG R4 ;IF DECTAPE SET REVERSE ... BNE RW.TOA ;... & RESET BLOCK NO. ;CONVERT BLOCK TO BIT MAP POSITION & CHECK IF FREE: RW.TOC: MOV @R2,R5 ;IF SO MUST GET BIT MAP BYTE INC R3 SUB R1,R5 ;(USING 10 ALREADY IN R1) BGE .-4 RW.TOD: RORB R4 ;USE REMAINDER TO GET kSUB #60,@R6 ;DO OCTAL CONVERSION ASL R0 ASL R0 ASL R0 ADD (R6)+,R0 BR CMAO10 ;CONTINUE CSICHR: ;SUBROUTINE TO EXAMINE CLR -(R6) ;THE NEXT CHARACTER INC R3 CMPB #'0,@R3 BHI CSCH10 CMPB #'Z,@R3 ;CONDITION CODED OUTPUT: BLO CSCH10 ; >0 MEANS LETTER CMPB #'9,@R3 ; =0 MEANS DIGIT BHIS CSCH05 ; <0 MEANS NEITHER CMPB #'A,@R3 BHI CSCH10 INC @R6 CSCH05: INC @R6 CSCH10: DEC @R6 TST (R6)+ RTS PC CMl ;NO - BRANCH JSR PC,CSAST BR CSLB15 CSLB25: CMPB #RBRKT,@R3 ;IS IT ]? BNE ERROR ;NO - ERROR TST R2 ;HAS A COMMA APPEARED? BEQ ERROR ;NO - ERROR TST R4 ;ANYTHING BEFORE ]? BEQ ERROR ;NO - ERROR INC R3 ;SKIP POINTER PAST ] BR CSSTCK ;CHECK LEGALITY CSAB00: ;< IDENTIFIED TST @R6 ;HAS < ALREADY OCCURRED? BNE ERROR ;YES - ERROR INC @R6 ;SET < SEEN INC R3 ;SKIP POINTER PAST < MOV R3,@R0 BR CSSTCK ;CHEm BNE DP.INL ; MORE BIT THIS SHAR DP.RGP: JSR R5,DP.PRT ; PRINT CHAR GENERATED IN R3 CMP R5,#7 ; BLANK NEEDED ? BNE DP.DEC MOV #-20,R3 JSR R5,DP.PRT ; PRINT BLANK DP.DEC: DEC R5 BNE DP.CVP ; CONTINUE ALL CHARS. JSR R5,DP.CLF ; GIVE CR-LF MOVB DP.TTF,R1 ; PICK UP PRINTER STATUS RORB DP.MSG+1 ; 1 OR 3 MESG. ? BCS DP.EXR ; YES, WAIT FOR OPERATOR MOVB R1,@#DP.TTS ; OTHERWISE RESTORE PRTR nBIT .... BCS RW.TOH ;... (C BIT FORCED BY LAST SUB) RW.TOE: INC R5 BLT RW.TOD MOV -(R5),-(SP) ;SAVE CURRENT STATUS BISB @PC,@R5 ;SET PRIORITY LEVEL 7 MOVB @R3,-(SP) ;SAVE MAP BYTE (******) BISB R4,@R3 ;TRY & TAKE THIS BLOCK CMPB (SP)+,@R3 ;BLOCK NOW TAKEN? BNE RW.TOI ;IF SO THAT'S IT! ;CHECK ADJACENT BLOCKS IF NOT: MOVB (SP)+,(R5)+ ;NO GO! DROP PRIORITY TST R4 ;DECTAPE IN REVERSE? BPL RW.TOF-2 DEC @R2 ;IF SO TRY PREVIOUS BLK ... oOD40: ;MOD 40 PACKER MOV R4,-(R6) ;SAVE R4 AND R5 MOV R5,-(R6) CMPB #ASTRSK,@R3 BNE CMOD00 ;IF AN ASTERISK, THEN SET R0: MOVB (R3)+,R0 ;HIGH BYTE = 0, LOW BYTE = * BR CMOD25 ;GO EXIT CMOD00: MOV #3,R4 ;INITIALIZE CHARACTER COUNT CLR R0 ;RESULT GOES IN R0 CMOD05: DEC R3 JSR PC,CSICHR ;NEXT CHAR LETTER OR DIGIT? BLT CMOD20 ;NO - BRANCH BEQ CMOD10 MOVB (R3)+,R5 ;LETTER SUB #100,R5 BR CMOD15 CMOD10: MOVB (R3)+,R5 ;DIGIpCK LEGALITY CSLT00: ;DEVICE OR FILENAME IDENTIFIED CLR -(R6) ;CONSECUTIVE LETTER INDICATOR CLR R4 ;CONSECUTIVE LETTER COUNTER CLR R2 ;NON-CONSECUTIVE LETTER INDICATOR CSLT05: INC R4 ;INCREMENT CONSECUTIVE LETTER COUNT CSLT10: ;INCREMENT BUFFER POINTER JSR PC,CSICHR ;EXAMINE NEXT CHARACTER BEQ CSLT15 ;IT IS A DIGIT BLT CSLT20 ;IT IS NEITHER LETTER NOR DIGIT TST @R6 ;THIS Lq DP.INT: MOV @#DP.RES,-(SP) ; RESTORE REGS JSR R5,@(SP)+ MOV (SP)+,(SP)+ ; REMOVE EMT MOV (SP)+,2(SP) ; REMOVE ARGUMENTS MOV (SP)+,2(SP) DP.IXT: DECB EDP-2 RTI ; GO TO DESIRED ROUTINE DP.EXR: MOV #-14,R3 ; $ PRINT JSR R5,DP.PRT MOV @#DP.SVP,R3 ; SVT POINTER MOV DP.WRA(R3),-(SP) ; SWITCH ADDRESSES ... MOV 22(SP),DP.WRA(R3) ; ... RETURN FOR MOV (SP)+,20(SP) ; ... WAIT LOOP CLR 22(SP) ; WAIT AT LOW PRL NEGB DP.MUS+1(R3) ; SHOWrBR RW.TOD ;... & CONTINUE SAME ROTATE INC @R2 ;OTHERWISE TRY NEXT BLOCK ... RW.TOF: ROLB R4 ;... & ROTATE OTHER WAY BCC RW.TOE ;TRY AGAIN IF STILL IN SAME BYTE ;CHECK MAP BY BYTES IF STILL UNSUCCESSFUL: RW.TOG: CMP @R2,2(SP) ;STILL ON THE MAP? BHIS RW.TOB ;IF NOT GO BACK TO START INC R3 ;GO TO NEXT BYTE CMPB @R3,#-1 ;CHECK WHOLE BYTE BNE RW.TOF ;EXIT WITH C BIT SET ADD R1,@R2 ;OTHERWISE TRY NEXT BYTE BR RW.TOG RW.TOH: TST @R2 ;SIMIT SUB #22,R5 CMOD15: ADD R5,R0 CMOD20: DEC R4 ;PACKED THREE CHARACTERS? BEQ CMOD25 ;YES - EXIT ASL R0 ASL R0 ASL R0 ;MULTIPLY BY 40 MOV R0,R5 ASL R0 ASL R0 ADD R5,R0 BR CMOD05 CMOD25: MOV (R6)+,R5 ;RESTORE R4 AND R5 MOV (R6)+,R4 RTS PC ;RETURN .END tETTER CONSECUTIVE? BEQ CSLT05 ;YES - BRANCH INC R2 ;NO - SET INDICATOR BR CSLT10 CSLT15: INC @R6 ;SET LETTERS NOT CONSECUTIVE BR CSLT10 CSLT20: TST (R6)+ CMPB #COLON,@R3 ;THIS A COLON? BNE CSSTCK BR CSDV00 CSTX00: CLR R5 ;STATE 0 CMPB #COMMA,@R3 BEQ CSCM00 ;COMMA CMP (R5)+,(R5)+ ;STATE 4 DEC R3 JSR PC,CSICHR BGT CSLT00 ;LETTER BEQ ERROR ;ERROR IF A DIGIT CSTX03: CMPB #ASTRSK,@R3 BNE CSTX05 CLR R4 ;IFu PROG SUSPENDED BIT DP.MSG,#1000 ; ... & FOR 3 MSG ... BEQ .+6 NEGB DP.MUS(R3) ; ... SHOW ALSO STOPPED! MOV @#60,R0 ;FORCE CMD ACCEPT MOV -(R0),R0 MOV R0,@R0 ; ... BY SETTING U/W SW. ADD #12,@R0 CMP (R0)+,(R0)+ ; MOVE TO KBL TPS SAVE TSTB @(R0)+ ; VALUE SAVED ALREADY? BNE DP.INT ; IF SO LEAVELONE INC R1 ; OTHERWISE STORE VALUE NOW MOVB R1,@-(R0) BR DP.INT DP.CLF: MOV #-43,R3 ; CR JSR R5,DP.PRT ; PRINT MOV #-46,R3 ; LFvLARLY FOR REVERSE TRAVEL BMI RW.TOB CMPB -(R3),#-1 BNE RW.TOD SUB R1,@R2 BR RW.TOH+2 ;STORE RESULT OF A SUCCESSFUL SEARCH: RW.TOI: MOVB (SP)+,@R5 ;RESTORE PRIORITY MOV R4,(SP)+ ;FOUND A BLOCK!!! BPL .+4 NEG @R2 ;MAKE IT SHOW DIRECTION ADD @R2,@(R0)+ ;STORE IN LINK AS ACTUAL NO. INC -20(R2) ;ADD TO FILE LENGTH .GNM=34 ;(****** - CARE!!!!! USED AS LITERAL BY PREVIOUS INSTR.) ;COMMON EXIT w;COPYRIGHT:- DIGITAL EQUIPMENT CORP.,MAYNARD,MASS. ;  1971 ; ;VERSION NO:- V004A ; .TITLE MT .GLOBL MT .CSECT R0=%0 ;DDB PTR R1=%1 ;LCMMD PTR R2=%2 ;CMMD REG R3=%3 ;SP FUNC BLOCK PTR R4=%4 ; R5=%5 ;SCRATCH SP=%6 PC=%7 ; ; ; MTS=172520 ;TM11 STATUS MTC=172522 ;TM11 COMMAND MTBRC=172524 ;TM11 BYTE/RECORD COUNTER MTCMA=172526 ;TM11 CORE MEMORY ADDRESS MTD=172530 ;TM11 DATA BUFFER MTRD=172532 ;TM11 READ LINES ; PS=177776 ;PROCESSOR STATUS ; ; ;MTS BITS ; Ix AN ASTERISK, THEN IF JSR PC,CSAST ;NEXT CHARACTER IS LETTER OR BR CSSTCK ;DIGIT, THEN ERROR; ELSE FILE CSTX05: TST (R5)+ ;STATE 6 CMPB #DOT,@R3 BEQ CSDT00 TST (R5)+ ;STATE 8 CMPB #LBRKT,@R3 BEQ CSLB00 ;LEFT BRACKET TST (R5)+ ;STATE 10 CMPB #SLASH,@R3 BEQ CSSL00 ;SLASH TST (R5)+ ;STATE 12 CMPB #ABRKT,@R3 BEQ CSAB00 ;ANGLE BRACKET TST (R5)+ ;STATE 14 CMPB #CR,@R3 ;IGNORE CARRIAGE RETURN BNE CSTX10 ;IF IMMEDy JSR R5,DP.PRT ; PRINT RTS R5 ;CHAR PRINT ROUTINE (CHAR IN R3) DP.PRT: ADD #60,R3 ; CONVERT TO ASCII MOVB R3,@#DP.TTB ; PRINT DP.WT4: TSTB @#DP.TTS BPL DP.WT4 RTS R5 ; CONSTANTS AND PSEUDO-CONSTANTS DP.TTS=177564 DP.TTB=177566 DP.SVP=40 DP.WOF=60 ; WAIT LOOP (IN SUT) DP.RES=46 DP.TTV=64 DP.TST=66 DP.STS=177776 DP.WRA=30 ; WAIT RETURN (IN SUT) DP.MUS=16 DP.COD: .BYTE 31,21,47,26,43 ; ORDERED CODES - 60 IAWFS .END TO DRIVER: RW.TFX: SUB R1,R0 ;GO BACK TO DDB ADDRESS MOV @#V.CDB,-(SP) ;CALL DRIVER JSR PC,@(SP)+ RW.RTU: MOV @#V.RRES,@SP ;RESTORE USER REGS JSR R5,@(SP)+ RTI ;TAKE TEMP. EXIT TO USER V.RRES=46 V.CDB=50 .END LC=100000 EOF=40000 CRE=20000 PAE=10000 BGL=4000 EOT=2000 RLE=1000 BTE=400 NXM=200 SELR=100 BOT=40 CH79=20 SDWN=10 WRL=4 RWS=2 TUR=1 DENB=140 PARB=10 ; ;MTC BITS ; ERR=100000 DEN=60000 POWR=10000 PAR=4000 UNIT=3400 CUR=200 INT=100 ADEX=60 CMMD=16 GOB=1 ; ;MTRD BIT ; GAPSDN=10000 ; ;COMMANDS ; RWU=0 READ=1 WRITE=2 EOFM=3 RWD=4 SKPR=5 BSPR=6 ; ; ; ;THIS IS THE DEVICE DRIVER FOR THE TM11/TU10 ; MT: .WORD 0  ;BUSY INDICATOR .BYTE 177  ;ALL GENERAL ST|IATELY FOLLOWED BY INC R3 ;A LINE TERMINATOR CSTX10: CMPB #LOWLT,@R3 BGT ERROR CMPB #HILT,@R3 BGE CSSTCK ERROR: MOV R3,22(R6) ;SET ERROR INDICATOR BR EXIT CSSTCK: ADD PC,R1 ;GET PROPER DISPLACEMENT ADD #STADR-.,R1 ADD @R1,R1 ;GET OLD STATE ERROR STATES CSCK00: CMPB (R1)+,R5 ;IS NEW STATE/OLD STATE LEGAL? BEQ ERROR ;NO - ERROR TSTB @R1 ;DONE SEARCHING? BGE CSCK00 ;NO - BRANCH MOV R5,R1 ;SET OLD STATE = NEW STATE CMP #14.~;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ; .TITLE GNM ; ;ROUTINE TO REPLENISH CORE BIT MAP: ; CALLED BY READ/WRITE PROCESSOR WHEN ; THE NEXT LINKED FILE BLOCK CANNOT BE ; FOUND WITHIN THE RANGE OF THE MAP ; CURRENTLY IN CORE. ; BECAUSE THE PROCESSOR ITSELF MAY BE ; THE OCCUPANT OF THE MONITOR SWAP ; BUFFER, THIS ROUTINE WHEN NON-RESIDENT ; WILL BE BROUGHT INTO THE KEYBOARD SWAP ; BUFFER BY:- ; EMT 34 ; ;OPERATIONS: ; A) FOR DISK ND.E ORATINRMTE= 4 1TETA,R5 ;LINE TERMINATOR THIS TIME? BNE CSTX00 ;NO - CONTINUE EXIT: TST (R6)+ ;POP < SEEN INDICATOR MOV @#42,R5 ;TAKE COMMON MONITOR EXIT TSTB CSINIT ;IN THE SWAP BUFFER? BNE EXIT00 ;YES - BRANCH CMP (R5)+,(R5)+ EXIT00: MOV R5,PC CSDV00: ;DEVICE IDENTIFIED CMP R4,#MAXDEV ;TOO MANY CONSECUTIVE LETTERS? BGT ERROR ;YES - ERROR TST R2 ;ANY NON-CONSECUTIVE LETTERS? BNE ERROR ;YES - ERROR TST -(R5) ;SET STATE 2 INC R3 ;S;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C ; .TITLE CVT ;CONVERSION UTILITY PACKAGE VERSION 1 DEC 70 ; ; THIS VERSION CONTAINS THE FOLLOWING CONVERSIONS ; (TO OR FROM A SINGLE WORD ONLY):- ;  A) OCTAL ASCII TO BINARY & VICE VERSA ;  B) DECIMAL ASCII TO BINARY & VICE VERSA ;  C) RADIX 50 PACK & UNPACK ; ; FOR CONVERSIONS TO BINARY, THE GENERAL CALLING SEQUENCE ; WILL BE:- ;  MOV #ADDR,-(SP) ;  MOV #CODE,-(SP) ;  EMT 42 ; WHER( OR OTHER MULTI-MAP DEVICES): ; 1) AT 1ST REQUEST FOR A PARTICULAR WRITE OP., ; CURRENT IN-CORE MAP WILL BE WRITTEN OUT TO ; THE DEVICE & WILL BE REPLACED BY THE FIRST ; MAP FOR THAT DEVICE. CONTROL WILL BE RETURNED ; TO READ/WRITE PROCESSOR FOR CONTINUATION OF ; SEARCH. ; 2) SUBSEQUENT REQUESTS BY THE SAME WRITE OP. ; WILL CAUSE READ-IN OF MAPS IN ORDER, UNTIL ; LAST AVAILABLE MAP HAS BEEN SEARCHED. FAILURE ; TO FIND A FREE BLOCK BY THIS TIME WILL BE ; SIGNALLED TO THE USER AS E;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003B ; ; ON ENTRY TOP OF STACK IS SET AS FOLLOWS:- ; PROGRAM LOAD ADDRESS ; COUNT OF NUMBER OF MONITOR ROUTINES ; TO BE RESIDENT AT RUN-TIME ; ONE WORD FOR EACH REQUEST (GIVING EMT CODE) ; START ADDRESS FOR RUN REQUEST, 0 FOR GET ; REGISTERS ; R0-DDB ADDRESS ; R1 (JUN. BYTE)-0 = LINKED FILE ; 1 = CONTIGUOUS FILE ; (SIGNED MINUS AS WORD IF DECTAPE) ; R2-BUFFER ADDRESS ; R3-BUFFER END (R2 KIP POINTER PAST : BR CSSTCK ;CHECK LEGALITY CSSL00: ;SWITCH IDENTIFIED JSR PC,CSICHR ;CHARACTER AFTER / MUST BE BLT ERROR ;LETTER OR DIGIT, ELSE ERROR CSSL05: JSR PC,CSICHR ;FLUSH LETTERS AND DIGITS BGE CSSL05 CSSL10: CMPB #COLON,@R3 ;VALUE ENCOUNTERED? BNE CSSTCK ;NO -GO CHECK STATE LEGALITY CSSL15: JSR PC,CSICHR ;SKIP LETTERS AND DIGITS BGE CSSL15 CMPB #DOT,@R3 ; . AND $ ARE LEGAL IN VALUES BEQ CSSL15 CMPB #DOLLAR,@R3 BEQ CSSL15 E "ADDR" IS THE ADDRESS OF THE FIRST BYTE IN ; THE STRING OF ASCII CHARACTERS TO BE CONVERTED & "CODE" ; IDENTIFIES THE CONVERSION REQUIRED:- ;  0 = RADIX 50 PACK ;  2 = DECIMAL ASCII TO BINARY ;  4 = OCTAL ASCII TO BINARY ; ON RETURN FROM THESE CONVERSIONS, THE CONVERTED VALUE ; WILL BE ON TOP OF THE PROCESSOR STACK, FOLLOWED BY THE ; ADDRESS OF THE BYTE AFTER THE LAST ONE CONVERTED. ; ; FOR CONVERSION FROM BINARY, THE CALLING SEQUENCE WILL BE ; AS FOLLOWS:- ;  MOV #WORD,-(.O.M. ERROR ; B) FOR DECTAPE: ; 1) BECAUSE INITIAL SEARCH BY READ/WRITE ; PROCESSOR MAY OVERLOOK BLOCKS IMMEDIATELY ; ADJACENT TO THE BLOCK ACTUALLY BEING WRITTEN ; (DUE TO INTERLEAVE FACTOR), CONTROL WILL ; BE RETURNED TO READ/WRITE PROCESSOR ON FIRST ; ENTRY WITH REVERSE SWITCH SET TO ENABLE THESE ; BLOCKS TO BE FOUND, IF VACANT. ; 2) A SECOND CALL TO GNM WILL RESULT IN E.O.M. ; SIGNAL TO USER. ;ON ENTRY, REGISTERS + SIZE) ; R4-NEXT CHARACTER TO PROCESS IS BUFFER ; R5-HOLDS MRT ENTRY IF RWN DISK-RESIDENT ONLY ; (CURRENTLY IGNORED) ; ; THELOADER IS CALLED VIA ; EMT 61 ; .TITLE LDR .GLOBL LDR ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .BYTE 0,-1 LDR: CMP LDR-2,#177401 BNE LD.LDR ; RESIDENT SO CONTINUE MOV #20,-(SP) MOV @#S.GTB,-(SP) ; GET BUFFER TO WORK IN JSR R5,@(SP)+ MOV (SP)+,R1 ; B;IF NEITHER, CHECK FOR NEW VALUE BR CSSL10 CSAST: ;ASTERISK CHECK SUBROUTINE TST R4 ;DID SOMETHING APPEAR FIRST? BEQ CSAS05 ;YES - BRANCH CSAS00: TST (R6)+ ;POP OFF RETURN ADDRESS BR ERROR ;GO TO ERROR RETURN CSAS05: JSR PC,CSICHR ;IF IT IS A LETTER OR BGE CSAS00 ;DIGIT, THEN AN ERROR INC R4 ;SET SOMETHING SEEN RTS PC CSICHR: CLR -(R6) INC R3 ;GET CHARACTER TO SP) ;  MOV #ADDR,-(SP) ;  MOV #CODE,-(SP) ;  EMT 42 ; WHERE "WORD" IS THE ACTUAL NUMBER TO BE CONVERTED, "ADDR" ; IS THE ADDRESS OF A BUFFER INTO WHICH THE UNPACKED ; BYTES ARE TO BE PLACED & "CODE" AGAIN SHOWS ; TYPE OF CONVERSION:- ;  1 = RADIX 50 UNPACK ;  3 = BINARY TO DECIMAL ASCII ;  5 = BINARY TO OCTAL ASCII ; ON RETURN FROM THESE, THE PROCESSOR STACK WILL BE CLEARED. ; ; IF THE CONVERSION HAS BEEN SATISFACTORILY CONCLUDED, ; THE CONDISET BY READ/WRITE PROCESSOR ; WILL BE ON TOP OF STACK AS FOLLOWS: ; R0 = DDB ADDRESS OF BUFFER ; R1 = 10 ; R2 = FIB ADDRESS BELOW BIT MAP DATA ; R4 = DEVICE SWITCH (NON-0:=DECTAPE) ; BEFORE CALL TO GNM, TWO UNWANTED DATA ITEMS ; ARE ON TOP OF STACK ; REGISTERS ACTUALLY CONTAIN: ; R1 = STACK ADDRESS BELOW CALL ENTRY ; R5 = PROCESSOR STATUS ADDRESS (OR -2) ;ON EXIT BACK TO READ/WRITE PROCESSOR, STACKED ; REGISTERS WILL BE RESTORED WITH FOLLOWING ; MODIFICATION TO MEET REQUIREMUFFER ADDRESS MOV PC,R3 ADD #LD.LDR-.,R3 ; STUFF TO BE TRANSFERRED MOV #-256.,R4 ; LENGTH MOV R1,R2 LD.MVI: MOV (R3)+,(R1)+ ; MOVE IT INC R4 BNE LD.MVI BIS #340,@#-2 ; RAISE PRIORITY FOR JUMP DECB LDR-2 ; GO TO IT JMP @R2 LD.LDR: CLR @#-2 ; RESET STATUS MOV @#S.RRES,-(SP) ; NO GOING BACK JSR R5,@(SP)+ CMP (SP)+,(SP)+ MOV (SP)+,LD.LOD MOV R0,LD.LNK ; LOAD AND DDB ADDRESEXAMINE CMPB #ZERO,@R3 BHI CSCH10 ;SUBROUTINE TO EXAMINE CMPB #Z,@R3 ;THE NEXT CHARACTER BLO CSCH10 ;OUTPUT : CMPB #NINE,@R3 ;(1) > 0 MEANS LETTER BHIS CSCH05 ;(2) = 0 MEANS DIGIT CMPB #A,@R3 ;(3) < 0 MEANS NEITHER BHI CSCH10 INC @R6 CSCH05: INC @R6 CSCH10: DEC @R6 TST (R6)+ RTS PC STADR: .WORD CSST0-. .WORD CSST2-. .WORD CSST4-. .WORD CSST6-. .WORD CSSTTION CODES IN THE PROCESSOR STATUS REGISTER ; WILL BE CLEARED. CONVERSION ERRORS WILL BE FLAGGED ; BY ONE OF THESE CODES AS FOLLOWS:- ;  N BIT = ILLEGAL CALL CODE ;  C BIT = INVALID ASCII BYTE ;  V BIT = WORD CAPACITY EXCEEDED ; THE LAST TWO ERROR TYPES MAY OCCUR DURING CONVERSION ; TO BINARY AND IN EITHER CASE THE CONVERSION WILL BE ; STOPPED BUT THE VALUE RETURNED WILL BE CORRECT ; UP TO THE ERROR. ; FOR CONVERSION FROM BINARY, THERE WILL BE NO ; OVERFLOW ERROR; HOWEVER AN INENTS OF ENTRY ; TO BLOCK ALLOCATOR: ; R0 = DDB ADDRESS OF WORD COUNT ; R2 = FIB ADDRESS OF NEXT BLOCK (SET TO ; 0 TO SHOW ENTRY TO GNM) ; UNWANTED ITEMS WILL BE REMOVED FROM STACK ; & INSTEAD TOP OF STACK WILL CONTAIN 10000 ; (REQUIRED AS ROTATION COUNT BY BLK ALLOC) ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL GNM ; .BYTE 0,-1 ;IN USE/NON SHARE SWITCH ; ;GET RELES MOV PC,R5 ADD #LD.TRB-.,R5 ; COMPUTE TRAN BLOCK ADDRESS MOV R5,LD.TBA MOV PC,R5 ADD #LD.LNK-.,R5 ; LINK BLOCK ADDDRSS MOV R5,LD.LKA MOV LD.TBA,R5 ; TRAN BLOCK CMP (R5)+,(R5)+ MOV R3,@R5 MOV R2,-(R5) ; BUFFER ADDRESS TST (R5)+ SUB R2,@R5 ASR @R5 ; WORD COUNT CMP -(R5),-(R5) MOV 4(R0),@R5 ; CURRENT BLOCK NUMBER MOVB 13(R0),-(SP) ; COLLECT EOD IF SET BIC #277,@SP BISB (SP)+,7(R5) MOV @#S.SVT,R5 MOV LD.TOB(R5),R5 ADD8-. .WORD CSST10-. .WORD CSST12-. CSST0: .BYTE 6. .BYTE -1 CSST2: .BYTE 2. .BYTE 6. .BYTE -1 CSST4: .BYTE 2. .BYTE 4. .BYTE -1 CSST6: .BYTE 2. .BYTE 4. .BYTE 6. .BYTE -1 CSST8: CSST10: .BYTE 2. .BYTE 4. .BYTE 6. .BYTE 8. .BYTE -1 CSST12: .BYTE 6. .BYTE 12. .BYTE 14. .BYTE -1 ;STATE 0 = COMMA ;STATE 2 = DEVICE ;STATE 4 = FILENAME ;STATE 6 = EXTENSION ;STATE 8 = UIC ;STATE 10 = SWITCH ;STATE 12 = < ;SVALID BYTE ERROR WILL ; BE GIVEN IF RADIX 50 UNPACKING IS REQUESTED FOR A ; WORD CONTAINING A VALUE GREATER THAN THAT WHICH IS ; POSSIBLE FOR THE RANGE OF ACCEPTABLE ASCII CHARS., I.E. ; ((47*50)+47)*50+47 OR 174777 OR IF THE UNUSED BYTE VALUE ; OF 35 IS PRODUCED IN THE CONVERSION. ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL CVT .BYTE 0,0  ;IN USE/SHARE SWITCHES. ;COMMON DESPATCH SEQUENCE: CVT: MOV R1,R5  ;GETVANT STACK DATA & TIDY UP: GNM: BIS #200,@R5 ;LOCK OUT KEYBOARD MOV SP,R5 ;SET VAR. STACK POINTER MOV @R5,R0 ;USE IT TO ACCESS USER DDB CLR @(R0)+ ; (FOR CLEAR BLOCK LINK STORE) MOV R0,(R5)+ MOV (R5)+,R1 ;... CONSTANT 10 MOV @R5,R3 ;... BIT MAP POINTER SUB #34,@R5 ;... FIB ADDRESS MOV (R5)+,R2 CMP (R5)+,-(R3) MOV (R5)+,R4 ;... & DEVICE SWITCH BNE GNM.DT ;IF DECTAPE HANDLE DIFFERENTLY ;SET UP INTERNAL DDB FOR TRANSFER OF MAP: MOV  #100,R5 ; TEMPORARY STACK MOV R1,LD.COL ; SET FILE TYPE INDICATOR MOV (SP),R2 ; STACK LENGTH CMPB (R2)+,(R2)+ ; MINUS TWO MOV R2,LD.STL LD.TSK: MOV (SP)+,(R5)+ ; SAVE STACK DEC R2 BNE LD.TSK MOV LD.STL,R2 MOV LD.LOD,SP LD.RST: MOV -(R5),-(SP) ; RESET STACK DEC R2 BNE LD.RST ; COMPLETELY MOV @#S.SVT,R5 ; ZERO PROGRAM AREA MOV LD.COR(R5),R5 SUB #LD.ABS,R5 ; EXCEPT PAPER TAPE LOADERS MOV LD.LOD,R2 LD.CLP: CLR (R2)+ ; CLEAR ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C ; ;PROGRAM LOADER PHASE II(B): ; ; THIS ROUTINE FIRST CLEANS UP MESS LEFT BY ; PHASE II(A) WITH RESPECT TO BUFFER ALLOCATION ; IT THEN LOADS NORMALLY NON-RESIDENT MONITOR ; ROUTINES WHICH THE USER HAS DECLARED HE WANTS ; RESIDENT FOR THE PROGRAM DURATION. FINALLY ; THE PROGRAM IS STARTED OR HELD PENDING ; ACCORDING TO THE LOAD COMMAND RECEIVED. ; ; THE ROUTINE IS CALLED BY ; EMT 62 ; WITH TH POINTER TO CALL ARGS BIC #17,-(R1) ;REMOVE C.C. FROM RETURN STATUS MOV (R5)+,R3 ;GET CONVERSION CODE MOV (R5)+,R4 ;... & BUFFER POINTER MOV PC,-(SP) ;SET PTR TO GET CHAR SUBR ADD #C.GETA-.,@SP CMP R3,#5  ;CHECK CALL VALIDITY BLOS C.GO MOV -(R1),-(SP) ;IF CODE TOO BIG ... SUB #2,@SP  ;... GIVE CALL AS EVIDENCE MOV #1434,-(SP) ;CALL DIAGNOSTIC PRINT IOT   ;... & MAKE IT FATAL! C.GO: ASL R3  ;IF O.K., BUILD DESPATCH ADDR ADD R3,PC  ;... & GOPC,R0 ;GET DDB POINTER ADD #GNM.XD-.,R0 MOV R0,R5 ;ENTER COMPLETION RETURN CLR -(R0) ;(LEFT FOR DK: OPS.) MOV R5,-(R0) MOV @SP,R5 ;SET PTR TO USER DDB MOV 2(R5),-(R0) ;MOVE OVER DEVICE UNIT BIC #174000,@R0 ;ENSURE NO GARBAGE TST -(R0) MOVB @PC,2(R0) ;SET FOR WRITE MOV -(R3),R3 ;ENTER BIT MAP ADDR AS BUFF MOV R3,-(R0) MOV 2(R3),-(R0) ;... & COMPUTE BLOCK NO. DEC @R0 ;... FROM MAP NO. ADD 6(R3),(R0)+ ;... & FIRST BLK NO. SUB RIT CMP R2,R5 BLO LD.CLP ; LOCATE BINARY BLOCK LD.LBB: CMP R4,R3 ; USUAL END BUF CHECK BLO LD.OK1 JSR R5,LD.RNB ; READ NEXT BUF. FIX REGISTERS LD.OK1: TSTB (R4)+ ; NULL? BEQ LD.LBB ; YES DECB -1(R4) ; MUST BE BUFFER HEADER BNE LD.FER CMP R4,R3 BLO LD.OK2 JSR R5,LD.RNB LD.OK2: TSTB (R4)+ ; MUST BE NULL BNE LD.FER ; OR FORMAT ERROR CMP R4,R3 BLO LD.OK3 JSR R5,LD.RNB LD.OK3: CLR R2 BISB (R4)+,R2 MOV R2,R1 ; FORME STACK AS FOR PHASE II(A) ; LESS THE TOP TWO WORDS .TITLE LD2 .GLOBL LD2 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .BYTE 0,1 LD2: MOV @#LR.RES,-(SP) ; RESET STACK JSR R5,@(SP)+ CMP (SP)+,(SP)+ MOV @#LR.SVT,R4 MOV LR.BFS(R4),R3 ; CLEAR BUFFER ALLOC TABLE LR.CLR: CLR (R3)+ CMP R3,LR.BFE(R4) BNE LR.CLR MOV @R4,R3  ; SET TOB ADD #40,R3 MOV R3,2(R4) ; LOAD REQUESTED MONITOR ROUTINES MOV (SP)+,R1 ; GET C TO IT ;DESPATCH TABLE: BR C.RPK  ;0 = RADIX 50 PACK BR C.RUP  ;1 = RADIX 50 UNPACK BR C.D2B  ;2 = DEC ASC TO BIN BR C.B2D  ;3 = BIN TO DEC ASC BR C.O2B  ;4 = OCT ASC TO BIN JMP C.B2O  ;5 = BIN TO OCT ASC ;RADIX 50 PACK: ; EXPECTS 3 BYTES & STOPS AFTER THESE. IF INVALID ; CHARACTER (NOT LETTER, DIGIT, SPACE, PERIOD OR $) ; PACKS WITH NULL TO PRODUCE CORRECT JUSTIFICATION. ; POINTER STAYS AT INVALID CHAR. C.RPK: MOV #3,R3  ;SET BYT1,R0 ;GET DRIVER ADDR MOV -12(R5),(R0)+ MOV -10(R5),@R0 ;SET DDB BUSY FLAG MOV R0,R5 ;SET POINTER AT BLOCK NO. CMP (R5)+,(R5)+ ;TRANSFER BIT MAP: TST @R2 ;FIRST TIME IN? BEQ GNM.RM ;IF NOT READ NEXT MAP ONLY MOV R0,-(SP) ;SAVE DDB ADDRESS ... MOV @R0,-(SP) ;... & ITS CONTENT JSR PC,GNM.XF ;OUTPUT CORE MAP MOV (SP)+,@(SP)+ ;RESET DDB BUSY CMP 6(R3),@R5 ;FIRST MAP ONE NOW IN? BE CHECKSUM IN R1 CMP R4,R3 BLO LD.OK4 JSR R5,LD.RNB LD.OK4: CLR R5 BISB (R4)+,R5 ; HIGH ORDER BYTE COUNT ADD R5,R1 ; TO CKSUM SWAB R5 ADD R5,R2 ; R2 = BYTE COUNT CLR R0 CMP R4,R3 BLO LD.OK5 JSR R5,LD.RNB LD.OK5: BISB (R4)+,R0 ADD R0,R1 CMP R4,R3 BLO LD.OK6 JSR R5,LD.RNB LD.OK6: CLR R5 BISB (R4)+,R5 ADD R5,R1 SWAB R5 ADD R5,R0 ; R0 = LOAD ADDRESS SUB #6,R2 BEQ LD.UND ; TRAN BLOCK SIGNALS END ; LOOP TOOUNT BEQ LR.EMR  ; IGNORE NEXT IF NONE MOV PC,R0  ; SET DDB POINTER ADD #LR.DDB-.-2,R0 MOV LR.DDL(R4),R3 ; INITIALIZE DDB MOV 2(R3),(R0)+ ; WITH DRIVER ADDRESSS MOV @#LR.XIT,R5 ; & COMPLETION RETURN ADD #LR.XA,R5 ; (USING SAM. EXIT) MOV R5,14(R0) LR.MRL: MOV LR.MRT(R4),R2 ; MRT BASE ASL @SP  ; DOUBLE OFFSET ADD (SP)+,R2 BIT @R2,#1  ; RESIDENT ALREADY ? BEQ LR.NXM MOV R0,R3  ; SET VARIABLE DDB PTR MOV @R2,-(SP) ; COMPUTE ROUTINEE COUNT C.RPKA: JSR PC,@(SP)+ ;GET BYTE FROM USER CMP R0,#11  ;DIGIT? BLOS C.RPKD  ;IF SO ADD 36 CMP R0,#-2  ;PERIOD? BEQ C.RPKD  ;IF SO TREAT AS DIGIT SUB #101-60,R0 ;LETTER? CMP R0,#31 BLOS C.RPKL  ;IF SO ADD 1 SUB #40-101,R0 ;SPACE? BEQ C.RPKA  ;IF SO NULL IT IS SUB #44-40,R0 ;FINALLY IF $ BNE C.RPKE MOV #-3,R0  ;... ADD 33 C.RPKD: ADD #35,R0 C.RPKL: INC R0 BR C.RPKA  ;RETURN TO PROC SUBR. C.RPKE: BISB #1,@R1  ;IF INVQ GNM.RM ;IF SO GO TO NEXT MOV 6(R3),@R3 ;OTHERWISE GET FIRST NOW GNM.RM: MOV @R3,(R5)+ BEQ GNM.DF ;IF LINK ZERO, NO MORE MOVB @PC,4(R5) ;SET UP READ JSR PC,GNM.XF ;... & DO IT BR GNM.XT ;RETURN TO R/W PROCESSOR ;TRANSFER SUB-ROUTINE: GNM.XF: MOV @#V.RSAV,-(SP) ;SAVE REGS FOR LATER JSR R5,@(SP)+ MOV SP,R2 ;USE STORED R0 AS DUMMY LINK MOV R2,-(SP) ;... & SET PTR TO IT MOV @#V.CDB,-(SP) ;GO TO DRIVER JSR PC,@(SP)+ EMT 1 ;WAIT TILL TFR  LOAD CORE LD.MVL: CMP R4,R3 BHIS LD.OUC LD.OK7: MOVB (R4)+,R5 ADD R5,R1 ; KEEP CHECKSUM MOVB R5,(R0)+ ; INTO CORE DEC R2 ; COUNT IT BNE LD.MVL CMP R4,R3 BLO LD.OK8 JSR R5,LD.RNB LD.OK8: INC R1 ; ADD IN HEADER VALUE MOVB (R4)+,-(SP) ADD R1,@SP TSTB (SP)+ ; CHECK CKSUM BEQ LD.LBB ; DO NEXT BLOCK BR LD.RER ; READ NEXT PHYSICAL BLOCK ROUTINE LD.RNB: MOV LD.TBA,R3 BIT #40000,6(R3) ; EOD SEEN LAST TIME? BNE LD.FER ;  SIZE BIC #37777,@SP BNE .+4 INC @SP SWAB @SP ASL @SP MOV @R4,R5  ; SAVE INPUT EOM ADD @SP,(R4)+ ; RESET EOM ADD @SP,@R4  ; AND TOB MOV #107070,@(R4)+ ; RESET PROTECT CMP -(R4),-(R4) ; & GO BACK TO EOM ASR @SP  ; WORD COUNT MOV PC,(R3)+  ; SET BUSY TST (R3)+ MOV @R2,@R3 BIC #140001,@R3 BEQ LR.NXM ASR (R3)+  ; BLOCK MOV R5,(R3)+ ; SET MEM ADDR MOV (SP)+,@R3 ; SET W.C. NEG @R3  ; WORD COUNT MOV -(R3),@R2 AL. CHAR FLAG ERROR TSTB -(R4)  ;MOVE PTR BACK CLR R0  ;TREAT AS NULL BR C.RPKA  ;BUT FORCE 3 CHARS. ;RADIX 50 UNPACK: ; PRODUCES 3 BYTES. IF INITIAL VALUE IS TOO HIGH, ; CONVERSION IS PERFORMED BUT USER IS NOTIFIED OF ; ILLEGAL CHAR. VIA C BIT. SIMILARLY IF UNUSED RADIX ; 50 CODE 35 IS PRODUCED DURING THE CONVERSION. ; ; USES ALGORITHM BASED ON THE FACT THAT 15/16 OF A ; NUMBER IS EXACTLY DIVISIBLE BY 5. BY MEANS OF AN ; ITERATIVE PROCESS THE REMDONE MOV @#V.RRES,-(SP) ;ON RETURN RESTORE REGS JSR R5,@(SP)+ RTS PC ;... & CONTINUE ;TRANSFER DDB & COMPLETION PROCESSING: .WORD 0,0,0,0,0,0,0,-64.,0,0,0 ;INTERNAL DDB GNM.XD: MOV @R0,-(SP) ;ERROR IN TRANSFER? TST 12(R0) BMI GNM.XE MOV @#V.XIT,R5 ;IF NOT TAKE SYSTEM EXIT JMP -12(R5) GNM.XE: MOV #BM.ERR,-(SP) ;IF ERROR TELL USER MOV #IOT,GNM+402 ;MUST BE FATAL!!!!! BR GNM+376 ;FREE KSB. ON WAY OUT IF SO SHOULDN'T BE! MOVB LD.COL,R4 BNE LD.CNF ; CONTIGUOUS FILE MOV 2(R3),R4 ; LINK WORD MOV @R4,@R3 BEQ LD.FER ; 0 = EOF (AGAIN ERROR) BMI LD.CDT ; POSSIBLY DECTAPE REVERSE ? LD.DTF: BIC #4000,6(R3) ; CLEAR REVERSE LD.GTI: MOV LD.TRB+4,R3 ASL R3 ADD R4,R3 ; RESET REGISTERS TST (R4)+ ; SKIP LINKED FILE LINK LD.AJI: MOV LD.TBA,-(SP) MOV LD.LKA,-(SP) EMT 10 ; TRAN IN MOV LD.LKA,-(SP) ; WAIT EMT 1 TST LD.TRB+6 ; I/O ERR ADD #2,@R2  ; PROGRAMS START ADDRESS IN MRT MOV @#LR.SAV,-(SP) ; SAVE REGS JSR R5,@(SP)+ MOV #10,R1  ; TRANSFER MOV SP,R2 MOV R2,-(SP) ; LINK BLOCK MOV @#LR.CDB,-(SP) ; DO IT JSR PC,@(SP)+ EMT 1  ; AWAIT COMPLETION MOV @#LR.RES,-(SP) ; RESTORE REGS JSR R5,@(SP)+ LR.NXM: DEC R1  ; ANYMORE REQUESTS BNE LR.MRL ;DO GENERAL CLEAN UP: LR.EMR: MOV R4,R2  ; SAVE EOM PTR MOV @R4,R1  ; GET LATEST EOM CLR (R1)+ AINDER IS REDUCED TO LESS ; THAN THE ACCEPTABLE MAX (47). C.RUP: MOV @R2,-(SP) ;USE EMT CALL AS STACK STOP C.RUPL: MOV @R5,-(SP) ;SAVE LAST VALUE OF WORD CLR @R5  ;CLEAR STORE FOR NEXT REMAINDER C.RUPA: MOV @SP,R0  ;TAKE 3-QTRS OF VALUE BISB @PC,R0  ;***** MOV R0,R2 ROR R2 ASR R2 SUB R2,R0 BIC #37,R0  ;PREP.TAKE QTR OF RESULT SUB R0,@SP  ;BUT REDUCE ORIGINAL BY 3/4 ROR R0  ;NOW GET 3/16 OF ORIGINAL ASR R0 SUB R0,@SP  ;REDUCE ORIGINAL B;SPECIAL DECTAPE ACTION: GNM.DT: TST @R2 ;FIRST TIME IN? BNE GNM.XT ;IF SO EXIT FOR RECHECK GNM.DF: MOV @SP,R0 ;OTHERWISE SET EOM BIS #40000,2(R0) SUB #4,14(SP) ;...& EXIT TO R/W END GNM.XT: CLR @R2 ;SET SWITCH AGAINST RE-ENTRY MOV @#V.RRES,-(SP) ;RESTORE R/W REGS. JSR R5,@(SP)+ MOV #10000,6(SP) ;SET ROT CNT FOR ALLOCATOR MOV 2(SP),4(SP) ;RMEMOVE UNWANTED GARBAGE MOV (SP)+,@SP TSTB GNM-2 ;THIS ROUTINE IN KSB? BEQ .+4 ;IF ? BMI LD.RER ASL LD.TRB+10 SUB LD.TRB+10,R3 ; ALLOW FOR SHORT BLOCK RTS R5 LD.CNF: ADD R4,@R3 MOV 2(R3),R4 MOV 4(R3),R3 ASL R3 ADD R4,R3 ; RECOMPUTE REGS FOR NO LINK BR LD.AJI LD.CDT: TST LD.COL ; IF REVERSIBLE MEDIUM BPL LD.DTF BIS #4000,6(R3) ; SET BIT ACCORDINGLY NEG @R3 ; SET PROPER BLOCK NUMBER BR LD.GTI LD.FER: CLR -(SP) MOV #1422,-(SP) IOT ; F022 LOADER FORMAT ERROR LD.RER: CLR -(SP) ; F021 LOADER READ ERROR  ; LEAVE DAT LINK WORDS CLR (R1)+ MOV R1,(R4)+ ; RESET EOM ADD #40,R1  ; & TOB MOV #107070,@R1 ; ALSO MUST GIVE NEW PROT CLR @(R4)+  ; & REMOVE OLD ONE MOV R1,-(R4) MOV (SP)+,R3 ; START INDICATOR MOV #60,R1  ; GET PTR TO KB INT VECTOR ADD R1,R2  ; USE TO GET WAIT LOOP ADDR MOV R2,LR.WRA-2(R4) ; & SET AS WAIT RETURN ADD #14,R4  ; MOVE TO MUS IN SVT. MOV #401,(R4)+ ; SET TO PROGRAM RUN STATE CLR -(SP)  ; CLEAR REGS AND STATUS MOVY THIS ADD R0,@R5  ;THIS GIVES FIRST APPROX. CMP @SP,#47  ;REDUCED AS LOW AS POSS.? BHI C.RUPA  ;IF SO THIS IS BYTE REQD. ASR @R5  ;DIVIDE REMAINING VALUE BY 10 ASR @R5 ASR @R5 DEC R3  ;DONE 2 BYTES? BNE C.RUPL CMPB @R5,#47  ;REMAINDER LAST BYTE - TOO BIG? BHI C.RUPE  ;IF SO FLAG ILLEGAL BYTE ;***** ALLOWS ROUND UP FOR SMALL VALUES (50 & 51) C.RUPB: TSTB @R5  ;SPACE? BEQ C.RUPN  ;IF SO GO ADD 40 CMPB @R5,#35   NOT NORMAL EXIT MOV #RTI,GNM+402 ;OTHERWISE MUST FREE KSB. BR GNM+376 ;... ON WAY OUT! ;DEFINITIONS: V.RSAV=44 V.RRES=46 V.CDB=50 V.CDQ=52 BM.ERR=1414 V.XIT=42 .END  MOV #1421,-(SP) IOT ; RELEASE DRIVER AND GO TO NEXT PHASE LD.UND: MOV LD.LKA,-(SP) ; RELEASE EMT 7 EMT 62 ; (CALL PHASE II (B) LD.OUC: JSR R5,LD.RNB ; NEXT BLOCK OUT OF LINE BR LD.OK7 LD.PIC: ; CONSTANTS AND ETC. LD.LNK: .WORD 0 ; FAKE LINK BLOCK S.CDB=50 S.CDQ=52 S.XIT=42 S.SVT=40 LD.LOD: 0 LD.STL: 0 LD.COL: 0 ; CONTIGUOUS OR LINKED LD.TOB=2 S.RRES=46 LD.ABS=320 ; ABS LOADER PROT R3,-(SP) ; RUN REQUESTED? BNE LR.RUN MOV R2,@SP  ; IF NOT EXIT TO WAIT CLRB -(R4)  ; PROGRAM NOT STARTED MOV @R1,R1  ; SIMULATE CTL. C MOV -(R1),R1 ; SET CMD U/W SWITCH MOV R1,@R1 ADD #12,(R1)+ MOVB @PC,@2(R1) ; & PRINTER HOLD SW. TSTB @#177564 BPL .-4 MOVB #'$,@#177566 LR.RUN: MOV #6,R5  ; CLEAR REGS LR.RCL: CLR -(SP) DEC R5 BNE LR.RCL CLR R5  ; COMMON EXIT TO WTL OR PROG TSTB LD2-2 BNE .+4 CMP (R5)+,(R5)+ ADD ;IF UNUSED CODE .... BNE .+6 C.RUPE: BIS #1,@R1  ;... ALSO RAISE ILLEGAL FLAG CMPB @R5,#33  ;IF DOLLAR SIGN BEQ C.RUP$  ;... GO ADD 11 BHI C.RUPD  ;FOR DIGIT OR . ADD 22 ADD #40,@R5  ;FOR LETTER ADD 100 C.RUPN: ADD #16,@R5 C.RUPD: ADD #11,@R5 C.RUP$: ADD #11,@R5 MOVB @R5,(R4)+ ;GIVE RESULT TO USER MOV (SP)+,@R5 ;GET NEXT BYTE .... BMI C.XIT2  ;... UNLESS STOP SEEN BR C.RUPB  ;OTHERWISE GO PROCESS LIKEWISE ;DECIMAL ARUCTURE EXCEPT OPEN .BYTE 40  ;SPECIAL STRUCTURE = MAG TAPE .BYTE 20  ;BUFFER SIZE = 512 BYTES .BYTE INTJ-MT  ;INTERRUPT HANDLER .BYTE 240  ;PRIO FOR INTERRUPT SERVICE .BYTE 0  ;NO OPEN ENTRY .BYTE TRANS-MT ;TRANSFER ENTRY .BYTE CLOSJ-MT  ;CLOSE ENTRY .BYTE SPECJ-MT  ;SPECIAL FUNCTION ENTRY .BYTE 0 MT.NAM: .RAD50 /MT / ; OPNFLG: .BYTE 0,0,0,0,0,0,0,0 ;SET BY OPEN ROUTINE,CLEARED BY CLOSE LCMMD: .BYTE -1,-1,-1,-1,-1,-1,-1,-1, ;1 BYTE FOR EACH DECTION LD.TBA: .WORD 0 ; CONSTANT COMPUTED TRAN BLOCK LD.LKA: .WORD 0 ;ADDRESS COMPUTED LINK ADDRESS S.GTB=54 LD.COR=4 LD.TRB: 0 ; TRAN BLOCK (#) 0 ; BUFFER ADDRESS 0 ; WORD COUNT 5 ; FUNCTION (READ BINARY) 0 ; RESIDUE .END @#LR.CXT,R5 MOV R5,PC ; LD2 CONSTANTS AND ETC. LR.SVT=40 LR.EOM=0 LR.MUS=16 LR.WRA=30 LR.BFS=54   ; BUFFER START LR.BFE=56 LR.TOB=2 LR.OFS=14 LR.RES=46 LR.SAV=44 LR.CDB=50 LR.CDQ=52 LR.DDL=50 LR.XIT=42 LR.XA=-22 LR.SEM: .WORD 0 .WORD 0,0,0 LR.DDB: .WORD 0 .WORD 0,0,0,0 .WORD 4  ; READ .WORD 0,0 LR.CXT=42 LR.BUF=54 LR.MRT=46 LR.WTL=460 .END SCII TO BINARY: ; EXPECTS 5 BYTES FOR CONVERSION AND STOPS AFTER THESE ; UNLESS INVALID CHAR. (NOT DECIMAL DIGIT) OR 5TH DIGIT ; CAUSES WORD OVERFLOW. C.D2B: INC R3  ;R3 = 4, 1 MORE GIVES BYTE CNT C.D2BL: JSR PC,@(SP)+ ;GET NEXT BYTE FROM USER CMP R0,#11  ;DECIMAL DIGIT? BHI C.BERR CMP @R5,#14631 ;IF SO ROOM FOR IT? BHI C.VERR BLO C.D2BC CMPB R0,#5 BHI C.VERR C.D2BC: ADD #4,@SP  ;MODIFY RETURN TO PROC SUBR. BR C.D2BL  ;... & GO TAKE IT ;ERROR IN INEVICE .BYTE 0,0,0,0,0,0,0,0 ;DEN/PAR FOR EACH DEVICE INTENB: .BYTE 0 INTRET: .WORD 0  ;ADDR FOR RET FROM INT HANDLER TCMMD: .BYTE 0  ;LAST CMMD SAVE LOCN FOR ERR RECOVERY ERRSW: .BYTE 0  ;SET BY ERR RECOVERY IF NOT RECOVERED RETRY: .WORD 0  ;RETRY COUNT FOR ERROR RECOVERY TRYCNT: .WORD -15.  ;INITIAL RETRY COUNT LASTAT: .WORD 0  ;ADDR IN LCMMD VECTOR FOR INT HANDLER CMA: .WORD 0 BRC: .WORD 0 ; INIT: MOV 12(R0),R1 ;GET UNIT NUM BIC #174377,R1  ;CLR EXT;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001D ; .TITLE KB ;DRIVER FOR TELETYPE MODEL ASR33 NOV 70 ; ;CONSIDERS TELETYPE AS 2 DEVICES:- ; A) KEYBOARD & PRINTER TERMINAL ("KB") ; B) PAPER TAPE READER/PUNCH ("TT") ; ;KB INPUT WILL BE ACCEPTED AND BUFFERED INTERNALLY, ; INDEPENDENTLY OF PROGRAM REQUESTS FOR DATA, AS ; LONG AS SPACE REMAINS. DATA WILL BE PASSED TO THE PROGRAM ; AT MONITOR REQUEST, ONE LINE AT A TIME, WHERE A ; LINE IS DEFINED AS A ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001A ; PAPER TAPE READER DRIVER (PR) .TITLE PR .GLOBL PR R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; PREAMBLE PR: .WORD 0  ;DCURRENT DDCB OR 0 .BYTE PR.BP  ; FACILITIES INDICATOR .BYTE 0 .BYTE 2  ; STANDARD BUFFER SIZE / 16. .BYTE PR.INT-PR ; INTERRUPT ADDRESS .BYTE 200  ; PRIORITY 4 INTERRUPT .BYTE PR.OPN-PR ; DISPATCH OPEN .BYTE PR.TFR-PR ; TRANSFER (IN) .PUT: C.VERR: INCB @R1  ;FOR OVERFLOW SET V BIT C.BERR: INCB @R1  ;FOR INVAL CHAR SET C BIT TSTB -(R4)  ;ADJUST INPUT PTR BR C.XIT  ;... & TAKE COMMON EXIT ;BINARY TO DECIMAL ASCII: ; PRODUCES 5 BYTES IN USER BUFFER. NO ERROR CONDITIONS C.B2D: MOV PC,R2  ;SET UP PTR TO REDUCTION TABLE CMP (R2)+,(R2)+ BR C.B2DC  ;... & GO START CONVERSION .WORD 10000.,1000.,100.,10.,0 INCB R0  ;BUILD DIGIT ... C.B2DA: SUB @R2,@R5  ;... BY REDUCIRA BITS MOV R1,@#MTC SWAB R1 ADD PC,R1 ADD #LCMMD-.,R1 ;ADDR IN LAST CMMD VECTOR MOV (SP)+,R4 ;SAVE RETURN ADDR MOV (SP)+,R5 ;SAVE ORIGINAL PC MOV @#PS,-(SP) ;SIMULATE INT CALL MOV R5,-(SP) MOV @#44,-(SP) ;SAVE REGS JSR R5,@(SP)+ MOV R4,-(SP) ;RESET CALLING PC MOV R1,LASTAT ;SAVE FOR INT HANDLER JSR PC,READY ;CHECK IF UNIT READY TSTB (R1)  ;CHECK IF DEVICE INITIALIZED BPL INITX  ;BRANCH IF IS MOVB #DENB,10(R1) ;SET DEFAULT DEN=80SET OF CHARACTERS TERMINATING ; AT EACH OCCURENCE OF LINE-FEED, VERTICAL TAB OR ; LINE-FEED. THE LINE WILL ALSO BE ECHOED AT THE ; PRINTER (SUBJECT TO PROGRAM OR OPERATOR CONTROL) ; WHEN TRANSFERRED TO THE PROGRAM. ; DURING PROCESSING, THE FOLLOWING CHARACTERS WILL ; RECEIVE TREATMENT SHOWN:- ; ; ESC (OR ALT MODE) - WILL CAUSE NEXT CHARACTER ;  TO LOSE ANY SPECIAL PROPERTIES I.E. AS ;  GIVEN BELOW OR AS TERMINATOR ; CTL/U - WILL DELETE CURRENT LINE, IF ANY INPUT EXISTS. ;  (WILLBYTE 0  ; CLOSE .BYTE 0  ; SPECIAL FUNCTIONS .BYTE 0 ; DUMMY PR.NAM: .RAD50 'PR' INTCNT: .WORD 0  ; INTERNAL COUNT STOADD: .WORD 0  ; STORE NEXT ADDRESS ; MAIN DRIVER ; BEGIN TRANSFER PR.TFR: MOV PR,R0  ; GET DDB MOV 10(R0),R4 ; PRESERVE USER COUNT ASL R4  ; BYTE COUNT MOV R4,INTCNT MOV 6(R0),STOADD ; SAVE BUFFER ADDRESS BIS #101,@#PR.CSR ; ENABLE INTERRUPT RTS PC  ;RETURN ; THE PR IS DRIVEN BY THE FOLLOWING INTERRUPT ROUTINE ; PR.INT: NG USER VALUE BCC .-4  ;... AS LONG AS POSS. C.B2DB: MOVB R0,(R4)+ ;GIVE DIGIT TO USER ADD (R2)+,@R5 ;RESTORE REMAINDER C.B2DC: MOV #60,R0  ;RESET ASCII BASE TST @R2  ;DONE ALL DIGITS? BGT C.B2DA  ;IF NOT GO FOR NEXT BMI C.XIT2  ;IF LAST STORED NOW EXIT ADD @R5,R0  ;OTHERWISE UNITS STILL REMAIN BR C.B2DB  ;SO GO BACK & STORE THESE ALSO ;OCTAL ASCII TO BINARY: ; EXPECTS 6 BYTES FOR CONVERSION AND STOPS AFTER THESE ; UNLESS INVA0,PAR=ODD CLRB (R1)  ;CLEAR NON INIT STATE INITX: RTS PC ; SIMCOM: CLRB ERRSW  ;CLEAR ERROR SWITCH TSTB INTENB  ;BRANCH IF INT RET BNE MTEXIT TSTB -3(R0)  ;BRANCH IF CALLED FROM QUEUE BNE MTEXIT ADD #20,SP  ;REMOVE PC,PS AND REGS MTEXIT: CLRB INTENB JMP @14(R0)  ;COMPLETION EXIT ; ; ; ; GO: MOV (SP)+,INTRET ;SAVE INT RETURN ADDR GOA: MOV CMA,@#MTCMA MOV BRC,@#MTBRC CMPB (R1),#WRITE ;CHECK IF THIS IS A WRITE BNE GO2  ;BRANCH IF NOT CAUSE ECHO OF CR-LF ALSO (REV.7/4/71) ;  IF NONE, WILL TERMINATE CURRENT LINE OF OUTPUT. ; RUBOUT - WILL ERASE PREVIOUS VALID CHARACTER IN ;  THE LINE. IT WILL BE ECHOED:- \(DEL.CHAR.) ;  SUCCESSIVE RUBOUTS WILL PRODUCE STRING ;  OF DELETED CHARS. (IN REVERSE) BETWEEN ;  \...\. IT WILL BE IGNORED IF NO CHARS. ;  ARE AVAILABLE FOR DELETION ; RETURN - WILL ECHO RETURN/LINE-FEED (WILL ;  THEREFORE ALSO ACT AS TERMINATOR) ; OTHER CHARACTERS MAY PRODUCE SPECIAL ECHO (SEE ;  KB OTST @#PR.CSR ; TEST FOR ERROR BMI PR.ERR  ; YES MOVB @#PR.BUF,@STOADD ; STORE CHARACTER INC STOADD  ; UPDATE INC INTCNT  ; POINTERS BEQ PR.DNE BIS #101,@#PR.CSR ; ENABLE RTI   ; AND RETURN PR.ERR: PR.DNE: MOV @#PR.SAV,-(SP) ; SET UP JSR JSR R5,@(SP)+ PR.DIS: CLRB @#PR.CSR ; DISABLE INTERRUPT MOV PR,R0  ; DDB ADDRESS MOV INTCNT,R1 ; REMAINING COUNT BEQ PR.FRT  ; NONE SUB #6,R1  ; ROUNDED TO WORDS (AND TEAR) ASR R1 MOV LID CHAR.(NOT OCTAL DIGIT) OR 6TH DIGIT ; CAUSES WORD OVERFLOW. C.O2B: TST -(R3)  ;R3 = 10, 2 LESS GIVES BYTE CNT C.O2BL: JSR PC,@(SP)+ ;GET BYTE FROM USER CMP R0,#7  ;VALID DIGIT? BHI C.BERR  ;IF NOT STOP NOW BIT @R5,#160000 ;ROOM IN STORE FOR ANOTHER? BNE C.VERR  ;ALSO STOP IF NOT ASL @R5  ;OTHERWISE MOVE PREVIOUS VALUE ADD #10,@SP  ;ADJUST RETURN TO PROC SUBR BR C.O2BL  ;... & REJOIN FOR REST ;SUBROUTINE FOR TO BINARY PROCESSING: ; INITIALLY CALLED GO1: BIT #WRL,@#MTS ;CHECK IF WRITE LOCK ON BEQ GO2  ;BRANCH IF NOT JSR PC,READY1 ;ISSUE ACTION MSG BR GO1  ;GO TEST IF LOCK STILL ON GO2: JSR PC,READY ;CHECK IF DEVICE READY BISB 10(R1),@#MTC+1 ;SET DEN AND PAR BIS #INT+GOB,R2  ;SET INT ENB AND GO BITS MOVB R2,@#MTC ;ISSUE INSTRUCTION GO3: MOV @#46,-(SP) ;RESTORE REGS JSR R5,@(SP)+ RTI   ;RETURN TO INTERRUPT ; ; READY1: MOV MT.NAM,-(SP) ;ISSUE ACTION DIAG - MOV #402,-(SP) ;DEVICE NOT READUTPUT BELOW) ; ;KB OUTPUT WILL ALSO BE EFFECTED ON A LINE-BY LINE ; BASIS. THE FOLLOWING CHARS. WILL BE ECHOED AS ; SHOWN:- ; ; ALL CTL CHARS. (OTHER THAN THOSE FOR FORM CONTROL ;  WILL APPEAR:- ^(CORR. CHAR.) ; HORIZONTAL TAB WILL BE REPLACED BY SPACES ON ;  A MODULO-8 BASIS. ; FORM-FEED WILL BE REPLACED BY LINE-FEEDS ON A ;  MODULO-8 BASIS. ; VERTICAL TAB, RUBOUT (IF NOT RESULT OF KEYBOARD ECHO) ;  & NULL WILL BE IGNORED. ; N.B. ECHO WILL OCCUR ALSO IF APPROPRIATE CHAR APPER1,16(R0) ; RETURN RESULT TO CALLER PR.FRT: JMP @14(R0)  ; COMPLETION RETURN ; OPEN ROUTINE: PR.OPR: MOV PR.NAM,-(SP) ; ADDITIONAL INFO MOV #402,-(SP) ;NOT READY - 1,2 ERR MSG IOT PR.OPN: TST @#PR.CSR ; TAPE READY BMI PR.OPR  ; NO TST (SP)+  ;CLEAR CALL FROM STACK MOV PR,R0  ;GET DDB ADDRESS BR PR.FRT  ; .... & TAKE COMPLETE RETN ; PR.BUF=177552 PR.CSR=177550 PR.BP=234 PR.SAV=44 .END  TO GET FIRST BYTE, AFTER SETTING ; POINTER TO RESULT ON STACK. RECALLED AT POINT ; VARYING WITH CONVERSION REQD. TO PERFORM COMPUTATION ; IF BYTE VALID. C.GETA: TST -(R5)  ;ON 1ST ENTRY, MOVE PTR TO STORE CLR -(R5)  ;... & CLEAR FOR RESULT C.GTAG: MOVB (R4)+,R0 ;GET USER BYTE BIC #177600,R0 ;... STRIPPED OF ANY PARITY SUB #60,R0  ;ASSUME DIGIT FOR NOW JSR PC,@(SP)+ ;GO BACK TO INDIV RTN FOR CHKS ASL @R5  ;RETURN FOR MULT BY 50 (RPK) ASL @R5 ASL @R5  ;R;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001A .TITLE PP .GLOBL PP R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; PAPER TAPE PUNCH DRIVER (PP) ; PREAMBLE ; PP: .WORD 0  ; CURRENT DCB OR 0 .BYTE PP.BP  ; FACILITIES .BYTE 0  .BYTE 2  ; 32 WORD STD BUFFER .BYTE PP.INT-PP ; TRANSFER ADDRESS .BYTE 200  ; STATUS .BYTE PP.OPN-PP ; RELATIVE ADDRESSES FOR OPEN .BYTE PP.TFR-PP ; TRANSFER .BYTEARS ; WITHIN DELETE STRING ON INPUT. ;TT INPUT AND OUTPUT WILL BE PASSED DIRECTLY TO OR FROM ; THE PROGRAM, AT MONITOR REQUEST ONLY, AND IT ; WILL NOT BE PROCESSED IN ANY WAY, (INCLUDING NO ; INPUT ECHO). ; NEITHER WILL BE ALLOWED TO PROCEED WHILE ; THE CORRESPONDING KB COMPONENT IS ACTIVELY ; ENGAGED VIZ. KEYBOARD WAITING INPUT TO SATISFY ; A MONITOR REQUEST OR PRINTER IN THE MIDDLE OF ; OUTPUT FROM MONITOR OR LINE OF INPUT ECHO.(& VICE ; VERSA). ; HOWEVER ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V000B ; LINE PRINTER DRIVER (LP) PRSIZE=80.  ; NUMBER OF COLUMNS FOR THIS PRINTER .TITLE LP .GLOBL LP R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; PREAMBLE (FIXED) LP: .WORD 0  ; CURRENT DCB OR 0 .BYTE LP.BP  ; FACILITIES INDICATOR .BYTE 0 .BYTE 3  ; STD. BUF. / 16    ; 80 CHAR. MAX. .BYTE LP.INT-LP ; INTERRUPT ADDRESS .BYTE 200  ; STATUS (PRIORITY 4) .BYTE ETURN FOR MULT BY 10 (D2B) ADD @R5,R0 ASL @R5  ;RETURN FOR OCTAL ROTATE (O2B) ASL @R5 ADD R0,@R5  ;BUILD IN NEW DIGIT DEC R3  ;DONE ALL REQD.? BNE C.GTAG  ;IF NOT REPEAT ;COMMON EXIT SEQUENCE: C.XIT: CMP (R5)+,(SP)+ ;TIDY STACK ... MOV R4,@R5  ;...& RETURN LAST PTR VALUE C.XIT1: CLR R0  ;SET UP EXIT TSTB CVT-2  ;... ALLOWING FOR NON-RES. BNE .+4 CMP (R0)+,(R0)+ ADD @#V.SXT,R0 JMP @R0  ;...& TAKE IT FREEING MSB IF NEC. V.SXT=42  PP.CLS-PP ; CLOSE .BYTE 0,0  ; SPF & SPARE PP.NAM: .RAD50 'PP' PP.TRL: .WORD 1  ; TRAILER INDOCATOR = 0 PPCT: .WORD 0  ; INTERNAL COUNT PPFPT: .WORD 0  ; CURRENT BUFFER POINTER ; ; DRIVER BODY PP.TFR: MOV PP,R0  ; GET CURRENT DDB MOV 6(R0),PPFPT ; GET BUFFER POINTER MOV 10(R0),R4 ; PRESERVE WORD COUNT ASL R4  ; CONVERT TO BYTES MOV R4,PPCT  ; AND SAVE MOVB #1,PP.TRL  ; RESET TO TFR PP.UEN: MOV (SP),-(SP) ; SIMULATE INTERRUPT MOV @#ST.AIN ORDER THAT BOTH READER & PUNCH MAY BE ; CONCURRENTLY IN USE THE ROUTINES TO HANDLE THESE ; DEVICES WILL MAINTAIN THEIR OWN INDICATORS OF ; THEIR STATE OF READINESS FOR USE AND WILL CAUSE ; TT ALWAYS TO APPEAR IDLE TO THE MONITOR(THEY ; WILL ALSO SCREAM IF THE PROGRAM TRIES TO MAKE ; THEM DO MORE THAN ONE TASK AT A TIME!!!!) ; THE DRIVER HAS NO MEANS OF KNOWING WHEN THE READER ; OR PUNCH IS PHYSICALLY 'IN GEAR'. THE USING ; PROGRAM MUST THEREFORE TAKE THE RESPONSIBILITY ; FOR NOTIFYLP.OPN-LP ; OPEN ENTRY .BYTE LP.TFR-LP ; TRANSFER (OUT) .BYTE LP.CLS-LP ; CLOSE .BYTE 0  ; SPECIAL .BYTE 0  ; SPARE LP.NAM: .RAD50 'LP' ; MISC. STORES: LP.FRM: .BYTE 14,0  ; USED FOR OPEN & CLOSE LP.LIN: .WORD 0 BTCT: .WORD 0  ; INTERNAL COUNT BUFAD: .WORD 0  ; BUFFER POINTER LP.TAB: .WORD 0  ; TABULATION COUNT ; OPEN & CLOSE ROUTINES: LP.OPN: JSR R5,LP.STS ; SIMULATE INTERRUPT MOV #1,BTCT  ; SET FOR FF PRINT MOV PC,BUFAD ; FROM HEADER ;CONVERSION FROM BINARY TO OCTAL ASCII: ; PRODUCES 6 ASCII BYTES IN USER SUPPLIED BUFFER ; NO ERROR CONDITIONS. C.B2O: MOV #2230,R0 ;SET ROTATION COUNT C.B2OL: ASL @R5  ;GET BIT FROM WORD ROLB R0  ;... & MOVE TO DIGIT BCC .-4  ;DONE REQD. BITS? MOVB R0,(R4)+ ;IF SO GIVE CHAR TO USER CLRB R0  ;RESET BIT COUNT BISB #23,R0 ASL R0  ;NOW CHECK IF DONE 6 BCC C.B2OL  ;IF NOT REPEAT ;EXIT SEQUENCE FOR FROM BINARY CONVERSIONS: C.XIT2: CTS,2(SP) ; FROM JSR PC,XXX MOV @#PP.VCT,@#ST.ATS ; RUN UNDER PUNCH STATUS PP.INT: TST @#PP.CSR ; PUNCH OUT OF PAPER OR OFF BMI PP.ERR  ; YES TST PPCT BEQ PP.DNE  ; ALREADY FINISHED INC PPCT  ; COUNT THIS ONE MOVB @PPFPT,@#PP.BRG ; MOVE CHARACTER TO PUNCH TSTB PP.TRL  ; TRAILER OR NO BEQ PP.NOI  ; TRAILER INC PPFPT  ; NEXT ADDRESS OF BUF. PP.NOI: BIS #100,@#PP.CSR ; ENABLE INTERRUPT RTI   ; RETURN PP.DNE: MOV @#PP.SAV,.+10 ; SAVE REGS FING THE OPERATOR OF ITS REQUIREMENTS ; IN THIS RESPECT. ; ;FOR BOTH TT AND KB, THE USER MUST USE A MONITOR KEYBOARD ; CALL TO INDICATE END OF AVAILABLE DATA. ; ;N.B. 1) IN USE FLAGS OPERATE AS FOLLOWS:- ; ; TT.ISW & TT.OSW}:= WHEN IN USE CONTAIN ADDRESS ;   OF DDB FOR DATASET UNDER SERVICE. ;   IF ACTUALLY UNDERWAY, THIS WILL ;   APPEAR AS A POSITIVE VALUE. IT ;   WILL BE NEGATED IF THAT SERVICE ;   MUST WAIT FOR KB TO RELEASE ;   APPROPRIATE DEVICE. ; KB.ISW:= ADD #LP.FRM-.,BUFAD BR LP.INT ; TRANSFER ROUTINE: LP.TFR: MOV LP,R0  ; PICK UP DDB JSR R5,LP.STS ; RUN AT LP STATUS MOV 6(R0),BUFAD ; SAVE BUFFER ADDRESS MOV 10(R0),R4 ; PRESERVE DDB W.C. ASL R4  ; CHARACTER COUNT NEG R4  ; MAKE POSITIVE MOV R4,BTCT LP.INT: BIC #100,@#LP.CSR ; DISABLE INTERRUPT TST @#LP.CSR ; CHECK FOR ERROR BMI LP.ERR  ; YES MOV R1,-(SP) ;QUICK SAVE MOV R2,-(SP)  ; REGS. MOV BTCT,R1  ; GEMP (R1)+,(R5)+ ;ADJUST POINTERS ... MOV -(R1),-(R5) ;... TO CLEAR CALL ARGS OFF STACK CMP R1,SP BNE .-4 ADD #10,SP  ;MAKE STACK TIDY BR C.XIT1  ;REJOIN OTHER RTNS IN COMMON EXIT .END OR RETURN JSR R5,@#0 CLR @#PP.CSR ; DISABLE INTERRUPT PP.IGN: MOV PP,R0  ; CURRENT DDB JMP @14(R0)  ; COMPLETION RETURN PP.ERR: MOV #63200,-(SP) ;SHOW DEVICE NAME MOV #402,-(SP) ; PRINT 1-2 ERR MSG IOT   ; NOT READY BR PP.INT PP.OPN: PP.CLS: CLRB PP.TRL  ; INDICATE TRAILER OPERATION MOV PC,PPFPT ADD #PP.TRL-.,PPFPT ; SET BUFADDR MOV #177524,PPCT ; Z FOLDS TRAILER BR PP.UEN  ; NORMAL FROM HERE ON ST.ATS=177776 PP.VC WILL BE SET ONLY IF INPUT ;   NEEDED BY THE PROGRAM IS NOT ;   IMMEDIATELY AVAILABLE. WILL ;   CONTAIN PTR TO LAST CHAR. IN ;   ECHO SCAN. ; KB.OSW:=  WILL BE SET TO 1 WHILE ;   PRINTER IS OPERATING ON OUTPUT ;   & NEGATIVELY DURING INPUT ECHO. ;   IN LATTER CASE REMAINS SET UNTIL ;   LINE TERMINATOR HAS BEEN DESPATCHED ; ; 2) ON ENTRY FROM MONITOR, BOTH TT & KB EXPECT ;  R0 SET TO DDB ADDRESS & R5 TO THAT OF ;  PROCESSOR STATUS REGISTER (AS CURRENTLY ;T CURRENT BYTE COUNT BEQ LP.DNE  ; NO MORE MOV BUFAD,R2 ; GET CURRENT BUF LOC. LP.LOP: TSTB @#LP.CSR  ; IS PRINTER GOING BPL LP.STI  ; YES CMPB (R2),#11 ; TAB ? BEQ LP.PTB CMPB (R2),#15 ; CARRIAGE RETURN ... BEQ LP.RSC  ; ... RESET COUNTS TSTB @R2  ; IGNORE NULL ... BEQ LP.DNP CMPB @R2,#13  ; VERTICAL TAB ... BEQ LP.DNP CMPB @R2,#177 ; ... & RUBOUT BEQ LP.DNP CMPB @R2,#12  ; IF LINE TERMINATOR ... BEQ LP.RSC CMPB @R2,#14;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V000B .TITLE DT ; .GLOBL DT ;DECTAPE DRIVER  VERSION 1 23 JULY 70 ; PRESENTLY CONTAINS ONLY ROUTINE FOR TRANSFER ; ;STANDARD DRIVER TABLE: DT: .WORD 0  ;BUSY FLAG (DDB ADDR WHEN BUSY) .BYTE 37,300  ;FACILITY INDICATOR .BYTE 16.  ;STD BUFF SIZE/16. .BYTE DT.INT-DT ;POINTER TO INT SVCE .BYTE 340  ;INT SVCE PRIORITY .BYTE 0  ;DESPATCH TABLE .... .BYTE DT.TFR-DT ;...FOR TRANST=76 PP.CSR=177554 PP.BRG=177556 PP.SAV=44 PP.BP=332 PP.SPF=PP.IGN .END   PROVIDED BY S.CDB) .GLOBL KB ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 TKS=177560 TKB=TKS+2 TPS=177564 TPB=TPS+2 ;DESCRIPTION TABLE - TERMINAL DEVICE (KB): KB: .WORD 0  ;BUSY FLAG .BYTE 327  ;FACILITIES: I/O,ASC,M/U,OPN,CLS .BYTE 1  ; ALSO TERMINAL .BYTE 2  ;STD BUFFER = 32 WORDS .BYTE KB.INT-KB ;POINTER TO INT SVCE KB.PSP: .BYTE 200  ;INT SVCE PRIORITY    ;ALSO USED AS PRINT SUPPRESS SW BNE LP.CLO LP.RSC: MOV #9.,LP.TAB ; ... RESET COUNTS MOV #PRSIZE+1,LP.LIN BR LP.TBF  ;... & OMIT NEXT LP.CLO: TST LP.LIN  ; OTHERWISE CHECK LINE OFLO BEQ LP.DNP  ; IGNORE CHAR IF FULL LP.TBF: MOVB (R2)+,@#LP.BUF ; PRINT CHAR DEC LP.LIN  ; COUNT CHARS. DESPATCHED DEC LP.TAB  ; UPDATE TAB COUNT BNE LP.TRT MOV #8.,LP.TAB ; RESET TAB COUNT LP.TRT: DEC R1  ; UPDATE COUNT BNE LP.LOP ; MORE TSTB @#LP.CSR ; PRINTER GOINFER ONLY! .BYTE 0 .BYTE 0 .BYTE 0  ;SPARE DT.NAM: .RAD50 'DT' .WORD DT.DIR  ;FIXED MFD BLOCK .WORD 0,0,0,0,0,0,0,0 ;POINTERS FOR BIT MAP ACCESS ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;SET UP TRANSFER: DT.TFR: MOV @PC,DT.RTC ;SET RETRY COUNT DT.PR1: MOV DT,R0  ;GET ADDRESS OF DDB ... MOV #DT.CBA,R1 ;... & OF HWR BLOCK CLR @R1 CMP (R0)+,(R0)+ ;SKIP USER LINE IN DDB MOV (R0)+,DT.BRQ ;SAV;COPYRIGHT 1971, DIGITAL EQUIPMENT COPR., MAYNARD, MASS. ;VERSION NUMBER: V001C ; ;CARD READER DRIVER (CR) ; ; A) FOR ASCII INPUT. AT EACH TRANSFER REQUEST ; ONE CARD WILL BE READ. UP TO 80 CHARACTERS, ; FOLLOWED BY CR-LF, WILL BE PASSED TO THE ; CALLING ROUTINE AS SPECIFIED BY THE WORD ; COUNT GIVEN. (IF THIS IS > 41, REMAINING ; BYTES WILL BE CLEARED. ; ALL ERRORS (INCLUDING 'HOPPER EMPTY' UPON ; AN 'OPEN' CALL) WILL BE TREATED AS 'DEVICE ; NOT READY'. USER CAN RESUME OPERATION. .BYTE KB.OPN-KB ;DESPATCH TABLE TO ROUTINES .BYTE KB.TFR-KB .BYTE KB.CLS-KB .BYTE 0  ;CURRENTLY NO SP. FUNC. .BYTE 0 .RAD50 "KB" ;DESCRIPTION TABLE - PAPER TAPE DEVICE (TT): TT: .WORD 0  ;AS FOR KB (EXCEPT NOT TERMINAL) .BYTE 327 .BYTE 0 .BYTE 1 .BYTE TT.INT-TT TT.EDI: .BYTE 200  ;ALSO USED AS DATA END FLAG .BYTE TT.OPN-TT .BYTE TT.TFR-TT .BYTE TT.CLS-TT .BYTE 0 .BYTE 0 .RAD50 "TT" KB.INT: TT.INT: JMP KT.INT  ;COMMON ENTG BMI LP.DNE  ; NO, SO NO INTERRUPT LP.STI: MOV R1,BTCT  ; SET UP FOR NEXT TIME MOV R2,BUFAD LP.TWC: BIS #100,@#LP.CSR ; ENABLE INTERRUPT MOV (SP)+,R2 ; RESTORE REGS MOV (SP)+,R1 RTI   ; THROUGH INTERRUPT LP.DNE: MOV (SP)+,R2 ; RESTORE REGS MOV (SP)+,R1 MOV @#LP.SAV,.+10 ; SAVE ALL REGS JSR R5,@#0 CLR @#LP.CSR ; DISABLE INTERRUPT LP.IGN: MOV LP,R0 JMP @14(R0)  ; COMPLETION RETURN LP.ERR: MOV LP.NAM,-(SP) ; ON ERRE BLOCK NO FOR LATER MOV (R0)+,@R1 ;SET READY MEMORY ADDR ... MOV (R0)+,-(R1) ;... & WORD COUNT DT.PR2: CLRB DT.INT  ;SET INT'RUPT SW. TO SRCH MOV DT.BRQ,DT.BCK ;SET BLK CTRL FOR SRCH MOV #100,R3  ;USED IN NEXT SEQUENCE MOV R3,DT.TAC ;SET TURN AROUND COUNT MOV @R0,-(SP) ;GET UNIT, DIRECTION & FUNC BIC #170341,@SP ;CLEAR POSS. GARBAGE BIS R3,@SP  ;ADD IN INT ENB BIT BITB @SP,@PC  ;WRITE REQD? BEQ .+6  ;(READ O.K. ALRDY)***** ADD #12,@SP  ;IF  BY ; RECTIFICATION OF ERROR OR REFILL OF HOPPER ; AND ENTRY OF 'CO' COMMAND AT KEYBOARD. ; THE END OF A FILE WILL BE DETERMINED BY ; RECOGNITION OF A TERMINAL CONTROL CARD:- ; 12-11-0-1 PUNCHED IN C.C. 1 ; ; XXXXXXXXXXXXXXXXXXXXXXXXX ; X X ; X NOTES X ; X X ; XXXXXXXXXXXXXXXXXXXXXXXXX ; ; 1) THIS DRIVER CAN BE ASSEMBLED FOR USE ; IN CONNECTION WITH EITHER '026' OR '029' ; PUNCHES OR BOTH AS INDICATED BY PARAMETER ; SPECIFICATION AT START OF SOURCRY TO INT SVCE ;PAPER-TAPE SET-UP ROUTINES: ; 1) OPEN & CLOSE: ; ON OUTPUT REQUEST, OPEN & CLOSE WILL GENERATE ;  APPROX. 6 INCHES OF BLANK TAPE AS ;  LEADER OR TRAILER. ; FOR INPUT, ONLY ACTION WILL BE CLEARANCE OF ;  ANY CURRENT END OF DATA INDICATOR. TT.OPN: TT.CLS: JSR R4,TT.DCK ;CHECK TRANSFER DIRECTION BR TT.OPI TT.OPO: CLR R2  ;FOR OUTPUT SET SW. MOVB #-100,R3 ;... & COUNT FOR L/T CODE BR TT.TFO  ;JOIN TT.TFO FOR REST TT.OPI: BISBOR SHOW NAME MOV #402,-(SP) ; 1-2 ERR MSG IOT  BR LP.INT ; SUBROUTINE FOR INTERRUPT SIMULATION: LP.STS: MOV (SP),R4  ; SIMULATE INTERRUPT MOV 2(SP),R3 MOV @#S.STAT,2(SP) ; FROM JSR PC,XXXX MOV R3,(SP) MOV R4,-(SP) MOV @#LP.STV,@#S.STAT ; RUN UNDER LP STATUS RTS R5 LP.PTB: TST LP.TAB  ; AT NEW TAB ALREADY? BEQ LP.EVN LP.MTB: MOVB #40,@#LP.BUF ; SPACE FOR TABS TST LP.LIN  ; LINE OVERFLOW BEQ LP.DNP  ; YES, IGNORSO GET DECTAPE EQUIV. MOVB @SP,DT.FRQ ;SAVE FUNC FOR LATER MOVB @PC,@SP  ;RESET FUNC TO SRCH (INT ENB) ASL R3  ;(NOW CONTAINS 200)***** BIT @SP,#4000 ;TRAVEL FORWARD? BNE .+4 INC R3  ;IF SO R3 NOW 201 & SO ... MOVB R3,DT.SSW ;MAKING BPL OR BMI AS REQD MOV (SP)+,-(R1) ;SET DECTAPE CONTROL RTS PC  ;RETURN TO CALLER FOR NOW ;***** CARE USED AS LITERAL BY PREVIOUS INSTRUCTION!!! ;INTERRUPT SERVICE (A) - SEARCH IN PRORESS: DT.SIP: TSTE INPUT ; AS FOLLOWS:- ; ; A) "ONLY26=0" - READ ONLY '026' CODES. ; B) "ONLY29=0" - READ ONLY '029' CODES ; C) "DEFALT=0" - READ BOTH TYPES OF CODE ; WITH '026' AS DEFAULT ; D) NIL - READ BOTH TYPES OF CODE ; WITH '029' AS DEFAULT ; ; IN CASES (C) & (D), DRIVER WILL USE DEFAULT ; UNLESS DIRECTED OTHERWISE BY ENTRY OF A ; CONTROL CARD PUNCHED IN C.C. 1:- ; ; 12-0-7-9 = '029' CODES FOLLOW ; 12-11-8-9 = '026' CODES FOLLOW ; ; 2) IF PARAMETER  @PC,TT.EDI ;FOR INPUT, CLEAR EOF MARK TSTB -3(R0)  ;COME FROM QUEUE? BEQ KT.IXT JSR R4,KT.ISM ;IF SO SIMUL8 INT. BR .+4  ;...TO ALLOW RTN AS REQD. KT.IXT: TST (SP)+  ;IF NOT IGNORE INTERIM RTN MOV 14(R0),PC ;...& SHOW ACTION DONE ; 2) NORMAL TRANSFER: ; THIS ROUTINE MERELY SETS UP TRANSFER CONTROLS ;  AS PASSED BY MONITOR IN ASSOCIATED ;  DDB AND THEN USES INTERRUPT ROUTINES ;  TO INITIATE TRANSFER REQUIRED, ;  PROVIDED ALWAYS THAT THE CORRESPONDING KB ;E REST DEC LP.LIN  ; INCLUDE IN LINE COUNT DEC LP.TAB  ; DONE ? BNE LP.LOP LP.EVN: MOV #8.,LP.TAB ; RESET LP.DNP: INC R2 BR LP.TRT LP.CSR=177514 LP.BUF=177516 LP.BP=322 LP.SAV=44 S.STAT=177776 LP.STV=202 LP.CLS=LP.OPN .END  @#DT.CCM ;CHECK STATUS BMI DT.SER  ;IF ERROR GO INVESTIGATE CMP @#DT.CDT,DT.BRQ ;CHECK BLOCK FOUND BEQ DT.BFD  ;IF ONE REQD, GO ACTION BMI DT.SXT  ;GET TO BLOCK THIS WAY? DT.SSW=.-1   ;(BPL IF TRAVEL BACKWARD) DT.TA1: BICB #40,@#177776 ;DROP PRIORITY ASRB #0  ;HOW MANY TURNS? DT.TAC=.-2 BCS DT.BER  ;IF 6 CAN'T FIND BLOCK MOV #4000,-(SP) ;OTHERWISE MUST TURN AROUND MOV #2,-(SP) ;ASSUME TRAVEL NOW FWD RORB DT.SSW  ;CHECK DIRECTION BCS DT.TA2"BLANKS" IS DEFINED, C.C. 73-80 ; & TRAILING SPACES BEFORE THESE WILL BE DISCARDED, ; WITH 'CR-LF' FOLLOWING LAST VALID DATA, PROVIDED ; THAT CARD FILE IS PRECEDED BY CTL CARD WITH ; 12-11-0-7-8-9 PUNCHED IN C.C. 1. IN THIS CASE ; HOWEVER, IF THE USER BUFFER IS WORD 1, BITS 15-4 ; C.C.2 > WORD 1, BITS 3-0; WORD 2, BITS 15-8 ; C.C.3 > WORD 2, BITS 7-0; WORD 3, BITS 15-12 ; C.C.4 > WORD 3, BITS 11-0 ; ; THE PACKED FORM WILL BE TRANSFERRED TO THE USER ; BUFFER UNTIL THIS IS FILLED, ANY DATA THEN REMOTHERWISE SIMILAR FOR INPUT TT.ISW: .WORD 0 TT.ICT: .WORD 0 TT.IBP: .WORD 0 KB.ISW: .WORD 0 .WORD TT.ISE-TT.OIX ;TERMINAL ROUTINES FOR SIMILAR SET-UP: ; 1) OPEN & CLOSE: ; THIS ROUTINE CAUSES CARRIAGE RESTORE IF OUTPUT ;  IS TO FOLLOW; FOR INPUT, IT WILL ;  MERELY CLEAR ANY CURRENT END OF DATA ;  INDICATION. KB.OPN: KB.CLS: JSR R4,KB.DCK ;NOW CHECK DIRECTION BR KB.OPI MOV R5,R3  ;FOR OUTPUT, SET BYTE COUNT (-2) MOV R5,#0  ;SET LIR2  ;CHECK INPUT/OUTPUT BEQ TRANO  ;BRANCH IF OUTPUT MOVB #READ,(R1) ;SET LAST CMMDSREAD SUB #2,R2  ;SET UP READ CMMD BR TRAN2 TRANO: BIT #EOT,@#MTS ;CHECK IF AT EOT BEQ TRAN1  ;BRANCH IF NOT MOV 10(R0),16(R0) ;RETURN WORD COUNT TRAN7: BR SIMCOM  ;REJECT CMMD - EXIT TRAN1: MOVB #WRITE,(R1) ;SET LAST CMMD S WRITE ADD #4,R2  ;SET UP WRITE CMMD TRAN2: JSR PC,GO  ;GO INITIATE I/O MOV @#MTBRC,R2 CMPB (R1),#READ ;COME HERE AFTER INT ERR CHK BUPT SW FOR TFR MOVB #0,@#DT.CCM ;MOVE IN CORRECT FUNC DT.FRQ=.-4 BR DT.SXT  ;... & GO SET UNDERWAY ;INTERRUPT SERVICE (B) - TRANSFER COMPLETE (?): DT.INT: BR .+2  ;INTERRUPT SWITCH .... BR DT.SIP  ;FOR SRCH COMES HERE! BICB #40,@#177776 ;DROP PRIORITY MOV @#V.RSAV,-(SP) ;ON TRANSFER COMPLETE ... JSR R5,@(SP)+ ;SAVE USER REGISTERS MOV DT,R0  ;GET DDB ADDR MOV #DT.CCM,R1 ;GET STATUS ADDR MOV #10,R3  ;SET MAGIC CONSTANT TST @R1  ;ERROR CAUSE INT'RAINING ; IN THE INTERNAL BUFFER BEING RETAINED UNTIL THE ; NEXT READ REQUEST. ; ; TREATMENT OF ASCII READING WILL STILL FOLLOW PATTERN ; DESCRIBED IN THE PREVIOUS PARAGRAPH WITHOUT EXCEPTION. ; ; THE ONLY CONTROL CARD WHICH WILL HAVE ANY EFFECT ; IN BINARY READING WILL BE THAT INDICATING E.O.F. (IN ; THIS CASE 12-11-0-1 PUNCHING MUST APPEAR IN AT LEAST ; C.C. 1 THRU 8). ; ; N.B. WHEN ASSEMBLED FOR USAGE IN BOTH MODES, AN 'OPEN' ; CALL WILL NOT CAUSE READING OF A CARD TO ALLOW THIS NE-COUNT KB.LCT=.-2 MOV (PC)+,@R2 ;....& CTLS IN BUFFER .BYTE 15,14 BR KB.TFO  ;JOIN KB.TFO FOR REST KB.OPI: BISB #200,KB.PSP ;FOR INPUT CLEAR EOF MARK ... BICB #10,KB.PSP ;... & ALLOW PROG ECHO JSR PC,KB.IGI ;CLEAR INTERNAL BUFFER BR TT.OPI+4 ;OTHERWISE NO ACTION ; 3) TRANSFER OPERATIONS: ; A) PRINTER IN ITS OWN WRITE: ; THIS ROUTINE OPERATES IN THE SAME MANNER AS ;  THOSE FOR TT IN THAT IT MERELY ;  COLLECTS THE TRANSFER CONTROLS NE TRAN6  ;BRANCH IF NOT READ BIT #EOF,@#MTS ;IF EOF, SET INIT CNT IN RESIDUE BEQ TRAN6 MOV BRC,R2 TRAN6: ASR R2 ;CHECK IF ODD BYTES SHORT REC BCC TRAN3  ;BRANCH IF NOT MOV @#MTCMA,R5 ;PUT NULL IN NEXT BUFF POS CLRB (R5) INC R2  ;ROUND UP WORD COUNT TRAN3: BEQ .+6  ;BRANCH IF NO RESIDUE BIS #100000,R2 ;INSURE NEG WORD COUNT BIT #RLE,@#MTS ;CHECK IF LENGTH ERROR BEQ TRAN4  ;BRANCH IF NOT INCB ERRSW TRAN4: MOV R2,16(R0) ;RETURN RESIDUE WOUPT? BMI DT.TER  ;IF SO GO & SEE WHY MOVB R3,@R1  ;OTHERWISE STOP TAPE ... DT.TXT: MOV 14(R0),PC ;... & TAKE COMPLETE RETN ;SEARCH ERROR - DETERMINE CAUSE: DT.SER: TST @#DT.TST ;IN END ZONE? BMI DT.TA1  ;O.K. MEANS TURN AROUND BICB #40,@#177776 ;DROP PRIORITY MOV @#V.RSAV,-(SP) ;SAVE ALL USER REGS. JSR R5,@(SP)+ MOV #DT.TST,R1 ;GET DECTAPE STATUS DT.EXT: MOV @R1,-(SP) ;SET UP TO TELL USER MOV #DT.IRE,-(SP) BIT #14000,(R1)+ ; TO BE TRANSLATED AS REQUIRED BY THE READ MODE ; SPECIFIED BY THE USER. ; ; C) DRIVER CAN ALSO BE USED FOR 80-COLUMN MARK ; SENSE READER. FOR 40 -COLUMN READER, ECONOMIES ; IN BUFFER SIZE CAN BE OBTAINED BY DEFINITION ; AT ASSEMLBY OF PARAMETER "MARKS". THIS WILL ; ALSO PREVENT AUTOMATIC REMOVAL OF COLS 33-40 ; IN 'BLANKS-SUPPRESS' MODE OF USAGE. ; XXXXXXXXXXXXXXXXXXXXXXXXX ; X X ; X NOTE X ; X ;  PASSED ON BY THE MONITOR AND THEN ;  USES THE INTERRUPT SERVICING ROUTINE ;  TO INITIATE THE TRANSFER./ (ASSUMING ;  PUNCH IS NOT ALREADT UNDERWAY) KB.TFR: JSR R4,KB.DCK ;CHECK DIRECTION BR KB.TFI KB.TFO: JSR R4,KT.ISM ;SIMULATE INTERRUPT MOV #1,KB.OSW ;SET IN USE FLAG (AS PRINTER) MOV R2,#0  ;SET BUFFER POINTER ... KB.OBP=.-2 MOV R3,#0  ;... & BYTE COUNT KB.OCT=.-2 KB.ITO: TST TT.OSW  ;PUNCH ALREADY IN USE? BNE KT.CXT  ;IF SO LET IT FINISH KT.OST: RD COUNT TRANX: TSTB ERRSW  ;BRANCH IF NO ERRORS BEQ TRAN5  BIS #100000,12(R0) ;SET ERR BIT TRAN5: BR TRAN7  ;TAKE DONE EXIT ; SPEC: JSR PC,INIT  ;INIT CHECK DEVICE MOV 2(R0),R3 ;GET FUNC BLOCK ADDR MOVB (R3),R5 ;GET FUNC BYTE SUB #SPFST,R5 BMI TRAN5  ;BRANCH OUT IF NOT CMP #SPLST,R5 ;SUPPORTED FUNCTION BLO TRAN5 CMPB #3,1(R3) ;CHECK IF VALID FUNC BLOCK BHI ABORT  ;ABORT IF NOT ASL R5 ADD PC,R5 ADD #SPECT-.,R5 JMP @R5  ;GO;.... ASSUMING H-W FAILURE BEQ DT.STP  ;.... IF SEL OR ILO MOV #DT.NRE,@SP ;DIAGNOSE TAPE FAULT DIFF. MOV DT.NAM,2(SP) ;... AS NOT READY DT.STP: MOVB #10,@R1  ;STOP TAPE IN CASE IOT   ;GO TO DIAG PRINT DT.RXT: JSR PC,DT.PR1 ;ON RECOVERY, SET UP RETRY MOV @#V.RRES,R5 ;RESTORE USER REGS JSR R5,@R5 RTI   ;... & HOPE FOR BETTER THINGS! ;BLOCK NOT FOUND IN SEARCH: DT.BER: MOV DT.BCK,-(SP) ;GIVE BLOCK NO. AS EVIDENCE MOV #DT.BRE,-(SP) MOV #DT.CCM,R1 ; X ; XXXXXXXXXXXXXXXXXXXXXXXXX ; ; PARAMETER DEFINITIONS CAN BE MADE DURING PASS 1 ; OF THE ASSEMBLY ONLY IF REQD AS DESCRIBED IN ; PAL-11R MANUAL, SECTION 9-2, E.G. ; ; #CR,LP:,/PA:2 ; ; XXXXXXXXXXXXXXXXXXXXXXXX ; .TITLE CR .GLOBL CR ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;INTERFACE TABLE: CR: .WORD 0 ;CURRENT DDB OR 0 IF IDLE .IFNDF BINARBITB @PC,@#TPS ;PRINTER DOING CMD? BNE .-4  ;IF SO LET IT FINISH BISB #200,@R5 ;RAISE PRL FOR SAFETY MOVB #100,@#TPS ;ENABLE INTERRUPT BR KT.CXT  ;... & WAIT TO COME BACK ; B) KEYBOARD SPECIAL OPERATIONS: ; THIS ROUTINE ATTEMPTS TO SATISFY EACH MONITOR ;  REQUEST FOR DATA FROM ITS OWN INTERNAL ;  CIRCULAR BUFFER. AT THE FIRST REQUEST ;  IT WILL SCAN THE BUFFER FOR THE FIRST ;  LINE TERMINATOR - IF FOUND IT WILL ;  THEN WAIT UNTIL WHOLE L TO PROPER SP FUNC ROUTINE ; ; SPFST=1 SPLST=6 ; SPECT: BR OFFLIN BR WEOF BR RWND BR SKP BR BSP BR PARDEN BR TUSTAT ; ; ABORT: MOV R3,-(SP) ;ISSUE SP FUNC BLOCK BAD ABORT MOV #1433,-(SP) ;WITH ADDR OF SP FUNC BLOCK IOT ; OFFLIN: JSR PC,EOFCK ;WRITE EOF IF NECESSARY CLRB (R1)  ;SET LAST CMMD=OFFLINE MOVB #1,@#MTC ;ISSUE DISABLED RWV BR TUSTAT  ;GET STAT AND EXIT RWND: JSR PC,EOFCK ;ISSUE WRITE EOF IF NECESSARY JSR PC,RWNDC ;ISSUE GET CONTROL ADDRESS BR DT.STP ;TRANSFER ERROR: DT.TER: BIT #34000,-(R1) ;TAPE FAILURE/OPERATOR FAULT? BNE DT.EXT  ;IF SO PRINT & WAIT RECOVERY BIT #100400,(R1)+ ;END ZONE/N.E.M? BNE DT.FER  ;IF SO TREAT AS FATAL ;RECOVERABLE ERRORS (TIMING OR PARITY): ASL #0  ;RETRIED 8-9 TIMES ALRDY? DT.RTC=.-2 BCC DT.RXT  ;IF NOT TRY AGAIN .... BIS #100000,12(R0) ;OTHERWISE SIGNAL ERROR MOVB R3,(R1)+ ;STOP TAPE IN CASE MOV 1(R1),R2 ;...BUT CY .BYTE 224,0 ;FACILITIES: ASCII INPUT,OPEN INC. .ENDC .IFDF BINARY .BYTE 234,0 ;ALLOW BINARY IF REQD. .ENDC .IFNDF MARKS .BYTE 3 ;STD BUFFER SIZE = 96 BYTES .ENDC .IFDF MARKS .BYTE 2 ;(64 IF 40-COL MARK SENSE) .ENDC .BYTE CR.INT-CR,300 ;INT'RUPT SVCE AT PRL 6 .BYTE CR.OPN-CR ;OFFSET TO OPEN .BYTE CR.TFR-CR ;OFFSET TO TRANSFER .BYTE 0,0,0 ;(NO CLOSE OR SPEC. FUNC.) CR.NAM: .RAD50 'CR' INE HAS BEEN ;  ECHOED (UNLESS THIS BE SUPPRESSED); IF ;  NOT IT WILL WAIT UNTIL A TERMINATOR IS INPUT, ;  ECHOING AS REQUIRED DURING SUCH WAIT. ;  WHEN A LINE HAS BEEN COMPLETED, IT WILL ;  TRANSMIT AS MANY CHARACTERS AS HAVE BEEN ;  DEMANDED BY THE MONITOR, PADDING IF THE ;  LINE IS TOO SHORT. SUBSEQUENT REQUESTS ;  FROM THE MONITOR WILL BE SATISFIED ;  FROM THE SAME LINE IF ANY REMAINS, WITH ;  SIMILAR PADDING CONSIDERATIONS. (FOR ;  .TRAN REQUESTS, AS SHOWN BY MONITOR DISABLED RWD BR TUSTAT  ;GET STATUS AND EXIT RWNDC: MOVB #RWD,(R1) ;SET LAST CMMD=RWD BIT #BOT+RWS,@#MTS ;IS IT REWOUND BNE RWNDX ;YES, BRANCH MOV #16,R2  ;ISSUE RWD JMP GO RWNDX: RTS PC ; EOFCK: CMPB (R1),#WRITE ;IF LAST CMMD WAS WRITE BEQ EOFCK1  ;BRANCH RTS PC  ;ELSE RETURN EOFCK1: MOV #6,R2  ;SET CMMD=WRITE EOF MOV (SP)+,INTRET ;SET INT RET ADDR JMP GO1  ;GO EXECUTE ; WEOF: MOVB #EOFM,(R1) ;SET LAST CMMD JSR PC,EOFCK1 ;GO EXECHK ALL WORDS DONE! BEQ DT.TXT  ;IF SO THAT'S IT! ADD R3,R0  ;GO TO WORD COUNT IN DDB SUB (R0)+,R2 ;... & USE TO DETERMINE ... SWAB R2  ;... NO. OF BLOCKS DONE BITB R3,(R1)+ ;CHECK PRESENT TRAVEL BEQ .+4  ;ADJUST NO. ACCORDINGLY NEG R2 ADD R2,DT.BRQ ;MODIFY SEARCH START BLOCK CLR DT.RTC  ;... & RETRY COUNT JSR PC,DT.PR2 ;GO SET UP NEW START BR DT.RXT+4 ;... & WAIT RESULTS! ;FATAL ERRORS - END ZONE OR NON-EXISTENT MEMORY: DT.FER: MOV @R0,-(SP) ;OPEN PROCESSOR: CR.ONR: JSR PC,CR.NRY CR.OPN: BIT #400,@#CR.CSR ;CARDS IN HOPPER? BNE CR.ONR ;IF NOT TELL USER TO READY .IFNDF ONLY26&ONLY29 .IFNDF DEFALT ;FOR DUAL-PUNCH DRIVER ... CLR (PC)+ ;... SET CONV. TABLE OFFSET .ENDC ;... FOR DEFAULT PUNCH .IFDF DEFALT ;... AS APPROPRIATE MOV #104,(PC)+ .ENDC CR.TOS: .WORD 0 .ENDC .IFDF BLANKS ;IF BLANK-SUPPRESS VERSION ... CLRB CR.ZSW ;... FORCE SUPPRESS OFF .ENDC  ;  ASKING FOR NON-STD BUFFER CAPACITY, ;  DATA WILL BE PASSED AS LINES BUT WITH ;  NO PADDING UNTIL WHOLE OF BUFFER ;  HAS BEEN FILLED. ; THE DATA WILL NOT FREE ITS AREA IN THE CIRCULAR ;  BUFFER UNTIL TRANSFERRED TO THE MONITOR ;  IN ORDER THAT THE SAME BUFFER CAN BE USED ;  FOR BOTH INPUT & ECHO OUTPUT. IF THE ;  CAPACITY OF THIS BUFFER IS EXCEEDED, THE ;  KEYBOARD INTERRUPT WILL BE DISABLED - ;  THOUGH NOT FOR INTERMEDIATE PAPER-TAPE ;  READ OPERATIONS - UNTIL ROOM ISUTE WRITE EOF BR TUSTAT ;AT INT RET, GET STAT AND EXIT ; ; PARDEN: BIT #CH79,@#MTS ;IF 9 TRACK TAPE BEQ TUSTAT  ;BRANCH (IGNORE NEW SETTINGS) MOV 4(R3),R5 ;GET NEW DEN/PAR BIC #176376,R5 ;CLR EXTRA BITS ASRB R5  ;SET INTO PROPER POSITION RORB R5 RORB R5 ROR R5 ROR R5 ROR R5 MOVB R5,10(R1) ;SET NEW DEN/PAR BR TUSTAT ; SKP: MOVB #SKPR,(R1) ;SET LAST CMMD=SKP MOV #8.,R2  ;SET CMMD BR SKPBSP  ;GO SET COUNT AND EXEC BSP: MOVB #BS;GIVE CALL AS EVIDENCE MOV #DT.FRE,-(SP) ;PRINT DIAGNOSIS BR DT.STP ;MISCELLANEOUSDEFINITIONS: V.RSAV=44 V.RRES=46 DT.DIR=100 DT.TST=177340 DT.CCM=177342 DT.CBA=177346 DT.CDT=177350 DT.NRE=402 DT.IRE=404 DT.FRE=1415 DT.BRE=1416 .END  .IFNDF BINARY TST (SP)+ ;IGNORE INTERIM RETURN BR CR.DXT ;... & TAKE COMPLETION .ENDC .IFDF BINARY ;FOR BINARY VERSION ... CLRB CR.TFR ;... FORCE NO OPEN READ BR CR.ODN CR.OXT: INCB CR.TFR ;... BY MAKING COME HERE BR CR.ODN ;... BEFORE EXIT .ENDC ;SUBSIDIARY ROUTINES: ; A) RESTART AFTER ERROR: CR.AGN: .IFDF BINARY ;IN BINARY VERSION ... TSTB CR.ISW ;... CHECK IF BINARY READ BEQ CR.TFR ;IF NOT CAN JUST START OVER BR CR.ERD  AGAIN ;  AVAILABLE. ; PROVIDED THAT THERE IS ALREADY SUFFICIENT DATA ;  IN THE BUFFER TO OPERATE IN THE MANNER ;  DESCRIBED THE MONITOR REQUEST WILL NOT BE ;  HELD UP DURING PAPER-TAPE READER INPUT ;  & WILL ONLY WAIT UPON ECHO IF THIS IS ;  REQUIRED AND THE PUNCH IS ALREADY IN USE ;SET-UP TRANSFER: KB.TFI: JSR R4,KT.ISM ;SIMULATE INTERRUPT MOV R3,#0  ;SAVE BYTE COUNT KB.ICT=.-2 MOV -(R1),R4 ;SET ECHO SUPPRESS IF REQD. BICB #367,R4 BICBPR,(R1) ;SET LAST CMMD=BSP MOV #10.,R2  ;SET CMMD BIT #BOT+RWS,@#MTS ;TEST IF AT BOT BEQ SKPBSP  ;BRANCH IF NOT MOV 4(R3),6(R3) ;REJECT CMMD RETURN REC COUNT BR TUSTAT  ;SET STATUS AND EXIT SKPBSP: MOV 4(R3),BRC ;SET RECORD COUNT NEG BRC JSR PC,GO  ;GO EXECUTE CMMD MOV @#MTBRC,6(R3) ;SET RESIDUE REC COUNT NEG 6(R3) ; TUSTAT: MOVB 10(R1),R2 ;GET DEN/PAR MOVB (R1),R1 ;GET LAST CMMD SWAB R2 BIS R2,R1  ;SET DEN AND PAR MOV @#MTS,R2 BE  EDSTAUXH ENTOU CIF; C BRMT@# STT E ON DISP BSR OIPSK; 7 NTIE BN  OT BORF EOF ;I R2T,BOF+EO#T BI 4:NT I; TECUXE EGO; 2 GO MPJ 1 F ONTOU;C RCTB#M,@-1#V MO  SP BUPT SE; 2 ,R0.#1 VBMO  MDCME AV;S MDCM,T5)(R VBMO 6:NT IP GAG ON LTHWIE ITWRY TR;) R5,(10#S BI  T6IN NEB E ITWRS IMDCMF ;I 5)(R2,#1 ITB T UNCOY TRRET SE;Y TRRET,CNRYTV MO  T4IN EQB ) R1,(PRBS#B MPC 4 NTIQ BE  SP BORP KI SIFH NCRA;B 1)(RR,KP#S PBCM  OT NIFH NCRA;B  T7IN EQB R RO ;ELSE LEAVE USER BUFFER ALONE ; B) INITIALISE INTERNAL BUFFER POINTERS: CR.ISP: MOV PC,-(SP) ;GET BUFFER START ADD #CR.BUF-.,@SP MOV @SP,(PC)+ CR.IBS: .WORD 0 ADD #CR.BSZ,@SP ;NOW GET END MOV @SP,(PC)+ ;STORE AS CONTROL CR.IBE: .WORD 0 MOV (SP)+,(PC)+ ;... & AS INIT. PTR CR.IBP: .WORD 0 INCB @PC ;MUSTN'T COME HERE AGAIN! .ENDC ;TRANSFER SET-UP PROCESSOR: CR.TFR: .IFDF BINARY ;FOR BIN #10,KB.PSP BISB R4,KB.PSP BPL KB.IP4  ;IF EOD SEEN EXIT NOW CLR KB.CSW  ;INIT CTL CHAR SWITCH. BISB #200,@R5 ;RAISE PRL FOR SAFETY KB.TRA: MOV R2,#0  ;SET BUFFER POINTER (MON.) KB.IBP=.-2 KB.OTI: JSR PC,KB.IGP ;NOW GET INTERNAL PTRS CMP R2,KB.ILE ;LINE UNDER PROCESS ALREADY? BNE KB.IP1  ;IF SO NO COLLECTION ;SCAN FOR LINE TERMINATOR: CLR -(SP)  ;OTHERWISE SET COUNTER MOV R3,KB.OBP ;STORE CURRENT PRINT POINT KB.IC1: MOV R3,KB.ISW ;... & SET WAIT IBIT #CRE+PAE+RLE,R2 ;TEST STATUS FOR ERROR BEQ STAT1  ;BRANCH IF NONE BIS #100000,R1 ;SET ERR BIT STAT1: BIT #EOT,R2  ;TEST IF EOT BEQ STAT2  ;BRANCH IF NOT BIS #1000,R1 ;SET EOT BIT STAT2: BIT #BOT+RWS,R2 ;TEST IF AT BOT BEQ STAT3  ;BRANCH IF NOT BIS #400,R1  ;SET BOT BIT STAT3: BIT #EOF,R2  ;TEST IF EOF BEQ STAT4  ;BRANCH IF NOT BIS #200,R1  ;SET EOF BIT STAT4: BIC #177753,R2 ;CLEAR ALL BUT WRL AND 79CH BITS SWAB R2 BIS R2,R1  ERF ICKHE;CR2E,CRR+PAE+BTL+BG#T BI 3:NT I; NETIOU RICIFECSPO TGO; 7 NTIR B T IO  P)(S,-06#4 OVM ) SP-(2,RV MO  T7IN EQB G IA DONTIACE SUIS, OFWER OTERI WIF;) R5,(#4 ITB G LA FORRR EET;S  SWRREB NCI L TAFAS ;I  TFIN NEB E AT LNTRA GUS=BRR EIF; 2 ,RGL#B ITB N AIAGY TRO TIFH NCRA;B  T6IN NEB Y TRRE NCI T NOF ICHANBR; 7 NTIQ BE  METIS HI TORRR EIFT ES;TR2E,PAE+CRE+BTL+BG#T BI 2:NT I; INGA ARY TGO; A GO MPJ P BST NOT-SE; D MMTC GBNE  MDCMT  D EN. Z IBB.+K=. .. .-8411B+=KBZ.IKB F:IBB. K: ERFFBUL NAERNT I) 3; ENEV. 0 ,3,7124,,1113,,100,2771E YT.B S:OCB. K: NGRISTK ECCHT PUUT O) 2; 125,,1335,177,175,,2002E YT.B S:ICB. K: NGRISTK ECCHT PUIN 1) ;: ASRE AGERATO STADA ;T XI E &..;.  R3 TSR P @SZ,N CASE CMP R3,R1  ;ANYTHING IN BUFFER? BEQ KB.IC3  ;IF NOT PERHAPS ECHO SO FAR KB.IC2: MOVB (R3)+,R0 ;GET NEXT CHARACTER JSR R3,KB.PCK ;ADJUST POINTER IF NEC. DEC @SP  ;... & COUNT CMPB R0,#14  ;IS IT TERMINATOR? BGT KB.IC1  ;IF NOT GET NEXT CMPB R0,#12 BLT KB.IC1 ;TERMINATOR FOUND - ECHO LINE TO END: MOV R3,KB.ILE ;SET LINE END ... CLR KB.ISW  ;... & CLEAR WAIT KB.IC3: MOVB @PC,@#TKS ;ENABLE INTS IN CASE MOV R3,KBARY VERSION ... BR .+4 ;... SWITCH TABLE FORCES ... BR CR.OXT ;... CORRECT INIT. BR CR.ISP .ENDC MOV CR,R0 ;GET DDB ADDRESS ADD #6,R0 ;... & MOVE TO BUFFER STORE MOV (R0)+,-(SP) ;GET BUFFER POINTER MOV @SP,-(SP) ;... & BUILD BUFF END SUB @R0,@SP SUB (R0)+,@SP MOV (SP)+,(PC)+ ;SAVE RESULT ... CR.UBE: .WORD 0 .IFDF BINARY ;IN BINARY VERSION ... MOVB @R0,R0 ;... CHECK MODE BICB #376,R0 MOVB R0,CR.ISW ;IF ASCII CLEAR SWITCH ;SET WRL AND 7,9 TRACK MOV R1,2(R3) ;RETURN STATUS BR COMJ  ;EXIT ; ; ; CLOSE: JSR PC,INIT  ;INIT CHECK ON DEVICE CLRB -10(R1)  ;CLEAR OPEN FLAG JSR PC,EOFCK ;IF LAST CMMD WAS WRITE, WRITE 3 EOFS JSR PC,EOFCK JSR PC,EOFCK JSR PC,RWNDC ;ISSUE DISABLED RWD COMJ: JMP SIMCOM ; ; ; ; INTH: MOV @#44,-(SP) ;SAVE REGS JSR R5,@(SP)+ MOV MT,R0  ;GET DDB ADDR MOV LASTAT,R1 ;GET LCMMD VECTOR ADDR MOV 2(R0),R3 ;GET SP FNC BLOCK ADDR MOV #MTIBB.#K DDA 6 .+ EQB S IBB.,KSP@P CM  D.EQ RASR TEINPOT SERE;P @SZ,IBB.#K UBS: CK.PKB HK COR FTR PIS3 RREHE WCK.PKB3, RSR JBYD LEALC; D:ENR FEUF BATR TEINPOF ICKHE C) 5; T XI EALRMNOE AK T &..;.  R5 TSR 3 ,R)+R5(V MO  R2+,5)(R OVM S TR PLEABRIVAT SE;1 ,R)+R5(V MO P:ISB. KC PTS RSSMIT US MUT B..;.  10.- NEB E ORSTT EX NTOO ;G  -4.C BC  R2 SRA D EQ RASE LUVAS ABE ORST;) R5-(1,RV MO  EAARE AGORSTO TERNTOI PET;S  5)(R-T TS  NTOU .ECP ;SAVE CURRENT ECHO PTR MOV @PC,KB.OSW ;IF SO SET OUTPUT FLAG TO SHOW MOV (SP)+,KB.OCT ;... & SET COUNT BEQ KT.CXT BITB @PC,@#TPS ;IF ANY TO DO GO PRINT BEQ KB.ITO  ;... UNLESS IT'S BUSY ;COMMON EXIT SEQUENCE: KT.CXT: MOV @#V.RRES,-(SP) ;RESTORE USER REGS JSR R5,@(SP)+ RTI V.RRES=46 ;LINE NOW ECHOED IF NECESSARY - START TFR TO MONITOR: KB.IP1: MOV R2,R3  ;SET START OF LINE MOV KB.IBP,R2 ;... & OF MONITOR BUFFER KB.IP2: CMP BEQ CR.RDC ;IF BINARY WANTED ... MOV (SP)+,R0 ;... SET PTRS & SWITCH MOV CR.IBP,R1 CLR R2 ;SET INTERRUPT FLAG CR.BIN: CMP R1,CR.IBE ;INTERNAL BUFF EMPTY? BNE CR.BLP CR.ERD: MOV CR.IBS,CR.IBP ;IF SO RESET INTERNAL PTR MOV R0,-(SP) ;SAVE USER BUFF PTR ... CR.RDC: .ENDC MOV @SP,(PC)+ CR.UBP: .WORD 0 CLR @(SP)+ ;ZERO UNDERWAY FLAG MOV #101,@#CR.CSR ;ENABLE INT & GO FOR CD READ RTS PC ;RETURN USER FOR NOW C,R5  ;ADDR OF CMMD REG BIC #100,(R5) ;DISABLE DEVICE INTERRUPT MOV @#MTS,R2 ;GET STATUS OF DEVICE INCB INTENB  ;SET INT FLAG BIT #ILC+NXM,R2 ;CHECK ILLEGAL CMMD, NONEXIST CORE BEQ INT1  ;BRANCH IF NOT INTF: MOV R2,-(SP) ;DISPLAY STATUS AND DIAGNOSE MOV #1432,-(SP) ;FATAL ERROR-MAG TAPE IOT   ;ABORT ; INT1: TSTB TCMMD  ;CHECK IF THIS WAS A RETRY BEQ INT3  ;BRANCH IF NOT BPL INT2  ;BRANCH IF WAS NOT BSP OF RETRY CLR R2 BISB TCMMD,R2 ;GE CONTITAROT SE; 2 ,R22#V MO  R1.,F-IBB.#K DDA R FEUF BOFR DD ABS AET;G  R1C,PV MO  ERFTEAER HREHEY TRENP TO;S  GP.IKB RBCL  E:INUTROG INISALTINI;I  PC,@R5 SRJ: GI.IKB ;0 RDWO.: BS.IKB RTTA SATT SEO LS ALSRONTCO; 0 RDWO.: LE.IKB ITEXL MAOR;N  PC TSR 0 RDWO.: CP.EKB LYALTINI IREHED RETO S..;.  0D OR.W Y:IPB. K. ..S LEABRIVAE ESTHG INUS; 0 RDWO.: PX.IKB S.AYLW AQDRES AGSRES ET;S SP.IKB5,RR JS  RYNT EST 1AT2 .+R BTOD GEANCH; I IGB.KR B: GP.IKB T.R3,KB.ILE ;MORE IN THE LINE? BNE KB.IP3 CMPB @(R0),#10 ;IF NOT IS IT .TRAN? BEQ KB.TRA  ;IF SO GO FOR MORE CLRB -(R3)  ;OTHERWISE NULL PAD KB.IP3: MOVB (R3)+,@R2 ;GET CHAR. JSR R3,KB.PCK ;ADJUST PTR IF NEC. MOV R3,KB.IPY ;SAVE NEW LINE START CMPB @R2,#177 ;LOOK FOR RUBOUT BEQ KB.IP3  ;IGNORE IF FOUND INC R2 INC KB.ICT  ;MONITOR BUFFER FULL? BNE KB.IP2 KB.IP4: MOV KB.ICT,16(R0) ;RETURN WORDS NOT AVAILABLE ASR 16(R0) KB.OXT: CLR KB.OSW .IFDF BINARY ;WITH BINARY DATA ... CR.BLP: SWAB @R1 ;... COMPLETE CONVERSION MOV (R1)+,(R0)+ ;... & GIVE TO USER CMP R0,CR.UBE ;USER BUFFER FULL? BNE CR.BIN ;IF NOT GET NEXT WORD MOV R1,CR.IBP ;OTHERWISE SAVE INT PTR TST R2 ;COME HERE ON INTERRUPT? BNE CR.ODN ;IF SO MODE SW. SET MOV @SP,-(SP) ;ELSE MUST SIMULATE ... MOV -(R2),2(SP) ;... STORE PC & PS SUB #16,SP ;... & DUMMY SAVE REGS. CR.ODN: TST (SP)+ ;IGNORET CMMD NEGB TCMMD  ;SET-NOT BSP JMP GOA  ;GO TRY AGAIN ; INT2: BIT #BGL+BTE+CRE+PAE,R2;TEST IF ERROR THIS TIME BEQ INT7  ;BRANCH IF NOT INC RETRY BNE INT6  ;BRANCH IF TO TRY AGAIN BIT #BGL,R2  ;IF ERR=BUS GRANT LATE BNE INTF  ;IS FATAL INCB ERRSW  ;SET ERROR FLAG BIT #4,(R5) ;IF WRITE OR WEOF, ISSUE ACTION DIAG BEQ INT7 MOV R2,-(SP) MOV #406,-(SP) IOT BR INT7  ;GO TO SPECIFIC ROUTINE ; INT3: BIT #BGL+BTE+PAR+CRE,R2;CHECK IF ERPUUT OENBES HAU ^NTUEEQBSSUR OORITON MHE TTO  ;N VEGIN HE WLYOND VEMOREE ARD AND TELEMPCON EE BVEHA  ;N CA SNELI& O CH EEDIRQUREL TIUNE ILB. KND APY.IKB  ;N EETWBER FEUF BINN AIEM REDSSCERO PNGEI BRSTEACARCH  ;) RYKEPOY-ERGGJIR FOE ACSPD ODG INAVLE (-1)=ZESI(-R21-R; ENWHL UL F &R21= RENWHY PTEMS IIT. BE.IKB&  ;S IBB. KENWEET BONHIAS FARULRCCIN IESATEROPR FEUFB. .B N; P)ECB.(KR TEINPON CA SNELI :=R3   ;) PY.IKB (ERNTOI PALOVEM RERCTRAHAC= 2:R ; X)IPB.(KR TEINPOE AGORSTR TEACARCH :=  ;FREE PRINTER IF NEC. ;COMMON EXIT FOR KB & PUNCH ON COMPLETION: ; READER DOES NOT NEED TO JOIN IN, PROVIDED ; INTERRUPT IS ENABLED ON EXIT - IF SAFE. KT.OXT: MOV 14(R0),-(SP) ;SIMULATE INTERRUPT JSR R4,KT.ISM TST KB.OSW  ;PRINT WAIT ON PUNCH? BNE KB.OIS  ;IF SO GO TO IT TST KB.ISW  ;KEYBOARD WAITING? BNE KT.CXT  ;IF SO MUST FINISH TST TT.ISW  ;READER WAITING? BLT TT.ISE-4 TST TT.OSW  ;MAYBE PRINTER HOLDING PUNCH? BGE KT RETURN PC BR CR.DXT ;... & TAKE COMPLETION EXIT .ENDC ;INTERRUPT SERVICE ROUTINES: ; A) CHECK FOR ERROR & COLLECT INPUT: CR.INT: MOV R0,-(SP) ;SAVE USER R0 MOV CR.UBP,R0 ;GET USER BUFF PTR ... MOV @#CR.CSR,-(SP) ;... & READER STATUS ASL (SP)+ ;CHECK FOR SPECIAL CASES BCS CR.ERR ;GO RETRY IF ERROR BMI CR.DUN ;CLEAN UP IF DONE MOV R1,-(SP) ;NOW SAVE USER R1 .IFDF BINARY ;IN BINARY VROR BEQ INT7  ;BRANCH IF NOT CMPB #SKPR,(R1) ;BRANCH IF SKIP OR BSP BEQ INT4 CMPB #BSPR,(R1) BEQ INT4 MOV TRYCNT,RETRY ;SET RETRY COUNT BIT #12,(R5) ;IF CMMD IS WRITE BNE INT6 BIS #10,(R5) ;TRY WRITE WITH LONG GAP INT6: MOVB (R5),TCMMD ;SAVE CMMD MOVB #10.,R2  ;SET UP BSP MOV #-1,@#MTBRC ;COUNT OF 1 JMP GO2  ;GO EXECUTE ; INT4: BIT #EOF+BOT,R2 ;IF EOF OR BOT BNE INT7  ;SKIP OR BSP IS DONE TST @#MTBRC  ;IF COUNT EXHAUSTED BER1   ;; :-WSLOOL FASS UEALV ; STTELAH IT WRSTEINPOF ONGTIET SESBLNA EERFTEAERTH  ;. SOS OE DATTHE INUTROS VEMOREY ELIVCTFEEFT I ; D,SEEAEL RISR VERI DILNT UGEANCHT NOL ILW ; SEHE TENTHS AS.OLTRON C &RSTEINPOR FO   ;S UEAL VTELUSOABS HEISBLTAES) PTRUERNT IBDK ; ORT ESQURER TFM RAOGPRR HEIT EOMFR (RYNT ESTIR FON  ;P IGB.,KPCR JSY BEDLLCA  ;: RSTEINPOR FEUF BALRNTEINT SE 4) ; 2014R=MET. T6 7777=1ATSTP. ORITON MRNTURE& . ..; C PS RT  AGFLY US BVT C.CXT .EOT ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001D ; ;ASR33 TELETYPE DRIVER PART 2: ; ;COMPLETION EXIT SEQUENCE FOR PRINTER INTERRUPT: ; MOVED HERE TO BE IN BRANCH RANGE KB.ODN: MOV KB,R0  ;GET ADDRESS OF DDB TST (SP)+  ;CLEAN UP STACK BPL KB.OXT  ;IF NORMAL PRINT EXIT BR KB.OTI  ;OTHERWISE RECALL INPUT PROC. ; ;INTERRUPT SERVICING ROUTINES: ; ; A) PUNCH CALL: ; THIS ROUTINE MOVES CHARACTERS TO THEERSION ... CR.ISW: BR .+4 ;... USE APPROPRIATE CONVERSION BR CR.ASC ; B) BINARY CONVERT & STORE: MOV CR.IBP,R1 ;GET INT BUFF PTR MOV @#CR.DB1,-(SP) ;... & INPUT MOV @SP,-(SP) ;... 2 COPIES FOR LATER COMB 1(R0) ;ODD COLUMN? BPL CR.BST ASL @SP ;IF SO SHIFT INPUT TO HIGH ASL @SP ASL @SP ASL @SP CLRB (R1)+ ;MAKE NXT INSTR = MOVB CR.BST: BISB 1(SP),-1(R1) ;SET HIGH BYTE AS REQD. MOVB (SP)+,(R1)+ ;THEN LOW BYTE MOV R1,CR.IBP ;SAVE PTQ INT7  ;IS DONE MOVB (R5),R2 ;ELSE SET UP CMMD JMP GO2  ;CONTINUE SKIP OR BSP ; INT7: CLRB TCMMD  ;CLEAR RETRY INDICATORS CLRB RETRY MOV INTRET,PC ;GO TO SPECIFIC ROUTINE ; ; .END T,AI WOR;F  1)(R10-M CO X:OIT. TN RTT INO TGO& ..;.  PC1,@R DDA T INE ATULIM SSEWIERTH;O SM.IKT4,RR JS  OW NOR FITWAO SIF; X OIT.TE BN  Y?US BDESIB ;K )+SP,()+R1(V MO  TYRIIOPRP RO;D  R5,@R4 OVM T UNCOE YT B &..;. )+R1,(R2 OVM R TEINPOR FEUF BRETO;S )+R1,(R3 OVM R VERI DE'RE'F& . ..; T TR CL  AGFLY US BET;S )+R1,(R0 OVM: IG.OTT L!TAFAS T' I &..;.   OTI . ..T PRG IA DORRR ELLCA;) SP-(R,MET.#T OVM E NCDEVI EVEGIE ISRWHEOT; P @S0,@R OVM 2 C-OIT.TQ  PUNCH ;  WITHOUT PROCESSING UNTIL BUFFER IS ;  EMPTY. ON COMPLETION CALLS KB PRINT ;  ROUTINE IF WAITING. COM TT.OSW  ;SHOW PUNCH NOW U/W TT.OIS: MOV PC,R1  ;SET POINTER TO STORES ADD #TT.OBP-.,R1 MOV @R1,R0  ;GET BUFF PTR .... BEQ TT.OGO  ;... ZERO IF OPEN/CLOSE MOVB @(R1)+,R0 ;OTHERWISE GET NEXT CHAR. INC -(R1)  ;... & BUMP POINTER TT.OGO: INC -(R1)  ;ASSUMING THERE IS ANY TO GET!! BGT TT.ODN KT.OGO: MOV #TPS,R4  ;SET HWR PTR TT.IGO: MOV #R CMP (SP)+,#7400 ;NOW LOOK FOR EOF CARD BNE CR.BXT DECB @R0 ;... PUNCHED 12-11-0-1 BPL CR.BXT ;... IN CC 1 THRU 8 ASLB @R0 BPL CR.EOF ;IF FND IGNORE REST OF CARD BR CR.CXT ;OTHERWISE TRY NEXT TIME .ENDC ; C) ASCII CONVERT & STORE: CR.ASC: MOVB @#CR.DB2,R1 ;GET COMPACTED INPUT BPL .+6 ;CONVERT CODES >200 ... ADD #340,R1 ;... TO RANGE >140 TSTB @R0 ;IF FIRST C.C. ... BPR,(R1) ;SET LAST CMMD=BSP MOV #10.,R2  ;SET CMMD BIT #BOT+RWS,@#MTS ;TEST IF AT BOT BEQ SKPBSP  ;BRANCH IF NOT MOV 4(R3),6(R3) ;REJECT CMMD RETURN REC COUNT BR TUSTAT  ;SET STATUS AND EXIT SKPBSP: MOV 4(R3),BRC ;SET RECORD COUNT NEG BRC JSR PC,GO  ;GO EXECUTE CMMD MOV @#MTBRC,6(R3) ;SET RESIDUE REC COUNT NEG 6(R3) ; TUSTAT: MOVB 10(R1),R2 ;GET DEN/PAR MOVB (R1),R1 ;GET LAST CMMD SWAB R2 BIS R2,R1  ;SET DEN AND PAR MOV @#MTS,R2 BE  CKHE C &..;.  SP,@R1@P CM  TETA SITWAN IOR FOWLL ASO; P @S OMC T ARSTRER TEAFS D/E AM SBEAY;M  +4.L BP  UEINNTCOT NOF ;I  IG.OTT EQB Y US BONTIEC SIFK ECCH; 1 @R STT N AIAGT INP TO&S. ..; 5 @RC,@P VBMO  SSREDD ADB DVESA; P @S0,RV MO C:OIT. TY ILARORMPTET INW LOAL; 5 @R4,RV MO  SHNIFIO TITS OWLLA ; SYBUS IKBF ODESIG INNDPOESRRCOF I ; R)SE U 1ANTHE OR M -ORRR EALAT FASS ATRE TOT NIF(; EEFRS IONTIEC SERIVDRD REUIEQ RATTHD DEVIROP; UPT-SEY TLECRR101,(R4)+ ;RE-ENABLE INTERRUPT MOVB R0,@R4  ;DESPATCH CHARACTER BR KT.CXT  ;... & WAIT TILL DONE TT.ODN: MOV -(R1),R0 ;GET USING DDB ADDRESS CLR @R1  ;... & CLEAR BUSY FLAG BR KT.OXT  ;GO TO COMMON COMP EXIT ; B) READER CALL: ; THIS ROUTINE MOVES INPUT CHARACTER TO MONITOR ;  BUFFER WITHOUT PROCESSING OR ECHO UNTIL ;  EITHER ITS BUFFER IS FILLED OR AN EXTERNAL ;  EOD HAS BEEN ENTERED. REQUEST FOR NEXT CHAR. ;  IS MADE WITH INT & GO ENA NE CR.CVT CMP R1,#301 ;... LOOK FOR E.O.F. BEQ CR.EOF .IFDF BLANKS ;FOR BLANK SUPPRESS ... CMPB R1,#337 ;... LOOK FOR SUPPRESS OFF BEQ CR.ZON .ENDC .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CMP R1,#227 ;... CHECK IF 029 CTL BEQ CR.029 CMP R1,#270 ;... OR 026 CTL BEQ CR.026 .ENDC CR.CVT: MOV R1,-(SP) ;CONVERT CARD CODE ... SUB #40,R1 ;FOR EACH 40 IN CODE ... BMI CR.STO ;... ADD 21 & STRIP 40 SUB #17,@SP ;... TO GE!BIT #CRE+PAE+RLE,R2 ;TEST STATUS FOR ERROR BEQ STAT1  ;BRANCH IF NONE BIS #100000,R1 ;SET ERR BIT STAT1: BIT #EOT,R2  ;TEST IF EOT BEQ STAT2  ;BRANCH IF NOT BIS #1000,R1 ;SET EOT BIT STAT2: BIT #BOT+RWS,R2 ;TEST IF AT BOT BEQ STAT3  ;BRANCH IF NOT BIS #400,R1  ;SET BOT BIT STAT3: BIT #EOF,R2  ;TEST IF EOF BEQ STAT4  ;BRANCH IF NOT BIS #200,R1  ;SET EOF BIT STAT4: BIC #177753,R2 ;CLEAR ALL BUT WRL AND 79CH BITS SWAB R2 BIS R2,R1  COE ESTHH IT WTSXIE; NGWILOOL FGSARH IT WIC.OTT1, RSR JBYD LEALC; T: TOR FUPT-SEN MOOM C) 3; T XI E &..;.  PC4,RV MO  R0E AV SLYCTREOR;C P)(S,-R0 OVM 5 U HR T 1GSRE' VESA;'  SP2,#1 UBS S TUTA STHWIE ACPLRE& . ..;) SP2(T,TA.S#P@V MO  .. .SSREDD ARNTURET GE;P @S),SP2( OVM: SM.IKT D)VESAY TLECRRCO0 (RK ACST   ;N OGSRE' EDAV'SW LOBEL AL CNT IM.SIH IT WTSXIE; CKTA SOFP TON ORNTUREH ITW ; SM.IKT4, RSR JBYD LEALC; T:UPRRTEINE ATULIM S) 2; TN#BLED (IN CASE KB ;  HAS DISABLED BECAUSE ITS BUFFER FULL) COM TT.ISW  ;SHOW READER NOW U/W TT.ISE: MOVB @TT.IBP,R0 ;DUMMY FOR ENTRY! TT.IIS: MOV #TKS,R4  ;SET HWR PTR MOV PC,R1  ;SET POINTER TO STORES ADD #TT.IBP-.,R1 MOVB R0,@(R1)+ ;STORE CHARACTER INC -(R1)  ;... & BTMP POINTER INC -(R1)  ;MORE TO COME? BGT TT.IDN TSTB TT.EDI  ;EOD ENTERED? BMI TT.IGO  ;EXIT VIA O/P RTN TT.IDN: MOVB @PC,@R4  ;ENABLE KBD INTS MOV -(R1),R0 ;WHEN DONE, $T TABLE INDEX BR CR.CVT+2 CR.STO: .IFNDF ONLY26&ONLY29 ADD CR.TOS,@SP ;PICK APPROP. TABLE .ENDC ADD PC,@SP ;COMPUTE ADDR OF BYTE REQD ADD #CR.TBL-.,@SP MOVB @(SP)+,(R0)+ ;... & STORE IN BUFFER CMP R0,CR.UBE ;BUFFER FULL? BEQ CR.EXT CR.BXT: BISB @PC,@R0 ;IF NOT SET UNDERWAY FLAG CR.CXT: MOV R0,CR.UBP ;SAVE NEW POINTER MOV (SP)+,R1 ;RESTORE USER REGS. CR.IXT: MOV (SP)+,R0 RTI ;... & EXIT =;SET WRL AND 7,9 TRACK MOV R1,2(R3) ;RETURN STATUS BR COMJ  ;EXIT ; ; ; CLOSE: JSR PC,INIT  ;INIT CHECK ON DEVICE CLRB -10(R1)  ;CLEAR OPEN FLAG JSR PC,EOFCK ;IF LAST CMMD WAS WRITE, WRITE 3 EOFS JSR PC,EOFCK JSR PC,EOFCK JSR PC,RWNDC ;ISSUE DISABLED RWD COMJ: JMP SIMCOM ; ; ; ; INTH: MOV @#44,-(SP) ;SAVE REGS JSR R5,@(SP)+ MOV MT,R0  ;GET DDB ADDR MOV LASTAT,R1 ;GET LCMMD VECTOR ADDR MOV 2(R0),R3 ;GET SP FNC BLOCK ADDR MOV #MT RMPCOT AR1H IT W..;.  R4 TSR D 2NE AK TTERI WIF; + 4)(R STT T XI EST 1KETAD EA RIF; 4 .+ EQB C UN FERSFANTRK ECCH;+ 1)(R2,#T BI  ESYT BAS. ..; 3 RL AS  NTOU CRDWO& . ..;3 ,R)+R1(V MO  SSREDD AERFFBUT GE;2 ,R)+R1(V MO  R16,#D AD  ERNTOI PNGVIMOT SE; 1 ,RR0 OVM: CK.DKB R5,@40#3 VBMO  OW NOR FPTRUERNT INTVERE;P  SP,@R5@V MO K:DCT. T . Y)NL OTTR FO (R4N ITYRIIOPRD VESA   ;& . GSREN ILSRONTCOR FENSRA TTHWI   ;T PUUT OOR F+4LLCA, UTNP IOR F+2LLCAS RNTURE 'GET USING DDB ;************ CARE!!! USED AS LITERAL BY PREVIOUS INSTR ******* CLR (R1)+  ;... & CLEAR BUSY ASR @R1  ;CONVERT ANY REMAINING COUNT MOV @R1,16(R0) ;... & GIVE TO MONITOR MOV 14(R0),PC ;EXIT DIRECTLY TO MONITO ; 2) TERMINAL INTERRUPTS: ; A) KEYBOARD CALL: ; THIS ROUTINE STORES INPUT IN BUFFER, CONVERTING ;  ALT MODE TO ESC, FLAGGING CHAR AFTER THESE ;  TO STOP SPECIAL ACTION & FOLLOWING CR WITH ;  LF. ALLOWS MORE INPUT IF ROOM IN(; D) CARD COMPLETED: CR.DUN: CLRB @#CR.CSR ;STOP INTERRUPTS TSTB @R0 ;IF NO PROCESSING YET ... BEQ CR.RPT ;... CONTINUE MOV (SP)+,R0 ;OTHERWISE RESTORE USER R0 MOV @#CR.RSV,-(SP) ;... & NOW SAVE ALL JSR R5,@(SP)+ MOV CR.UBP,R0 ;SET USER BUFF PTR .IFDF BINARY ;FOR BINARY VERSION ... TSTB CR.ISW ;... CHECK IF BINARY READ BNE CR.BDN ;IF SO ACTION ACCRODINGLY .ENDC MOV CR.UBE,R1 ;FOR ASCII, SET END PTR .IFDF BLANKS ;... & PE ;K DCB. KORK DCT.,TR4R JSY BEDLLCA  ;: RYNT EUPT-SEN OONTIECIR DERSFANTRK ECCH 1) ;: ESINUTROB-SUY ARDISIUB;S T SERE& R HEOTR FO. DJ ATO. ..;   P OO LALCIPE SERTHNO ASE;U  D4.OKB BR  .. .ARCH1 R FOT CNT USDJ;A  CT.OKB ECD R PTG INTR SETES;R )+R4,()+R4(B MPC R FEUF BUTNP ISEEAEL R &..;. PY.IKB3,RV MO  .. .ITT SEREE ISRWHEOT;E ILB.,KR3 OVM R PTD ENE AVLEO SIF; 6 .+ NEB ? /W UDYEALR ANELI;E ILB.,KPY.IKB MPC R CTHWIT LO SEVPR& . ..;) R2-(+ BUFFER ;  BY LEAVING INT ENB BUT WILL ACCEPT ONLY ;  CTL/U WHEN THE BUFFER IS FILLED. CALLS PROC. ;  ROUTINE IF CURRENTLY AWAITING DATA. KT.INT: BCS KT.INO  ;COMMON ENTRY ON INT. TST TT.ISW  ;IF INPUT, READER'S BABY? BGT TT.IIS  ;IF SO GIVE IT TO HIM! KB.IIS: JSR PC,KB.IGP ;GET INTERNAL BUFF PTRS MOV PC,R4  ;SET CHECK STRING POINTER ADD #KB.ICS-.,R4 BICB (R4)+,R0 ;STRIP PARITY BIT CMPB R0,(R4)+ ;^U INPUT? BNE KB.IG1  ;IF NOT CONTINUE CMP R1,R2 ,RHAPS CHECK SUPPRESS CR.ZSW: BR .+4 ;SWITCH ON? BR CR.ADN ;IF NOT NO SUPPRESSION .IFNDF MARKS CMP R0,R1 ;IF BUFFER FULL OMIT NEXT BEQ .+6 SUB #8.,R0 ;OTHERWISE LOSE CC 73-80 .ENDC CMP -(R0),(PC)+ ;THEN TRAILING SPACES .BYTE 240,240 BEQ .-4 TST (R0)+ ;ADJUST PTR WHEN DONE CR.ADN: .ENDC CLR -(R1) ;CLEAR REST OF BUFFER CMP R1,R0 BHI .-4 MOV (PC)+,@R1 ;FINALLY MOVE IN CR-LF .BYTE 215,12 CR.DXT: MOV CR,R0 ;GET DDB ADDRESS ND.E DCEN. Z BSR.+C=. .C ND.E 0.=6SZ.BCR KSARMF FD.I DCEN. . 20=1SZ.BCR KSARMF NDIF.: UF.BCR RYNABI DFIF. : GERATO SRYNABIR FOR FEUF BALRNTEIN; DCEN. I ; 1 31E YT.B ;! 41E YT.B ;< 74E YT.B ;] 35 3TEBY. ) ; 1 25E YT.B ;. 56E YT.B ;? 77E YT.B TYMP;E 40 2TEBY. H ; 0 11E YT.B ;G 07 1TEBY. F ; 6 30E YT.B ;E 05 3TEBY),R4-( VBMO  LFH IT W^UE ACPLRE;2 @R),R4-( VBMO 6:OSB. K: GEIARRCAE ORSTRE- U L/TR CUTNP I) 6; G5.OKB BR  SSREPPSUE IN LVEMORE, SOF ;I SP.PKBP,@S CBBI  G5.OKB MIB ? NTRI PUETR; P @S STT: S5.OKB N:URET RGEIARRCA 5) ;P TO SAB TETES RTON URET;R  G5.OKB BR  NTOU CNELIT SERE. ..;T LCB.,K7.#- OVM 5 OGB.KE BL  .. .ND-EGEPAT AIF; T LCB.KC IN 4:OSB. K: EDFEE-IN L) 4; G3.OKB BR  TR P &NT CSTJUADY B..;.  CT.OKB ECD T SIL MAOR NASL EL WAS; 3 ,RR2 OVM: S3.OKB/ ;OTHERWISE ANY OTHER INPUT? BNE KB.IG1 MOV KB.OSW,R5 ;IF NOT, PRINT U/W? BLE KB.IG5 BISB R5,KB.PSP ;IF SO STOP LINE OUTPUT BR KB.IG5  ;... & FORGET IT! KB.IG1: MOV R1,R3  ;SET MOVING PTR KB.ESW: BR .+4  ;ESC SW. (BR .+2 WHEN SET) BIS -(R4),R0 ;FLAG CHAR. IF LAST = ESC CLRB KB.ESW  ;ASSUME ESC COMING CMPB R0,(R4)+ ;RUBOUT? (OR FLAGGED) BHIS KB.IG2  ;IF SO OMIT ESC CHECK CMPB R0,(R4)+ ;ALT MODES (375/6)? BGE KB.IG5 CMPB R0,(R4)+ ;... O0 JMP @14(R0) ;TAKE COMPLETION EXIT .IFDF BINARY CR.BDN: MOV CR.IBS,R1 ;FOR BINARY, INIT INT PTR MOVB @R0,R2 ;EXIT IF EOF SEEN BMI CR.DXT ;ALSO SETS INTERRUPT FLAG JSR PC,CR.BIN ;ELSE GO MOVE DATA TO USER MOV @#CR.SXT,R5 ;IF COME BACK, MORE READ REQD. JMP 4(R5) ;SO TAKE SYSTEM EXIT .ENDC ;SPECIAL CASE PROCESSING: ; A) ERROR ROUTINE: CR.ERR: CLRB @#CR.CSR ;STOP INTERRUPTS JSR PC,CR.N. D ; 4 10E YT.B ;C 03 3TEBY. B ; 2 10E YT.B ;A 01 1TEBY. + ; 3 5TEBY. ; ;R 22 3TEBY. & ; 6 24E YT.B ;> 76 2TEBY. [ ; 3 33E YT.B ;* 52 2TEBY. $ ; 4 4TEBY. : ; 2 7TEBY. Y PTEM; 0 24E YT.B ;Q 21 3TEBY. P ; 0 12E YT.B ;O 17 3TEBY. N ; 6 11E YT.B ;M 15 1TEBY. L ; 4 31E YT.B ;K 13 1TEBY. J ; 2 31E YT.B ;- 55E YT.B ; ;Z 32 1TEBY. D:EE FRMFO 3) ;T SIE ETEL DSE USEWIERTH;O )+R5,(R1 VBMO  IT SND AGOO SIF; 3 OSB.KQ BE  N?IOETEL DERND UAB;T  R5 STT G INTR SINF LTOO ;G  R4 NCI: S2.OKB O)CH E \UTBORUO LS(A  ;: AB TALNTZORIHO 2) ;. ..K AC BERNTOI PNGRISTE OV;M 4)(R,-4)(R-B MPC E IM TISTH^ O CH;E  R06,13#B OVM: S1.OKB ):SSPAT RSFI (RSTEACARCHL CT 1) ;: ESAS CALCIPE;S T PUUT OTOT TINJO; O OGT.KP JM  NGTIET STR PSTTELAE AV;S BP.OKB3,RV MO  !!Y!WANY ANTRI PNOE YBMA. 3R ESCAPE? BEQ KB.IG5  ;IF SO SET SWITCH KB.IG2: INCB KB.ESW  ;... BY OMITTING THIS ;STORE CHARACTER IF ROOM IN BUFFER: SUB R2,R1  ;MORE ROOM IN BUFFER? BMI .+6 SUB #KB.IBZ,R1 ;... ALLOWING WRAP AROUND ADD #3,R1  ;(SAFETY MARGIN) BLT KB.IG3 BGT KB.IG4  ;IF NOT FOR 1 CHAR ONLY .. CMPB R0,#25  ;... ALLOW ^U ONLY BNE KB.IG4 KB.IG3: MOVB R0,(R3)+ ;OTHERWISE STORE INPUT JSR R3,KB.PCK ;... & ADJUST PTR CMPB R0,(R4)+ ;FOLL4RY ;INFORM OPERATOR CR.RPT: JSR PC,CR.AGN ;IF RETURN TRY AGAIN BR CR.IXT ;... & EXIT FOR NOW ; B) END OF FILE CARD SEEN: CR.EOF: MOV CR,R1 ;GET DDB ADDRESS .IFNDF BINARY ;FOR SIMPLE VERSION ... MOV 10(R1),16(R1) ;... NO DATA READ ON EOF .ENDC .IFDF BINARY ;MAYBE SOME IF BINARY ... ADD #16,R1 ;SO MOVE TO UNUSED COUNT STORE MOV R0,@R1 ;... & COMPUTE VALUE REQD SUB CR.UBE,@R1 ASR @R1 ;... AS WORDS! .ENDC COM @R0 ;SET FLAG CR.EXT: % ; 5 24E YT.B ;# 43 2TEBY. " ; 2 4TEBY. ( ; 0 5TEBY. , ; 4 25E YT.B ;; 73 2TEBY. Y PTEM; 0 24E YT.B ;Y 31 1TEBY. X ; 0 33E YT.B ;W 27 3TEBY. V ; 6 12E YT.B ;U 25 1TEBY. T ; 4 32E YT.B ;S 23 1TEBY. / ; 7 25E YT.B ;0 60E YT.B ;9 ; 1 7TEBY. \ ; 4 13E YT.B ;' 47E YT.B ;^ 36 3TEBY. @ ; 0 30E YT.B ;= 75 2TEBY. _ ; 7 13E YT.B TYMP;E 40 2TEBY. 8 ; 0 27E YT.B ;7 67 2TEBY. 6 ; 6 ..;4 S+OIB.KE BN  ...., ATTHL ALR TEAFE,USCABE;P PSB.,KR4@B ITB 4 RC IN  HOECR FOT USDJ AOT NIF; 4 .+ PLB ? NTRI PUETR; + P)(S STT . SWE ETEL DSTTELAE ORST;W DSB.,KR5 OVM: G6.OKB CT.TKB4,@R VBMO 5:OGB. K6 OGB.KL BP  EC NIFP TO SAB TETES;R  CT.TKB CBDE 4:OGB. K1 OSB.KE BN  -2=.SW.CKB ^BYD DECERE P &..;.  #0 OMC D TEERNVCOE BSTMUE ESTH; 0 ,R00#1 SBBI  G4.OKB GTB S ARCHL CTR HEOTR FOK OO LOW;N  32,#R0 PBCM  CKHE CGOO S..;.  S5.OKB EQB T INPRE OR7OW CR WITH LF ... BNE .+6 MOVB (R4)+,R0 BR KB.IG3 MOV R3,KB.IPX ;SAVE POINTER KB.IG4: MOV R3,R1 KB.IG5: MOVB @PC,@#TKS ;REENABLE INTERRUPT MOV KB.ISW,R3 ;INPUT AWAITED? BEQ TT.ODN-2 ;IF NOT, EXIT MOV KB.OCT,-(SP) ;OTHERWISE PICK UP ECHO CNT BMI .+4  ;LEAVE ANY REMAINING ... CLR @SP  ;OTHERWISE ZERO IT JMP KB.IC1  ;... & GO PROCESS ; B) PRINTER CALL: ; THIS ROUTINE HANDLES ALL PRINT OPERATIONS, ;  INCLUDING SPECIAL EC8BISB #2,@#CR.CSR ;ALLOW REST OF CARD THRU BR CR.CXT ; C) CONTROL CARD SEEN: .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CR.026: MOV #104,CR.TOS ;... SET TABLE OFFSET ... BR CR.EXT ;... & IGNORE REST OF CTL CARD CR.029: CLR CR.TOS BR CR.EXT .ENDC .IFDF BLANKS ;IN SUPPRESS VERSION CR.ZON: INCB CR.ZSW ;... SET SUPPRESS NOW BR CR.EXT ;AGAIN IGNORE REST OF CARD .ENDC ;READER NOT READ 6TEBY. 5 ; 5 6TEBY. 4 ; 4 26E YT.B ;3 63E YT.B ;2 62 2TEBY. 1 ; 1 26E YT.B CEPA;S 40 2TEBY. 9 Y2NLOF NDIF. : CHUN P26 0OR FLEAB TONSIERNVCOI CIASY ITAR;P C ND.E ;I 11 3TEBY. ^ ; 6 33E YT.B ;+ 53E YT.B ;( 50E YT.B ;< 74E YT.B ;. 56E YT.B ;[ 33 3TEBY. Y PTEM; 0 24E YT.B ;H 10 1TEBY. G ; 7 10E YT.B ;F 06 3TEBY. E ; 5 30E YT.B ;D 04 1TEBY.STREY MAR ;C  15,#R0 PBCM  ND-EGEPAR FOK OO LSTMU. ..; 4 OSB.KQ BE  ....EDFEE-IN;L )+R4,(R0 PBCM 3:OGB. K3 OSB.KE BN  ND-EGEPAL TIUN. ..; T LCB.KT TS  LFY BEDACPLRES I..;.  R04,@R VBMO  G3.OKB NEB . ..D EE FRMFO;+ 4)(R0,RB MPC: G2.OKB HTN OIT SLEHINWEA;M  S2.OKB NEB 2 .-T=TCB. KP TO SAB TXTNEL TIUN. ..; 7 #B STT . .. .ESACSPH IT W..;.  R00,#4 VBMO  G2.OKB NEB . ..B TA. IZOR HCELAEP;R )+R4,(R0 PBCM  ERAT LEDIRQUREE AS CINE AV;S  R10,RV MO  GO.O;HO AS REQD.I.E.:- ;  CONVERSION OF HT & FF, DISCARDING OF ;  NULL, VT & PRINT RUBOUT, CONVERSION ;  OF CTL CHARS TO ^ FOLLOWED BY ASSOC. ;  NORMAL CHAR. ; IT ALSO EFFECTS ERASURE OF UNWANTED INPUT BY ;  ACTUALLY REPLACING CHAR WITH RUBOUT, ;  (INCLUDING ESCAPE IF PRECEDING) & ;  PRODUCES APPROPRIATE ECHO. FOR ^U ;  IT ADJUSTS LINE START TO REMOVE ;  UNWANTED GARBAGE & RELEASES KB BUFFER ;  AREA IT OCCUPIES. ; IT WILL NOT BE CALLED FOR SUPPRESSED ECHO; ;  HOWEVER FOR SU<Y SUBROUTINE: CR.NRY: MOV CR.NAM,-(SP) ;IDENTIFY DEVICE MOV #402,-(SP) ;GIVE ONT READY CODE IOT ;... & CALL EDP RTS PC ;TRY AGAIN IF COME BACK ; ;MISCELLANEOUS DEFINITIONS: CR.CSR=177160 CR.DB1=177162 CR.DB2=177164 CR.SXT=42 CR.RSV=44 CR.TBL: ;PARITY ASCII CONVERSION TABLE FOR 029 PUNCH .IFNDF ONLY26 .BYTE 240 ;SPACE .BYTE 261 ;1 .BYTE 262 ;;2 .BYTE 63 ;3 .BYTE 264 ;4 .BYT C ; 3 30E YT.B ;B 02 1TEBY. A ; 1 10E YT.B ;& 46 2TEBY. ; ;R 22 3TEBY. \ ; 4 13E YT.B ;; 73 2TEBY. ) ; 1 25E YT.B ;* 52 2TEBY. $ ; 4 4TEBY. ! ; 1 4TEBY. Y PTEM; 0 24E YT.B ;Q 21 3TEBY. P ; 0 12E YT.B ;O 17 3TEBY. N ; 6 11E YT.B ;M 15 1TEBY. L ; 4 31E YT.B ;K 13 1TEBY. J ; 2 31E YT.B ;- 55E YT.B ; ;Z 32 1TEBY. ? ; 7 7TEBY. KB EQB B TAL CATIER V &..;. )+R4,(R0 PBCM  GO.OKB EQB . .. .UTBORU. ..; 1 ,RR0 PBCM  LSUL NRENOIG& . ..; O OGB.KQ BE  .. .IT BTYRIPAP RIST;0 ,R)+R4(B ICB R TEINPOK ECCHT USDJ;A R1+,4)(R VBMO 1:OGB. K: RSTEACARCHL IAECSPR FOS ESOCPR C) ; OW NOR FIT SGO& . ..; 3 OSB.KR B . .. .TR PRGSTP UM;B  R45,#D AD 4:ODB. K\ H IT WCELAEP R. ..; 0 ,R34#1 VBMO  .. .NGRISTF OND EATO LS AIF; 5 RR CL 3:ODB. K4 .+ BR  CHITSWT SEO SIF; 5 ,RR2 OVM?PPRESSED PRINT IT ;  PERFORMS NORMAL PROCESSING, ONLY ;  STOPPING ACTUAL OUTPUT TRANSMISSION. ; ;ENTRY FOR OUTPUT INTERRUPT: KT.INO: TST TT.OSW  ;ON OUTPUT INT MAY BE PUNCH BGT TT.OIS  ;IF SO GO TO ITS ROUTINE ;STANDARD SEQUENCE FOR PRINTER PROCESSING: ; GETS CHAR. OR ITS SUBSTITUTE & SETS UP FOR NEXT ; A) GET CHARACTER FROM BUFFER: KB.OIS: MOV KB.OBP,R3 ;GET BUFFER POINTER IF NOT MOV KB.OSW,-(SP) ;GET SWITCH FOR LATER CHECKING KB.OGO: INC KB.OCT  ;MORE IN BUFFER? E 65 ;5 .BYTE 66 ;6 .BYTE 267 ;7 .BYTE 270 ;8 .BYTE 240 ;EMPTY .BYTE 72 ;: .BYTE 243 ;# .BYTE 300 ;@ .BYTE 47 ;' .BYTE 275 ;= .BYTE 42 ;" .BYTE 71 ;9 ; .BYTE 60 ;0 .BYTE 257 ;/ .BYTE 123 ;S .BYTE 324 ;T .BYTE 125 ;U .BYTE 126 ;V .BYTE 327 ;W .BYTE 330 ;X .BYTE 131 ;Y .BYTE 240 ;EMPTY .BYTE 335 ;] .BYTE 254 ;, .BYTE 245 ;% .BYTE 137 ;_ .BYTE 276 ;> C,R5  ;ADDR OF CMMD REG BIC #100,(R5) ;DISABLE DEVICE INTERRUPT MOV @#MTS,R2 ;GET STATUS OF DEVICE INCB INTENB  ;SET INT FLAG BIT #ILC+NXM,R2 ;CHECK ILLEGAL CMMD, NONEXIST CORE BEQ INT1  ;BRANCH IF NOT INTF: MOV R2,-(SP) ;DISPLAY STATUS AND DIAGNOSE MOV #1432,-(SP) ;FATAL ERROR-MAG TAPE IOT   ;ABORT ; INT1: TSTB TCMMD  ;CHECK IF THIS WAS A RETRY BEQ INT3  ;BRANCH IF NOT BPL INT2  ;BRANCH IF WAS NOT BSP OF RETRY CLR R2 BISB TCMMD,R2 ;GE 1 OGB.KE BN  W?NOT OUUB RW, STELEDEO NIF; 4 @R0,RB MPC: D2.OKB R5,@R4@B OVM . ARCHD TELEDEE ASER; 0 ,RR5@B OVM 1 ODB.KQ BE  DYEALR AEDETEL DIFE ORGN;I R4,@5)(R-B MPC 5 ,RBZ.IKB#D AD  +6.E BN  RYSAESEC NIFT USDJ;A BS.IKB5,RP CM  RENOIGT NOF ;I  GO.OKB EQB ? TELEDEO TNY;A PY.IKB5,RP CM 1:ODB. KW NOH TCWI SARLE CGO- O ;N  D3.OKB NEB ? INGA AUTBORUO SIF; 4 @R0,RB MPC 2 ODB.KQ BE  -2=.SW.DKB N? OCHITSWT OUUB;R  R50,#V MO 0:ODB. KO CH ELFCRP UET SBGT KB.ODN CLR R5  ;WILL BE USED AS RUBOUT SW. MOV PC,R4  ;FOR MORE, SET CHK STRG PTR ADD #KB.OCS-.,R4 MOV R3,R2  ;HOLD BUFF PTR AGAINST ECHO SIT MOVB (R3)+,R0 ;GET CHARACTER ... JSR R3,KB.PCK ;... & ADJUST PTR ; B) IF ECHO PRINT, TAKE DELETE ACTION IF REQUIRED: TST @SP  ;CHECK IF ECHO PRINT BPL KB.OG1  ;IF NOT OMIT ALL THIS CMPB R0,#25  ;CHECK FOR ^U BNE KB.OD0 TST KB.CSW  ;SECOND TIME THRU? BNE KB.OS6  ;IF SO