.TITLE EPR .IDENT /090185/ ; ; COMMAND SEQUENCE: ; ; >MAC EPR=EPR ; >TKB EPR=EPR,[1,1]EXELIB/LB ; >INS EPR/CLI=YES/TASK=...EPR ; >CLI /INIT=EPR/LGO/CPR="<15><12>/QSI>/" ; >CLI /INIT=EPR/MESSAGE/DPR="<15><12>/>>/"/TASK=...EPR ; ; >SET /CLI=TTN:EPR ; ; NOTE THAT THE PROMPT ISSUED IN RESPONSE TO A CONTROL/C DEFAULTS TO THE ; NAME OF THE CLI WHICH IS "EPR>". ; ; IT CAN BE ELIMINATED FROM THE SYSTEM BY THE FOLLOWING COMMANDS, ASSUMING ; NO TERMINALS ARE SET TO IT: ; ; >CLI /ELIM=EPR ; >REM ...EPR ; .MCALL GCCI$,RPOI$,EXIT$S,QIOW$,ALUN$,DIR$ ; ; DIRECTIVE DPBS ; GCCI: GCCI$ CMDBUF,CBLEN,IBUF,IBLEN,0,GC.CEX RPOI: RPOI$ MCR... QIOW: QIOW$ IO.WVB,5,1,,,,<,,40> ALUN: ALUN$ 5 QIOW6: QIOW$ IO.WVB,6,1,,,,<,,40> ALUN6: ALUN$ 6,CO,0 ; ; BUFFER AREAS ; CMDBUF: .BLKB 80.+G.CCBF ;LENGTH = HEADER PLUS COMMAND IN BYTES CBLEN=.-CMDBUF ;CALCULATE LENGTH .EVEN IBUF: .BLKB G.CCCA+2 ;LONG ENOUGH TO CONTAIN ALL INFORMATION IBLEN=.-IBUF ;CALCULATE LENGTH .EVEN TCMD: .ASCII /PIP TI:=/ ;BASIC PIP COMMAND TO IMPLEMENT "T" COMMAND TCLEN=.-TCMD ;LENGTH OF COMMAND QIOBUF: .BLKB 120. BUF: .BLKB 80. ;BUFFER TO GENERATE COMMANDS IN .EVEN MCR2: .ASCII /MCR/<15> ;STRING TO RECOGNIZE AS A SET TO MCR REQUEST MCR: .ASCII <25><15> MCMD: .ASCII %SET /CLI=TI:MCR% ;SET TERMINAL TO MCR COMMAND MCLEN=.-MCMD ;LENGTH OF COMMAND MCMD2: .ASCII %@LB:[1,2]MCR% ;SET TERMINAL TO MCR2 COMMAND MCLEN2=.-MCMD2 ;LENGTH OF COMMAND .EVEN ; ; TEXT TO BE DISPLAYED UPON RECEIPT OF NEW TERMINAL LINKED OR ; TERMINAL REMOVED MESSAGES FROM SYSTEM. ; LKT: .ASCII <15><12>/ --- QSI --- /<15><12> LKTLEN=.-LKT .EVEN RMT: .ASCII <15><12>/ --- MCR --- /<15><12> RMTLEN=.-RMT .EVEN ; ; CHARACTERS LOST DUE TO BUFFER BEING TO SMALL MESSAGE ; CHLOST: .ASCII <15><12>/QSI -- Sorry, part of your command was lost/<15><12> CLLEN=.-CHLOST ; ; ILLEGAL COMMAND MESSAGE ; ILL: .ASCII <15><12>/QSI -- Illegal command/<15><12> ILLLEN=.-ILL .EVEN ; PRVLST: ; ; Allgemeine Kommandos ; .ASCIZ /@LB:[1,2]MCR/ ;Dieses Kommando erm”glicht die ;Umschaltung auf DCL .ASCIZ /@MCR/ .ASCIZ /SHO DEF/ .ASCIZ $SET /HOST$ .ASCIZ /TIM/ .ASCIZ /DEV/ .ASCIZ /PAR/ .ASCIZ /ACT/ .ASCIZ /ABO/ .ASCIZ /BLK/ .ASCIZ /UNB/ .ASCIZ /RMD/ .ASCIZ /FRE/ .ASCIZ /CLR/ .ASCIZ /BRO/ .ASCIZ #SET /SLAVE=TI:# .ASCIZ #SET /NOSLAVE=TI:# ; ; Applikationsgebundene Kommandos: ; .ASCIZ /@LOG/ .ASCIZ /HELP SKN/ .ASCIZ /H SKN/ .ASCIZ /?SKN/ .ASCIZ /HEL ALLE/ .ASCIZ /VMN TT=:@[1,2]QUE/<15> .ASCIZ /BYE/ .ASCIZ /ADE/ .ASCIZ /LOG/ .ASCIZ $MOU DL2:/OVR$ .ASCIZ $MOU DK2:/OVR$ .ASCIZ /DIR [200,1]/ .ASCIZ /DIR DK1:/ .ASCIZ /DIR DK2:/ .ASCIZ $DMO DL2:/DEV$ .ASCIZ /@PLOE/ .ASCIZ /@KOMPRNEU/ .ASCIZ /@PLDIR/ .ASCIZ /@EPR/ .ASCIZ /@VPR/ .ASCIZ /@ASP/ .ASCIZ /@LOE/ .ASCIZ /@LIST/ .ASCIZ /@SORT/ .ASCIZ /@DELETE/ .ASCIZ /@ANLEG/ .ASCIZ $HAN /$ .ASCIZ /AUS / .ASCIZ /AUS/<15> .ASCIZ /WOC/ .ASCIZ /TAG/ .ASCIZ /@SWERTE/ .ASCIZ /@DSOLL/ .ASCIZ /@LB:[1,2]BASIC/ .ASCIZ /@SCH/ .ASCIZ /@BALK/ .ASCIZ /@SHU/ .ASCIZ /HZE/ .ASCIZ /HZV/ ; ; arbeiten nur auf eine bestimmte Platte: ; .ASCIZ /DIR US:/ .ASCIZ /PRI US:/ .ASCIZ /PUR US:/ .ASCIZ /EDT US:/ .ASCIZ /DEL US:/ .ASCIZ /REN US:/ .ASCIZ /RUN US:/ .ASCIZ /PIP US:/ .ASCIZ /TYP US:/ ; ; Ende der Liste ; .EVEN .WORD 0 ; ; CLI CODE ; .ENABL LSB START: DIR$ #GCCI ;GET A COMMAND FROM SYSTEM BCC 11$ JMP 100$ ;IF CS, DIRECTIVE ERROR ; ; IF THE GCCI$ DIRECTIVE HAD THE GC.CST OPTION SPECIFIED, WE MAY HAVE ; JUST BEEN UNSTOPPED, SO WE HAVE TO GET THE COMMAND. ; 11$: CMP #IS.CLR,$DSW ;WERE WE JUST UNSTOPPED? BEQ START ;IF EQ YES MOV #CMDBUF,R0 ;POINT TO COMMAND BUFFER TST (R0) ;IS THIS A SYSTEM MESSAGE? BNE 12$ JMP MSG ;IF EQ YES ; BPT 12$: CMPB G.CCCT(R0),G.CCCL(R0) ;DID ENTIRE COMMAND FIT IN BUFFER BHIS 13$ JMP 150$ ;IF LO NO 13$: MOV #RPOI,R5 ;POINT TO DPB OF RPOI$ DIRECTIVE ; ; AT THIS POINT, THE CLI HAS A COMMAND TO BE PROCESSED. ; MOV #PRVLST,R2 ;LOAD COMMAND LIST 1$: MOV #CMDBUF+G.CCBF,R1 ;LOAD BUFFER ADDRESS 2$: TSTB (R2) ;END OF COMMAND(S) TO CHECK? BEQ 50$ ;EXECUTE CMPB #140,(R1) ;LOWER CASE ? BGT 22$ ;NO BICB #40,(R1) ;YES, CLEAR LOWER BIT 22$: CMPB (R1)+,(R2)+ ;CHARACTER ALLOWED? BEQ 2$ ;YES, NEXT 3$: TSTB (R2)+ ;SKIP TO END OF COMMAND BNE 3$ TSTB (R2) BNE 1$ ;ANOTHER COMMAND TO CHECK CMP MCR,G.CCBF(R0) ;IS IT A "M" COMMAND? BEQ 4$ ;IF EQ YES CMP MCR2,G.CCBF(R0) ;MCR? BNE 60$ ;NO - QUIT CMP MCR2+2,G.CCBF+2(R0) ;SECOND PART- BNE 60$ ;NO - QUIT MOV #MCMD2,R.POBF(R5) ;PUT ADDRESS OF CMD TO ISSUE IN DPB MOV #MCLEN2,R.POBL(R5) ;PUT LENGTH OF CMD IN DPB BR ISSCMD ;ISSUE COMMAND ; ; THE USER HAS ENTERED AN "M" COMMAND, SO SET THE TERMINAL TO MCR. ; 4$: MOV #MCMD,R.POBF(R5) ;PUT ADDRESS OF CMD TO ISSUE IN DPB MOV #MCLEN,R.POBL(R5) ;PUT LENGTH OF CMD IN DPB BR ISSCMD ;ISSUE COMMAND ; ; THE USER HAS ENTERED A "T" COMMAND SO CONSTRUCT THE NECESSARY PIP ; COMMAND AND SEND IT TO MCR ; 10$: MOV R0,R1 ;COPY ADDRESS OF BUFFER WITH COMMAND ADD #G.CCBF+1,R1 ;POINT TO SPACE AFTER THE T MOV #BUF,R2 ;POINT TO BUFFER THAT WILL CONTAIN CMD MOV #TCLEN,R4 ;GET LENGTH OF INITIAL PART OF COMMAND 20$: MOVB (R1)+,R3 ;GET NEXT CHARACTER CMPB #15,R3 ;IS IT THE END OF THE COMMAND BEQ 30$ ;IF EQ YES CMPB #40,R3 ;IS IT A SPACE BEQ 20$ ;IF EQ YES, SKIP IT MOVB R3,(R2)+ ;PUT CHARACTER IN OUTPUT BUFFER INC R4 ;COUNT CHARACTER BR 20$ ;GET NEXT CHARACTER 30$: MOV #TCMD,R.POBF(R5);PUT ADDRESS OF CMD TO ISSUE IN DPB MOV R4,R.POBL(R5) ;INSERT LENGTH OF COMMAND ; ; THIS COMMAND WILL BE PASSED TO THE MAIN COMMAND DISPATCHER (MCR...) ; WHICH WILL START A COPY OF PIP AND GIVE IT THE COMMAND. THE RPOI ; DIRECTIVE COULD BE USED TO GIVE THE COMMAND DIRECTLY TO ...PIP AND ; GIVE THE RESULTING TASK A DIFFERENT NAME. IN THIS EXAMPLE, ; WE COULD CALL THE RESULTING PIP TASK "TYPTNN" WHERE THE LAST ; THREE CHARACTERS (TNN) ARE REPLACED BY A DEVICE NAME CHARACTER. ; BR ISSCMD ;EXECUTE COMMAND ; ; AT THIS POINT, THE CLI HAS A COMMAND TO BE PROCESSED. ; 50$: MOV #CMDBUF+G.CCBF,R.POBF(R5) ;PUT ADDRESS OF STRING IN DPB MOVB G.CCCT(R0),R.POBL(R5) ;PUT LENGTH IN RPOI DPB ; ; SEND INPUT TO THE CO: DEVICE ; MOV #CMDBUF+G.CCBF,R1 CLR R4 MOVB G.CCCT(R0),R4 MOV #QIOBUF,R3 MOV (R0),(R3)+ CLR R2 MOVB G.CCUN(R0),R2 ;COPY UNIT NUMBER ADD #60,R2 MOVB R2,(R3)+ MOVB #':,(R3)+ 51$: MOVB (R1)+,(R3)+ SOB R4,51$ MOV #QIOBUF,R1 SUB R1,R3 MOV R1,QIOW6+Q.IOPL ;SET ADDRESS OF MESSAGE MOV R3,QIOW6+Q.IOPL+2 ;INSERT LENGTH OF MESSAGE DIR$ #ALUN6 DIR$ #QIOW6 ;DO I/O AND WAIT FOR IT ; ; ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMAND ; ISSCMD: MOV (R0),R.PODV(R5) ;PUT NAME OF ISSUING DEVICE IN RPOI MOVB G.CCUN(R0),R.POUN(R5) ;COPY UNIT NUMBER MOVB IBUF+G.CCPU,R.POUM(R5) ;PROPOGATE UIC OF TERMINAL MOVB IBUF+G.CCPU+1,R.POUG(R5) MOV IBUF+G.CCOA,R.POOA(R5) ;COPY ID PARENT IN CASE WE WERE SPAWNED DIR$ #RPOI ;PASS COMMAND TO EXECUTOR TASK BCS 110$ ;IF CS, ERROR JMP START ;SUCCESS ; ; CONTROL IS TRANSFERED HERE IF UNKNOWN COMMANDS ARE TO BE REJECTED ; INSTEAD OF BEING PASSED TO MCR. ; 60$: MOV #ILL,R1 ;POINT TO MESSAGE TO BE PRINTED MOV #ILLLEN,R2 ;GET LENGTH OF MESSAGE CALL ISSMSG ;ISSUE MESSAGE JMP START ;TRY FOR NEXT COMMAND ; ; ERROR HANDLING CODE ; 100$: CLR R0 ;FATAL ERROR ON GCCI$ BR 150$ 110$: MOV #1,R0 ;FATAL ERROR ON RPOI$ 120$: IOT ;FATAL 150$: MOV #CHLOST,R1 ;POINT TO MESSAGE TO BE PRINTED MOV #CLLEN,R2 ;GET LENGTH OF MESSAGE CALL ISSMSG ;ISSUE MESSAGE JMP START .DSABL LSB ; ; A SYSTEM MESSAGE WAS RECEIVED INSTEAD OF A COMMAND ; MSG: CMPB #CM.LKT,G.CCUN(R0) ;IS IT A NEW TERMINAL LINKED TO US? BEQ 10$ ;IF EQ YES CMPB #CM.RMT,G.CCUN(R0) ;IS IT A TERMINAL BEING REMOVED BEQ 20$ ;IF EQ YES CMPB #CM.EXT,G.CCUN(R0) ;IS IT A ELIMINATE ALL PACKET BEQ 50$ ;IF EQ YES CMPB #CM.ELM,G.CCUN(R0) ;IS IT A CLI ELIMINATION MESSAGE BEQ 50$ ;IF EQ YES JMP START ;IGNORE ALL OTHER MESSAGES ; ; ISSUE WELCOME MESSAGE ; 10$: MOV #LKT,R1 ;POINT TO MESSAGE TEXT MOV #LKTLEN,R2 ;GET LENGTH ADD #G.CCBF,R0 ;POINT TO TERMINAL THAT WAS SET BR 30$ ; ; ; ISSUE GOOD BYE MESSAGE ; 20$: MOV #RMT,R1 ;POINT TO MESSAGE TEXT MOV #RMTLEN,R2 ;GET LENGTH ADD #G.CCBF,R0 ;POINT TO TERMINAL NAME 30$: CALL ISSMSG ;ISSUE MESSAGE JMP START ;GET NEXT COMMAND ; ; WHEN AN ELIMINATE ALL MESSAGE IS RECEIVED, EXIT IMMEDIATELY ; 50$: EXIT$S ; ; ROUTINE TO PRINT TO TERMINAL ; ; ; INPUTS: ; ; R0=ADDRESS OF NAME OF TERMINAL TO PRINT TO ; R1=ADDRESS OF MESSAGE TO PRINT ; R2=LENGTH OF MESSAGE ; ; OUTPUTS: ; ; NONE ; ; THIS ROUTINE PRINTS THE SPECIFIED MESSAGE ON THE SPECIFIED TERMINAL. ; ISSMSG: MOV (R0),ALUN+A.LUNA ;SET UP DEVICE NAME MOVB 2(R0),ALUN+A.LUNU ;AND UNIT NUMBER CLRB ALUN+A.LUNU+1 ;CLEAR HIGH BYTE DIR$ #ALUN ;ASSIGN LUN 5 TO THE SPECIFIED DEVICE BCS 10$ ;IF CS, SKIP I/O MOV R1,QIOW+Q.IOPL ;SET ADDRESS OF MESSAGE MOV R2,QIOW+Q.IOPL+2 ;INSERT LENGTH OF MESSAGE DIR$ #QIOW ;DO I/O AND WAIT FOR IT 10$: RETURN .END START