;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ˆˆˆˆˆˆˆ€ˆˆ""""""""""DDDˆˆˆˆˆDDD€ˆˆˆ@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆˆˆˆˆˆ"""" """" """€ˆˆ """"""""€ˆˆˆˆˆˆˆˆˆˆ """DDDDDD """""""""€ˆˆˆˆˆˆDD!""€ˆˆˆˆˆˆˆˆˆˆÌÌÌÌÌÌÌÌ@DD """""DDDDDD133ADDB C—r^\4d©U›—rc\4d©V›—r[\4d©W›—r€\4d©l›—r¨\4d©Y¥›—rÐ\4d©Zn›—rø\4d©[ ƒ›¯x4d©p|›ð4d©rŠ›¸4d©€ ¤›x4d©‡Ÿ›&t4d©Ž;v›—r ]4d©£›‚:4d©¨à›sr4d©© É›Ñ4d©Í ñ›o4d©ä›|—4d©õ›Cy4d©›ôy4d©›N`4d©Y›³4d©P›/4d©7›Å4d©;o›Ð4d©T…þ›ð4d©]y›ý-4d©z ¦›D4d©}É›²K4d© «›ÀK4d©�¬›`T4d©s›E4d©¯5þý›Ðf4d©°¼›€f4d©¾Î›€M4d©ÀÜ› 4d©Í ù›�4d©Ò!Ûý›©à›$DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßýÿÿÝýÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ››ëŽB›¾ÃðÃ8ŽÅaå Í‹æÄ,L ƒw:ÄBŒ ýƒàÇ` 5 þÿ€�&ˆ ‚— ýÿ†ƒœÃEÀÿ× >w†× × ò f€ò5ÀeòU@ò €× [æ*ˆ² ¦¦æ× Ž & *ˆÖ G× ‚&(ˆ°Ì 8�L'ˆ°4e÷ ÌQ$ ô �BBâBä" ± üÿü× ÷ ¬ŒÉU@Ò °ðU€ Æe  Å"U%÷‹äþGæÎeÞþæfÇ.Ö … U¥… … … … U¥Ñ Bb‘â‹Ã 0Š æ*ˆ€�Ö BÃICKS) ;  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 14ƒPTR 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 DKRTRY‰ET 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 .WO�DKIN10  ;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 BINAR“RD 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 ADDRES–Y 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) ; ÿW—ION 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 ;WA�OF 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 REGISTE³COMMAND ; ; 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. MOVµRIVER 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 OTHER¾TUS 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 ; INITÈATASET? 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 TRANSFEÒSR ÿ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 ROUTÖED 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 STÚET 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(RÝACK ; 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) OTHEßAP2/  ; 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 STAâRWISE 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 ÿBEãFOR 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! BæQ ÿ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  ;FîÿOTHER 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 ACCEPTANCúGET 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: ; ;OPERATIûS 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  ; TRANSFEýE 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 PTR9ÿR1,-(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 SBÿADD ÿ@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 .FMQÿASL ÿ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) ÿ; SHOWrÿBR ÿ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 CONDIŠSET 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 REQUIREM‹UFFER 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 ADDRESŒEXAMINE ÿ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 ÿCSST�TION 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 INŽENTS 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 RELE�S ÿ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 ÿADD…þ8-. ÿ.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 = < ;S‘VALID 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  ;GET’VANT 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  ;... & GO–ÿPC,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 ÿR—IT ÿ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 ÿ ÿ; FORM˜E 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 BYTš1,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 TOœOUNT 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 ROUTINE�E 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 INVžQ ÿ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 REM¢DONE ÿ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 MOV©Y 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 A®RUCTURE 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 IN²EVICE .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 REDUCI¶RA 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=80·SET 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. ;  (WILL¸BYTE 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 INVAº0,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 O¼TST @#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 READ¿UTPUT 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 .BYTEÃARS ; 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.AÇIN 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 NOTIFYÈLP.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: CÊTS,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 FËING 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 GOINÕFER 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 ENTØG 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 ERRÙE 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 SOURCÛRY 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: BISBÜOR 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, IGNORÝSO 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: TSTÞE 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 REMçOTHERWISE 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 LIèR2  ;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 BéUPT 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'RêAINING ; ÿ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 WOíUPT? 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 ÿBINARóBITB @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 CöY ÿ.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 EXECùHK 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 ISüUTE 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 TLECRRêý101,(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 KSARÿMF FD.I ÿ DCENÿ. . 20=1SZ.BCR KSARÿMF 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 ORÒý7OW 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 EC8ÿBISB ÿ#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 Y2NLÿOF 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 SÆýÂýBGT 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