;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C ;KBI PARAMETER TAPE FOR RF11 DISK: ; ;THE FOLLOWING SHOWS DISK BLOCK SIZE IN BYTES: KBI.BS=128. ; ;THE FOLLOWING IS USED TO COMPUTE THE START BLOCK ; OF AN OVERLAY (IN MRT. FORMAT) AND IS ; BASED ON:- ;  [OVERLAY SIZE(256.)/KBI.BS]*2 ;  WITH A MINIMUM VALUE OF 1 FOR [...] KBI.OS=4 ; ;THE ASSEMBLY POINT FOR AN OVERLAY RELATIVE TO THAT ; OF ITS PREDECESSOR IS GIVEN BY:- ;  [KBI.BS/OVERLAY SIZE]*25;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ;KBI PARAMETER TAPE FOR RK11 DISK: ; ;THE FOLLOWING SHOWS DISK BLOCK SIZE IN BYTES: KBI.BS=512. ; ;THE FOLLOWING IS USED TO COMPUTE THE START BLOCK ; OF AN OVERLAY (IN MRT. FORMAT) AND IS ; BASED ON:- ;  [OVERLAY SIZE(256.)/KBI.BS]*2 ;  WITH A MINIMUM VALUE OF 1 FOR [...] KBI.OS=2 ; ;THE ASSEMBLY POINT FOR AN OVERLAY RELATIVE TO THAT ; OF ITS PREDECESSOR IS GIVEN BY:- ;  [KBI.BS/OVERLAY SIZE]*25;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A .TITLE KBL ;MINIMAL TELETYPE LISTENER VERSION 1 DEC 70 ; NON-RESIDENT MONITOR ROUTINE TO GATHER ; A MONITOR COMMAND FROM THE KEYBOARD, ECHOING ; AT THE PRINTER AS REQUIRED. ; ; (ALTHOUGH NOT PART OF THE RESIDENT MONITOR THIS ; ROUTINE WILL NORMALLY OCCUPY THE SUBSIDIARY SWAP ; BUFFER WHENEVER THIS IS NOT OTHERWISE IN USE.) ; ;OPERATIONS: ; 1) WHENEVER THE RESIDENT DRIVER INTERCEPTS CTRL/C ; IT ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A .TITLE KBI ;KEYBOARD COMMAND INTERPRETER VERSION 1 DEC 70 ; ; CALLED BY KEYBOARD LISTENER AFTER AN ; APPARENTLY VALID COMMAND HAS BEEN INPUT ; ; COLLECTS COMMAND CODE (FIRST TWO BYTES OF COMMAND) ; & MOVES TO FIRST DELIMITER LEAVING ; POINTER ON A [RETURN] OR ON THE BYTE BEYOND ; [ ] OR [,]. ; INITIALLY CHECKS FOR 'CONTINUE', 'STOP' OR 'WAIT' ; FOR WHICH THERE IS AN EMBEDDED ROUTINE ; 6. ;  WITH A SIMILAR MINIMUM FOR [...] KBI.OZ=256. ; ;THE FOLLOWING IS USED FOR THE DETERMINATION OF ; THE START BLOCK OF A DOUBLE OVERLAY ; ALSO IN MRT. FORMAT. ITS BASE IS:- ;  [OVERLAY SIZE(256.)*2/KBI.BS]*2 ;  (MINIMUM FOR [...] AGAIN 1) KBI.OX=10 .EOT 6. ;  WITH A SIMILAR MINIMUM FOR [...] KBI.OZ=512. ; ;THE FOLLOWING IS USED FOR THE DETERMINATION OF ; THE START BLOCK OF A DOUBLE OVERLAY ; ALSO IN MRT. FORMAT. ITS BASE IS:- ;  [OVERLAY SIZE(256.)*2/KBI.BS]*2 ;  (MINIMUM FOR [...] AGAIN 1) KBI.OX=2 .EOT WILL CALL THIS ROUTINE TO ACCEPT & ECHO ALL ; INPUT UP TO THE NEXT CARRIAGE RETURN (UNLESS ERASED) ; 2) DURING THIS PERIOD A RUNNING USER PROGRAM WILL ; BE ALLOWED TO PROCEED AS NORMALLY EXCEPT THAT ITS ; CONSOLE OPERATIONS WILL BE SUSPENDED. ; 3) THIS ROUTINE WILL ALSO BE CALLED AUTOMATICALLY ; WHENEVER THE COMPUTER IS PUT INTO A WAIT STATE, ; I.E. AS A RESULT OF AN ACTUAL KEYBOARD COMMAND ('WAIT' ; OR 'STOP') OR FOLLOWING DETECTION OF A PROGRAM ERROR ; OR IF A PROGRAM IS LOADED USING AND IF FOUND TAKES EFFECTIVE ACTION BY ; REPLACING THE USER PROGRAM RETURN ADDR ; WITH THAT OF A WAIT LOOP IN THE SVT & ; STORING THE FORMER IN THE SVT. (OR VICE ; VERSA.) ; ALL OTHER COMMANDS ARE COVERED BY AN INDEX WHICH IS ; BROUGHT IN AS AN OVERLAY OF AN UNREQUIRED ; PART OF KBI ITSELF. (THIS INDEX IS ASSUMED ; TO BE STORED ON SUBSEQUENT BLOCKS ; OF THE MONITOR LIBRARY ON DISK - AN ; IMMEDIATE SEARCH DETERMINES THE PART & HENCE ; BLOCK REQUIRED) ; THIS INDE ;COPYRIGHT:- DIGITAL EQUIPMENT CORP.,MAYNARD, MASS. ; ;VERSION NO.:- V001C ; .TITLE KBI.DA ; ;KEYBOARD DATE COMMAND PROCESSOR ; 1) IF COMMAND CONTAINS AN ARGUMENT, THIS IS ; EXPECTED TO BE IN THE FOLLOWING FORMAT:- ;  DD-MMM-YY ; WHERE 'DD' IS 2-DIGIT DAY VALUE, 'MMM' ; GIVES FIRST 3 ALPHA CHARS. FOR MONTH & 'YY' ; REPRESENTS LAST TWO DIGITS OF YEAR, (A SINGLE ; LEADING 0 FOR BOTH 'DD' & 'YY' CAN BE ; OMITTED. ;  ANY DEPARTURE FROM THIS FORMAT, INCLUDING ; INCORRECT DAY S;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003B ; .TITLE KBI.SA ; ;KEYBOARD SAVE COMMAND PROCESSOR: ; ; EXPECTS A COMMAND OF THE FORM: ; ; SA[VE][ (DATASET SPECIFIER)][/RA:LOW:HIGH] ; WHERE:- ; 'DATASET SPECIFIER' IS IN CSI FORMAT FOR ; DEVICE & UNIT, FILE NAME & EXT. & UIC ; 'RA' IS A SWITCH WITH VALUES REPRESENTING ; AREA TO BE SAVED ('LOW' & 'HIGH' ; MUST BE VALID OCTAL ADDRESSES & 'LOW' ; MUST BE LESS THAN 'HIGH') ; BY D A 'GET' COMMAND. ; 4) THE PRINTER WILL BE DEEMED SOLELY AT THE ; DISPOSAL OF THE KEYBOARD FOR ECHO PURPOSES FROM THE ; FIRST INTERRUPT AFTER THE CTRL/C INPUT IF THIS IS ; EXPECTED OR IMMEDIATELY IN ALL OTHER CASES. ; 5) CHARACTERS WILL BE ECHOED EXACTLY AS INPUT WITH ; THE FOLLOWING SPECIAL CASE EXCEPTIONS: ; ; A) CTRL/C - WILL APPEAR [^C], CARRIAGE ; RESTORE & [.] A SECOND CTRL/C WILL ; ERASE LINE AND EXPECT A NEW COMMAND. ; B) CTRL/U - WILL APPEAR AS [^U] & ;X SHOWS THE RELATIVE POSITION OF THE ; ROUTINE TO SERVICE THE COMMAND WITHIN THE ; COMMAND LIBRARY ALSO ASSUMED TO FOLLOW KBI ; IMMEDIATELY WITHIN THE MONITOR LIBRARY. ; THE ROUTINE WILL BE A COMPLETE OVERLAY OF KBI ; AND IS ITSELF RESPONSIBLE FOR DECODING THE ; REMAINDER OF THE INPUT STRING. THE CONVERSION ; ROUTINES IT MAT NEED FOR THIS ARE EMBEDDED ; SINCE THE NORMAL SWAP BUFFER WHICH THE MONITOR ; CONVERSION PACKAGE WOULD USE MIGHT BE OCCUPIED ; BY SOME OTHER SERVIZE, WILL RESULT IN A 'SYNTAX ; FAULTY' MESSAGE AND THE COMMAND WILL BE IGNORED. ; 2) A COMMAND WITHOUT AN ARGUMENT WILL CAUSE OUTPUT ; OF THE CURRENTLY STORED DATE IN THE SAME FORMAT. ; (AN APPARENTLY INVALID VALUE WILL APPEAR AS:- ;  00-XXX-YY) ; ; ON ENTRY, EXPECTS REGISTERS TO BE SAVED ON TOP ; OF STACK AS FOLLOWS:- ;  R3 = ADDRESS OF SVT. TABLE ;  R4 = ADDRESS OF TELEPRINTER BUFFER ;  R5 = POINTER TO NEXT COMMAND INPUT BYTE ; ; ON EXIT, R4 WILL CONTAIN SAME DATA, R1 WIEFAULT, DEVICE WILL BE SYSTEM DISK, FILE ; NAME WILL BE 'SAVE.LDA', UIC WILL BE THAT FOR ; THE USER LOGGED IN & THE RANGE WILL EXTEND ; FROM PROGRAM LOAD POINT TO TOP OF MEMORY. ; ; THE COMMAND WILL BE ACCEPTED PROVIDED THAT ; A USER PROGRAM HAS BEEN LOADED & NOT STARTED ; OR IF STARTED HAS NOW BEEN STOPPED. IF THE ; FORMAT IS CORRECT, THIS SEQUENCE WILL OBTAIN ; A BUFFER AND READ INTO IT A TRANSFER CONTROLLER ; FOR THE ACTUAL SAVE, IN ORDER THAT THE KEYBOARD ; SWAP BUFFER CAB BE FREE CARRIAGE RESTORE. ALL INPUT PRECEDING ; WILL BE ERASED AND A NEW COMMAND ; STARTED AFRESH (= SECOND [^C]) ; C) RUBOUT - WILL BE ECHOED BY [\] AND ; THE PRECEDING CHARACTER, ALSO ; ECHOED, WILL BE ERASED. SUCCESSIVE ; RUBOUTS WILL ECHO DELETED CHARACTERS ; BETWEEN [\.......\].NO ECHO WILL OCCUR ; IF NO VALID INPUT EXISTS. ; 6) COMMENTS MAY BE INSERTED AFTER INPUT OF [;], ; INCLUDING THE WHOLE LINE CASE. ; 7) AT THE END OF THE LINE, COMMENTS WILICE TO THE USER. ; ON COMPLETION THE ROUTINE WILL NORMALLY RECALL KBL TO ; EFFECT FINAL TIDY UP, UNLESS THIS MIGHT ; CAUSE CONFLICTING I/O REQUIREMENTS WITH THE ; USER. (AS IN BEGIN OR RESTART). ALL ROUTINES ; WILL NEVERTHELESS RECALL KBL IF THE INPUT ; COMMAND IS FOUND TO BE IN ERROR. ; ON ENTRY FROM KBL, REGISTERS WILL BE AS FOLLOWS:- ; R0 = (IRRELEVANT) ; R1 = END OF INPUT STRING ; R2/3 = (IRRELEVANTLL BE ; POSITIVE UNLESS FORMAT ERROR (CONTENT THEN -3) & ; R5 WILL BE CLEARED TO SHOW DONE. R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; .BYTE 0,-1  ;IN USE/NON-REENTRANT SWITCHES ;SET POINTERS & CHECK REQUIREMENT: KBI.DA: MOV @#V.RRES,-(SP) ;RESTORE KBI REGS. JSR R5,@(SP)+ CMP (SP)+,(SP)+ ;... & CLEAN UP STACK MOV #60,R1  ;SET ASCII NO. BASE ... MOV #10.,R2  ;... & DIGIT RANGE ADD #V.DAT,R3 ;MOVE SVT. PTR TO DATE STORE MOVD FOR OTHER USAGE. ; ON SATISFACTORY COMPLETION THE BUFFER WILL BE ; RETURNED TO "FREE CORE" ; ; ON ENTRY, RELEVANT REGISTERS SET BY KBI WILL BE: ; R0 = INFO ON DISK BLOCK JUST READ IN ; R1 = END OF COMMAND INPUT STRING ; R3 = START ADDRESS OF SVT. ; R4 = ADDRESS OF TPB ; R5 = START OF INPUT COMMAND STRING ; ; ON EXIT TO TRANSFER CONTROLLER, THEY WILL BE: ; R0 = ADDRESS OF BUFFER USED ; R5 = POINTER TO TABLE CONTAINING ADDRESSES ; OF LINK BLOCK & FILEL BE ERASED, ; AND IF ANY VALID COMMAND INPUT REMAINS, THE LISTENER ; WILL OVERLAY ITSELF WITH THE INTERPRETIVE ROUTINE, KBI. ; 8) AFTER SUCH COMMAND HAS BEEN EFFECTED, THIS ; ROUTINE WILL BE RECALLED. IF ANY ERROR HAS BEEN ; DETECTED, IT WILL CAUSE PRINTING OF AN ; APPROPRIATE MESSAGE, USING AN OVERLAY SECTION ; TO DETERMINE THE MESSAGE REQUIRED. ; 9) AFTER THE COMMAND, IF ANY, HAS BEEN ACTIONED ; OR AFTER THE ERROR MESSAGE HAS BEEN PRINTED, THE ; MACHINE STATE PRIOR TO THE INPUT W) ; R4 = TPB ADDRESS ; R5 = POINTER TO START OF COMMAND STRING ; ON CALL TO COMMAND SERVICE ROUTINE, THEY WILL BE ; MODIFIED AS FOLLOWS:- ; R2 = COMMAND CODE ; R3 = POINTER TO SVT. ; R5 = NEXT COMMAND BYTE TO BE ACTIONED ; ON RETURN TO KBL, EITHER DIRECTLY FROM KBI OR FROM ; THE SERVICE ROUTINE, THE FOLLOWING ; REQUIREMENTS MUST BE SATISFIED:- ; R1 = ERROR FLAG (NEGATIVE CODE IF ERROR; ; OTHERWISE POSITIVE) (***) ; R4 = TPB ADDRESS AS ON ENTRY ;B (R5)+,R0 ;GET FIRST INPUT BYTE SUB R1,R0  ;IF APPEARS A DIGIT ... BGE DA.IN  ;... ASSUME NEW DATE INPUT MOV KBI.DA-4,R0 ;OTHERWISE GET NEXT BLOCK NO. ADD #KBI.OS,R0 ;... FOR OUTPUT OVERLAY BR DA.ND1  ;GO GET IT ;FOR INPUT, GET DAY (& YEAR): DA.IN: MOV @R3,-(SP) ;SAVE CURRENTLY STORED DATE CLR @R3  ;ZERO STORE AS BUFFER ... CLR -(SP)  ;... & ONE FOR NUMBER BUILD DA.IGD: CMP R0,R2  ;VALID DIGIT INPUT? BHIS DA.ICD  ;IF NOT S BLOCK DATA SET ; UP BY CSI. ; ; IF THE COMMAND IS REJECTED THRU ERROR, KBL WILL ; BE RECALLED WITH R4 UNCHANGED FROM ITS ENTRY ; VALUE, R5 WILL BE CLEARED TO SHOW RECALL & R1 ; WILL BE SET AS FOLLOWS: ; -2 = INVALID COMMAND (PROGRAM NOT LOADED ; OR IS NOT STOPPED) ; -3 = FAULTY SYNTAX ; -6 = LIMIT ADDRESSES ILLEGAL ('LOW'>'HIGH') ; -7 = NO BUFFER SPACE AVAILABLE FOR PART 2 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; .BYTE 0,-1 ;IN USE/RE-ENILL BE RESUMED ; (INCLUDING AUTOMATIC RECALL IF PROGRAM SUSPENDED) ;ON ENTRY, EXPECTS REGISTERS AS FOLLOWS:- ; ; R0 = POINTER TO OUT BUFFER START ; R1 = POINTER TO INPUT BUFFER (NEXT CHAR) OR ; 0 IF FIRST CTRL/C. ; R2 = POINTER TO LAST CHARACTER IN ECHO BUFFER ; R3 = POINTER TO NEXT CHARACTER FOR PRINTING ; R4 = POINTER TO APPROPRIATE H/W BUFFER REGISTER ; R5 = POINTER TO STORE FOR INPUT CHARACTER, (WHICH ; MU R5 = 0 TO INDICATE COMPLETED ACTION. ;(***) FOR DIRECT RETURN FROM KBI, POSSIBLE CODES ARE:- ; -1 = ILLEGAL COMMAND ; (DOESN'T EXIST) ; -2 = INVALID COMMAND ; (NOT ACCEPTABLE AT THIS TIME) ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; ; XXXXXXXXXXXXXXXXXXXXXXXXX ; X X ; X * NOTE * X ; X X ; XXXXXXXXXXXXXXXXXXXXXXXXX ; ; KBI & EACH COMMAND PROCESSOR MUST BE ASSEMBLED WITH AN ; APPROPRIATE PARAMETER TAPE SHOWINTOP CONVERSION ASL @SP  ;OTHERWISE MULTIPLY ... ADD @SP,R0  ;... PREVIOUS INPUT BY 10. ASL @SP ASL @SP ADD R0,@SP  ;... & ADD NEW DIGIT DA.IDL: MOVB (R5)+,R0 ;GET NEXT INPUT SUB R1,R0  ;STRIP ASCII BASE BR DA.IGD  ;... & GO PROCESS ;CHECK DAY VALID: DA.ICD: TST @R3  ;JUST DONE YEAR? BNE DA.IGY  ;IF SO GO ELSEWHERE CMPB R0,#'--60 ;DAY CORRECTLY DELIMITED? BNE DA.ERR  ;OBJECT IF NOT CMP @SP,#31. ;CORRECT DAY SIZE? BGT DA.ERR  ;AGAINTRANT SWITCHES ;PREPARE INPUT FOR CSI.: ; (THIS AREA IS USED AS LINE BUFFER WHEN EXECUTED) KBI.SA: MOV @#V.RRES,-(SP) ;RESTORE KBI REGS JSR R5,@(SP)+ CMP (SP)+,(SP)+ ;CLEAN UP STACK ADD #KBI.OS,R0 ;ADJUST DISK INFO ... BIC #140001,R0 JSR R0,@PC ;SAVE R0 & RESET AS LINE PTR INC SA.ND+4 ;PREPARE KBL RECALL ... MOVB #-2,@R1 ;... IN CASE OF ERROR MOV V.MUS(R3),R2 ;SET ERROR CODE & GET MUS BMIST BE ZEROED IF OUTPUT IN FACT REQD.) ; ;DURING RETURNS TO THE USER PROGRAM TO AWAIT THE NEXT CONSOLE ; INTERRUPT WHILE A COMMAND IS BEING COLLECTED, THESE ; REGISTERS WILL BE SAVED, AS MODIFIED BY THE LISTENER, ; BY THE RESIDENT DRIVER ROUTINE. ; ;ON EXIT TO THE COMMAND INTERPRETER, THE FOLLOWING REGISTERS ; WILL BE RELEVANT:- ; ; R1 = END OF COMMAND INPUT ; R5 = START OF COMMAND INPUT ; ;ON RECALL BY COMMAND INTERPRETER, R4 SHOULD REMAIN AS ON ; EXIT & THE FOLLOWING INDICATORS SHO G VALUES WHICH WILL ; VARY WITH THE SYSTEM DISK BEING USED. THIS FOLLOWS FROM ; THE REQUIREMENT THAT ANY OVERLAY MAY ONLY BE BROUGHT ; FROM A DISK IF IT IS STORED AT THE BEGINNING OF A BLOCK .GLOBL KBI .BYTE 0,-1 ;GET COMMAND CODE & MOVE TO FIRST DELIMITER IN STRING: KBI: MOV @#V.RRES,-(SP) ;RESTORE KBL REGS. JSR R5,@(SP)+ CMP (SP)+,(SP)+ ;REMOVE CALL MOV R4,-(SP) ;SAVE FOR LATER MOV #EMT+.SAM,-(SP) ;A! REJECT IF TOO BIG MOV (SP)+,@R3 ;STORE VALUE OTHERWISE BEQ DA.ERR+2 ;... UNLESS NONE JSR R4,DA.IGM ;SAVE R4 & SET AS LIST PTR ;MONTH & DAY COUNT TABLE: .ASCII 'JAN' .BYTE 31. .ASCII 'FEB' .BYTE 28. .ASCII 'MAR' .BYTE 31. .ASCII 'APR' .BYTE 30. .ASCII 'MAY' .BYTE 31. .ASCII 'JUN' .BYTE 30. .ASCII 'JUL' .BYTE 31. .ASCII 'AUG' .BYTE 31. .ASCII 'SEP' .BYTE 30. .ASCII 'OCT' .BYTE 31. .AS" .+4 ;NEGATE IF NEC. SINCE ... NEG R2 ;... VALID STATES ARE 1/-1(*) INC R2 ;CHECK FOR THEM BNE SA.ERR ;... & SCREAM IF NOT FOUND DECB @R1 ;ADJUST ERROR CODE MOV V.MSB(R3),R2 ;ENSURE MSB. IS FREE CMP (R2)+,(R3)+ ;... & MOVE TO CSA IN SVT. MOV (R3)+,(R2)+ CLR (R2)+ MOV R0,R2 ;NOW SET MOVE POINTER SUB #22,R0 ;LEAVE CSI. COMD BLOCK MOV R1,@R2 ;COMPUTE BYTE COUNT SUB R5,(R2)+ BEQ SA.GO ;IF NONE CONTINUE LATER MOV PC,@R0 ;S#ULD BE SET: ; ; R1 = POSITIVE IF NO ERROR DETECTED; ; NEGATIVE CODE FOR ERROR OTHERWISE. ; R5 = 0 (INDICATES RECALL) ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; XXXXXXXXXXXXXXXXXXXXXXXXX ; X X ; X * NOTE * X ; X X ; XXXXXXXXXXXXXXXXXXXXXXXXX ; ; THIS ROUTINE MUST BE ASSEMBLED WITH A CORRECT ; PARAMETER TAPE BASED UPON THE SYSTEM DISK IN USE ; (AS WITH 'KBI' & ITS ASSOCIATED ROUTINES). $SSUME WILL NEED OVERLAY MOV @R5,R2 ;GET FIRST TWO COMD BYTES CLR (R5)+ ;... & LEAVE BUFFER CLEAR CMP R5,R1 ;MISSED STOP BYTE? BHI KBI.QY ;IF SO MUST BE ERROR KBI.AG: CMPB @R5,#15 ;END OF MESSAGE? BEQ KBI.GO ;IF SO, GO TO DECODE MOVB (R5)+,R4 ;SIMILARLY FOR SPACE ... CMPB R4,#40 BEQ KBI.GO CMPB R4,#54 ;... OR COMMA BNE KBI.AG ;...DENOTING END OF COMD WORD ;CHECK IF COMMAND EMBEDDED WITH INTERPRETER: KBI.GO: MOV #177401,R0 ;SET CHECK P%CII 'NOV' .BYTE 30. .ASCII 'DEC' .BYTE 31. .WORD 0 ;GET MONTH: DA.IGM: CMPB @R5,@R4  ;FIRST CHAR. HOPEFUL? BEQ DA.IMC  ;IF SO GO CHECK SOME MORE DA.IML: ADD #3,R4  ;OTHERWISE GET DAY COUNT MOVB (R4)+,R0 ;PICK UP ... ADD R0,@R3  ;ADD TO PREVIOUS VALUE TST @R4  ;AT LIST END? BNE DA.IGM DA.IME: MOV @SP,R4  ;IF SO RESTORE R4 DA.ERR: TST (SP)+  ;CLEAN UP STACK MOV (SP)+,@R3 ;RESTORE OLD DATE MOV #-3,R1  ;SET SY&AVE THIS POINT AS LINE LIMIT MOVB (R5)+,(R2)+ ;... & START SHIFT CMP R2,@R0 ;MORE ROOM?(**) BEQ SA.ERR CMP R5,R1 ;IF SO REACHED END YET? BNE .-10 DECB -(R2) ;MAKE CR = FF AS DELIMITER ;THE FOLLOWING ENSURES CSI SCAN STOP (HYBYTE = FF) ; MUST NOT THEREFORE BE MOVED!!!!!!! ASR @SP ;FINAL ADJ. TO OVLAY BLOCK ;(*) 1,0 = PROGRAM LOADED NOT STARTED, -1,-1 = ; PROGRAM STARTED BUT SUSPENDED & STOPPED. ;(**) MAX. LINE 'DDDN:FFFFFF.EEE[UUU,UUU] ; /RA:LLLLLL:HHHHHH' .GLOBL KBL .BYTE 0,-1 ;IN USE/ SHARE SWITCHES ;CHECK NATURE OF CALL & ACTION ACCORDINGLY: KBL: MOV @#V.RRES,-(SP) ;GET ORIGINAL REGS. JSR R5,@(SP)+ TST R5 ;COMMAND U/W OR DONE? BNE KB.GO ;RECALL FROM KBI - SET UP END PRINT: CMP (SP)+,(SP)+ ;REMOVE RECALL FROM STACK MOV #EMT+.SAM,-(SP) ;PREPARE FOR ERROR ... MOV PC,R3 ;... SET UP OVLAY CALL ADD #KBL-4-.,R3 ;... & COMPUTE BLOCK # REQD. MOV @R3,R0 ;... FROM DIS(ATT. FOR FOLL CMDS. MOV @#V.SVT,R3 ;GET PTR TO SVT. IN READINESS CMP R2,#"CO ;CHECK IF COMD YET IMPLEM. BEQ KBI.CO ;ACTION ACCORDINGLY IF FND CMP R2,#"ST BEQ KBI.ST CMP R2,#"WA BEQ KBI.WA BR KBI.DG ;OTHERWISE MUST GET INDEX ;COMMAND IN INDEX - WAIT TO COME FROM DISK: KBI.W8: EMT 1 ;WAIT UNTIL INDEX IN MOV @#V.RRES,@SP ;RESTORE REGS. SAVED EARLIER JSR R5,@(SP)+ ;SEARCH INDEX FOR COMMA)NTAX FAULT FLAG BR DA.IXT  ;... & LEAVE NOW ;CHECK MONTH CORRECT: DA.IMC: MOV R5,R0  ;TEST OTHER CHARS. INC R0 CMPB (R0)+,1(R4) BNE DA.IML CMPB (R0)+,2(R4) BNE DA.IML  ;GO BACK IF NO MATCH MOV R0,R5  ;CHECK DELIMITED CORRECTLY CMPB (R5)+,#'- BNE DA.IME  ;OBJECT IF NOT MOV (SP)+,R4 ;RESTORE R4 CLR -(SP)  ;PREPARE TO GET YEAR ... BR DA.IDL  ;... & GO FOR IT ;CHECK YEAR O.K.: DA.IGY: BIT #3,@SP  ;LEAP YEAR? B*(CR)' REQUIRES 31 WORDS WITH ; CSI. COMD & HDRS. THIS GIVES 33 WORDS. ;CALL CSI. TO CHECK FORMAT VALID: ; THIS AREA IS OVERWRITTEN BY CSI CMDBUF, ; FILE BLOCK & LINK BLOCK DUMMIES & OVLAY TRAN DDB SA.GO: MOV R0,-(SP) ;CALL SYNTAX CHECK EMT .CSX TST (SP)+ ;REJECT COMMAND IF ERROR BNE SA.ERR MOV #2,@R0 ;PREPARE FOR REDUCTION MOV PC,R2 ;... OUTPUT SPEC REQD. MOV R2,R5 ;THIS CODE USED AS LINK .. +K INFO FOR THIS ADD #KBI.OS,R0 COM R1 ;ERROR MESSAGE REQD.? BPL KB.IXT+4 MOV -(R3),R0 ;IF NOT GET PTR RESET VALUE MOV R3,R2 ;ADJUST PTRS AS REQD LATER BR KB.OXT ;GO TIDY UP ;COMMAND JUST COMING IN - CHECK IN OR OUT: KB.GO: MOVB (R5)+,-(SP) ;INPUT OR OUTPUT? BEQ KB.PR ;GO ELSEWHERE IF LATTER ;COMMAND INPUT OPERATIONS: TST -(R4) ;SET PTR TO KBD STATUS CMPB -(R5),@PC ;INPUT = CTRL/C? ,ND: MOV @R0,R4 ;GET START OF INDEX MOV (SP)+,R0 ;BUILD BLOCK NOW REQD. ADD (R4)+,R0 CMP (R4)+,R2 ;COMMAND THIS ONE? BEQ KBI.XT ;IF SO GO GET RTN TO DO IT BLO .-6 ;OTHERWISE TRY AGAIN KBI.QY: MOV #-1,R1 ;IF NOT THERE, MUST BE ERROR 0 BR KBI.QZ ;DDB FOR INDEX COLLECTION: .WORD 0,0 ;REQD. FOR DVR Q .WORD 0 ;SET TO SYSTEM DSK ADDRESS .WORD 0 ;BUSY FLAG SET WHEN CALL MADE .WORD 10 ;SETS R1 AS DVR PTR .WORD 160000 ;SET TO BLOCK REQ-NE DA.IYC CMP @R3,#60. ;IF BEYOND FEB 29 ... BLE .+4 INC @R3  ;... ALLOW EXTRA DAY DA.IYC: MOV #100.,R1 ;ADJUST YEAR SO THAT ... ADD #30.,@SP ;... '70' BECOMES '00' CMP @SP,R1 BLT .+6 SUB R1,@SP BEQ DA.ERR  ;'70' ITSELF CANNOT BE! CMP @SP,R1  ;NOR CAN '170' BGE DA.ERR ADD #1000.,@R3 ;O.K., ADD YEAR VALUE DEC @SP BNE .-6 CMP (SP)+,(SP)+ ;WHEN DONE, CLEAN UP STACK DA.IXT: CLR R5  ;SET DONE FLAG INC DA.ND1+4 ;RECALL KBL BR D.SUB #12,R5 ;... & FILE BLOCKS ASR .-2 ;ALLOW 4 WORDS FOR SWITCH MOV R5,-(SP) ;PRECEDE FILE BLOCK ... MOV (SP)+,-(R5) ;... WITH CSI. LIST MOV R2,-(R5) MOV R0,-(R5) MOV R5,-(SP) ;CALL INTERPRETER EMT .CSM DEC (SP)+ ;ONLY VALID RETURN =1 BNE SA.ERR ;NOW CHECK SWITCH VALUES O.K.: ADD #10,R2 ;MOVE TO SWITCH WD CNT ASL (R2)+ ;CONVERT TO BYTES BEQ SA.XT ;IF NONE WILL USE DEFAULT ADD -(R2),R2 ;MOVE TO SWITCH NAME CMP @R2,#"RA ;REJEC/BEQ KB.CC ;****USED AS LITERAL***** CMPB @R5,#25 ;... OR = CTRL/U BNE KB.TRO KB.CC: MOVB #136,(R2)+ ;ECHO CTRL/C OR U .... MOVB @R5,@R2 ;... AS ^C OR ^U BISB #100,(R2)+ MOV R5,R1 ;IF SO SET/RESET INPUT PTR MOVB @R0,(R1)+ ;RESTART COMMAND? BNE KB.LD MOVB 4(R4),@R0 ;NO - SAVE PRINTER STATUS ... INC @R0 ;(MAYBE PROGRAM IS USING) KB.LD: MOVB #15,(R5)+ ;REPLACE WITH RETURN CLR @R4 ;STOP INTERRUPTS FOR NOW CMP R1,R5 ;JUST STARTING LINE0D. .WORD KBI.CT+2-. ;SET TO BUFFER ADDRESS .WORD -62. ;SETS TRANSFER COUNT .WORD 4 ;READ ONLY REQD. .WORD V.XITA ;SET TO RETURN ON TFR DONE ;TABLE FOR DETERMINATION OF COMMAND INDEX BLOCK ; OVERLAID FROM HERE BY THAT INDEX BLOCK KBI.CT: .WORD "ZZ ;INDEX TABLE .WORD -1,-1,-1 ;SEARCH INDEX TABLE ABOVE: KBI.DG: MOV #KBI.CT-.-6,R0 ;GET ADDRESS FOR INTERNAL DDB ADD PC,R0 MOV R0,R4 ;ALSO POINT1A.ND1 .=.+KBI.DA+376-. DA.ND1: .=.+KBI.DA-2+KBI.OZ-. .EOT ;PART 2  DATE TYPE OUT: ; ; ON CALL VALID REGISTERS ARE:- ;  R2 = 10. ;  R3 = ADDRESS OF DATE STORE IN SVT. ;  R4 = ADDRESS OF TELEPRINTER BUFFER ; ON EXIT THE FOLLOWING ARE RELEVANT:- ;  R1 = POSITIVE VALUE (NO ERROR POSSIBLE) ;  R4 = AS ON ENTRY ;  R5 = 0 (DONE FLAG) .BYTE 0,-1  ;SWITCHES FOR NEW OVERLAY ;SET UP CONVERSION: KBI.DX: MOV @#V.RRES,-(SP) ;RESTORE REGS. JSR 2T IF INCORRECT BNE SA.ERR SA.CVT: MOV -(R2),-(SP) ;CALL OCTAL CONVERTER MOV #4,-(SP) EMT .CVT BVS SA.ERX ;VALUE TOO BIG! MOV (SP)+,@R2 ;STORE CONVERSION TST (SP)+ ;IGNORE POINTER DEC @R0 ;DONE TWO VALUES? BNE SA.CVT ASLB @R1 ;IF SO RESET ERROR CMP @R2,@R3 ;OBJECT IF 'HIGH' ABOVE CORE BHI SA.ERR CMP (R2)+,(R2)+ ;... OR 'LOW' ABOVE 'HIGH' BLOS SA.ERR ;... WRONG WAY ABOUT 3? BEQ KB.CXT ;... OR FINISHED? CLR R1 ;NO - NO VALID INPUT (*) BR KB.UXT ;SO FORCE NEW START ; ;(*) R1 = R5 ONLY IF COMMAND HAS JUST BEEN SET U/W OR ; WHEN [RETURN] HAS BEEN INPUT AND VALID DATA REMAINS ; AFTER COMMENT HAS BEEN ERASED. (SEE KB.CRN) ;INPUT UNDERWAY ALREADY - CHECK FOR SPECIAL CASES: KB.TRO: INCB @R5 ;MAKE RUBOUT GO NEG. CMPB @R5,@R1 ;IF PREV CHAR ALSO R/O, ... BPL .+6 ;BUFFER SH4S TO INDEX AREA TST @R4 ;SEARCH TABLE FOR BLOCK REQD BMI KBI.QY ;IF NOT FND, MUST BE ERROR CMP R2,(R4)+ BHI .-6 SUB R0,R4 ;GET RELATIVE BLOCK FROM SRCH ;SET UP DISK TRANSFER IF SUCCESSFUL: ADD @#V.XIT,-(R0) ;SET TO USE SAM RETURN CMP -(R4),-(R0) ;ADJ BLK FOR VARYING SYS DISK ADD #KBI.OS,R4 ADD KBI-4,R4 ;...& BUILD ACTUAL MOV R4,-(SP) ;SAVE RESULT FOR LATER CMP -(R0),-(R0) ;GO TO BUFFER ADDR IN DDB MOV @#V.RSAV,-(SP) ;SAVE REGS NOW. JSR R55R5,@(SP)+ CMP (SP)+,(SP)+ INC DA.ND2+4 ;SET UP KBL RECALL JSR R3,DA.OGY ;SAVE DATE PTR ...    ;... & SET ONE TO FOLL. LIST ;MONTH & DAY COUNT TABLE FOR PRINT: .WORD 666.  ;MOVES INTO DEC RANGE! .ASCII 'DEC' .BYTE 30. .ASCII 'NOV' .BYTE 31. .ASCII 'OCT' .BYTE 30. .ASCII 'SEP' .BYTE 31. .ASCII 'AUG' .BYTE 31. .ASCII 'JUL' .BYTE 30. .ASCII 'JUN' .BYTE 31. .ASCII 'MAY' .BYTE 30. .ASCII 'APR6;INPUT O.K. - SET UP CALL PART 2: SA.XT: DECB @R1 ;RESET ERROR CODE MOV #20,-(SP) ;TRY & GET BUFFER MOV @#V.GTB,-(SP) JSR R5,@(SP)+ MOV (SP)+,@R5 ;SAVE START ... BEQ SA.ERR ;... UNLESS NONE AVAILABLE MOV V.DDL-4(R3),R0 ;GET SYS DISK IN DDL CLR (R2)+ ;SET DDB AFTER LINK BLOCK CMP (R2)+,(R0)+ ;CLEAR DVR Q LINKAGE MOV @R0,(R2)+ ;STORE SYS DISK DVR ADDR MOV R2,R0 ;SAVE DDB POINTER MOV R0,(R2)+ ;SET BUSY FLAG FOR W8 CHK MOV R5,(R2)+ ;SAV7OWS IT, & ... MOVB #134,(R2)+ ;NEG COMPARE MEANS PRINT \ TSTB @R5 ;NOW CHECK FOR RUBOUT ... BMI KB.RO DECB @R5 ;IF NONE, RESTORE INPUT CMPB @R5,#15 ;... & LOOK FOR RETURN BEQ KB.CRN DEC R0 CMP R1,R0 ;ROOM IN BUFFER? BEQ KB.IXT ;IF NOT IGNORE THIS BYTE ;NORMAL CHARACTER - STORE IN BUFFER: MOVB (R5)+,(R1)+ ;STORE IN INPUT BUFFER KB.CXT: CLRB @R1 ;FOR NO RUBOUT CLEAR NEXT BYTE KB.UXT: MOVB -(R5),(R2)+ ;ECHO CHAR. OR REPLACEMENT KB.RXT: TSTF,@(SP)+ ADD R0,@R0 ;STORE BUFF ADDR. REQD. ASR R4 ;ADJUST BLOCK INFO BIC -(R0),R4 MOV R4,@R0 ;... & STORE ALSO MOV -(R0),R1 ;GET DVR RTN PTR MOV PC,-(R0) ;SET DDB BUSY MOV V.DDL(R3),R3 ;GET SYS DISK DVR ADDR CMP -(R0),(R3)+ ;... & STORE IT MOV @R3,(R0)+ MOV R0,-(SP) ;SIMULATE LINK BLOCK MOV SP,R2 MOV R2,-(SP) ;... PREPARE FOR WAIT MOV @#V.CDB,-(SP) ;... & GO TO DRIVER JSR PC,@(SP)+ BR KBI.W8 ;WAIT UNTIL TFR DONE G' .BYTE 31. .ASCII 'MAR' DA.LYR: .BYTE 28. .ASCII 'FEB' .BYTE 31. .ASCII 'JAN' .BYTE 0 .ASCII 'XXX '  ;GIVES DUMMY MONTH IF ? VALUE ;GET YEAR COMPONENT: DA.OGY: MOV #69.,R5  ;SET YEAR BASE MOV @(SP)+,R0 ;GET DATE FROM SVT. INC R5  ;BUILD YEAR SUB #1000.,R0 BCC .-6 BIT #3,R5  ;LEAP YEAR? BNE DA.OGM INCB DA.LYR  ;IF SO ADJ. FEB COUNT DEC R0  ;... & REMAINDER ;DETERMINE MONTH: DA.OGM: MOV (R3)+,R1 ;AHE TABLE POINTER MOV (SP)+,(R2)+ ;STORE SAVED BLOCK NO. MOV @R5,(R2)+ ;ALSO BUFFER START MOV #-256.,(R2)+ ;SET WORD COUNT ... MOV #4,(R2)+ ;... & READ FUNCTION MOV @#V.XIT,@R2 ;USE SAM. EXIT ... SUB #22,@R2 ;... AS COMPLETION RTN MOV R0,-(SP) ;SAVE DDB POINTER MOV SP,R2 ;... & POINTER TO IT ... MOV R2,-(SP) ;... FOR .WAIT MOV #10,R1 ;SET UP FOR DVR TFR MOV @#V.CDB,-(SP) ;... & GO TO DVR JSR PC,@(SP)+ EMT .WAIT ;WAIT TILL TFR COMPLETE EB @R2 ;END OF ECHO BUFFER REACHED? BPL .+4 CLR @R4 ;IF SO STOP KBD INT FOR NOW CMP (R4)+,(R4)+ ;BUMP HWR PTR ... MOVB (R4)+,(R4)+ ;... TO CHECK PRINTER BUSY BMI KB.PR ;IF NOT ECHO NOW BR KB.IXT ;OTHERWISE WAIT ITS INTERRUPT ;CHARACTER DELETION: KB.RO: MOVB -(R1),(R2)+ ;SET UP DELCHAR ECHO BPL .+4 ;... UNLESS NO MORE BICB (R1)+,-(R2) ;IN WHICH CASE ADJUST PTR MOVB @R5,@R1 ;SET R/O SWITCH, LEAVING ECHO BR KB.RXT ;... & EXIT ;END OF INPU"D """"@DD""""""DDDDDDDDDDD """""""""""""""DDDDD@DDDDDDDDDDDD"""""""""""""""""""""""@DDDDDD@D@DDDDDDDDDD"""""""""@DADDB CE:d4dE:d+ժE4diE4dVE(4d [Ev4d EE4dZ ~E`^4d_wEH 4dmE(F4d{Eh~4d ES4d E8 4d%'EH4dW4dBxe4d.,8^4d&f}4d* J|8^4d+;VqM4d?[!"4dNZe"4d^nz4d_Z&4dr-"4dz4dxe4d $D Bcc8a ͋,L w:B ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * BIT LINE: KB.CRN: MOVB #73,@R1 ;STORE [;] AS STOPPER MOV R5,-(SP) ;SAVE START OF BUFFER CMPB (R5)+,@R1 ;LOOK FOR FIRST [;] BNE .-2 ;... TO REMOVE COMMENT MOV R5,R1 ;HOLD ITS POSITION CMPB -(R5),-(R5) ;AT START OF BUFFER? CMP R5,(SP)+ BEQ KB.LD ;IF SO OMIT NEXT STEP (*) INC R5 ;BUMP CTRL PTR .... BR KB.LD ;.. FOR APPROP. EXIT ; (*) MAKES R5 AND R1 UNEQUAL DURING EXIT SEQUENCE & ; THEREFORE FORCES COMMAND MODE TERMINATION. J;IMMEDIATE ROUTINEW$,GLSO OVERLAID BY INDEX) KBI.ST: NEG R2 ;SET STOP SWITCH KBI.WA: ADD #401-177401,R0 ;FOR WAIT U/P IN CORE & RUN KBI.CO: ADD #V.MUS,R3 ;PTR TO MON/USER SW IN SVT. MOV #-2,R1 ;ASSUME MAYBE INVALID ERROR CMP R0,(R3)+ ;CHECK WITH PATTERN SET ABOVE BNE KBI.QZ MOV V.WRA-V.MUS-2(R3),R0 ;SWITCH ADDRESSES ... MOV 26(SP),V.WRA-V.MUS-2(R3) ;...USER RTN FOR WT LP MOV R0,26(SP) ;...OR VICE VERSKDJUST REMAINDER TO YEAR RANGE ADD R1,R0  ; (MAYBE DECEMBER DATE) BGT DA.OPD  ;POSITIVE RESULT GIVES DAY ADD #3,R3  ;BUMP LIST PTR OTHERWISE MOVB (R3)+,R1 ;GET NEXT DAY COUNT BNE DA.OGM+2 ;TRY AGAIN IF NOT AT LIST END CLR R0  ;OTHERWISE MAKE DAY ZERO ;GET DAY & OUTPUT: DA.OPD: MOV #35057,R1 ;SET ASCII BASES FOR BOTH BYTES INC R1  ;BUILD FIRST DIGIT SUB R2,R0 BCC .-4 CMPB R1,#72  ;FOR YEAR REDUCE 100 TO 0 BLT .+4 SUBL MOV (SP)+,R0 ;GET BACK DDB POINTER MOV 2(R0),R5 ;... & TABLE PTR MOV (R5)+,R0 ;GET START OF PART 2 JSR PC,40(R0) ;... & GO TO IT ;ERROR EXIT: SA.ERX: CMP (SP)+,(SP)+ ;CLEAN UP STACK SA.ERR: TST (SP)+ ;... AS NECESSARY CLR R5 ;SET DONE FLAG MOVB @R1,R1 ;... & ERROR CODE BR SA.ND .=.+KBI.SA+376-. SA.ND: .=.+KBI.SA-2+KBI.OZ-. .EOT M;PRINTER CALL - CHECK IF LINE-END: KB.PR: CMPB (R3)+,#15 ;JUST PRINTED RETURN? BNE KB.MOR MOVB #12,@R4 ;IF SO FOLLOW WITH LINEFEED MOV #EMT+.KBI,@SP ;SET UP FOR KBI CALL KB.OXT: MOVB #'.,-(R3) ;... OR LINE STARTING CMP R5,R1 ;NOW CHECK WHICH WANTED (*) BLT KB.IXT+4 ;O.K. CALL KBI BEQ KB.MXT ;... OR GET COMMAND NOW MOVB #'$,@R3 ;OTHERWISE MAYBE MACHINE WAIT MOV 6(SP),R1 ;RESET INPUT POINTER ... CMP (R1)+,(RNA NEGB -(R3) ;SHOW PROG SUSPENDED MOV R2,R1 ;STOP? (ALSO CLEARS ERROR)* BPL KBI.QZ ;IF NOT TAKE EXIT RESET ;OTHERWISE STOP ALL I/O NEGB -(R3) ;...& SHOW PROG STOPPED ALSO KBI.QZ: CLR R5 ;SET DONE FLAG INC @SP ;MAKE RECALL TO KBL KBI.XT: MOV (SP)+,KBI.ND+4 ;... FREEING SWAP AREA MOV (SP)+,R4 ;RESTORE ENTRY VALUE BR KBI.ND ;... & EXIT AS NEC. ; ;* EXCEPT FOR STOP - CODE OVERLARGE SO FORCES CR-LF PRINT ; ON EXIT (SEE LISTING FOR 'KBL'). THIO R2,R1 JSR PC,DA.OPT ;OUTPUT FIRST BYTE SWAB R1  ;GET SECOND BASE ... ADD R0,R1  ;... & BUILD SECOND DIGIT JSR PC,DA.OPT ;PRINT IT MOV R5,R0  ;GET YEAR VALUE FOR LATER BEQ DA.ODN  ;... UNLESS ALREADY DONE MOV #4000,R5 ;SET COUNTER FOR NEXT DA.OPM: MOV #'-,R1  ;PRINT DELIMITER JSR PC,DA.OPT ASL R5  ;PRINTED MONTH DELIMITER BCS DA.OPD  ;IF SO GO FOR YEAR BMI DA.OPM  ;IF MONTH DONE DO DELIMITER MOVB (R3)+,R1 ;OTHERWISE DO MONTH NOW BRP;SAVE PROCESSOR PART 2: ; ;DATA LINKS: ; A) PROGRAM STATE SAVE STORE: .WORD 0 ;R0 SET HERE ON ENTRY ; B) LINK BLOCK: .WORD 0,0 .RAD50 'SAV' .WORD 1,0 ; C) FILE BLOCK: .WORD 0,2 .RAD50 'SAV' .RAD50 'E' .RAD50 'LDA' .WORD 0,200 ; C) LINE BUFFER: SA.LIN: .WORD 200,1,26 ;LINE ITSELF OVERLAYS FOLLOWING CODE ; ;MOVE LINK DATA OVER FROM KEYBOARD SWAP BUFFER: MOV @#V.SVT,R3 ;RESET SVT. POINTER MOV V.MUS(R3),(R0)+ ;SAVE PROGRAM STATE MOV Q1)+ ;... USING SAVED MARKER MOV @#V.SVT,R5 ;CHECK IF RETURN ADDR ... CMP V.WTL(R5),@24(SP) ;... IS SET TO SVT WAIT LP BEQ KB.MXT ;IF SO ACCEPT NEW INPUT ;NO MORE ECHO CURRENTLY - CLEAN UP: CLR R1 ;OTHERWISE CLEAR FLAG MOV #100,-(R4) ;RE-ENABLE INTERRUPT KB.OMT: MOV R0,R2 ;RESET OUTPUT POINTERS MOV R0,R3 INC R2 ;... ALLOWING END CHECK MOVB @PC,@#177560 ;REENABLE KBD INTS BR KB.IXT ;LINE UNDERWAY - CONTINUE IF NECESSARY: KB.MOR: CMP R3,R2 ;MORE RS IS ; NECESSARY BECAUSE RESET STOPS OUTPUT OF LINE-FEED ; WHICH TERMINATES ORIGINAL COMMAND INPUT ; ;MISCELLANEOUS DEFINITIONS: V.SVT=40 V.XIT=42 V.RSAV=44 V.RRES=46 V.CDB=50 V.MUS=16 V.WRA=30 V.DDL=50 V.XITA=-22 .SAM=30 KBI.ND: .=.+KBI-2+KBI.OZ-. .EOT ;COMMAND INDEX BLOCKS ASSEMBLE HERE: ; INDEX FORMAT:- EACH ENTRY IS 2 WORDS ; AS FOLLOWS:- ; WORD 1: RELATIVE BLOCK FACTOR TO ENABLE ; COMPUTATION OF ACTUAS DA.OPM+4 ;PRINT SUBROUTINE: DA.OPT: TSTB -2(R4)  ;WHEN PRINTER FREE ... BPL .-4 MOVB R1,@R4  ;... PRINT BYTE RTS PC  ;... & EXIT .=.+KBI.DX+376-.-14 DA.ODN: MOV #5215,R1 ;FINALLY RESTORE CARRIAGE JSR PC,DA.OPT SWAB R1 BPL .-6 DA.ND2:    ;DROP THRU TO EXIT .=.+KBI.DX-2+KBI.OZ-. V.RRES=46 V.DAT=32 .END ;DETERMINE MONTH: DA.OGM: MOV (R3)+,R1 ;ADJUST REMAINDER TO YEAR RANGE ADD R1,RO  ; (MAYBE DECEMBER DATE) BGT DA.OPT#401,V.MUS(R3) ;SIMULATE RUNNING PROGRAM TST (R0)+ ;LEAVE LINK ERROR RTN MOV #5,R2 ;SET INCR TO DEVICE NAME MOV R0,R4 ;SET LINK PTR HERE ... ADD R2,R4 ;... AT DEV NAME ADD (R5)+,R2 ;... & IN KSB. MOVB (R2)+,(R4)+ ;MOVE OVER UNIT TST @R2 ;ANY DEVICE GIVEN? BNE .+6 MOV @V.DDL(R3),@R2 ;IF NOT ASSUME SYS DISK MOV (R2)+,(R4)+ ;... & SET IN LINK BLK ;MOVE FILE DATA OVER: MOV PC,@R4 UECHO WAITING? BEQ KB.OMT MOVB (R3)+,@R4 ;IF SO DESPATCH IT KB.MXT: DEC R3 ;SIT ON CHAR ACTIONED MOV #100,-(R4) ;ENABLE PRINTER INTS KB.IXT: MOV #RTI,@SP ;TAKE NORMAL EXIT MOV (SP)+,KB.ND1+4 ;... DROPPING THRU TO DO SO ; ;(*) IF LINE JUST STARTED, R1 = R5; IF COMMAND WAITING ; FOR ACTION, R1 > R5; OTHERWISE R1 CAN BE 0 ; INDICATING NO VALID INPUT THIS TIME OR ; NEGATIVE IF JUST RETURNED FROM COMMAND ACTION, ; (IN WHICH CASE R5 = 0). V.SVT=40 V.RRES=46 V.WTL=60 .SAVL BLOCK FROM ONE NOW IN ; WORD 2: 2-BYTE ASCII COMMAND ; ; ORDER ESSENTIALLY ALPHABETIC ON 2ND LETTER OF COMMAND ; ; MAXIMUM ENTRIES PER INDEX = 31 (1 64-WORD BLOCK) ; CURRENTLY MAY BE UP TO 4 INDICES. ; KBI.I1: .WORD KBI.XA,"DA ;STARTS NEXT BLOCK .WORD KBI.O2,"SA .WORD KBI.OS+KBI.OX,"EC .WORD KBI.OS,"OD .WORD KBI.OS,"BE .WORD 0,"RE ;ON SAME BLOCK AS "BE .WORD KBI.O3,"KI .WORD KBI.OS,"TI .WORD -KBI.OS-KBI.O3-KBI.OS-KBI.OS,"EN ;(WITH "EC) .WORD KBI.OWD  ;POSITIVE RESULT GIVES DAY ADD #3,R3  ;BUMP LIST PTR OTHERWISE MOVB (R3)+,R1 ;GET NEXT DAY COUNT BNE DA.OGM+2 ;TRY AGAIN IF NOT AT LIST END CLR R0  ;OTHERWISE MAKE DAY ZERO ;GET DAY & OUTPUT: DA.OPD: MOV #35057,R1 ;SET ASCII BASES FOR BOTH BYTES INC R1  ;BUILD FIRST DIGIT SUB R2,R0 BCC .-4 CMPB R1,#72.  ;FOR YEAR REDUCE 100 TO 0 BLT .+4 SUB R2,R1 JSR PC,DA.OPT ;OUTPUT FIRST BYTE SWAB R1  ;GET SECOND BASE ... ADD R0,R1  ;... & BUIX ;SET ERROR RTN IN FILE BLK ADD #SA.OPN-.,(R4)+ ; (NO FILE FOR DELETE) TST (R4)+ ;SKIP HOW OPEN CODE MOV R4,R1 ;SAVE FILE BLOCK PTR MOV @R5,R5 ;GET THAT FOR KSB. TST @R5 ;ANY FILE NAME GIVEN? BNE SA.MFL CMP (R5)+,(R4)+ ;IF NOT LEAVE DEFAULT CMP (R5)+,(R4)+ CMP (R5)+,(R4)+ BR SA.MUC SA.MFL: MOV (R5)+,(R4)+ ;OTHERWISE MOVE NAME GIVEN MOV (R5)+,(R4)+ MOV (R5)+,(R4)+ DECB SA.DSW ;STOP AUTO-DELETE SA.MUC: MOV (R5)+,(R4)+ TST (R4)+YM=30 .KBI=33 .=.+KBL+376-. KB.ND1: .=.+KBL-2+KBI.OZ-. ;KEYBOARD LISTENER - PART 2 ; ; CALLED BY PART 1 IF ANY COMMAND PROCESSOR ; RECALLS KBL FOR ERROR DIAGNOSIS, AS SHOWN ; BY A NEGATIVE CODE SET IN R1. ON ENTRY TO ; THIS PART, R1 HAS BEEN COMPLEMENTED. AN ; APPROPRIATE MESSAGE WILL BE PRINTED ; AT THE CONSOLE, BASED UPON THIS CODE. THE ; PRINT LOOP WILL RETAIN CONTROL OF THEPDP ; 11 UNTIL COMPLETION OF THE MESSAGE 3+KBI.O3+KBI.OS,"MO .WORD -KBI.O3-KBI.O3-KBI.OS,"PR ;(WITH "EC) .WORD KBI.O3+KBI.O3+KBI.O2,"AS .WORD KBI.O3,"DU .WORD KBI.O3,"ZZ KBI.O2=KBI.OS+KBI.OS KBI.O3=KBI.OS+KBI.OS+KBI.OS ; .=.+KBI.I1+KBI.BS-. ;NEXT INDEX WOULD COME HERE (SUCCESSIVE BLOCKS REQUIRED) ;THE FOLLOWING PARAMETER MUST BE ADJUSTED IF MORE:- KBI.XA=2 .END [LD SECOND DIGIT JSR PC,@(SP)+ ;PRINT IT MOV R5,R0  ;GET YEAR VALUE FOR LATER BEQ DA.ND2-2 ;... UNLESS ALREADY DONE MOV #4000,R5 ;SET COUNTER FOR NEXT DA.OPM: MOV #'-,R1  ;PRINT DELIMITER JSR PC,@(SP)+ ASL R5  ;PRINTED MONTH DELIMITER BCS DA.OPD+2 ;IF SO GO FOR YEAR BMI DA.OPM  ;IF MONTH DONE DO DELIMITER MOVB (R3)+,R1 ;OTHERWISE DO MONTH NOW BR DA.OPM+4 ;PRINT SUBROUTINE: DA.OPT: TSTB -2(R4)  ;WHEN PRINTER FREE ... BPL .-4 MOVB R1,R4  \ ;LEAVE PROTECT CODE ;PREPARE FIRST LINE: CMP (R3)+,(R3)+ ;MOVE TO CSA IN SVT. TST (R2)+ ;ANY RANGE GIVEN? BNE SA.SUL MOV (R3)+,(R2)+ ;IF NOT USE TOP OF CORE MOV @R3,@R2 ;... & PROG LOAD POINT CMP -(R3),-(R2) ;RESET POINTERS SA.SUL: MOV (R2)+,-(SP) ;SAVE UPPER LIMIT MOV (R4)+,R5 ;COMPUTE LINE END ADD R4,R5 CMP (R4)+,(R4)+ ;SKIP OTHER HDR WORDS MOV @R2,(R4)+ ;SET DUMMY LOAD ADDR. ]AND WILL ; THEN RECALL PART 1 TO CLEAN UP (INCLUDING ; OUTPUT OF TERMINAL CR-LF). ; ; CURRENTLY THE FOLLOWING CODES HAVE BEEN ; IMPLEMENTED (AS COMPLEMENTED):- ; 0 = ILLEGAL COMMAND [DOESN'T EXIST] ; 1 = INVALID COMMAND [IMPROPER WHEN REQUESTED] ; 2 = FAULTY SYNTAX ; 3 = ILLEGAL DEVICE ; 4 = FILE NOT AVAILABLE ; 5 = ILLEGAL ADDRESS ; 6 = INSUFFICIENT CORE TO ALLOW BUFFER ALLOCATION ; ; APART FROM R1, THE ONLY VALID REGISTER ; CONTENTS PASSED ON PART 1 ARE R^;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C .TITLE KBI.KB ;GENERAL UTILITES FOR TERMINAL DEVICES: ; ; BY MEANS OF A COMMAND OF THE FORM:- ;  (COMMAND)[,DEVNAME] ; THE USER WILL CURRENTLY HAVE AVAILABLE ; THE FOLLOWING FACILITIES:- ;  A) EC[HO] - SUPPRESSION OF PRINTING ; OF KEYBOARD ECHO (1ST ENTRY) OR ITS RESTORATION ; (2ND ENTRY) ;  B) PR[INT] - SUPPRESSION OF PRINTER OUTPUT IN ; ITS OWN WRITE (1ST ENTRY) OR ITS RESTORATION ; (2ND E;... PRINT BYTE JSR PC,@(SP)+ ;... & EXIT BR DA.OPT  ;IF COME BACK GO AGAIN .=.+KBI.DX+374-. CMP (SP)+,(SP)+ ;CLEAN UP STACK & EXIT DA.ND2: .=.+KBI.DX-2+KBI.OZ-. V.RRES=46 V.DAT=32 .END `MOV #3401,(R4)+ ;SET COMD CODE MOV @R2,(R4)+ ;MOVE IN LOAD POINT MOV (SP)+,@R4 ;... & COMPUTE SIZE ADD #2,@R4 SUB @R2,(R4)+ ADD #16,R3 ;GO TO TRANSFER ADDR IN SVT. MOV (R3)+,(R4)+ ;MOVE INTO LINE ... MOV (R3)+,(R4)+ ;MOVE IN ODT START CLR (R4)+ ;ASSUME PROGRAM ABSOLUTE ADD #14,R3 ;MOVE TO PROGRAM NAME MOV (R3)+,(R4)+ MOV (R3)+,(R4)+ MOV #2,(R4)+ ;NO MONITOR REQUESTS FOLLOW CLR @R4 a4 (TPB ; ADDRESS) & R5 (0). ON EXIT THESE WILL ; BE UNCHANGED. R1 WILL BE POSITIVE. ; .BYTE 0,-1 ;IN USE/NO SHARE SW. ;SET UP MESSAGE PRINT: KBL.EP: MOV @#V.RRES,-(SP) ;RESTORE PART 1 REGS. JSR R5,@(SP)+ CMP (SP)+,(SP)+ ;CLEAN UP STACK ASL R1 ;MAKE CODE 8 BYTE INCR. ASL R1 ASL R1 ;THEN SAVE IT & ... JSR R1,KB.EPG ;... SET MESSAGE PTR ;ERROR MESSAGES: KB.EMS: .ASCII 'ILL CMD' ;CODE 0 bNTRY) ;  C) EN[D] - FLAGGING END OF DATA INPUT (WILL ; ALSO BE PERMITTED FOR TAPE-READER ON ASR33) ; (IN ALL CASES, THE DEFAULT ASSUMPTION FOR DEVICE ; WILL BE 'KB') ; ; THE COMMAND WILL BE ACCEPTED AS LONG AS THE ; DEVICE IS LEGAL, I.E. IT EXISTS AND IS A TERMINAL ; TYPE DEVICE (EXCEPT AS NOTED ABOVE), AND ALSO ; ITS DRIVER MUST BE IN CORE AT THE TIME ; THE COMMAND IS RECEIVED. THE PROCESSING ROUTINE ; WILL SET AN APPROPRIATE FLAG IN A BIT WITHIN THE ; TABLE AT THE START OF THE c;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C ; .TITLE KBI.OD ;DEBUG PROCESSOR VERSION 1 ; ; PROVIDES THE FACILITY FOR RECALL TO A DEBUG ; PROGRAM LINKED TO A RUNNING USER PROGRAM & ; CURRENTLY SHARING CORE WITH IT. ; ;COMMAND FORMAT: ;  OD[T][,R OR ,K] ; ; THE PARAMETER OR ITS ABSENCE WILL SIGNIFY ; THE POINT OF ENTRY INTO THE DEBUG PROGRAM:- ;  (NIL) = START ;   R = START+2 ([R]EMOVE BREAKPOINTS) ;   K = START+4 ([K]EEP BRd;RELEASE KEYBOARD SWAP BUFFER: MOV (SP)+,R4 ;GET KSB. EXIT ADDRESS ADD #SA.ND-SA.ERX,R4 ;... SAVED ON ENTRY CMP (SP)+,(SP)+ ;IGNORE KBL RETURN MOV (SP)+,R3 ;GET PTR TO KBL SAVE AREA CLR -(SP) ;RETURN WITH PRL DROPPED MOV R4,-(SP) ;SAVE KSB EXIT MOV #RTI,4(R4) ;CAUSE RETURN HERE MOV R3,R4 ;CLEAR KBL PTRS ADD #112,R4 ; = OUTBUFF MOV R4,-(R3) CLRB (R4)+ ; (REMOVES TP STATUS) MOV R4,-(R3) CLR -(R3) ;NO INPUT U/W NOW MOV @R2,Re.BYTE KB.ESC .ASCII 'INV CMD' ;CODE 1 .BYTE KB.ESC .ASCII 'SYN ERR' ;CODE 2 .BYTE KB.ESC .ASCII 'ILL DEV' ;CODE 3 .BYTE KB.ESC .ASCII 'NO FILE' ;CODE 4 .BYTE KB.ESC .ASCII 'ILL ADR' ;CODE 5 .BYTE KB.ESC .ASCII 'NO CORE' ;CODE 6 .BYTE KB.ESC KB.ESC='!+200 ;DO MESSAGE PRINT: KB.EPG: ADD @SP,R1 ;USE CODE TO ADJUST PTR MOV #5015,R3 ;SET CR-LF CONSTANT CMP (SP)+,#KB.EPG-KB.EfDRIVER; THE DRIVER WILL ; THEN TAKE THE NECESSARY ACTION WHEN REQUIRED. ; THE COMMAND WILL NOT HOWEVER BE ACCEPTED IF ; NO PROGRAM HAS BEEN LOADED. ; ;ON ENTRY FROM THE KEYBOARD INTERPRETER, RELEVANT REG. ; CONTENTS (ON TOP OF THE STACK) WILL BE:- ;  R1 = END OF COMMAND INPUT ;  R2 = COMMAND CODE (1ST TWO BYTES) ;  R5 = NEXT INPUT BYTE FOR PROCESSING ; ;ON EXIT (VIA KBL RECALL), R5 WILL BE CLEARED TO SHOW ; COMMAND PROCESSING COMPLETE, R4 WILL BE UNCHANGED ; R1 WILL CONTAIN A PgEAKPOINTS) ; THE COMMAND WILL BE REJECTED IF THERE IS NO USER ; PROGRAM IN CORE OR THE DEBUG PROGRAM IS ABSENT ; OR IF THE INPUT FORMAT IS INVALID. ; ;ON ENTRY FROM THE KEYBOARD INTERPRETER, VALID REG. ; CONTENTS (ON TOP OF STACK) ARE:- ;  R1 = END OF INPUT STRING ;  R3 = POINTER TO SVT. ;  R4 = POINTER TO TPB. ;  R5 = NEXT INPUT BYTE FOR PROCESSING ; ;ON EXIT TO THE DEBUG PROGRAM REGISTERS AND THE STACK ; WILL BE RESTORED TO THEIR STATE PRIOR TO RECEIPT ; OF THE COMMAND. Ah3 ;SAVE LOAD ADDRESS MOV -(R2),R2 ;... & TOP OF SAVE AREA JSR PC,@(SP)+ ;GO DO CLEAR KSB. MOV @PC,@#177560 ;NOW ALLOW KBD INTS AGAIN ;PREPARE FILE FOR TRANSFER: MOV R0,-(SP) ;INIT DATASET EMT .INIT SA.DSW: BR .+4 ;AUTO-DELETE 'SAVE.LDA' BR SA.OPN ;... BUT NOT ANY OTHER MOV R1,-(SP) ;DO DELETE MOV R0,-(SP) EMT .DLETE SA.OPN: ADD #SA.OER-.,-4(R1) ;RESET ERROR EXIT MOV R1,-(SP) ;FAILiMS ;IF OVERSIZE ... BLO KB.EPS ADD #4,KB.EPS+2 ;... OUTPUT CR-LF ONLY KB.EPS: JSR R3,KB.EPC ;SET ADDRESS OF SUBRTN TSTB -2(R4) ;WHEN PRINTER FREE ... BPL .-4 MOVB (R1)+,@R4 ;... DESPATCH CHARS. RTS PC .=.+KBL.EP+376-.-20 KB.EPC: JSR PC,@R3 ;OUTPUT MESSAGE .... BPL .-2 ;... UNTIL PARITY SEEN MOV SP,R1 ;FOLLOWED BY CR-LF JSR PC,@R3 JSR PC,@R3 MOV (SP)+,R1 ;TIDY STACK & CLEAR FLAG INCB KB.ND2+4 ;SET UP PART 1 RECALL KB.ND2: ;DROPjOSITIVE VALUE UNLESS AN ; ERROR HAS BEEN ENCOUNTERED, IN WHICH CASE ITS ; CONTENT WILL BE:- ;  -2 = INVALID COMMAND (NO USER PROGRAM) ;  -3 = ILLEGAL SYNTAX ;  -4 = ILLEGAL DEVICE ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .BYTE 0,-1  ;IN USE/NO SHAE SW. ;GET ARGUMENT IF ANY: KBI.KB: MOV @#V.RRES,-(SP) ;GET KBI REGS. JSR R5,@(SP)+ CMP (SP)+,(SP)+ ;... & IGNORE KBI RTN INC KB.ND+4  ;INSTEAD SET UP KBLkLSO THE KEYBOARD INTERRUPT WILL ; BE ENABLED AND THE PROGRAM WILL BE FLAGGED ; AS ALREADY BEING IN RUN STATE. ; ;AT INPUT ERROR, KBL WILL BE RECALLED WITH R4 SET AS ON ; ENTRY, R5 CLEARED TO SHOW RECALL & R1 WILL ; CONTAIN AN ERROR CODE AS FOLLOWS:- ;  -2 = COMMAND INVALID (NO PROGRAM ;   IN CORE OR NO ODT) ;  -3 = FAULTY SYNTAX (ARG. OTHER THAN ;   'K' OR 'R') ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .BYTE 0,l NOW IF OPEN ERROR MOV R0,-(SP) EMT .OPEN MOV #1,@R5 ;PREPARE LINE 2 BUFFER MOV #200,-(R5) MOV R5,R1 ;SET LINE 2 END ADD @R5,R1 MOV R5,R4 ;... & LINE 1 START SUB @R5,R4 JSR PC,SA.WRT+2 ;OUTPUT COMD BLOCK BR SA.WLP ;THEN GO FOR TFR PROPER ;OPEN ERROR: SA.OER: JSR R0,SA.PRT ;PRINT ERROR MESSAGE .ASCII 'FILE ERROR' ; (ALSO SAVES LINK PTR) .WORD 0,0 ;EXITS TO CLOSE WHEN DONE .BYTE 15,12,-2 THRU TO MAKE IT .=.+KBL.EP-2+KBI.OZ-. .END n RECALL MOV #-2,-(SP) ;SET ERROR FOR INV CMD TSTB V.MUS(R3) ;... & CHK FOR PROG IN CORE BEQ KB.XT  ;REJECT IF NOT DEC @SP  ;MAKE ERROR FAULTY SYNTAX MOVB @SP,-(R1) ;SET COUNT FOR RADPK NAME CLR R0  ;... & CLEAR BUFFER KB.LP: CLR R3  ;SET UP FOR PADDING IF NEC. CMPB @R5,@R1  ;AT END OF INPUT? BEQ KB.PGO  ;IF SO USE IT CMPB @R5,#40  ;SIMILARLY IF SPACE ... BEQ KB.PGO CMPB @R5,#',  ;... OR COMMA BEQ KB.PGO MOVB (R5)+,R3 ;OTHERWISE CHEo-1  ;IN USE/NO SHARE SW. ;GET ARGUMENT IF ANY: KBI.OD: MOV @#V.RRES,-(SP) ;GET INTERPRETER REGISTERS JSR R5,@(SP)+ CMP (SP)+,(SP)+ ;IGNORE KBI RETURN MOVB #-2,R0  ;SET UP ERROR CODE (COMD INVAL) TST V.MUS(R3) ;USER PROGRAM IN CORE? BEQ OD.ERR  ;IF NOT REJECT COMMAND MOV V.DSA(R3),R2 ;GET DEBUG START ... BEQ OD.ERR  ;... ALSO REJECT IF NOT LOADED DECB R0  ;RESET ERROR (SYNTAX FAULT) CMPB @R5,-(R1) ;AT STRING END? BEQ OD.GO  ;IF SO START FROM SCRAp.=.+SA.LIN+400-. ;TRANSFER LOOP: SA.CBF: CMP R4,R5 ;AT END OF LINE? BEQ SA.OBF ;IF SO GO OUTPUT SA.WLP: MOV (R3)+,(R4)+ ;ELSE MOVE WORD CMP R3,R2 ;MORE TO OUTPUT? BLOS SA.CBF ;CONTINUE IF SO CLR R2 ;SET END SWITCH SA.OBF: SUB SA.LBF,R4 ;COMPUTE # OF DATA BYTES MOV R4,-(SP) ;SAVE RESULT ... MOV #0,R4 ;... WHILE GET HDR PTR SA.LBF=.-2 MOV (SP)+,-(R4) ;MOVE IN BYTE COUNT JSR PC,SA.WRT ;GO WRITE LINE TST R2 ;END SWITCHq;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003B .TITLE KBI.BE ;ROUTINE TO PROCESS KBD BEGIN/RESTART COMMANDS: ; ; IF INPUT COMMAND PROVIDES ADDRESS (& THIS IS ;  VALID[*]) RESTART WILL OCCUR FROM THIS. ; IF NONE GIVEN, 'RESTART' WILL USE PROGRAM-SET RESTART ;  ADDRESS, IF ANY; 'BEGIN' WILL USE THE ;  NORMAL PROGRAM START AS SUPPLIED ON THE ;  LOAD MODULE. ; BEFORE RECOMMENCEMENT, ALL I/O CURRENTLY UNDERWAY ;  WILL BE STOPPED AND ANY BUSY STATrCK BYTE SUB #'A,R3  ;(MUST BE ALPHA!!) CMPB R3,#32 BHIS KB.XT  ;FOR NOW IT'S AN ERROR INCB R3  ;RESET BYTE TO RANGE 1-32 KB.PGO: ASL R0  ;MULT PREV INPUT BY 50 ASL R0 ASL R0 ADD R0,R3 ASL R0 ASL R0 ADD R3,R0  ;ADD IN NEW BYTE INCB @R1  ;MUST DO THREE BYTES BNE KB.LP  ;SO REPEAT IF NEC. ;SET UP DEVICE CHECK: MOV #16,R3  ;PRESET INDEX TO DVR ADDR CMP R0,(PC)+ ;... IN CASE 'PT' .RAD50 'PT' BEQ KB.SKB CLR R3  ;OTHERWISEsTCH TST (R2)+ CMPB @R5,#'R  ;USER WANTS B/P REMOVED? BEQ OD.GO TST (R2)+ CMPB @R5,#'K  ;... OR KEPT? BEQ OD.GO OD.ERR: MOVB R0,R1  ;IF NEITHER, ERROR ... CLR R5  ;SET ERROR & DONE FLAGS INC OD.ND+4  ;SET UP RECALL KBD LISTEN BR OD.ND  ;... & GO MAKE IT ;ADDRESS NOW KNOWN - SET UP EXIT: OD.GO: CMP (SP)+,(SP)+ ;LOSE RETURN TO MINIMAL DVR MOV R2,16(SP) ;SET UP ADDRESS AS RTN POINT MOV (SP)+,R1 ;GET PTR TO KBL SAVE AREAt SET? BNE SA.WLP ;WRITE TRANSFER BLOCK WHEN DONE: MOV @#V.SVT,R3 ;RESET SVT. POINTER MOV V.PSA(R3),-(R4) ;STORE TRANSFER ADDRESS MOV #2,-(R4) ;GIVE BYTE COUNT JSR PC,SA.WRT ;... & OUTPUT MOV R0,-(SP) ;NOW CLOSE FILE SA.CLS: MOV @SP,R0 ;RESTORE LINK PTR ... EMT .CLOSE ;... IF COME FROM ELSEWHERE MOV R0,-(SP) ;RELEASE FILE EMT .RLSE ;ON COMPLETION, RELEASE THIS BUFFER: TST -(R0) ;GET uES (I.E. ;  DATASET BUSY, DRIVER BUSY & DRIVER QUEUES) ;  WILL BE REMOVED. ALSO THE PROCESSOR STACK ;  WILL BE REDUCED SO THAT ON EXIT SP WILL ;  START IMMEDIATELY BELOW PROGRAM LOAD ADDRESS ; FOR 'BEGIN' ONLY, ALL DDB'S AND NORMALLY ;  NON-RESIDENT DRIVERS WILL DISAPPEAR AND ;  ALL BUFFERS ALLOCATED WILL EFFECTIVELY BE ;  RETURNED TO FREE CORE. ;  TO PROVIDE SOME MEASURE OF RECLAIM FROM ;  PROGRAM FAILURE, THIS VERSION CONTAINS ;  A SECONDARY SECTION WHICH EXAMINES EACH v CLEAR INDEX TST R0  ;...& SET DEFAULT IF NEC. BNE .+6 KB.SKB: MOV (PC)+,R0 ;'KB' IF NONE OR 'PT' .RAD50 'KB' ;CHECK DEVICE VALIDITY: MOV @#V.SVT,R1 ;GET START OF DRIVER LIST MOV V.DDL(R1),R1 ADD #6,R1 MOV (R1)+,R5 ;... & ITS END KB.CDV: CMP R0,(R1)+ ;CHECK IF DEVICE EXISTS BEQ KB.FDV ADD #6,R1 CMP R1,R5 BLO KB.CDV KB.ERR: DECB @SP  ;IF NOT IT'S AN ERROR 4 BR KB.XT  ;SET FLAG & EXIT .... ;GET ADDRESS OF DRIVER IFw MOV R1,R0  ;ZERO IT .... ADD #112,R0  ;... PRINT POINTERS MOV R0,-(R1) CLRB (R0)+  ;... & UNDERWAY MARK MOV R0,-(R1) CLR -(R1)  ;... & INPUT PTR (^C SW.) TST -(R4)  ;WAIT FOR PRINTER TO FINISH TSTB @R4 BPL .-2 MOV #401,V.MUS(R3) ;GIVE PROGRAM A RUN STATE ADD #V.WRA,R3 ;ENSURE INTERNAL WAIT MOV R3,@R3  ;... CORRECTLY SET ADD #V.WTL-V.WRA,@R3 MOV #RTI,OD.ND+4 ;SET UP EXIT MOV @#V.RRES,-(SP) ;RESTORE USER REGS. JSR R5,@(SP)+ xBACK PROGRAM STATE MOV -(R0),V.MUS(R3) ADD #V.WTL,R3 ;... & MOVE TO WTL ADDR MOV R3,14(SP) ;FORCE EXIT TO IT JSR R0,SA.PRL ;PRINT MONITOR MARKER .BYTE '$,-1 ; (SAVED R0 ON STACK ON RTN) SA.XIT: MOV #20,-(SP) ;SIMUL8 'JSR R5,S.RLB' TST -(SP) MOV @#V.XIT,R5 ;ARGS. DONE - NOW GET RTN CMP (R5)+,(R5)+ ;... TO GO TO S.XIT MOV @#60,R1 ;FORCE COMMAND ACCEPT MOV #12,@-(R1) ;... BY SETTING KBD FLAG ADD @R1,@(R1)+ MOV @#V.RLB,PC ;... & LEAVE y;  DATASET CURRENTLY OPEN; IF THE ASSOCIATED ;  DRIVER IS NORMALLY FILE-STRUCTURED, & THERE ;  IS A FILE OPEN, THE ROUTINE WILL ATTEMPT TO ;  CLOSE IT, UNDER THE FOLLOWING CIRCUMSTANCES: ;  1) IT IS ONE ALREADY ESTABLISHED ;  2) IT IS IN THE PROCESS OF BEING SET UP ;  & THE USER INDICATES BY A SECOND ;  PARAMETER IN THE 'BEGIN' COMMAND ( 'S' ) ;  THAT ALL SUCH FILES SHOULD BE SAVED. ;  IF THIS SECOND PARAMETER IS ABSENT IT WILL ;  BE TAKEN TO MEAN THAT FILES IN THIS SECOND z IN CORE: KB.FDV: MOV @R1,R5  ;GET CORE ADDRESS IF ANY BEQ KB.ERR  ;IF NOT NO GO ADD R3,R5  ;INDEX IF 'PT' ADD #6,R5  ;... & MOVE TO FLAG BYTE    ;(SETTING FOR INT VECTOR) ;PROCESS AS REQUIRED: MOV #200,R3  ;SET BIT FOR 'EN' MOV R3,R0  ;... & STORE CMP R2,#"EN  ;CONTINUE LATER IF O.K. BEQ KB.FLG BIT -4(R5),#400 ;FOR 'EC' & 'PR' ... BEQ KB.ERR  ;... MUST BE TERMINAL! MOV #20,R3  ;NOW ASSUME 'EC' CMP R2,#"EC  ;CONTINUE LATER IF SO MOVB @PC,@#177560 ;RE-ENABLE KBD INTS. BR OD.ND  ;... & GO TO IT .=.+KBI.OD+376-. OD.ND=. .=.+KBI.OD-2+KBI.OZ-. V.SVT=40 V.RRES=46 V.MUS=16 V.DSA=24 V.WRA=30 V.WTL=60 .END |;WRITE SUBROUTINE: ; ; CALLED BY 'JSR PC,SA.WRT' OR 'JSR PC,SA.WRT+2' ; WITH R4 POINTING AT THE LINE TO BE OUTPUT (AT ; HDR WORD 3 OR 1 RESPECTIVELY). .WRITE OPERATION ; IS AN IMPLIED WAIT; THEREFORE NO EXPLICIT CALL ; FOR THIS IS NEEDED. ON THE BASIS THAT R5 ; WILL CURRENTLY POINT TO THE END OF THE LINE ; BEING OUTPUT & R1 TO THE END OF THE LINE AREA, ; R4 & R5 ARE BOTH RESET TO THE NEXT BUFFER TO BE ; FILLED WITH R4 ACTUA} ;  CATEGORY ARE NO LONGER REQUIRED. THEY WILL ;  BE 'UNLOCKED' AND DELETED. ; THE PROCESSING OF 'BEGIN' & 'RESTART' IS ACTUALLY ;  BEING DONE WHILE THE PRINTER IS OUTPUTTING ;  THE [LINE-FEED] WHICH TERMINATES THE COMMAND ;  INPUT. THIS IS ALLOWED TO FINISH BEFORE 'RESET' ;  IS GIVEN TO STOP I/O AS MENTIONED ABOVE. ;  THE USER PROGRAM MIGHT ALSO ISSUE AN INIT. ;  'RESET' WHICH WOULD PREMATURELY TERMINATE ;  THE OPERATION OF KBL, IF THE EXIT TO THE ;  PROGRAM WERE MADE BY IT~BEQ KB.FLG-2 MOV #2,R3  ;FINALLY SET 'PR' FLAG MOV @R5,R0  ;...& PREPARE XOR KB.FLG: BIC R3,@R5  ;FOR 'EC' & 'PR' ... BIC R0,R3  ;... FLIPS FLAG BIS R3,@R5  ;CLEARS FOR 'EN' COMB @SP  ;REMOVE ERROR FLAG KB.XT: MOVB (SP)+,R1 ;OTHERWISE IT GOES THRU CLR R5  ;SET DONE FLAG ... BR KB.ND  ;... & EXIT .=.+KBI.KB+376-. KB.ND=. ;MISCELLANEOUS DEFINITIONS: V.SVT=40 V.RRES=46 V.MUS=16 V.DDL=50 .=.+KBI.KB-2+KBI.OZ-. .END ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C ; .TITLE KBI.KI ;KILL PROCESSOR  VERSION 1 ; ; ALLOWS OPERATOR TO RECALL MONITOR AFTER A PROGRAM ; HAS BEEN LOADED OR SET IN MOTION. ; SUSPENDS I/O UNDERWAY BY HARDWARE RESET, THEN ; REMOVES ALL ASSOCIATED BUSY FLAGS, I.E. DATASET ; & DRIVER AND DVR Q LINKAGE ; ALSO CHECKS NATURE OF DRIVER; IF FILE STRUCTURED ; AND DATASET IS OUTPUT TO LINKED FILE,SETS UP ; CONDITIONS FOR END BLOCK TO BE OUTPUT DURLLY POINTING AT THE ; FIRST DATA POSITION, THE LOAD POINT HAVING ; BEEN ENTERED FROM R3. ; IF THE LINE PREVIOUSLY WRITTEN CAUSED THE ; SPECIFIED DEVICE TO BECOME FULL, THE ROUTINE ; EXITS WITH A DIAGNOSTIC MESSAGE BEING SENT ; TO THE CONSOLE PRINTER. ; SA.WRT: CMP -(R4),-(R4) ;ADJUST LINE PTR IF ENTER HERE MOV R4,-(SP) ;OUTPUT LINE MOV R0,-(SP) EMT .WRITE MOV @R4,-(SP) ;SAVE LINE SIZE ADD @R4,R5 ;ADJUST END POINTER AS NEC. CMP R5,R1 BEQ .+6 SUB @R4,R5 S RECALL AS IN THE ;  CASE OF OTHER COMMAND PROCESSORS, (LEADING ;  TO POSSIBLE CORRUPTION OF KBL PTRS FOR THE ;  NEXT COMMAND CALL). HENCE THIS ROUTINE ;  PROVIDES ITS OWN RESTORATION OF THOSE PTRS ;  AND EXITS IMMEDIATELY TO THE USER, PROVIDED ;  ALWAYS THAT THE COMMAND CAN BE CORRECTLY ;  EFFECTED. ANY ERROR HOWEVER IS HANDLED NORMALLY ;  BY KBL RECALL. ; REGISTERS ON ENTRY AS SET BY KBI WILL GIVE:- ;  R1 = EING ; SUBSEQUENT CLOSE OPERATIONS. ; ; ON COMPLETION, RECALLS MONITOR VIA .XIT, WHICH ; SHUTS DOWN AND RELEASES AS NECESSARY. ; (BEFORE THE CALL RESETS SP TO PROGRAM LOAD POINT ; TO ALLOW .XIT PROCESSOR AS MUCH WORK SPACE AS POSS.) ; ; COMMAND WILL BE REJECTED IF THERE IS NO USER ; PROGRAM IN CORE. IN THIS CASE, KBL WILL BE ; RECALLED WITH R4 SET AS ON ENTRY TO TPB ADDRESS, ; R5 CLEARED TO SHOW RECALL & R1 CONTAINING -2 ; TO INDICATE INVALID COMMAND. ;REGISTER ASSIGNMENTS: R0=%0 R SUB @R4,R5 MOV R5,R4 ;NOW SET START POINTER SUB (SP)+,R4 TST (R4)+ ;IGNORE HDR 1 BIT #40000,(R4)+ ;CHECK FOR END OF MEDIUM BNE SA.FER TST (R4)+ ;ALSO SKIP HDR WORD 3 MOV R4,SA.LBF ;SAVE START FOR LATER MOV R3,(R4)+ ;STORE LOAD POINT RTS PC ;... & RETURN SA.FER: JSR R0,SA.PRT ;PRINT ERROR MESSAGE .ASCII 'DEV. FULL' .BYTE 15,12,-2 ;PRINT SUBROUTINE: ; ; CALLED BY 'JSR R0,SAND OF COMMAND INPUT ;  R2 = COMMAND CODE ;  R3 = POINTER TO SVT. ;  R4 = POINTER TO TPB ;  R5 = POINTER TO NEXT BYTE IN INPUT STRING ; ON EXIT TO THE USER PROGRAM, REGISTERS WILL BE ;  RESTORED TO THEIR STATE PRIOR TO THE ACCEPTANCE ;  OF A 'RESTART' - IN CASE SUCH CONTENT IS ;  STILL OF VALUE TO THE RESTARTED PROGRAM. ;  FOLLOWING A 'BEGIN' THEY WILL BE CLEARED. ; ON KBL RECALL FOLLOWING AN INCORRECT INPUT, R4 ;  WILL STILL CONTAIN TPB ADDRESS & R5 WILL ;  BE CLEARED;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C ; .TITLE KBI.TI ; ;TIMER KEYBOARD RESPONSE PROGRAM ; ; EXPECTS THE KEYBOARD COMMAND:- ; ;  TI[ME][ HH:MM:SS] ; ; IF THE ARGUMENT IS PRESENT, THE STATED TIME ; IS CONVERTED INTO A DOUBLE PRECISION VALUE(*) ; AND STORED IN THE SYSTEM VECTOR TABLE, WHERE ; IT WILL BE AUTOMATICALLY UPDATED, PROVIDED ; THAT THE CONFIGURATION INCLUDES A REAL- ; TIME CLOCK. ; ; ON ENTRY EXPECTS REGISTERS SET BY KBI. 1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .BYTE 0,-1  ;IN USE/NO SHARE SW. ;SUSPEND CURRENT I/O: KBI.KI: MOV @#V.RRES,-(SP) ;RESTORE KBI REGS. JSR R5,@(SP)+ CMP (SP)+,(SP)+ ;... & REMOVE STACK GARBAGE TST V.MUS(R3) ;CHECK IF PROG IN CORE BEQ KI.ERR  ;REJECT COMMAND IF NOT TST -(R4)  ;GET TP. STATUS TSTB @R4  ;ALLOW TELEPRINTER T0 ... BPL .-2  ;...FINISH COMD LF RESET   ;THEN STOP ALL I/O CMP @#100,#374 ;ALL EXCEPT CL.PRT' WHERE R0 NOW ; POINTS TO THE START OF THE PRINT STRING. THE ; NORMAL OPERATION TERMINATES AT FIRST NEG. ; BYTE; FOR ERROR PRINT THIS WILL BE -2 WHICH ; WILL FORCE EXIT TO CLOSE & RELEASE FILE (STACKED ; R0 WILL BE RESTORED AFTER EXIT): FOR ; '$' PRINT THE BYTE WILL BE -1 TO CAUSE RETURN ; TO THE TERMINAL SEQUENCE. ; IF A ZERO BYTE IS FOUND PRIOR TO THIS, IT WILL ; CAUSE CONVERSION OF THE ERROR STATUS ; BYTE IN THE FILE NAME BLOCK. SA.PRT: MOVB #200,@#177776 ;RAISE PRL TO STOP TO SHOW COMMAND HAS BEEN PROCESSED. ;  IN ADDITION, R1 WILL BE SET AS FOLLOWS:- ;   -2 = COMMAND INVALID AS NO PROGRAM ;    LOADED ;   -3 = SYNTAX FAULTY (ADDRESS CONTAINS ;    OTHER THAN OCTAL DIGITS OR ;    IS BEYOND 16-BIT CAPACITY) ;   -6 = ADDRESS IS INVALID AS ;    DEFINED BELOW. ; ;[*] VALIDITY IN THIS CASE MEANS THAT THE ADDRESS MUST ; OCCUR ON WORD-BOUNDARY & IT MUST LIE WITHIN ; THE PROGRAM AREA, VIZ ABOVE MONITOR AREA AND BELOW ; UPPER MEMORY LIMIT. AS ; FOLLOWS:- ;  R1 = END OF INPUT STRING ;  R3 = SVT. ADDRESS ;  R4 = TPB ADDRESS ;  R5 = START OF ARGS IN INPUT STRING ; ; ON COMPLETION, KBL WILL BE RECALLED WITH ; R5 CLEARED, R4 STILL SET TO ITS ENTRY VALUE ; (TPB ADDRESS) AND R1 POSITIVE. ; ; THE COMMAND WILL BE REJECTED IF THE INPUT ; VALUES DO NOT CONFORM TO THOSE EXPECTED, ; I.E. DECIMAL DIGITS WITH HOURS < 24, MINUTES ; & SECONDS < 60. IN THIS CASE,ON KBL RECALL, ; R1 WILL BE SET TO -3 TO SHOW FAULTY SYNTAX. ; OCK THAT IS BEQ .+6  ;... PROVIDED THERE IS ONE MOVB @PC,@#177546 MOV V.DCO(R3),R5 ;GET DDB CHAIN PTR KI.CMC: BEQ KI.XT  ;IF NO CHAIN JUST EXIT CLR @R5  ;OTHERWISE FREE DATASET MOV -(R5),R4 ;GET DRIVER ADDRESS CLR (R4)+  ;FREE THAT TOO MOV R5,R0  ;MOVE TO CHECK BUFFER IN DDB ADD #12,R0 TST @R4  ;LOOK FOR F/S DEVICE BPL KI.CMN MOV 16(R0),R4 ;IF FOUND, HAS IT FIB? BEQ KI.CMN  ;IF NOT JUST EXIT BITB @PC,2(R0) ;OTHERWISE OUTPUT OPEN?  KBD INT MOV @#V.SVT,R3 ;RESET SVT. PTR SA.PRL: TSTB @#177564 ;WHEN PRINTER FREE ... BPL .-4 MOVB (R0)+,@#177566 ;... PRINT CHAR. INCB @R0 ;CHECK FOR -1 ... BEQ SA.XIT ; (ENTRY FROM FINAL SEQ.) DECB @R0 ;CONTINUE IF NEXT ... BGT SA.PRL ;... IS NOT STOPPER BMI SA.CLS ;END WHEN BYTE NEG CLR -(SP) ;ELSE CONVERT ERROR STATUS MOVB -(R1),@SP MOV R0,-(SP) SUB #2,@SP ;... USING 4 BYTES ONLY MOV #5,-(SP) EMT .CVT MOV R0,R1 ;S; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .BYTE 0,-1  ;IN USE/NO SHARE SW. ;GET INPUT ADDRESS IF ANY: KBI.BE: MOV @#V.RRES,-(SP) ;RESTORE KBI REGS. JSR R5,@(SP)+ CMP (SP)+,(SP)+ ;... & TIDY STACK MOVB #-2,-(R1) ;SET INITIAL ERROR CODE MOVB V.MUS(R3),-(SP) ;ANY USER PROG IN CORE? BEQ BE.QY  ;IF NOT COMMAND INVALID! CLR @SP  ;CLEAR STORE FOR ADDRESS DECB @R1 ; IF NO ARGUMENT IS SPECIFIED, THE CURRENT TIME ; STORED IN THE SYSTEM VECTOR TABLE WILL BE OUTPUT ; IN THE FORMAT GIVEN ABOVE. IT WILL ; ASSUME CR-LF PRINTING BY KBL ON ITS RECALL. ; (FOR THIS, REGISTERS WILL BE SET AS FOR NORMAL ; COMPLETION). ; ; (*) BOTH COMPONENTS ARE STORED AS SIGNED POS.) ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .BYTE 0,-1  ;IN USE/NO-SHARE ;CHECK IF INPUT REQUIRED: KBI.TI: MOV @#V.RRES,-(SP) ;RESTORE REGS JSR BEQ KI.CMN+2 ;IF NOT OMIT NEXT MOV -(R0),R2 ;IF WRITE, GET BUFF ADDR BEQ KI.CMN+2 ;IF NOT, DITTO TST 6(R4)  ;FOR LINKED FILES ... BMI .+4 CLR (R2)+  ;CLEAR LINK MOV R2,10(R0) ;... FORCE OUTPUT ON CLOSE BR .+4 KI.CMN: CLR -(R0)  ;ON SIMPLE DEVICES FORCE RLSE CLR -(R5)  ;REMOVE ANY DVR Q LINKAGE CLR -(R5) MOV -(R5),R5 ;GET NEXT DDB BNE KI.CMC  ;REPEAT IF MORE ;WHEN ALL I/O CLEAR, CALL MONITOR: KI.XT: MOV V.MSB(R3),RUPPRESS LEADING 0 SA.ELP: CMPB @R1,#'0 BNE SA.PRL CMPB 2(R1),#15 ;BUT ALWAYS PRINT 1 ZERO BEQ SA.PRL MOVB #' ,(R1)+ BR SA.ELP ;MISCELLANEOUS DEFINITIONS: V.SVT=40 V.XIT=42 V.RRES=46 V.CDB=50 V.GTB=54 V.RLB=56 V.CSA=4 V.MUS=16 V.PSA=22 V.DDL=50 V.WTL=60 V.MSB=64 .WAIT=1 .WRITE=2 .INIT=6 .RLSE=7 .OPEN=16 .CLOSE=17 .DLETE=21 .CVT=42 .CSX=56 .CSM=57 .=.+KBI.SA-2+KBI.OZ+512.-. .END  ;... & RESET ERROR CODE BE.GTA: CMP R5,R1  ;NOW AT INPUT END? BEQ BE.CKS  ;IF SO ADDRESS MUST BE IN MOVB (R5)+,R0 CMPB R0,#40  ;SIMILARLY IF BYTE = SPACE BEQ BE.CKS CMPB R0,#54  ;... OR COMMA BEQ BE.CKS  ;BUT NOW CHECK FOR 'S' SUB #60,R0  ;REMOVE ASCII GARBAGE CMPB R0,#7  ;OCTAL DIGIT MUST REMAIN BHI BE.QY BIT @SP,#160000 ;ALSO MUST BE ROOM FOR ANOTHER BNE BE.QY ASL @SP  ;IF O.K. SHIFT PREV. INPUT ASL @SP ASL @SP BISB R0,@SR5,@(SP)+ CMP (SP)+,(SP)+ ;CLEAN UP STACK ADD #V.TOD+2,R3 ;MOVE SVT PTR TO TOD CMPB @R5,-(R1) ;MORE IN STRING? BEQ TI.OUT  ;IF NOT ASSUME OUTPUT CMPB @R5,#60  ;ALSO IF NEXT CHAR ... BLT TI.OUT  ;... APPARENTLY NOT DIGIT ;PREPARE TO ACCEPT INPUT: MOV R4,-(SP) ;SAVE TPB POINTER CLR -(SP)  ;CLEAR BUFFER FOR RESULT CLR -(SP) MOV SP,R4  ;SET POINTER TO IT JSR R3,TI.IGO ;SAVE R3 & SET AS TABLE PTR .WORD 24.  ;CHECK VALUE - HOURS .WORD 45700,1 ;GET PTR TO MSB CMP (R3)+,(R3)+ TST (R1)+  ;SKIP S.DDB IN MSB CLR (R1)+  ;ENSURE MSB FREE CLR (R1)+ CMP (SP)+,(SP)+ ;REMOVE KBL RECALL ADDRESS MOV (SP)+,R1 ;GET PTR TO KBL SAVE AREA MOV R1,R0  ;... & ITS OUTBUFF ADD #112,R0 MOV R0,-(R1) ;RESET SAVE AREA CLRB (R0)+  ;... & UNDERWAY MARK MOV R0,-(R1) CLR -(R1) MOV @R3,@SP  ;MOVE STACK WAY UP IN CASE BIC #777,@SP MOV @SP,SP MOV #EMT+.XIT,KI.ND+4 ;SET UP CALL TO EXIT BR KI.ND P  ;... & ADD IN NEW DIGIT BR BE.GTA  ;RETURN FOR MORE ;CHECK FOR SECOND ARGUMENT IF 'BEGIN': BE.CKS: CMP R2,#"BE  ;IGNORE 'RESTART' BNE BE.CKA COM R2  ;SET TO DIFF. FROM 'RESTART' CMPB @R5,#'S  ;LOOK ONLY FOR 'S' BNE BE.CKA CLR R2  ;SET MARKER FOR LATER ;CHECK ADDRESS VALIDITY, USING DEFAULT IF NO INPUT: BE.CKA: ASLB @R1  ;AGAIN RESET ERROR FLAG TST @SP  ;ANY ADDRESS GIVEN? BNE BE.CVA 6  ;MULTIPLIER - HOURS .WORD 60.  ;CHECK VALUE - MINUTES .WORD 3600.,0  ;MULTIPLIER - MINUTES .WORD 60.  ;CHECK VALUE - SECONDS .WORD 60.,0  ;MULTIPLIER - SECONDS ;GET INPUT CHARACTER & BUILD COMPONENT: TI.IGO: CLR R0  ;ZERO STORE TI.IGL: MOVB (R5)+,R2 ;GET NEXT BYTE SUB #72,R2  ;REMOVE ASCII GARBAGE BGE TI.IMG  ;... STOPPING AT ... ADD #12,R2  ;... FIRST NON-DIGIT BMI TI.IMG ASL R0  ;IF O.K. ... ADD R0,R2  ;... ;GO MAKE IT & FREE THIS S/B ;ERROR - PROGRAM NOT IN CORE: KI.ERR: INC KI.ND+4  ;INSTEAD RECALL KBL MOV #-2,R1  ;... WITH DONE & ERROR SET CLR R5 BR KI.ND .=.+KBI.KI+376-. KI.ND=. V.SVT=40 V.RRES=46 V.DCO=14 V.MUS=16 V.MSB=64 .XIT=60 .=.+KBI.KI-2+KBI.OZ-. .END ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C ; .TITLE KBI.MO ; ;MODIFY COMMAND PROCESSOR ; REQUIRES INPUT OF OCTAL ADDRESS AS PART ;  OF COMMAND STRING ; IF ADDRESS VALID (ON WORD BOUNDARY & WITHIN ;  AVAILABLE CORE), CONTENT IS OUTPUT ;  & RETURN INPUT IS AWAITED FROM OPERATOR ; IF OPERATOR RETURNS CR ONLY NO CHANGE MADE TO ;  THAT CONTENT; IF HOWEVER NEW OCTAL ;  VALUE IS INPUT BEFORE CR, THIS REPLACES ;  ORIGINAL ; INPUT OF NEW VAL MOV V.PSA(R3),@SP ;IF NONE USE NORMAL START ... TST R2  ;... UNLESS 'RESTART' BLE BE.CVA MOV V.RSA(R3),@SP ;FOR THIS USE RESTART ADDR BE.CVA: BIT @SP,#1  ;ADDRESS ON WORD-BOUND? BNE BE.QY  ;REJECT IF NOT MOV R3,R5  ;SIMILARLY IF NOT IN MEMORY CMP (R5)+,(R5)+ CMP @SP,(R5)+ BHI BE.QY CMP @SP,@R3  ;... OR ABOVE MONITOR BHIS BE.GO ;ERROR EXIT - RECALLS KBL TO PRINT MESSAGE: BE.QY: TST (SP)+  ;FORGET ADDRESS MOVB @R1,R1  ;SET ERROR FLAG FOR MULT PREV. BY 10 ASL R0 ASL R0 ADD R2,R0  ;ADD IN NEW DIGIT BR TI.IGL  ;... & GO FOR NEXT TI.IMG: CMP R0,(R3)+ ;VALUE IN RANGE? BHI TI.ERR TST R0  ;SKIP NEXT ON NO VALUE BEQ TI.IGN ;MULTIPLY INPUT BY APPROPRIATE FACTOR: TI.IML: ADD (R3)+,@R4 ;ADD LOW ORDER M'IER ASL (R4)+  ;TRANSMIT ANY CARRY ADC @R4 ADD @R3,@R4  ;ADD HIGH ORDER TST -(R3)  ;ADJUST POINTER ROR -(R4)  ;RESTORE LOW RESULT (C=0) DEC R0  ;COUNT DOWN BNE TI.IML  ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C ; .TITLE KBI.AS ;ASSIGN PROCESSOR  VERSION 1 ; ; ALLOWS USER TO REALLOCATE I/O RESOURCES ; AT PROGRAM RUN TIME VIA THE KEYBOARD COMMAND:- ;  AS[SIGN][,FILE SPEC,LOG NAME] ; WHERE:- ; A) 'FILE SPEC' MAY BE OF THE FORM:- ;  DEV(N):FILE NAME.EXT[UIC] ; IN ACCORDANCE WITH CSI PRACTICE. ; B) 'LOG NAME' IS A THREE-CHAR. IDENTIFIER ; FOR THE CONCERNED DATASET AS ALLOTTED BY THE USER ; IN HIS PROGRUE EXPECTS OCTAL DIGITS ONLY BUT THE ;  ROUTINE ALLOWS CTRL/U & RUBOUT ACTION ;  AS IN COMMAND STRING PROPER. ; FOR SEQUENTIAL MODIFICATION, LINE-FEED MAY BE ;  USED INSTEAD OF RETURN. IN THIS CASE ;  OPENED REGISTER WILL BE CLOSED AFTER ;  ANY CHANGE HAS BEEN EFFECTED AND THE ;  ADDRESS OF THE NEXT LOCATION WILL BE ;  PRINTED AND A NEW ENTRY AWAITED. ; THE COMMAND & RETURN INPUT WILL BE IGNORED WITH ;  APPROPRIATE ERROR MESSAGE IF FORMAT INCORRECT ; BOTH OUTPUT & INPUT WAIT KBL CLR R5  ;... ALSO DONE FLAG INCB RE.ND+4  ;SET UP KBL RECALL BR RE.ND  ;... & GO MAKE IT ;ADDRESS O.K. SO INITIALISE: BE.GO: TSTB @#177564 ;WAIT FOR PRINTER TO FINISH BPL .-4 RESET   ;THEN STOP ALL I/O CMP @#100,#374 ;... THO' MUST RESTART CLOCK BEQ .+6  ;... IF ANY MOV @PC,@#177546 MOV (R5)+,R1 ;GET PROG LOAD ADDR CLR -(R1)  ;PREPARE NEW STACK FOR EXIT MOV (SP)+,-(R1) ;...;CONTINUE IF NEC. ;CHECK IF MORE TO DO: TI.IGN: CMP (R3)+,#60. ;LAST MULTIPLIER? BEQ TI.IDN CMP R5,R1  ;MORE INPUT? BHIS TI.IDN CMP R2,#-20  ;...OR AT SPACE? BEQ TI.IDN MOV R2,(R3)+ ;GO NEXT MULTIPLIER BEQ TI.IGO  ;ALSO CHECKS FOR COLON TI.ERR: MOV #-3,R1  ;IF NONE, SET ERROR FLAG TST (SP)+  ;FORGET SVT. PTR BR .+6  ;... & EXIT ;INPUT COMPLETE - STORE IN SVT. & EXIT: TI.IDN: MOV (SP)+,R3 ;RESET SVT. PTR MOV R3,R1  ;USE TO MAKE R1 POSITIVAM ; ; NOTE: 1) IF EITHER ARGUMENT IS PRESENT THE OTHER ; MUST BE ALSO. ;  2) IF NEITHER IS PRESENT, THE COMMAND WILL ; SIGNIFY THAT ALL CURRENT ASSIGNMENTS ARE TO BE ; DELETED. IT WILL BE RELEVANT ONLY IF THERE IS ; NO USER PROGRAM IN CORE AND WILL THEREFORE ; BE REJECTED IF GIVEN AT ANY OTHER TIME. ; ;USAGE: A) THE EFFECT OF THE COMMAND WILL BE TO SET UP ; A TABLE IN 'MONITOR' CORE IN WHICH EACH ASSIGN ; WILL PRODUCE AN ENTRY OF THE FORMAT:- ;  LOG NAME (*) ;  DEV NAMEON FLAG RATHER THAN USE ;  INTERRUPT. ; ON COMPLETION OR RECOGNITION OF ERROR, RECALLS KBL ;  FOR TIDY UP ; ; ON ENTRY EXPECTS REGISTERS (SET BY KBI) AS ; FOLLOWS:- ;  R1 = END OF INPUT STRING ;  R3 = SVT ADDRESS ;  R4 = TPB ADDRESS ;  R5 = START OF ARGUMENT IN INPUT ; ; ON RECALL TO KBL, R4 WILL BE UNCHANGED, R5 ; WILL BE CLEARED TO SHOW DONE & R1 WILL BE POS. ; UNLESS THE COMMAND IS REJECTED THRU ERROR. IN ; THIS CASE R1 WILL CONTAIN:- ;  -3 = FAULTY SYNTAX (NOT USING ADDR GIVEN MOV R1,RE.XT+2 ;HOLD NEW SP FOR LATER CMP (SP)+,(SP)+ ;GET PTR TO KBL PTRS MOV (SP)+,R0 ;... (SAVED BY KBD) MOV R0,R4  ;USE TO RESET KBL PTRS ADD #112,R4 MOV R4,-(R0) CLRB (R4)+  ;...CLEARING TP IN USE SW. MOV R4,-(R0) CLR -(R0)  ;... & CMD U/W SW. MOV R3,R4  ;GET MSB ADDRESS FROM SVT. ADD #V.MSB,R4 MOV @R4,R0 TST (R0)+  ;...& PREPARE TO FREE IT CLR (R0)+ CLR (R0)+ CMP -(R4),-(R4) ;RESET PTR TO WAIT LOOP MOVE MOV (SP)+,@R3 ;STORE INPUT MOV (SP)+,-(R3) MOV (SP)+,R4 ;RESET TPB POINTER BR TI.XIT  ;... & EXIT ;PRINT CURRENTLY STORED TIME: ; ; R3 HERE POINTS TO RELEVANT ENTRIES IN SVT. & ; R4 IS SET TO TPB. ADDRESS. ; ;GET STORED TIME & PREPARE CONVERSION: TI.OUT: MOV @R3,R0  ;GET VALUES FROM SVT. MOV -(R3),R1 ASL R0  ;REMOVE LOW ORDER SIGN ASR R1 ROR R0 JSR R3,TI.OGO ;SET POINTERS TO DIVISORS .WORD 172600,40 ; HOURS X 10 .W (*) ;  DEV UNIT/NO. OF WORDS FOLLOWING ;  FILE - ;   NAME (*) ;  EXTENSION (*) ;  UIC ; (*) PACKED IN RAD50 FORM ; THIS FORMAT PROVIDES FOR VARYING LENGTH ENTRIES ; THE MINIMUM BEING THE FIRST THREE WORDS ONLY AND ; THE REMAINDER /BEING DROPPED ; FROM THE BOTTOM UPWARDS IF NOT REQD. ; B) DURING THE RUN OF A USER PROGRAM THE ENTRY ; FOR THE DATASET WILL OVERRIDE CORRESPONDING DATA ; IN THE PROGRAM ITSELF ; C) THE TABLE AREA WILL DEPEND UPON TH OCTAL DIGITS) ;  -6 = ILLEGAL ADDRESS (NOT ON WORD- ;   BOUND OR IN AVAILABLE MEMORY) ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .BYTE 0,-1  ;IN USE/NO SHARE SW. ;GET ADDRESS FROM COMMAND INPUT & CHECK VALIDITY: KBI.MO: MOV @#V.RRES,-(SP) ;GET BACK KBI REGS. JSR R5,@(SP)+ TST (SP)+  ;TIDY STACK JSR PC,MO.A2B ;CONVERT ADDRESS TO BINARY BMI MO.XT  ;NONE GIVEN IF N BIT ASLB @R1  ;GET E/CODE 6 (SET R4,V.WRA(R3) CMP (R5)+,(R5)+ MOV KBI.BE-4,R0 ;ASSUME PART 2 WILL BE CALLED ADD #KBI.OS,R0 ;... & SET UP DISK INFO. TST R2  ;IF 'BEGIN' GO NOW PART 2 BLE RE.XT MOV (R5)+,R0 ;OTHERWISE CLEAR ALL I/O BEQ RE.SMU  ;... USING DDB CHAIN RE.ZDC: CLR @R0  ;BOTH DATASET .... CLR @-(R0)  ;... & ASSOC. DRIVER CLR -(R0)  ;ALSO ANY DVR Q LINKAGE CLR -(R0) MOV -(R0),R0 ;REPEAT IF MORE BNE RE.ZDC ORD 45700,3  ; HOURS .WORD 106240,0 ; MINUTES X 10 .WORD 7020,0  ; MINUTES .WORD 1130,0  ; SECONDS X 10 .WORD 74,0  ; SECONDS ; ;PRINT SUBROUTINE: TI.OPT: TSTB -2(R4)  ;WHEN PRINTER FREE ... BPL .-4 MOVB R5,@R4  ;... DESPATCH CHAR. RTS PC ; ;EXTRACT PRINT DIGIT: TI.OGO: MOV #44777,@SP ;SET CONTROL FOR PRINT OUT TI.OEL: MOV (R3)+,R2 ;GET LOW DIVISOR MOV #35057,R5 ;SET ASCII BASES (HIGH = ':') TI.ODL: INCB R5  ;BUILD DIGIT SUB R2,R0E TIME ; AT WHICH THE COMMAND IS RECEIVED:- ;  1) PRIOR TO PROGRAM LOADING THE TABLE ; CAN OCCUPY CORE IMMEDIATELY ABOVE THE PERMANENTLY ; RESIDENT MONITOR AND EFFECTIVELY BECOMES A PART ; OF IT UNTIL THE USER ENTERS A NO-ARG 'ASSIGN'. ;  2) AFTER A PROGRAM HAS BEEN LOADED BUT ; NOT STARTED, THE TABLE MAY FOLLOW MONITOR ROUTINES ; MADE RESIDENT FOR THE DURATION OF THE PROGRAM. ; THESE ROUTINES WILL DISAPPEAR AUTOMATICALLY WHEN ; THE PROGRAM RETURNS CONTROL TO THE MONITOR AND ; THE IN A2B) CMP R0,4(R3) ;ADDRESS INPUT IN CORE? BHI MO.XT  ;IF NOT IT'S AN ERROR ASR R2  ;IF NOT ON WORD-BOUND .... BCS MO.XT  ;... LIKEWISE MO.RPT: JSR R0,MO.GO ;SAVE IT & GET PRT SUB ADDR ;PRINT SUBROUTINE: TSTB -2(R4)  ;WHEN PRINTER FREE ... BPL .-4 MOVB R2,@R4  ;... DESPATCH CHAR. RTS PC  ;... & EXIT ;ROUTINE TO CONVERT INPUT TO BINARY: ; CALLED BY [JSR PC,MO.A2B] WITH R5 AT START OF ASCII ; RETURNS WITH VALUE IN R0. N BIT SH;O.K. NOW TO EXIT IF 'RESTART': RE.SMU: MOV #401,@R5 ;SET MON/USER SW. MOV @#V.RRES,-(SP) ;RESTORE USER REGS. JSR R5,@(SP)+ MOV #RTI,RE.ND+4 ;SET UP USER EXIT RE.XT: MOV #0,SP  ;RESET SP AS SAVED EARLIER MOV @PC,@#177560 ;RESTORE KBD INTS. BR RE.ND  ;... & CONTINUE AS NEC. .=.+KBI.BE+376-. RE.ND=. V.RRES=46 V.MUS=16 V.PSA=22 V.RSA=26 V.WRA=30 V.MSB=64 .=.+KBI.BE-2+KBI.OZ-. .EOT ;BEGIN PRO  ;REDUCE DIVIDEND SBC R1 SUB @R3,R1 BPL TI.ODL  ;.... UNTIL NEGATIVE ADD R2,R0  ;RESTORE LAST POS. REMAINDER ADC R1 ADD (R3)+,R1 ;(ALSO GETS NEXT DIVISOR) ;PRINT DIGIT & CHECK FOR MORE TO DO: TI.OPL: JSR PC,TI.OPT ;PRINT CHARACTER SWAB R5  ;GET OUT COLON ASL @SP  ;REQD. THIS TIME? BCC TI.OEL  ;IF NOT GET NEXT DIGIT BPL TI.OPL  ;COLON IS WANTED - GO DO ;RESTORE CARRIAGE & EXIT: MOV #5215,R5 ;TIME NOW DONE ... JSRTABLE ENTRIES WILL ALSO BE REMOVED ;  3) ONCE THE PROGRAM HAS STARTED, TABLE ; ENTRIES CAN ONLY BE SET UP IN BUFFERS CLAIMED ; FROM FREE CORE (1 ENTRY OCCUPYINY A 16-WORD ; BLOCK). SUCH ENTRIES MIGHT UNNECESSARILY TIE ; UP OTHERWISE RELEASED FREE CORE; MOREOVER THEY ; WILL ONLY BE VALID IF MADE BEFORE THE PROGRAM ; HAS ISSUED .INIT ON THE APPROPRIATE DATASET. AS ; A RESULT ASSIGNING AT THIS TIME IS NOT ; RECOMMENDED EXCEPT AS A MEANS OF RECOVERY FROM ; A .INIT ERROR OR IF THE USER DOEOWS NO INPUT MO.A2B: CLR R0  ;USED TO STORE VALUE MOV #-3,R2  ;SET AS INPUT SEEN FLAG MOVB R2,-(R1) ;ALSO SET ERROR CODE 3 MO.ABG: CMP R5,R1  ;NOW AT END OF INPUT? BEQ MO.ABD  ;IF SO THAT'S IT MOVB (R5)+,R2 ;OTHERWISE GET BYTE SUB #60,R2  ;REMOVE ASCII GARBAGE CMPB R2,#7  ;... & OCTAL DIGIT REMAINS BHI MO.XT  ;ERROR 3 IF NOT BIT R0,#160000 ;ROOM FOR ANOTHER DIGIT? BNE MO.XT  ;ALSO ERROR 3 IF NOT ASL R0  ;SHIFT PREVIOUS INPUT ASL R0 CESSOR PART 2 ; ; THIS SECTION CLEARS ALL I/O CURRENTLY IN ; PROGRESS AND ATTEMPTS TO TIDY UP ; UNFINISHED FILE OPERATIONS AS NOTED IN INTRO ; ;ON ENTRY FROM PART 1 REGS. AS STORED ON TOP OF STACK ; WILL BE RELEVANT AS FOLLOWS: ;  R0 = POINTER TO DISK BLOCK JUST READ ;  R2 = 0 IF COMMAND SAID 'SAVE' ;   -"BE" OTHERWISE ;  R5 = DDB LINK IN SVT. ; .BYTE 0,-1  ;IN USE/NO SHARE SW. ;SET UP I/O BUSY SEARCH: BE.CON: MOV @#V.RRES,-(SP) ;GET BACK PART 1 REGS. JSR R5,@(S PC,TI.OPT ;... SO PRINT CR-LF SWAB R5 BPL .-6 SUB (SP)+,R1 ;ENSURE R1 POSITIVE ;EXIT BY KBL RECALL: TI.XIT: CLR R5  ;SET DONE FLAG INC TI.ND+4  ;SET UP RECALL TO KBL ... BR TI.ND  ;.... & GO MAKE IT V.RRES=46 V.TOD=34 .=.+KBI.TI+376-. TI.ND: .=.+KBI.TI-2+KBI.OZ-. .END S SO WITH EXTREME ; CAUTION. ; THE DIFFERENT SECTIONS OF THE TABLE MAY ; ALL BE PRESENT. TO ENABLE SEARCHING THEY WILL ; BE LINKED BY A 2-WORD TERMINAL ENTRY FOR EACH ; OF THE FORM:- ;  0 = LAST SECTION; -1 IF OTHERS ;  ADDRESS OF NEXT SECTION ;PROCESSING: ;  THE COMMAND WILL BE PROCESSED IN THREE PARTS ; BY OVERLAYING THE SUBSIDIARY SWAP BUFFER: ; 1) PART 1 PERFORMS A SCAN OF THE ARGUMENT ; STRING FOR SYNTAX ERROR AND ESTABLISHES A ; TABLE ON TOP OF ASL R0 BISB R2,R0  ;ADD IN NEW DIGIT CMPB @R5,#40  ;NEXT BYTE SPACE? BNE MO.ABG  ;IF NOT LOOK FOR NEW DIGIT MO.ABD: TST R2  ;WHEN DONE, CHECK IF ANY VALUE MO.BAX: JSR PC,@(SP)+ ;N BIT SET IF NOT ;ON RETURN ADDRESS OF NEXT SUB-ROUTINE REMAINS ON STACK! ;ROUTINE TO CONVERT BINARY TO ASCII & PRINT: ; CALLED BY [JSR PC,@(SP)+] WITH VALUE IN R1 ; RETURNS ON COMPLETION WITH R1 CLEAR MO.B2A: MOV #2230,R2 ;SET ROTATION COUNTER MO.BAG: ASL R1  ;GET BIT FROM NO ROLB RP)+ CMP (SP)+,(SP)+ ;CLEAN UP STACK ADD #KBI.OS,R0 ;SET DISK INFO FOR PART 3 JSR R0,@PC  ;SAVE R0 & RESET FOR DATA PTR ;PREVIOUS CODE & FOLLOWING INSTR. WILL BE OVERLAID AS ; LINK BLOCK & .TRAN BLOCK IF NEEDED. MOV @R5,R1  ;GET START OF DDB CHAIN BEQ BE.ND1  ;... IF ANY CLR @R5  ;REMOVE DDBS MONITOR-WISE CLR (R0)+  ;CLEAR LINK ERROR RETURN ;TIDY UP DDB & DRIVER, IN GENERAL: BE.ZDC: MOV R1,@R0  ;SET DDB IN LINK BLOCK CLR @R1  ;SET FREE MOV -(R1),R4;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001C ; .TITLE KBI.DU ;DUMP ROUTINE VERSION 1 8 JULY 70 ; NON-RESIDENT ROUTINE USING RESIDENT KBI AREA ; ;THIS ROUTINE OPERATES IN 2 PARTS:- ; ; A) COMMAND STRING DECODER ; B) DEVICE DRIVING ROUTINES ; ;N.B. USES KBI AREA AND OWN DRIVERS TO AVOID CORRUPTION ; OF USER IMAGE, THEREBY ALLOWING RESTART FACILITY ; ;COMMAND STRING FORMAT:- ; ; DUMP DEV(N) TD START END (CR) ; ; WHERE:- ;  DEV:- DEVICTHE STACK OF POINTERS TO EACH ; ELEMENT (0 IF NOT PRESENT):- ;  LOG NAME ;  U.I.C. ;  EXTENSION ;   0 ;  FILE NAME ;  DEVICE UNIT ;  DEVICE ; IT ALSO CONVERTS CHARS FOR RAD50 PACKING ; INTO THE APPROPRIATE VALUE. IT DOES NOT CHECK OCTAL ; DIGITS AT THIS POINT. ; 2) PART 2 PERFORMS THE ACTUAL CONVERSION OF EACH ; ELEMENT INTO ITS FINAL FORM, INCLUDING THE DIGIT ; CHECKING. ON EXIT TO PART 3 THE RESULTS HAVE REPLACED ; THEIR POINTERS ON TOP OF THE STACK. ; 3) PART 32  ;... & MOVE INTO DIGIT BCC .-4  ;...UNTIL BUILT JSR PC,@R0  ;OUTPUT TO PRINTER CLRB R2  ;RESET ROTATION COUNT BISB #23,R2 ASL R2  ;NOW CHECK IF ALL DONE BCC MO.BAG BR MO.BAX  ;IF SO EXIT & EXPECT RETURN ;MAIN ROUTINE BEGINS HERE********** ; ;IF ADDRESS VALID, PRINT CONTENT: MO.GO: MOV (SP)+,R3 ;GET BACK ADDRESS INPUT MOV R3,R1  ;PRINT ADDRESS JSR PC,@(SP)+ ;... USING ADDR SET BY A2B MOVB #57,R2  ;...FOLLOWED BY / ;GET DRIVER ADDRESS CLR -(R1)  ;REMOVE Q LINKAGE CLR -(R1) MOV R1,-(SP) ;SAVE DDB PTR TST R4  ;DRIVER ATTACHED? BEQ BE.ZDN  ;IF NOT IGNORE REST CLR (R4)+  ;OTHERWISE ENSURE DVR FREE TST (R4)+  ;F/S DEVICE? BPL BE.ZDN  ;IF NOT, CONTINUE LATER ADD #20,R1  ;MOVE TO DDB STATUS TSTB @R1  ;... TO CHECK IF FILE OPEN BPL BE.ZDN MOV 14(R1),R5 ;ALSO IF FIB ATTACHED BEQ BE.ZDN  ;IF NOT FORGET IT E NAME (2 (OR 3) ALPHA CHARS) ;  N:- UNIT NUMBER IF APPROPRIATE ;  TD:- TRANSFER DIRECTION (I OR O) ;  START):-LIMITS OF DUMP AREA (MUST BE ;  END ) OCTAL WORD ADDRESSES) ; DEFAULT ASSUMPTIONS:- ;  DEV:- SYSTEM DISK ;  N:- 0 ;  TD:- OUTWARD ;  START:- LOCATION 0 ;  END:- LAST AVAILABLE CORE ADDRESS ; (DELIMITER ONLY INVOKES DEFAULT ASSUMPTION: ;  EACH SPACE IS A DELIMITER ;  SPACE MAY BE FREELY REPLACED BY COMMA) ; ;N.B. FILE-STRUCTURED DEVICES MUST HAVE PR PERFORMS THE REDUCTION OF THE TABLE INTO ; ITS FINAL FORM AND ITS TRANSFER INTO ITS POSITION ; IN THE MONITOR AREA. ; 4) PROCESSING OF THE NO-ARG 'ASSIGN' WILL BE ; EFFECTED BY IMMEDIATE TRANSFER BETWEEN PARTS 1 ; AND 3, THE TOP OF THE STACK REMAINING AT 'LOG NAME' ; AS SHOWN ABOVE AND THE VALUE APPEARING AS 0 ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;ASSIGN PROCESSOR PART 1 ; ; PERFORMS SCANSION OF INPUT STRING & BUILDS JSR PC,@R0 MOV @R3,R1  ;NOW PRINT CONTENT JSR PC,@(SP)+ MOV #": ,R2  ;FOLLOWED BY ': ' MOV #5015,@SP ;STORE CR-LF CHECK WORD MO.IP1: JSR PC,@R0  ;ALSO USED FOR CTRL/U ECHO SWAB R2 ;PROCESS INPUT OF NEW VALUE IF ANY: MOV R5,R1  ;SET STORAGE POINTER INC R1 MO.IP2: CLRB @R1  ;SHOWS NO RUBOUT SEEN MO.IP3: JSR PC,@R0  ;GENERAL PRINT CALL MO.IP4: TSTB @#177560 ;WAIT FOR INPUT BPL .-4 MOVB @#177562,@R5 ;STORE CHAR. WHEN IN BICB #200,@R5 ;...;FILE OPEN - CHECK SOME MORE: MOV SP,2(R0) ;SAVE PRESENT STACK POINTER MOV #10000,-(SP) ;COMPUTE BUFFER SIZE MOVB @R4,@SP  ;... FROM DRIVER STANDARD ASL @SP BCC .-2 NEG @SP  ;NEGATE FOR WORD COUNT MOV @SP,-(R1) ;SAVE IN DDB ASL @SP  ;NOW SET UP NEW BUFF ON STACK ADD (SP)+,SP ;... IN CASE OLD ONE INVALID MOV SP,-(R1) ;ALSO STORE IN DDB MOVB -(R4),-(SP) ;SAVE DEVICE TYPE INDIC. MOV R5,R3  ;SAVE FIB PTR ... TST (R3)+  ;... E-ALLOCATED ; AREAS EQUIVALENT TO MAX. AVAILABLE CORE SIZE ; AS NO ACTION WILL BE TAKEN TO CHECK WHETHER THE AREA ; FOR THE DUMP IS OTHERWISE IN USE. ; ;ON ENTRY, RELEVANT REGISTERS FROM KBI (ON TOP OF ; STACK ARE:- ;  R1 = END OF INPUT COMMAND ;  R3 = SVT. ADDRESS ;  R4 = TPB. ADDRESS ;  R5 = START OF INPUT STRING ; ;ON FINAL RETURN TO KBL, R4 MUST BE UNCHANGED, R5 ; MUST BE CLEAR TO SHOW DONE AND R1 MUST BE ; POSITIVE UNLESS AN ERROR IS MET. IN THIS ; CASE, R1 SHOULD CO ; TABLE OF POINTERS TO EACH ELEMENT ON TOP ; OF STACK (0 IF NONE) ; ALSO CONVERTS RAD50 BYTES TO PACK FORM IN ; ORIGINAL STRING. ; ; ON ENTRY FROM KBD INTERPRETER, RELEVANT ; REGISTER CONTENTS ARE:- ;  R1 = END OF INPUT STRING ;  R5 = FIRST ARG BYTE OR AT RETURN ; ; ON EXIT TO PART 2, R5 WILL BE POSITIONED AT ; BYTE FOLLOWING LAST VALID BYTE IN LOGNAME. ; IF NO ARGS GIVEN, CALLS PART 3 IMMEDIATELY ; WITH TABLE CLEARED TO 0 ; ; FORMAT ERRORS WILL RESULT IN KBL RECALL, ; W LOSING PARITY BIT MOV #"^U,R2  ;PREPARE FOR CTRL/U CMPB @R5,#25  ;... & LOOK FOR IT BEQ MO.IP1  ;PRINT ECHO & START OVER INCB @R5  ;LOOK FOR RUBOUT CMPB @R5,@R1  ;IF SEEN BEFORE ... BPL .+10  ;SWITCH SET IN BUFFER... MOVB #134,R2  ;& NEG MEANS PRINT \ JSR PC,@R0 TSTB @R5  ;IF RUBOUT THIS TIME ... BPL MO.IP5 MOVB -1(R1),R2 ;ECHO ERASED CHAR. BMI MO.IP4  ;... UNLESS NO MORE THERE MOVB @R5,-(R1) ;REPLACE WITH R/O[+1] AS SW. BR MO.IPAT HOW OPEN CODE BIT @PC,2(R5) ;UNLESS WRITE INVOLVED ... BEQ BE.CLF  ;... JUST CLOSE FILE TST 6(R5)  ;SIMILARLY IF FILE NOT LINKED BMI BE.CLF ADD #22,R5  ;MOVE FIB PTR TO DIRY BLK. TST R2  ;USER WANT SAVE? BNE BE.DLT  ;NO GO DELETE ;MORE CHECKING IF SAVE REQUESTED: MOVB 5(R1),-(SP) ;GET BIT MAP PTR ... BIC #177770,@SP ;... VIA DRIVER LINK ASL @SP ADD (SP)+,R4 MOV 15(R4),R4 BEQ BE.DLT  ;IF NO LINK, DELETE ANYWAY CMP 6(R5),-(R4) ;ALSONTAIN AN APPROPRIATE ; CODE IDENTIFYING THE ERROR. ;DUMP PART I:- DECODE COMMAND STRING: ; ;ON ENTRY, REGISTERS AND STACK ARE AS SHOWN ABOVE ; ;USES SAVED VALUE OF R5 TO COLLECT CHARACTERS AND BUILD ; THE APPROPRIATE ARGUMENTS FOR THE DUMP ; OPERATION:- ; ; DEVICE NAME PACKED INTO RADIX 50 FORMAT ; UNIT NO. AND TFR DIRECTION CONVERTED TO ;  BYTES (TD:= 2 OR 4) ; START CONVERTED TO BINARY ADDRESS ; END CONVERTED TO WORD COUNT ; ;IF SATISFACTORY, DEVICE NAMITH R5 CLEARED AS REQD., R4 POINTING AS ON ; ENTRY TO TPB & R1 SET TO -3 TO FLAG THE ERROR. ; .BYTE 0,-1  ;IN USE/NO SHARE SW. ;SET UP TABLE ON TOP OF STACK: KBI.AS: MOV SP,@SP  ;HOLD TOP IN CALL R0 MOV @#V.RRES,-(SP) ;RESTORE CALL REGS JSR R5,@(SP)+ CMP (SP)+,(R0)+ ;MAKE ADJUSTMENT TST (SP)+  ;RTN TO KBI NOT REQD. MOV SP,R3  ;SAVE BOTTOM OF TABLE CLR -(SP)  ;CLEAR REST CMP SP,R0 BNE .-4 CMPB @R5,-(R1) ;ANY ARGS AT ALL? BEQ AS.GO  ;IF NOT G3 MO.IP5: DECB @R5  ;IF NOT R/O, RESTORE CHAR. MOVB @R5,(R1)+ ;... STORE IT, MOVB @R5,R2  ;... & ECHO IT CMPB R2,@SP  ;WAS IT RETURN OR LINE-FEED? BGT MO.IP2  ;IF NOT RETURN FOR MORE ;INPUT DONE - CONVERT & STORE: MOV (SP)+,R2 ;PRINT CR FOR LOW CTL CHARS JSR PC,@R0 SWAB R2  ;GET LF FROM STORED WORD JSR PC,@R0  ;PRINT IT ... CLR @SP  ;... & ZERO SWITCH CMPB (R5)+,R2 ;NOW CONVERT TO BINARY BNE .+4  ;... THO' IF LF IN IF THIS FIB ... BNE BE.DLT  ;... DOESN'T POINT SAME MAP MOV @R1,R4  ;OTHERWISE LET'S PRAY!!!!! CLR (R4)+  ;FORCE A LAST 0-LINK WRITE MOV R4,10(R1) ;CLOSE FILE AS REQD.: BE.CLF: MOV R0,-(SP) EMT .CLOSE BE.CDN: MOV 2(R0),SP ;RESTORE ORIGINAL STACK BR BE.ZDN  ;... & GO FOR NEXT DDB ;DELETE UNWANTED FILES: BE.DLT: MOV R0,R4  ;USE LINK ADDR .... CMP -(R4),(R1)+ ;... TO GET TRAN BLOCK MOV #4,E IS USED TO ESTABLISH ; DESPATCH POINT IN PART II AND PART II IS ; CALLED IN ON TOP OF PART I. ON EXIT:- ; ;  R0:- BLOCK NO FOR PART II (*) ;  R1:- START ADDRESS ;  R2:- WORD COUNT ;  R3:- DESPATCH ADDRESS POINTER ;  R5:- UNIT/FUNCTION (0=WR;1=RD) ; (* USES FOUR BLOCKS:- ;  1ST TWO FOR LINE PRINTER ONLY ;  2ND TWO FOR OTHERS) ; ;IF ERROR DETERMINED, KBI RECALLED WITH REGISTERS SET ; AS INDICATED ABOVE. POSSIBLE ERROR CODES ARE:- ;  -3 = FAULTY SYNTAX ;  -4 = IO TO NEXT PART ;CHECK FOR DEVICE: MOV R5,R2  ;SET LOOK-AHEAD PTR AS.CDV: CMPB (R2)+,#': ;CHECK FOR DEVICE BEQ AS.DV  ;IF FND GO CHK SOME MORE CMP R2,R1  ;KEEP LOOKING TO END BLO AS.CDV CMP -(R3),-(R3) ;IF NONE LEAVE TABLE BLANK AS.CFL: JSR PC,AS.CA ;LOOK FOR ALPHA ... BCC AS.FL  ;.... MUST BE FILE IF FND SUB #6,R3  ;OTHERWISE COULD BE UIC AS.CUC: CMPB (R5)+,#'[ ;CHECK ACCORDINGLY BEQ AS.UC ;INPUT INVALID - RECALL KBL: AS.ERPUT MOV R5,@SP  ;... RESET SWITCH JSR PC,MO.A2B BPL .+4  ;IF NO VALUE GIVEN ... MOV @R3,R0  ;...USE CURRENT VALUE MOV R0,(R3)+ ;OTHERWISE STORE INPUT MOV R3,R0  ;RESET ADDRESS POINTER MOV 2(SP),R5 ;... & IF SWITCH SET BNE MO.RPT  ;... REPEAT FOR NEXT LOC. COMB @R1  ;ENSURE R1 POSITIVE ;EXIT SEQUENCE: MO.XT: MOVB @R1,R1  ;SET ERROR CODE IF NEC. CMP (SP)+,(SP)+ ;CLEAN UP STACK CLR R5  ;SET DONE FLAG FOR KBL INCB MO.ND+4  ;SET UP KBL RE-(R4) ;SET FOR READ ... MOV @R1,-(R4) ;... USING WORD COUNT ... NEG @R4 MOV -(R1),-(R4) ;... & BUFF ADDR FROM DDB MOV R4,R1  ;SAVE TRAN PTR HERE MOV @R5,-(R4) ;THEN GET DIRY BLK FROM FIB BEQ BE.CDN  ;IF NONE EXIT NOW MOV -(R5),R5 ;GET ENTRY INDEX & USE ... ADD (R1)+,R5 ;... TO GET ENTRY ADDRESS JSR PC,BE.DOT ;DO READ ASR (R3)+  ;IF FILE OPEN FOR EXTENSION ... BCC BE.DOF CLRB 10(R5)  ;... UNLOCK IT MOV R3,R5  ;SET PTR AT 1ST EXT. BLOCK LLEGAL DEVICE ;  -6 = ILLEGAL ADDRESS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; .BYTE 0,-1  ;IN USE/SHARABLE SWITCH ;SET UP CHECK: ;PREPARE TO DECODE COMMAND STRING: KBI.DU: MOV @#V.RRES,-(SP) ;RESTORE KBI REGS. JSR R5,@(SP)+ MOV SP,R2  ;PREPARE BUFFER (*) CLR (R2)+  ;CLEAR DEV NAME BUFFER CLR @R2  ;ASSUME OUTWARD ON UNIT 0 CMP -(SP),-(SP) ;LEAVE ROOM FOR LIMITS MOVB #-6,-(R1) ;SET UP ERROR CODE IN CASE CMP (R3)+R: ADD #16,SP  ;FORGET TABLE MOV #-3,R1  ;SET UP ERROR .... CLR R5  ;... & DONE FLAGS INCB AS.ND+4  ;SET UP RECALL (EMT 31) BR AS.ND  ;... & GO DO IT ;DEVICE SPECIFIED (APPARENTLY): AS.DV: MOV R5,-(R3) ;STORE START IN TABLE MOV #3,-(R3) ;SET COUNT FOR 3 ALPHA AS.DVL: JSR PC,AS.CA ;LOOK FOR THEM BCS .+6  ;STOP AT FIRST NON-ALPHA DEC @R3  ;KEEP LOOKING BNE AS.DVL CMP R5,2(R3) ;ANY FOUND AT ALL? BEQ AS.ERR CLR @R3CALL MO.ND: .=.+KBI.MO-2+KBI.OZ-. V.RRES=46 V.CSA=4 .END BR BE.DEF BE.DOF: CLR (R5)+  ;IF OPEN FOR CREATION ... CLR (R5)+  ;... SCRUB FILE NAME ENTRY CLR (R5)+ CMP (R5)+,(R5)+ ;MOVE TO START BLOCK BE.DEF: ASLB (SP)+  ;CHECK DEVICE TYPE BPL .+4  ;IF DECTAPE, FORCE EXIT NOW CLR @R5  ;... BY ZEROING START BLOCK BE.CLX: TST (R1)+  ;MOVE TO FUNC IN TRAN BLK TST @R1  ;IF LAST READ CAUSED ERROR .. BMI BE.CDN  ;... FOR SAFETY DO NO MORE ASRB @R1  ;OTHERWISE SET FOR WRITE JSR PC,BE.DOT ;... DIRY OR LINK ,(R3)+ ;MOVE SVT. PTR TO CSA. JSR R3,DU.GDV ;SAVE IT & SET PTR TO SUBR. ; ; (*) OVERWRITES KBI CALL ARGS WHICH ARE NOW GARBAGE ; ;SUBROUTINE TO CHECK FOR DELIMITER: ; CALLED BY 'JSR PC,@R3' ; IF DELIMITER FOUND EXITS WITH Z BIT SET ; & INPUT PTR BUMPED (UNLESS END OF INPUT) ; OTHERWISE EXITS WITH CHAR IN R0 & PTR BUMPED DU.CHK: CMP R5,R1  ;AT END OF STRING? BEQ DU.CXT MOVB (R5)+,R0 ;GET NEXT BYTE CMPB R0,#40  ;CHECK FOR SPACE ... BEQ DU.CXT CMPB R0,#54  ;  ;IF SO MAY NOW BE UNIT CMPB (R5)+,-(R2) ;CHECK BY LOOKING AT : BEQ AS.CLN  ;THERE ALREADY - NO UNIT CMPB -(R5),(R2)+ ;RESET PTRS. MOV R5,@R3  ;HOLD START OF UNIT MOV R2,R5  ;SKIP TO NEXT (CHK IN PT2) ;CHECK FOR LOG NAME: AS.CLN: JSR PC,AS.CC ;CHECK FOR , & IF NOT FD ... CMP R3,SP  ;& COME FROM ELSEWHERE .. BEQ AS.ERR  ;... COULD BE AT TOP BR AS.CFL  ;... & CAN BE NO MORE ;FILE SPECIFIED: AS.FL: MOV R5,-(R3) ;SAVE START OF FILE STRING DEC @R3;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARDDDDDDDD, MASS. ;VERSION NUMBER: V003B ; .TITLE TMON ;TRANSIENT MONITOR VERSION 1 DEC 70 ; ; OCCUPIES MEMORY WHENEVER THERE IS NO ; CURRENT USER PROGRAM IN OPERATION ; ; LOADED AFTER MONITOR INIT. OR AT ; END OF USER RUN THRU .EXIT CALL. ; ;FUNCTIONS: ; 1) CHECKS FOR OUTSTANDING I/O LINKS ; VIA MONITOR DDB CHAIN. IF ANY, PERFORMS ; NECESSARY .CLOSE & .RLSE OPERATIONS ; 2) EFFECTIVELY REDUCES CORE OCCUPANCY ; TO PERMANENTBACK MOV @R5,@R4  ;SET START BLOCK (OR NEXT) BEQ BE.CDN  ;.... IF MORE TO DO ASLB @R1  ;RESET FOR READ MOV @R1,-(R1) ; (JUST THE LINK REALLY!) JSR PC,BE.DOT ;... & DO IT MOV @-(R1),@R5 ;SAVE LINK JUST READ CLR @(R1)+  ;CLEAR ITS BUFFER BR BE.CLX  ;... & GO CLEAR ON DISK ;SUB-ROUTINE TO DO TRANSFERS: BE.DOT: MOV R4,-(SP) ;SET UP .TRAN MOV R0,-(SP) EMT .TRAN MOV R0,-(SP) ;... & WAIT TILL COMPLETE EMT .WAIT RTS PC  ;... BEFORE GO FOR MO... OR COMMA DU.CXT: RTS PC  ;Z BIT SET IF FND ;GET DEVICE NAME: DU.GDV: MOV -(R2),-(SP) ;PACK RADIX 50 REQD. ASL @SP  ;SO MULT. PREV VALUE BY 50 ASL @SP ADD (SP)+,@R2 ASL @R2 ASL @R2 ASL @R2 JSR PC,@R3  ;GET INPUT CHARACTER BEQ DU.GTD  ;DELIMITER: GO FOR DIRECTN SUB #100,R0  ;ASSUME ALPHA O.K. ... BLE DU.GDU  ;... UNLESS TOO SMALL (*) ADD R0,(R2)+ ;ADD TO PREV. VALUE BR DU.GDV  ;CONTINUE TILL NON-ALPHA ;  ( MOV #5,R2  ;ALLOW 6 CHARS. TST -(R3)  ;OMIT 2ND WORD FOR NOW AS.FLL: CMP R5,R1  ;LOOK FOR THEM BEQ AS.ERR  ;IF AT STRING END NO LOGNAME JSR PC,AS.CV ;CHECK IF O.K. BCS AS.CFE  ;IF NO MORE GO CHK FOR EXT DEC R2  ;OTHERWISE KEEP LOOKING BNE AS.FLL ;CHECK FOR EXTENSION: AS.CFE: JSR PC,AS.CC ;CHECK FOR , & IF RETURN ... TST -(R3)  ;ALREADY GOT EXTENSION? BNE AS.CUC  ;IF SO GO CHK FOR UIC CMPB @R5,#'.  ;OTHERWISE CHK FOR IT BNE AS.CUC  ; MONITOR & PRE-LOADING ASSIGNMENTS ; ONLY. ; 3) TIDIES MONITOR TABLES FOR THIS STATE & ; IN PARTICULAR, RESTORES MRT. TO GENERATED FORM ; BY READING COPY FROM DISK. ; 4) ON COMPLETION OF CORE RESTORATION, ACTS AS ; KEYBOARD LISTENER FOR MONITOR COMMANDS. FOR GENERAL ; CALLS USES THE INTERPRETER TO EFFECT ACTION ; REQUIRED. THE FOLLOWING COMMANDS HOWEVER CAN ; ONLY BE CONSIDERED WHEN THERE IS NO USER ; PROGRAM RESIDENT - THESE ARE HANDLED BY TMON ; ITSELF:- ;  LOGIN ;  FINISH RE ;WHEN DONE GO BACK FOR NEXT DDB: BE.ZDN: MOV (SP)+,R1 ;GET BACK ORIG. DDB PTR MOV -(R1),R1 ;GET NEXT DDB ADDR BNE BE.ZDC  ;... UNLESS AT CHAIN END BE.ND1: MOV (SP)+,R0 ;IN WHICH CASE GO PART 3 .=.+BE.CON+376-. V.RRES=46 V.GTB=50 .WAIT=1 .TRAN=10 .CLOSE=17 .=.+BE.CON-2+KBI.OZ-. .EOT ;BEGIN PROCESSOR PART 3 ; ; PERFORMS FINAL CLEAN-UP OPERATI*) IF NOT WILL FAIL DEVICE CHECK! ;GET UNIT NO.: DU.GDU: ADD #20,R0  ;MUST BE OCTAL DIGIT CMP R0,#7  ;SO ADJUST & CHECK BHI DU.DVD  ;IF NOT GO TRY ':' MOVB R0,3(R2) ;OTHERWISE STORE IN UNIT BYTE JSR PC,@R3  ;NEXT CHAR MIGHT BE ':' BEQ DU.GTD  ;... OR DELIMITER SUB #60,R0  ;IF NOT LATTER, ADJUST CHAR DU.DVD: CMP R0,#12  ;ACCEPT COLON ... BNE DU.ER1  ;REJECT ANYTHING ELSE JSR PC,@R3  ;NOW THERE MUST BE DELIMITER BNE DU.ER1  ;IF NOT SCREAM NOT THERE - AGAIN UIC CHK INC R5  ;GO PAST . MOV R5,(R3)+ ;STORE START OF EXT MOV #3,R2  ;RESET COUNT ... BR AS.FLL  ;RETURN & CHK AGAIN ;CHECK U.I.C.: AS.UC: MOV R5,-(R3) ;SAVE START AS.UCL: CMP R5,R1  ;MORE IN STRING? BEQ AS.ERR  ;MUST BE LOGNAME! CMPB (R5)+,#'] ;LOOK FOR UIC END BNE AS.UCL BR AS.CLN  ;WHEN FOUND GO CHK FOR , ;SUBROUTINE TO CHECK CHARS FOR LATER RAD50 PACK ; VARYING ENTRY POINT DEPENDING ON CHARS ACCEPTABL ;  RUN ;  GET ;  OTHER ; ; FOLLOWING 'RUN' OR 'GET', OPENS FILE ; SPECIFIED AND PASSES CONTROL TO THE RUN-TIME ; LOADER TO COMPLETE THE READING OF THE PROGRAM ; IT CONTAINS. ; ; ON ENTRY FROM '.EXIT', STACK IS SET AT LOAD POINT ; & R5 IS SET TO THE ADDRESS OF MONITOR DDB CHAIN ; IN SVT. ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL TMON ;SHUT DOWN OUTSTANDING I/O: TMONS. ; ; ON ENTRY,SAVED REGS ARE OF NO FURTHER USE. ; OTHERWISE STACK SET IMMEDIATELY BELOW ; PROGRAM LOAD POINT IS CLEAN. ; .BYTE 0,-1 ;DROP ASSIGNMENTS NADE DURING EXECUTION: BE.CLR: MOV @#V.RRES,-(SP) ;RESTORE CALL REGS. JSR R5,@(SP)+ CMP (SP)+,(SP)+ ;... & TIDY STACK MOV @#V.SVT,R3 ;RESET POINTER TO SVT. MOV R3,R5  ;GET WTL IN SVT. ADD #V.WTL,R5 MOV R3,R1  ;GET BAT IN SVT. ADD #V.BAT,R1 BE.ZAT: CMP @R1,@R3  ;TABLE START ABOVE EOM? BHIS BE.ZAD;GET DIRECTION: DU.GTD: JSR PC,@R3  ;GET CHARACTER BEQ DU.GLL CMP R0,#111  ;LOOK FOR 'I' BNE .+6  ;TREAT ALL ELSE AS 'O' INCB 2(R2)  ;FOR 'I' MAKE FUNC = 1 JSR PC,@R3  ;NEXT CHAR MUST DELIMIT BNE DU.ER1 ;GET LIMITS: DU.GLL: CLR -(R2)  ;ZERO NUMBER BUFFER JSR PC,@R3  ;GET CHAR. BEQ DU.GHL  ;IF NOT DELIMITER ... SUB #60,R0  ;... MUST BE DIGIT CMP R0,#7 BHI DU.ER1 BIT #160000,@R2 ;MUST ALSO BE ROOM IN WORD BNE AS.CV: MOV #22,R0  ;GET CHAR. .... CMPB @R5,#'0  ;CHECK FOR DIGIT BLO AS.CA  ;O.K. AFTER FIRST FILE CHAR CMPB @R5,#'9 BLOS AS.CG AS.CA: MOV #100,R0  ;LOOK FOR ALPHA CMPB @R5,#'A  ;O.K. ANYWHERE BLO AS.CXT CMPB #'Z,@R5 BLO AS.CXT AS.CG: MOVB @R5,-(SP) ;REDUCE VALID CHAR. TO ... SUB R0,@SP  ;... RAD50 FORMAT MOVB (SP)+,(R5)+ ;... & GO TO NEXT AS.CXT: RTS PC  ;ON EXIT C BIT SHOWS RESULT ;SUBROUTINE TO LOOK FOR END OF DATASET SPECIFIER: AON: MOV @PC,@#177560 ;ENABLE KBD INTS AGAINST ERROR MOV PC,R3  ;GET ADDR OF LINK BLOCK ADD #TM.LNK-.,R3 TM.GO: MOV @R5,@R3  ;GET DDB ADDR IF ANY BEQ TM.IOC MOV @R5,R0  ;SET POINTER TO IT MOV -(R0),R2 ;GET ASSOC. DVR ADDR CMP (R0)+,(R2)+ BIT @R2,#120000 ;... & CHK IF FILE DEVICE BEQ TM.NFS  ;... OR MAGTAPE TST 6(R0)  ;IF SO, IS FILE OPEN? BEQ TM.NFS MOVB 12(R0),R4 ;... & ACTUALLY BY .OPEN BPL TM.NFS-4 BIT R4,#2  ;OUTPUT DONE? BEQ   ;IF SO, WILL BE LOST MOV @R1,R1  ;ANY TABLE AT ALL (OR MORE)? BEQ BE.ZDL  ;IF NOT NEVER MIND BE.ZAS: TST @R1  ;OTHERWISE FIND END BEQ BE.ZDL  ;... IN CASE IT'S IN BUFF AREA CMP (R1)+,#-1 ;A NEW SEGMENT IS THE CLUE! BEQ BE.ZAT MOVB 2(R1),R0 ;OTHERWISE TRIP ALONG CHAIN ASL R0 CMP (R0)+,(R0)+ ADD R0,R1 BR BE.ZAS BE.ZAD: CLR @R1  ;IF END ABOVE EOM, SET STOP ;NOW CLEAR FREE CORE: BE.E DU.ER1 ASL @R2  ;IF O.K. MOVE PREV INPUT ASL @R2 ASL @R2 ADD R0,@R2  ;... & ADD IN NEW DIGIT BR DU.GLL+2 ;CHECK IF LIMITS DONE: DU.GHL: BIT #1,@R2  ;INPUT MUST ADDRESS WORD BNE DU.ER2 COM @SP  ;DONE BOTH LIMITS? BMI DU.GLL  ;IF NOT GO DO HIGH NOW ;CHECK LIMITS & ADJUST FOR DEFAULT MOV (SP)+,R3 ;GET BACK SVT. PTR MOV (SP)+,R2 ;GET HIGH LIMIT BNE .+4 MOV @R3,R2  ;IF NONE USE CORE TOP MOV (SP)+,R0 ;... & LOW CMP R2,@R3  ;IF GIVES.CC: CMPB @R5,#',  ;IF NOW AT COMMA ... BEQ AS.LN  ;... OR SPACE ... CMPB @R5,#'  ;... DO LOG NAME BNE AS.CXT  ;ELSE GO CHECK SOME MORE ;LOG NAME CHECK: AS.LN: CMPB (R5)+,(SP)+ ;SKIP , & CLEAN UP STACK CMP R5,R1  ;ANYTHING FOLLOWING? BEQ AS.ERR  ;(MUST BE!!!) MOV R5,@SP  ;IF SO STORE START JSR PC,AS.CV ;CVT REST BCC .-4 AS.GO: MOV #KBI.OS,R0 ;GET DISK INFO BCS .+4  ;IF FROM ABOVE OMIT NEXT ASL R0  ;IF FROM NO ARG OMIT PART 2 ADD KTM.NFS-4 TST @R2  ;ENOUGH CHECKS FOR MT BPL TM.MTC  ;... MUST CLOSE MOV 26(R0),R4 ;ALSO FIB LINKED OTHERWISE? BEQ TM.NFS-4 BIT @PC,2(R4) ;... OUTPUT OPEN & ... BEQ TM.NFS-4 TST 26(R4)  ;... WITH BIT MAP IN? BEQ TM.NFS-4 TM.MTC: MOV R3,-(SP) ;YES - MUST CLOSE IT EMT .CLOSE MOV R3,-(SP) ;WAIT TILL DONE & THEN ... EMT .WAIT CLR 6(R0)  ;MAKE SURE NO BUFFER NOW TM.NFS: MOV R3,-(SP) ;... BEFORE TRY RELEASE EMT .RLSE BR TM.GO  ;... & RZDL: MOV -(R5),R0 ;REMOVE ALL BUFFER ALLOC. TST -(R5) CLR -(R0) CMP R0,@R5 BNE .-4 MOV (R3)+,R0 ;RESET STACK STOP MOV R0,R1  ;BUT ZERO FREE CORE FIRST CLR (R1)+ CMP R1,SP BLO .-4 ADD #40,R0 MOV #107070,@R0 MOV R0,@R3 TST -(R5) MOV -(R5),R0 ;REMOVE NO-RES DVRS TST (R0)+  ;FIRST MOVE TO SYS DSK ADDR MOV (R0)+,R1 ;PICK UP ADDR CMP (R1)+,(R0)+ ;MOVE ON (ALSO SETS C BIT ... MOV #2000,R2 ;... SINCE @R1 MUST BE 0) BIT R2,@R1 N IS IT IN CORE? BHI DU.ER3  ;OBJECT IF NOT TST (R2)+  ;GET SIZE SUB R0,R2  ;... PROVIDED LOWBK01,-(SP) ;OLD NAME MOV #LKBK01,-(SP) EMT RENAME ;RENAME TO TEMP FILE NAME MOV .ADDR1,FNBK01+10 ;MOV IN NEW PROTECT CODE MOV #FNBK01,-(SP) ;NEW NAME MOV #FNBKPR,-(SP) ;OLD NAME MOV #LKBK01,-(SP) EMT RENAME ;RENAME BACK WITH NEW PROTECTION MOV #LKBK01,-(SP) EMT RELEAS ;RELEASE DEVICE TSTB .FLAG1 ;MORE OUTPUT BNE .PRR ;YES RTS R5 ;NO-GO HOME .PERR: MOV #S20@: ; A) CHECKS SPECIFIED INPUT AVAILABLE:- ; IF NO OWNERSHIP STIPULATED WHEN DEVICE ; IS FILE-TYPE, INPUT WILL BE ASSUMED ; INITIALLY TO BELONG TO LOGGED-IN USER ; OR, BY DEFAULT, TO THE SYSTEM. THERE ; WILL BE NO ASSUMPTION IF OWNER SPECIFIED. ; B) CALLS RUN-TIME LOADER TO ENTER PROGRAM. ; FOLLOWING 'RUN', PROGRAM WILL BE STARTED ; AUTOMATICALLY AT THE APPROPRIATE ADDRESS - ; THAT ESTABLISHED DURING ASSEMBLY OR AT ; LOAD POINT BY DEFAULT. ;GET SPECIFIED INPUT & CHECK AVAILABILITY:A////////////// ;ROUTINE TO SET UP SWITCH DISPATCH BY SETTING FLAGS ;FOR QUALIFIERS AND SETTING ADDRESS FOR ACTION DISPATCH. ;CALLED BY CONTROL ROUTINE WHEN A SWITCH IS SEEN .SWLOG: MOV LKBKDU+10,R0 ;MOV # OF WDS TO FOLLOW IN R0 TST R0  ;ANY SWITCHES AT ALL? BEQ .SWL10  ;NO-CHECK FOR * ROL R0  ;MAKE IT NUMBER OF BYTES ADD #LKBKDU+10,R0 ;R0 POINTS TO SWITCH ASCII .SWL5: MOV R0,R4  TST (R4)+  ;R4 POINTS TO NEXT SWITCH INC SWCNT  ;SWITCH-SEEN COUNT B5,.ERCDW ;ILLEGAL INPUTS JMP .ERRFT ;FATAL ERROR ;FS ERROR IN PROTECT .PERR3: MOV #S203,.ERCDW ;PROTECT CODE TOO LONG JMP .ERRFT .WORD 0 FNBKPR: .WORD 175777 ;DUMMY NAME FOR TEMPORARY .WORD 175777 ;FILE RENAME .WORD 176777 .WORD 0 .WORD 0 .ADDR: .WORD 0 ;LITTLE BUFFER TO STORE .WORD 0 ;SIX CHAR ASCII STRING .WORD 0 .ADDR1: .WORD 0 .END CD TM.GE: CLR R2  ;REMEMBER IT'S 'GET' TM.RU: MOV V.EOM-V.OSW(R4),@SP ;RESET EOM FOR .... MOV 10(SP),V.EOM-V.OSW(R4) ;PROG D/S SET UP MOV (SP)+,6(SP) ;... & MOVE TO STRING PTR MOV 2(SP),@#60 ;RESET FOR KBI OPERATION ... MOV R2,2(SP) ;... & SAVE REQT FOR START MOV @PC,@#177560 ;ALLOW INTS. AGAINST ERROR MOV #401,V.MUS-V.OSW(R4) ;ALSO ASSUME PROGRAM IN CORE MOV @SP,R2  ;USE CSI TO GET SPECIFICATION MOV #-3,-(SP) ;... WITH FIRST ERROR ILL SYN JSR PC,TM.CSI ;AEJSR R5,.ASCHK ;CHECK IF ACTION SWITCH TST R2  ;SUCCESS? BEQ .SWL3  ;NO TST .ACT  ;YES-IT IT FIRST ACTION SWITCH? BEQ .SWL4  ;YES MOV #S232,.ERCDW ;NO-MORE THAN ONE ACTION SWITCH JMP .ERRFT .SWL4: MOV R2,.ACT  ;SAVE ROUTINE ADDRESS .SWL3: TST (R4)  ;MORE SWITCHES? BEQ .SWL1  ;NO MOV (R4),R0  ;MOV # OF WDS IN R0 ROL R0  ;MAKE IT NUMBER OF BYTES ADD R4,R0  ;R0 POINTS TO SW VALUE BR .SWL5  ;LOOP TILL DONE .SWL1: MOV LKBKDU+10,RFG ;PIP-11 V002A ;////////////////////////////////////////////////////// ;////////////////////////////////////////////////////// ;///////////// SUBROUTINE RENAME ////////////////////// ;////////////////////////////////////////////////////// ;////////////////////////////////////////////////////// .CSECT .TITLE RENAME .GLOBL .RENAM .GLOBL .ERCDW,.ERRFT,HLSO CHECK INDIV OWNERSHIP BEQ TM.RUG  ;FILE FOUND - GO PROCESS MOV (PC)+,R2 ;SET UP FOR DEFAULT EXT. .RAD50 'LDA' TST 6(R1)  ; OWNER STIPULATED? BNE TM.RCM  ;IF SO CHECK AGAIN ;SPECIFIED FILE NOT THERE - TRY DEFAULTS: TM.RUR: MOV #401,6(R1) ;OTHERWISE TRY SYSTEM JSR PC,TM.DCK BEQ TM.RUG  ;O.K. GOT IT THIS TIME TST 4(R1)  ;ANY EXT. GIVEN? BNE TM.RER  ;IF SO THAT'S IT MOV R2,4(R1) ;OTHI0 ;#OF WDS TO FOLLOW IN R0 ROL R0  ;TIMES 2 ADD #LKBKDU+10,R0 ;R0 POINTS TO SWITCH ASCII .SWL11: MOV R0,R4 TST (R4)+  ;R4 POINTS TO NEXT SWITCH TO CHECK JSR R5,.QUACK ;CHECK FOR QUALIFIERS TST (R4)  ;MORE SWITCHES? BEQ .SWL10  ;NO MOV (R4),R0  ;# OF WDS IN R0 ROL R0  ;TIMES 2 ADD R4,R0  ;R0 POINTS TO ASCII SW BR .SWL11 ;/////////////// THIS PORTION OF SWITCH LOG TESTS FOR * SPECIFIER ;/////////////// IN COMMAND STRING. IF FOUND,ITJK.ERRPR,.MOVFN,.MOVLK .GLOBL .NUMIN,.NUMOT,.CSII,.CSII1,.CSII2,.CSII3,.CSII4,.CSII5 .GLOBL FNBK01,FNBK02,FNBKDU,LKBK01,LKBK02,LKBKDU ;SUBROUTINE TO PERFORM PIPS RENAME FUNCTION ;ONLY ONE INPUT AND OUTPUT FILES ALLOWED ;A,(R0)+ RTS PC ;CONVERT BINARY TO OCTAL ASCII (6BYTES) BTOA: MOV R3,-(SP) ;NO. TO CONVERT MOV R0,-(SP) ;ADDRESS OF DESTINANE MOV R1,#0  ;HOLD FOR LATER CHECKING TM.LBC=.-2 JSR PC,@R2  ;IGNORE LOAD ADDRESS JSR PC,@R2  ;GET GEN INFO MARKER CMP R1,#3401 ;CHECK IT'S CORRECT BNE TM.LCL  ;IF NOT THIS COULD BE 2ND LINE ;EXTRACT GENERAL INFORMATION: JSR PC,@R2  ;GET LOAD POINT MOV R1,-(SP) ;... & HOLD FOR MOMENT JSR PC,@R2  ;GET SIZE ... ADD @SP,R1  ;... & COMPUTE UPPER LIMIT SUB #2,R1 CMP R1,(R5)+ ;WITHIN  ;FATAL ERRORS: OUTPUT SPECIFIER IS NON FILE-STRUCTURED ;NON FATAL ERRORS: MORE THAN ONE OUTPUT SPECIFIER .GETLK: JSR R5,.CSII2 ;INITIALIZE INTERFACE JSR R5,.CSII5 ;GET OUTPUT SPECIFIER MOV FNBKDU+6,UIC JSR R5,UCGET ;GET UIC TST R0  ;ANY MORE OUTPUT SPECIFIERS? BEQ GETLNK  ;NO MOV #S204,.ERCDW ;TOO MANY OUTPUT SPECIFIERS JSR R5,.ERRFT GETLNK: JSR R5,.MOVLK LKBKDU LKBK01 INITO: MOV #LKBK01,-(SP) EMT INIT  ;INIT OUTPUT DEVICE MOV #LKBK01,LT R2 ;BYPASS READ CHECK,WRITE, BEQ .COPY2 ;AND WRITE CHECK ON 1ST PASS. BIT #RDCHK,2(R2) ;TEST FOR ERROR IN PREVIOUS READ. BNE .CERR2 ;YES-JMP TO ERROR PRINT. BIT #40000,2(R2) ;END OF DATA IN PREVIOUS READ? BNE .COPY4 ;YES-SKP TO SET FLAG. BIT 2(R2),#400 ;CHECK FOR INVALID LINE. BNE .CERR2 ;YES-INVALID LINE. BR .COPY1 ;GO TO WRITE. .COPY4: TST 4(R2) BEQ .COPOT ;NOTING READ-EXIT INCB .FLAG4 ;SET FLAG TO TERMINATE ;AFTER WRITE TION MOV #5,-(SP) ;CODE - BINARY TO OCTAL ASCII EMT 42 MOV #6,UPDFAC RTS PC ;CONVERT BINARY TO DECIMAL ASCII BTDA: MOV R3,-(SP) ;NO. TO CONVERT MOV R0,-(SP) ;ADDRESS OF DESTINATION MOV #3,-(SP) ;CODE EMT 42 MOV #5,UPDFAC RTS PC REPLZ: MOVB #40,R3 BR SUPLZ+2 SUPLZ: CLR R3 MOV R0,-(SP) ;SAVE ORIG. ADDRESS LZTST: CMPB (R0),#60 BNE UPDATE  ;NOT A LEADING ZERO MOVB R3,(R0)+AVAILABLE CORE? BHI TM.LE3  ;IF NOT REJECT MOV (SP)+,@R5 ;STORE LOAD POINT MOV @R5,#0  ;... & AGAIN SAVE TM.PLA=.-2 ADD #V.PSA-V.PLA,R5 ;MOVE TO PSA IN SVT. JSR PC,@R2  ;GET & STORE PROGRAM START MOV R1,(R5)+ TST @SP  ;CHECK IF 'RUN' BEQ .+4 MOV R1,@SP  ;IF SO HOLD START NOW JSR PC,@R2  ;GET & STORE DEBUGGER START MOV R1,(R5)+ JSR PC,@R2  ;GET RELOCATE FLAG TST R1  ;OBJECT IF SET ... BNE TM.LE2  ;... FOR THE PRESENT ADD #V.PGKBK JSR R5,SETUP ;SETUP FOR DISK OR DT  RTS R5  ;OK - FILE STRUCTURED DEV. MOV #S231,.ERCDW ;FATAL ERROR JSR R5,.ERRFT ;DEVICE NOT FILE STRUCTURED ;SEES WHETHER DEVICE IS FILE STRUCTURED ;IF SO SETS UP BUFFER SIZE, NOWDS/BLOCK ;BLOCK NO OF 1ST MFD FOR DEVICE SPECIFIED ;REQUIRES LKBK CONTAIN LKBK01 OR LKBK02 SETUP: MOV LKBK,-(SP) ;EXIT 1 - OK EMT STATUS  ;EXIT 2 - ERROR - NON FILE STRUCT. DEVICE MOV (SP BIT 2(R2),#2 ;IGNORE FOLLOWING TEST BEQ .COPY1 ;IF FORMATTED MODE. MOV R2,R0 ;WE MUST TEST IF LAST ADD #6,R0 ;LINE READ FROM FILE ADD 4(R2),R0 ;ENDS IN NUL. IF SO, DON'T TSTB -(R0) ;OUTPUT THE BYTE. BNE .COPY1 ;BRANCH IF NOT NUL. DEC 4(R2) ;DECREMENT BYTE COUNT .COPY1: MOV R2,-(SP) MOV #LKBK01,-(SP) EMT WRITE ;INITIATE WRITE TSTB .FLAG4 ;EOD ON PREVIOUS READ? BNE .COPOT ;YES-EXIT TST R3 ;BYPASS WRITE CHECK ON BEQ .C ;REPLACE WITH NULL OR SPACE INC CNT TST CNT BLT LZTST UPDATE: MOV (SP)+,R0 ADD UPDFAC,R0 RTS PC UPDFAC: 0 CRLF: MOVB #15,(R0)+ MOVB #12,(R0)+ RTS PC ;CONVERT RAD50 WORD TO ASCII AND STORE IN LINE BUFF (3 BYTES) CONV: MOV (R1)+,-(SP) ;WORD TO BE CONVERTED MOV R0,-(SP) ;ADDRESS OF DEST. MOV #1,-(SP) ;RAD50 TO ASCII EMT 42 ADD #3,R0  ;UPDATE POINTER IN LINE BUFF RTS PC  ;DONE ;MOVE SPACES TO LINE BUFF (-NO. IN CNT) SPACE: MOVB N-V.PSA-4,R5 ;MOVE TO PGN IN SVT. JSR PC,@R2  ;GET & STORE PROGRAM NAME MOV R1,(R5)+ JSR PC,@R2 MOV R1,(R5)+ ;NOW COLLECT LIST OF MONITOR ROUTINES TO BE RESIDENT: CLR #0  ;PREPARE TO COUNT MON RTNS TM.LMC=.-2 MOV SP,R5  ;HOLD PRESENT STACK POINTER JSR PC,@R2  ;GET NEXT MARKER TM.LCL: CMP R5,SP  ;MON RTN STORE U/W? BLO TM.LE2  ;NEEDED IF COME HERE DIRECTLY CMP TM.LBS,TM.LBC ;SHOULD STILL B)+,STWD MOV (SP)+,DEVNAM MOV (SP)+,NOWDS BIT #120000,STWD BNE OK  ;FILE STR. OR MAG TAPE TST (R5)+  ;SETUP ERROR EXIT RTS R5  ;AND EXIT OK: BIT #40000,STWD BEQ DISK  ;DEVICE IS DISK DECTAP: MOV #100,FSTMFD ;DEVICE IS DT - INITIALIZE MFD SETUP2: MOV NOWDS,ENDBLK ROL ENDBLK ADD #BLOCK-2,ENDBLK ;POINTER TO END OF BUFFER FOR DEVICE SPECIFIED RTS R5  ;OK EXIT DISK: MOV #1,FSTMFD BR SETUP2 STWD: .WORD 0 DEVNAM: .WORD 0 ;SUBROUTINEOPY2 ;2ND PASS. BIT #WRCHK,2(R3) BNE .CERR3 .COPY2: MOV R3,-(SP) ;ROTATE THE BUFFER BNE .COPY5 ;POINTERS ACCOUNTING MOV #.LINE2,(SP) ;FOR FIRST TWO ENTRIES. TST R2 BEQ .COPY5 MOV #.LINE3,(SP) .COPY5: MOV R2,R3 MOV R1,R2 MOV (SP)+,R1 BR .COPY6 .COPOT: RTS R5 ;DONE-EXIT .COPY .CERR2: MOV 2(R2),.AUXWD ;READ ERROR. BR .CERR .CERR3: MOV 2(R3),.AUXWD ;WRITE ERROR. .CERR: BIC #377,.AUXWD SWAB .AUXWD MOV #S202, .ERCDW #40,(R0)+ INC CNT TST CNT BLT SPACE RTS PC FILLST: JSR PC,MOVMES ;MESS. ADDRESS IN R1 JSR PC,BTDA  ;NO TO BE CONVERTED IN R3 MOV #-4,CNT JSR PC,REPLZ EX: RTS PC MOVMES: TSTB (R1)  ;MOVES MESSAGE (R1) TO LINE BUFFER (R0) BEQ EX  ;EXITS ON 0 (R1) MOVB (R1)+,(R0)+ BR MOVMES OUTPUT: SUB #LINE,R0 MOV R0,HEADER+4 MOV #HEADER,-(SP) MOV #LKBK01,-(SP) EMT WRITE MOV E IN BIN. LINE BGT TM.LE2  ;... SO CHECK DECB R1  ;AT COMD END? BMI TM.LND DECB R1  ;IF NOT, THIS MON RTN MARK? BNE TM.LE2 SWAB R1  ;O.K., ANY RTNS REQD. BEQ TM.LCL-2 ;IF NOT GO BACK FOR END MARK ASL R1  ;OTHERWISE GET # OF BYTES SUB R1,SP  ;... TO GIVE STACK ROOM TM.LGM: JSR PC,@R2  ;GET RTN # MOV R1,-(R5) ;STORE ON STACK INC TM.LMC  ;... & COUNT 'EM CMP R5,SP  ;UNTIL END OF LIST BNE TM.LGM CMP TM.LBS,TM.LBC ;NOW AT LINE END TO GET A WILD CARD FILE - FNBKWC SHOULD CONTAIN *'S. ;EXIT 1=GOOD FILE ;EXIT 2=NO MORE FILES WCSRCH: TST (R2)  ;R2 POINTS TO FILE NANE IN UFD BEQ NOGO  ;NULL FILE NAME CMP FNBKWC,#'* BEQ TSTEXT  ;FILNAM IS * CMP FNBKWC,(R2) ;FIL BNE NOGO CMP FNBKWC+2,2(R2) ;NAM BNE NOGO TSTEXT: CMP FNBKWC+4,#'* BEQ WCRET  ;EXT IS * CMP FNBKWC+4,4(R2) BEQ WCRET  ;MATCH NOGO: TST (R2)  ;EMPTY FILE? BEQ NOGO2  ;YES. DON'T TALLY ADD 14(R2),BLKS ; JSR R5,.ERRFT ;PRINT IT .END #LKBK01,-(SP) EMT WAIT RTS PC HEDEND: JSR PC,CRLF JSR PC,CRLF JSR PC,OUTPUT RTS PC ;ROUTINE TO PRINT OUT "DEV: FREE BLKS: N N N N" IN RESPONSE TO /FR ;COUNTS FREE BITS IN PERMANENT BIT MAPS (CNTBIT) FREE: MOV FSTMFD,BLKNO CLR R3  ;ACCUMULATE TOTAL IN R3 JSR PC,RDBLK ;READ 1ST MFD MOV BLOCK+4,BLKNO ;POINTER TO 1ST BIT MAP RDMAP: JSR PC,RDBLK JSR PC,CNTBIT TST BLOCK BEQ PRNTFR  ;DONE-PRINT MOV BLOCK,BLKNO BR RDMAP PRNTFR: MOV #? BNE TM.LCL-2 ;IF NOT GO FOR NEXT MARK JSR PC,@R2  ;OTHERWISE GET CHECKSUM TSTB TM.LCS  ;DOES IT TALLY? BEQ TM.LGO+4 ;IF SO GO FOR NEXT LINE ;LOAD ERRORS: TM.LE1: MOV #1421,-(SP) ;READ FAILURE IOT TM.LE3: MOV R1,-(SP) ;LOAD MODULE TOO BIG MOV #1423,-(SP) ;GIVE UPPER LIMIT AS EVID. IOT ;TM.LE2 MOVED OUT IN ORDER TO BE WITHIN BRANCH RANGE ;COMD BLOCKS NOW DONE - DESPATCH TO DATA LOADER: TM.LND: JSUPDATE TOTAL BLKS INC FILES NOGO2: JSR R5,ENDTST ;NO MATCH - GET NEXT FILE  BR WCSRCH  ;GOT IT ADD #2,R5  ;NO MORE FILES WCRET: RTS R5  ;EXIT .WORD 0  ;WILD CARD FNBLK .WORD 0 FNBKWC: .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 ;GLOBAL SUBROUTINES ;CHECKS IF FNBKXX+6 IS NON-ZERO (OTHER THAN LOGGED IN UIC) ;IF NOT, GETS LOGGED IN UIC ;REQUIRES FNBKXX+6 BE IN UIC TO START UCGET: T ; PIP-11 V003B ; SYMBOL DEFINITION FOR ALL PIP ; ASSEMBLY MODULES R0=%0 ;REGISTER DEFINITION R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 SP=%6 PC=%7 R7=%7 WAIT=1 ;DISK MONITOR EMT SYMBOLS WRITE=2 READ=4 INIT=6 RELEAS=7 TRAN=10 STATUS=13 SEARCH=14 ALLOC=15 OPEN=16 CLOSE=17 RENAME=20 DELETE=21 APPEND=22 PROTECT=24 EXIT=33 UTILIT=41 S202=2202 S203=2203 S204=2204 S205=2205 S206=2206 S207=22LINE,R0 JSR PC,DEVICE ;"DEV" TO LINE BUFFER MOVB #40,(R0)+ MOV R3,BLKS JMP FRMESS  ; ;SUBROUTINE TO COUNT BITS IN PERMANENT BIT MAP. USED WITH /FR SWITCH CNTBIT: MOV BLOCK+4,R4 ;NO. WORDS IN BIT MAP ASL R4  ;MAKE IT BYTE COUNT MOV #BLOCK+10,R1 ;1ST WORD OF BITS IN MAP TBYT: TSTB (R1)  ;ALL ZEROES? BNE CNTFR  ;NO COUNT THE BITS ADD #8.,R3  ;YES ADD 8 TO CNT NXTBYT: INC R1 DEC R4 BNE TBYT RTS PC  ;DONE CNTFR: ROLB (R1)  ;1 BCS .+R PC,@R2  ;GET FINAL CHECKSUM TSTB TM.LCS  ;... & VERIFY BNE TM.LE1 MOV @R0,R0  ;GIVE LDR DDB ADDRESS MOV TM.LTS,R1 ;... & FILE TYPE SWITCH MOV TM.LTB,R5 ;GET TRAN BLOCK ADDRESS TST (R5)+ MOV (R5)+,R2 ;... TO PASS BUFFER ADDRESS TST (R5)+ BIC #137777,@R5 ;ENSURE EOD BIT SET IN DDB BIS @R5,12(R0) ;... IF NECESSARY MOV TM.LRS,R5 ;PASS ON RWN RESIDENCY MOV TM.LMC,-(SP) ;SHOW MON RTN COUNT MOV TM.PLA,-(SP) ;... & PROGRAM LOAD POINT EMT 61 ST UIC  ;CALLED BY JSR R5 BNE UCRET MOV #105,-(SP) EMT UTILIT  ;GET UIC MOV (SP)+,UIC UCRET: RTS R5 FINDUC: MOV FSTMFD,BLKNO JSR PC,RDBLK ;READ 1ST MFD BLOCK RDMFD: MOV BLOCK,BLKNO ;LINK TO NEXT MFD JSR PC,RDBLK ;READ NEXT MFD BLOCK MOV #BLOCK+2,R2 ;UIC IN MFD CMPUIC: CMP (R2)+,UIC BEQ RETURN  ;FOUND MATCHING UIC ADD #6,R2 CMP R2,ENDBLK BLT CMPUIC TST BLOCK BNE RDMFD TST (SP)+  ;CLEAR STACK MOV #S233,.ERCDW ;NO MATCHI07 S231=2231 S232=2232 S233=2233 S234=2234 S235=2235 S236=2236 S237=2237 S240=2240 S241=2241 S242=2242 S251=2251 S252=2252 CR=15 LF=12 ;ASCII DEFINITIONS FOR CNTRL CHRS VERTAB=13 AL="AL BR="BR B='B CO="CO C='C DE="DE DI="DI EN="EN E='E FA="FA FB="FB FR="FR MT="MT M='M PR="PR P='P QU="QU Q='Q RE="RE R='R UN="UN U='U ZE="ZE Z='Z WC=-1 .GLOBL LKBK01,LKBK02,LKBKDU,FNBK4 INC R3  ;FREE BIT - INC CNT ROLB (R1)  ;2 BCS .+4 INC R3 ROLB (R1)  ;3 BCS .+4 INC R3 ROLB (R1)  ;4 BCS .+4 INC R3 ROLB (R1)  ;5 BCS .+4 INC R3 ROLB (R1)  ;6 BCS .+4 INC R3 ROLB (R1)  ;7 BCS .+4 INC R3 ROLB (R1)  ;8 BCS .+4 INC R3 BR NXTBYT DIRMES: .ASCII /DIRECTORY / .BYTE 0 DFMES1: .BYTE CR,LF .ASCII /TOTL BLKS: / .BYTE 0 DFMES2: .BYTE CR,LF .ASCII /TOTL FILES:/ . ;CALL LOADER PROPER. ;DATA BLOCKS: ; (A HEADER MESSAGE: TM.HDR: .WORD 2 .WORD 0 .WORD 2 .BYTE 15,12 ; B) SIGNAL READY FOR COMMAND: TM.DOL: .WORD 2 .WORD 0 .WORD 2 .BYTE '$,13 ; C) CTL/C ECHO MESSAGE: TM.CTLC: .WORD 6 .WORD 0 .WORD 6 .ASCII '^C' .BYTE 15,12,'.,13 ; D) DATE & TIME MESSAGES: TM.DAT: .WORD 10 .WORD 0 .WORD 10 .ASCII 'DATE:- ' .BYTE 13 ; TM.TIM:NG UIC FOUND JSR R5,.ERRFT    ;2 EXITS - 1ST=NO UFD ;GETS UFD BLOCKS ;EXIT 1=NO UFD ;EXIT 2=FOUND NEXT UFD. R2 POINTS TO 1ST ENTRY GETUFD: TSTB UFDPAS  ;IS THIS 1ST PASS? BEQ FIRST  ;YES MOV BLOCK,BLKNO GET: JSR PC,RDBLK MOV #BLOCK+2,R2 BR DONEX FIRST: INCB UFDPAS TST (R2) BEQ RETURN  ;0 - NO UFD, SO EXIT MOV (R2),BLKNO BR GET ENDTST: ADD #22,R2  ;POINTS R2 TO NEXT UFD ENTRY CMP R2,ENDBLK ;READS NEXT UFD BLOCK IF NECESS. BLT R01,FNBK02,FNBKDU,.ACTSW .GLOBL .M20B,.CSQF,.TRFQF,.PSTQF,.PREQF,.ENTB1,.ENTB2 .GLOBL .FLAG1,.FLAG2,.FLAG3,.FLAG4,.FLAG5,.FLAG6,.FLAG7,.FLAG8 .GLOBL .NUMIN,.NUMOT,.ERCDW,.ACT,.SPARE,.COUNT,.ERRPR .GLOBL .ERRFT,.M2OB,.RSAV,.USAV,.CSII,.CSII1,.CSII2,.CSII3 .GLOBL .CSII4,.CSII5,.MOVLK,.MOVFN,.RENAM,.TFR .GLOBL .FLGIN,.FLGOT,.START,.DIREC,.DELET,.ZERO .GLOBL .NYI,.BRIEF,.PROT,.ALLOC,.ENTER,.UNLOC,.FREE .GLOBL BLOCK,FSTMFD,UIC,.GETLK,.GETFN,BLKNO,HOWOPN,NOWDS .GLOBL ENDBLK,STWD01,STWD02,LKBK,SBYTE 0 DTMES1: .BYTE CR,LF .ASCII /FREE BLKS: / .BYTE 0 DTMES2: .BYTE CR,LF .ASCII /FREE FILES:/ .BYTE 0 .EVEN HEADER: .WORD 0  ;LINE BUFFER .WORD 2  ;UNFORMATTED ASCII .WORD 0  ;PLANT (NO. BYTES) LINE: .WORD 0 .=.+72. CNT: 0 .END  .WORD 10 .WORD 0 .WORD 10 .ASCII 'TIME:- ' .BYTE 13 ; E) INPUT FILE BLOCK: .WORD 0  ;NO ERROR RTN - SYS ERROR .WORD 4 TM.INF: 0,0,0,0,0  ;NAME SET VIA CSI ; E) INPUT COMMAND BUFFER .WORD 2,0,0,0,0,0,0 ;REQD FOR CSI LDR.GS=.-4 TM.LBA=.-2 LDR.LN: TM.IBF: .WORD 128. .WORD 0 .WORD 0 .=.+128. ; F) LINK-BLOCK FOR FILE LOOK-UP: .WORD 0  ;NO ERROR POSSIBLE??? TM.RBK: .WORD 0 .ETURN  ;INCREMENTS EXIT IF NO MORE BLOCKS TST BLOCK BNE ENDTS2 CLRB UFDPAS  ;INITIALIZE FOR NEXT TIME BR DONEX ENDTS2: JSR R5,GETUFD  TST (SP)+  ;NO UFD. RETURN TO PIP RETURN: RTS R5 DONEX: ADD #2,R5  ;INCREMENT EXIT RTS R5 ;ROUTINE TO SEARCH LKBKDU FOR SWITCH MATCHING ONE FOLLOWING CALL ;RETURNS WITH R0=0 IF MATCH ;R0=1 IF NO MATCH SWGET: MOV #LKBKDU+10,R0 SWGET1: TST (R0)  ;SWITCHES TO FOLLOW? BEQ SWGET3  ;NO SWGET2: MOV (R0),R1  ;NO. WTWD,PASSGL,FNBKWC .GLOBL FINDUC,GETUFD,ENDTST,RDBLK,WRBLK,WCSRCH,SETUP,UCGET .GLOBL BLKS,FILES,UFDPAS,SWGET,.AUXWD .GLOBL DEVNAM,DKZ,LKBKTT,LKBKKB,.CMDBF .EOT  .TITLE DKZERO .GLOBL DKZ,LKBKTT,LKBKKB,LKBK01,BLOCK,.CMDBF ;VERSION V000A ;PROGRAM TO INITIALIZE A DISK CARTRIDGE ;COPYRIGHT DIGITAL EQUIPMENT CORPORATION ;MAYNARD, MASSACHUSETTS JUNE 1971 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 PC=%7 CR=15 LF=12 VT=13 UIC=440 INIT=EMT+6 READ=EMT+4 WRITE=EMT+2 WATE=EMT+1 TRAN=EMT+10 IF=5    ;INTERLEAVE FACTOR MSGBUF: .WORD 12.,0,12. .BYTE CR,WORD -1  ;CANNOT BE ASSIGNED!!! .WORD 1 .RAD50 'DF'  ;DEFAULT IS DSK ; G) LINK-BLOCK FOR INPUT COMMAND: .WORD 0  ;AGAIN SHOULD BE NO ERROR! .WORD 0 .RAD50 'CMD'  ;COMMAND DEVICE .WORD 1 .RAD50 'KB'  ;... NORMALLY KBD ; H) LINK-BLOCK FOR PRINTER MESSAGES: .WORD 0 .WORD 0 .WORD -1  ;AGAIN AVOID ASSIGNMENT .WORD 1 .RAD50 'KB'  ;ALWAYS CONSOLE ; I) LINK BLOCK FOR I/O TIDY & DISK READ: .WORD 0  ;NO ERROR RETURN FOR NOW TM.LNK: .WORDS TO FOLLOW ROL R1  ;DOUBLE IT ADD R1,R0  ;POINT R0 TO SWITCH CMP (R0)+,(R5) ;MATCH? BEQ SWGET4  ;YES BR SWGET1  ;NO - TRY FOR MORE SWGET3: MOV #1,R0  ;NO MATCH BR SWEX SWGET4: CLR R0  ;MATCH SWEX: ADD #2,R5 RTS R5 RDBLK: MOV #4,HOWOPN TRN: MOV #BLKNO,-(SP) ;CALLED B, JSR PC MOV LKBK,-(SP) EMT TRAN MOV LKBK,-(SP) EMT WAIT BIT #TRNCHK,HOWOPN ;TEST FOR ERROR OR EOM BNE TRNERR RTS PC  ;NO ERROR TRNERR: MOV HOWOPN,LF  ;CONFIRMATION MESSAGE .ASCII /CONFIRM: / .BYTE VT .EVEN RESBUF: .WORD 3,0,3  ;RESPONSE TO CONFIRMATION .=.+3 .EVEN ;CALLED BY JSR PC,DKZ DKZ: MOV #MSGBUF,-(R6) MOV #LKBKTT,-(R6) WRITE   ;SEND REQUEST FOR CONFIRM MOV #RESBUF,-(R6) MOV #LKBKKB,-(R6) READ   ;READ THE REPLY MOV #LKBKKB,-(R6) WATE   ;WAIT FOR THE READ MOV R5,-(R6) ;SAVE MAIN PIP'S R5 MOV #2400.,R5 ;SET FOR LOW DENSITY MOV #2,R2  ;# OFD 0  ;PTR TO DDB - SET AS NEC .WORD -1  ;CANNOT BE ASSIGNED!!! .WORD 1 .WORD 0  ;SET TO SYS DSK NAME ; J) TRANSFER BLOCK FOR DISK READ: .WORD 5  ;STD BLOCK FOR MRT COPY .WORD 0,0  ;ADDR & CNT SET BY PROG .WORD 4  ;READ ONLY REQD .WORD 0 ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;X EMBEDDED READ/WRITE PROCESSOR MUST COME HERE: X ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .AUXWD BIC #377,.AUXWD SWAB .AUXWD MOV #S207,.ERCDWD JMP .ERRFT WRBLK: MOV #2,HOWOPN BR TRN .=.+20  ;PATCH SPACE LKBK: .WORD 0  ;PLANT BLKNO: .WORD 0  ;PLANT .WORD BLOCK NOWDS: .WORD 0  ;PLANT HOWOPN: .WORD 0  ;PLANT .WORD 0  ;MONITOR USE FSTMFD: .WORD 0  ;PLANT UIC: .WORD 0  ;PLANT ENDBLK: .WORD 0  ;PLANT STWD01: .WORD 0  ;PLANT STWD02 BM BLOCKS MINUS 1 MOV #RESBUF+6,R1 CMPB #'L,@R1  ;IS REPLY CONFIRM LOW? BEQ DKZ00  ;YES - BRANCH CMPB #'H,@R1  ;IS REPLY CONFIRM HIGH? BNE DKZXIT  ;NO - GO EXIT ASL R5  ;SET FOR HIGH DENSITY TST (R2)+ DKZ00: INC R1  ;KEEP 'EM HONEST! IF NEXT CMPB #12,@R1  ;CHARACTER IS NOT AN ASCII BHI DKZXIT  ;DELIMETER, ASSUME NO CMPB #15,@R1  ;CONFIRMATION BLO DKZXIT TSTB LKBK01+5 ;IS THIS UNIT 0? BNE DKZ03  ;NO - CAN'T BE SYSTEM DEVICE MO;MISC DEFINITIONS: V.EOM=0 V.TOB=2 V.CSA=4 V.PLA=6 V.BAT=12 V.DCO=14 V.MUS=16 V.OSW=20 V.PSA=22 V.DAT=32 V.UIC=40 V.PGN=42 V.MRT=46 V.DDL=50 V.SSP=52 V.BFE=56 V.WTL=60 V.KBA=62 V.SVT=40 V.RSAV=44 V.RRES=46 V.GTB=54 .WAIT=1 .WRITE=2 .READ=4 .INIT=6 .RLSE=7 .TRAN=10 .STAT=13 .LUKUP=14 .OPEN=16 .CLOSE=17 .KBL=31 .KBI=33 .CVT=42 .CSX=56 .CSM=57 .XIT=60 .END TMON : .WORD 0  ;PLANT BLOCK: .WORD 0 .=.+508. .WORD 0 ;ROUTINE TO ZERO DIRECTORY ON DECTAPE .TITLE .ZERO .CSECT .ZERO: JSR R5,.GETLK BIT #40000,STWD BNE ZDEC  ;DECTAPE CMP DEVNAM,DK ;IS IT DK? BEQ DKZE CMP DEVNAM,MTA BEQ MTZE MOV #S236,.ERCDW JSR R5,.ERRFT ;ILL OUTPUT DEVICE DKZE: JSR PC,DKZ ;ZERO DK ZEND: MOV #LKBK01,-(SP) EMT 7  ;RELEASE OUTPUT DEV. RTS R5  ;RETURN TO PIP MTZE: JSR PC,MTZ  ;ZERO MT BR ZEND V #.CMDBF,-(R6) EMT 56  ;FIND OUT WHAT THE SYSTEM TST (R6)+  ;DEVICE IS CMP .CMDBF+6,LKBK01+6 ;IS THIS IT? BNE DKZ03  ;NO - GO AHEAD CLR -(R6) MOV (PC)+,-(R6) ;S254 MEANS YOU TRIED TO .BYTE 254  ;ZERO THE SYSTEM DISK .BYTE 4  ;USING PIP. WHICH IS IOT   ;DEFINITELY A NO-NO BR DKZX00  ;GO BACK TO PIP DKZ03: MOV #TB,R4 MOV #BLOCK,R0 CLR @R4 MOV #2,R3  ;INITIALIZE ZERO PASS COUNT MOV R0,R1 JSR PC,DKZCLR ;CLEAR THE 256. WORD BUF MTA: .RAD50 /MT/ DK: .RAD50 /DK/ ZDEC: JSR R5,ZDIR  ;ZERO DECTAPE BR ZEND ;ROUTINE TO ZERO DECTAPE ZDIR: MOV #LKBK01,LKBK MOV NOWDS,CNT ;BLOCK SIZE JSR R7,CLEAR  ;CLEAR 256 WORD BLOCK CLR PASS   ;INITIALIZE 1ST PASS MOV #70,FBLK MOV #TABLE,FTAB NEWPAS: MOV FTAB,R0 MOV FBLK,BLKNO SAMPAS: JSR R7,@(R0) ;MOVE DATA,WRITE,CLEAR ADD IF,R0   ;INC TABLE PNTR BY IF ADD IF,R0FER DKZ05: ADD #3,@R4 CMP @R4,R5 BHIS DKZ12  ;CLEAR THE CARTRIDGE DKZ10: MOV R4,-(R6) ;THE ALGORITHM IS TO MOV #LKBK01,-(R6) ;ZERO BLOCKS 0,3,6,... TRAN   ;THEN BLOCKS 2,5,8,... BR DKZ05  ;THEN BLOCKS 1,4,7,... DKZ12: MOV R3,@R4 DEC R3 BGE DKZ10 DKZ15: MOV R0,R1 MOV #1,@R4  ;WRITE OUT FIRST MFD BLOCK SUB R2,R5  ;GET SECOND MFD BLOCK # CMPB -(R5),-(R5) MOV R5,(R1)+ ;LINK TO FIRST MFD MOV R2,R3 MOV #IF,(R1)+ ;INTERLEAVE FACTOR  ADD IF,BLKNO  ;INC BLOCK NO. BY IF CMP R0,#ENDTAB BLE SAMPAS INC PASS   ;SET UP NEXT PASS CMP PASS,IF   ;WAS THIS LAST PASS? BEQ EXITZ   ;YES INC FBLK ADD #2,FTAB BR NEWPAS EXITZ: RTS R5 PASS: 0 IF: 4 CNT: 0 TEMP: 0 FBLK: 0 FTAB: 0 ;TABLE OF SUBROUTINES TABLE: WR70S    ;70 WR70S    ;71 WR70S    ;72 WR70S    ;73 WR70S    ;74 WR70S    ;75 WR70S    ;76 WR70S    ;77 WR100 WR101INC R5  ;FIRST BIT MAP BLOCK MOV R5,(R1)+ ;ENTER IT TWICE MOV R5,(R1)+ MOV R5,-(R6) ;AND SAVE IT FOR LATER DKZ20: INC R5  ;ENTER SUCCESSIVE BM BLOCKS MOV R5,(R1)+ DEC R3 BNE DKZ20 JSR PC,DKZTRN ;WRITE OUT MOV R0,R1  ;SET TO DO SECOND MFD BLOCK MOV @R1,@R4  ;SET THE BLOCK NUMBER CLR (R1)+  ;CLEAR THE LINK MOV @#UIC,(R1)+ ;ENTER THIS USER'S UIC CLR (R1)+  ;NO UFD YET MOV #9.,(R1)+ ;9. WORDS PER UFD ENTRY JSR PC,DKZCLR ;CL WR102 WR103 ENDTAB: WR104 WR70S: JSR R7,WRBLK  ;WRITE A BLOCK OF ZEROS RTS R7 WR100: MOV #BLK100,R1  ;FOR MOVING DATA MOV #4,CNT   ;NO. WORDS TO BE MOVED JSR R7,MVWRCL  ;MOVE DATA,WRITE,CLEAR BLOCK RTS R7 WR101: MOV #BLK101,R1 MOV #4,CNT MOV UIC,2(R1)  ;UIC TO BUFFER JSR R7,MVWRCL RTS 7 WR102: MOV #BLK102,R1 MOV #1,CNT JSR R7,MVWRCL RTS R7 WR103: JSREAR THE REST OF THE BLOCK    ;AND WRITE IT OUT ;SET TO DO THE BIT MAPS CLR R5  ;USED FOR MAP NUMBER MOV @R6,@R4  ;GET BLOCK OF FIRST MAP MOV #60.,R3  ;USED PERIODICALLY BELOW DKZ25: MOV R0,R1  ;INITIALIZE BUFFER POINTER MOV @R4,@R1  ;GET LINK TO NEXT MAP INC (R1)+ DEC R2  ;IF THIS IS THE LAST MAP. BGE DKZ30  ;THEN THE LINK IS ZERO CLR @R0 DKZ30: INC R5  ;PUT IN THE MAP NUMBER MOV R5,(R1)+ MOV R3,(R1)+ ;PUT IN MAP SIZE MOV @R R7,WRBLK  ;ALL ZEROES RTS R7 WR104: MOV #BLK104,R1 MOV #11,CNT JSR R7,MOVDAT MOV #BLOCK+80.,R1 MIN1: MOV #-1,(R1)+  ;FILL WDS 40-255 WITH -1 CMP R1,ENDBLK BLE MIN1 JSR R7,WRBLK  ;WRITE THE BLOCK MOV #256.,CNT JSR R7,CLEAR  ;CLEAR THE WHOLE BLOCK RTS R7 MOVDAT: MOV CNT,TEMP  ;MOVES DATA MOV #BLOCK,R2  ;TO BLOCK MOVE: MOV (R1)+,(R2)+ DEC TEMP BGT MOVE RTS R7 CLEAR: MOV #BLOCK,R2  ;CLEARS BLOCK CLR1: CLR (R2)+ 6,(R1)+ ;PUT IN LINK TO FIRST MAP CMPB R5,@PC  ;IS THIS MAP #1? BHIS DKZ35  ;NO - BRANCH -*****- MOV #3,(R1)+ ;SET BLOCKS 0 & 1 TAKEN DKZ35: TST R2  ;IS THIS THE LAST MAP? BGE DKZ45  ;NO - BRANCH ADD R3,R1  ;SET UP FOR LOW DENSITY TST -(R1)  ;POINTER LAST WORD OF MAP CMP (R6)+,#2400. ;IS IT LOW DENSITY ? BLO DKZ40  ;YES - BRANCH ADD R3,R1 MOV #176000,(R1)+ ;SET LAST 6 BLOCKS TAKEN BR DKZ45 DKZ40: MOV #170000,(R1)+ ;SET LAST 4 BLOCKS TAKDEC CNT BGT CLR1 RTS R7 MVWRCL: JSR R7,MOVDAT JSR R7,WRBLK JSR R7,CLEAR RTS R7 BLK100: 101   ;LINK 4   ;I.F. 104   ;FIRST PBM 104   ;LAST PBM BLK101: 0   ;LINK 0   ;UIC PLANTED HERE 102   ;FIRST BLOCK OF UFD 11   ;NO. WDS/UFD ENTRY BLK102: 103   ;LINK BLK104: 0   ;LINK 1   ;NUMBER 44   ;NO. WDS IN MAP 104   ;1ST MAP OF CHAIN 1 EN DKZ42: MOVB #-1,(R1)+ DEC R3  ;LOW DENSITY ONLY USES "HALF" BNE DKZ42  ;OF THE LAST BIT MAP DKZ45: JSR PC,DKZCLR ;CLEAR GARBAGE & WRITE INC @R4  ;SET UP FOR NEXT BLOCK TST R2  ;WAS THIS THE LAST MAP? BGE DKZ25  ;NO - BRANCH BR DKZX00  ;GO EXIT DKZXIT: CLR -(R6) MOV (PC)+,-(R6) ;I354 MEANS YOUR DISK .BYTE 354  ;CARTRIDGE WAS NOT ZEROED .BYTE 0 IOT DKZX00: MOV (R6)+,R5 ;RESTORE PIP'S R5 RTS PC  ;RETURN TO MAINLINE PIP ;-  ;BIT PATTERN,BLKS 17-0 0   ;BLKS 37-20 0   ;BLKS 57-40 177400   ;BLKS 77-60 37   ;BLKS 117-100 ;ROUTINE TO ZERO MAGTAPE ;REWIND AND WRITE 3EOFS MTZ: MOVB #3,SFBLK ;REWIND CODE=3 JSR R5,SPFNCT ;REWIND MOVB #2,SFBLK ;EOF CODE=2 JSR R5,SPFNCT ;EOF CODE=2 JSR R5,SPFNCT ;EOF CODE=2 JSR R5,SPFNCT ;EOF CODE=2 MOVB #3,SFBLK JSR R5,SPFNCT ;REWIND AGAIN RTS PC SPFNCT: MOV #SFBLK,-(SP) MOV #LKBK01,-(SP) EMT 12 MOV #LKBK01,*****- USED AS LITERAL BY PREVIOUS INSTRUCTION TB: .WORD 0  ;TRAN BLOCK .WORD BLOCK .WORD 256. .WORD 2 .WORD 0 DKZCLR: CLR (R1)+  ;CLEARS THE BUFFER FROM CMP R1,#BLOCK+512. ;@R1 TO THE END BLO DKZCLR DKZTRN: MOV R4,-(R6) ;TRANS OUT THE BUFFER MOV #LKBK01,-(R6) ;R4 CONTAINS #TRANBLOCK TRAN MOV #LKBK01,-(R6) WATE   ;WAIT FOR COMPLETION RTS PC .END -(SP) EMT WAIT RTS R5 SFBLK: .BYTE  0  ;SPECIAL FUNCTION CODE .BYTE  3  ;NO WDS TO FOLLOW .WORD  0  ;TAPE UNIT STATUS RETURNED BY DRIVER .WORD  0  ;USER SPECIFIED COUNT .WORD 0  ;RESIDUE COUNT RETURNED BY DRIVER .END