.TITLE MC.... .SBTTL HANDLER TO WRITE MCR COMMAND BUFFERS .IDENT "MRH001" ; ; ; AUTHOR; F. BORGER ; DEPT OF MEDICAL PHYSICS ; MICHAEL REESE HOSPITAL ;CHICAGO ILL 60616 ; ; ;THIS DUMMY HANDLER DOES ONLY ONE THING. IT ACCEPTS A WRITE VIRTUAL ;IO REQUEST AND THEN ; ;A/ WRITES AN MCR BUFFER WITH THE TEXT IN THE IO REQUEST ;B/ REQUESTS THE TASK APPROPRIATE TO THE FIRST 3 LETTERS OF THE LINE ; ;IN ALL PURPOSES ANY PROGRAM CAN WRITE ONE LINE TO MM0: AND HAVE THE ;SAVE EFFECT AS TYPING THE SAME LINE TO AN "MCR." PROMPT WITH THE ONE ;EXCEPTION THAT THERE IS NO MCR RECALL OR ABILITY TO WAIT FOR THAT TASK ;TO FINISH ; ;FUNCTION CODES RETURNED IN STATUS BYTE ARE ; ;IE.... VALUE MEANING ;------ ----- ----------------------------------- ;IE.BAD -01. BAD PARAMETER (P1,P2 OR P3) ;IE.IFC -02. BAD IO FUNCTION CODE ;IE.DNR -03. FAILED TO RUN REQUESTED ...XXX TASK ;IE.SPC -06. ILLEGAL USER BUFFER (OVER 80 CHARACTER LINE) ;IE.DNA -07. DEVICE NOT ATTACHED ;IE.DAA -08. DEVICE ALREADY ATTACHED ;IE.PRI -16. PRIVILEDGE VIOLATION (DISPATCH TABLE NO-NO) ;IE.NOD -23. NO NODES AVAILABLE FOR MCR BUFFER ; .PAGE .SBTTL MISC DEFINITIONS ;SYSTEM EVENT FLAGS ; EVFNOR=001 ;NORMAL REQUEST EVFEXR=002 ;EXPRESS REQUEST EVFIOD=004 ;I/O TRANSFER FINISHED ; ;MISC DEFINITIONS ; PSW=177776 ;ADDR OF STAT WORD DIRSTA=0 ;DIRECTIVE STATUS RETURNED AT LOC 0 MAXFUN=30 ;MAX IO FUNCTION CODE ; .MCALL DIR$,SPWN$,WTLO$,EXIT$ .SBTTL GENERAL MACROS .MACRO INTOFF ;TURN OFF ALL INTERRUPTS MOV @#PSW,-(SP) ;SAVE CURRENT STATUS REGISTER BIS #340,@#PSW ;REPLACE WITH MAX HARDWARE STATUS .ENDM ; ; .MACRO INTON ;RESET INTERRUPT CAPABILITY MOV (SP)+,@#PSW ;POP STATUS TO PSW .ENDM ; ; ; .MACRO ILFN ;GENERAL ILLEGAL FUNCTION MACRO .BYTE 140,140 .WORD ILLFUN .ENDM ; ; ; ; .MCALL CALL .MCALL RETURN .PAGE .SBTTL INITIALIZATION SECTION ; ; ;THIS AREA WILL BE MADE AVAILABLE FOR THE STACK ONCE ;INITIALIZATION HAS BEEN SUCCESSFULLY COMPLETED ; ;ROUTINE MUST DO THE FOLLOWING ;A DECLARE ITSELF RESIDENT ; ; .=.+40 ;CREATE INITIAL STACK AREA INIT: MOV PC,SP ;AND SET STACK POINTER TO HERE MOV #UITID,R0 ;POINTER TO UNITID TABLE TO R0 MOV #"MC,R2 ;DEVICE NAME TO R2 MOV #UF.RH,R3 ;FLAG BYTE FOR PUD FLAG WORD=RESIDENT CALL @#..DSUT ;REGISTERS SET SO CALL DECLARE BCS TRAN1 ;FAILED TO DECLARE RESIDENCY***ERROR MOV #UITEN,R4 ;ADDR OF UITEN TO R4 MOV (R4),R5 ;PUD POINTER TO R5 BEQ TRAN11 ;IF ZERO, NO DEVICES MOV PC,SP ;NOTHING ON STACK, MOVE IT TO HERE JMP GO ; ; TRAN1: JMP EXITDF ;BRANCH AID TRAN11: JMP EXITCF ;BRANCH AID .PAGE .SBTTL DIRECTIVE PARAMETER BLOCKS ; ; SCRAM: ;DO SYSTEM EXIT EXIT$ ; ; RQSDPB: SPWN$ ;DPB FOR SPAWNING ...XXX TASK ; ; ;WAIT FOR NORMAL OR EXPRESS EVENT WAITME: WTLO$ 0,3 .PAGE .SBTTL WAKE UP CODE ; ; ;COMMENT SOMETHING HAPPENED TO WAKE ME UP, SOMEBODY WANTS TO ;DO SOMETHING ; ; GO: MOV @#.CRTSK,R3 ;HEY ACTION AT LAST INTOFF ;TURN OFF ALL INTERRUPTS MOV A.EF(R3),R5 ;GET SIGNIFANT EVENT FLAGS BIC #177774,A.EF(R3) ;CLEAR ALL BUT NORMAL, EXP FLAGS ;JUST IN CASE INTON ;NOW CAN SAFELY TURN INTERRUPTS BACK ON MOV #UITID,R0 ;SET UIT>R0 FOR LATER DQ'S EXPREQ: BIT #EVFEXR,R5 ;ANY EXPRESS REQUESTS ? BEQ NOEREQ ;NO SKIP NEXT SECTION CALL @#..DQRE ;YESS TRY TO DEQUE EXPRESS REQUEST BCC PROREQ ;IF DEQUE SUCCEDDED PROCESS IT NOEREQ: BIT #EVFNOR,R5 ;NO EXP REQ (OR IT FAILED) ARE THERE BEQ IDLE ;ANY NORMAL REQ'S IF NOT ZZZZZZZZZZZ CALL @#..DQRN ;NORMAL REQ TRY TO DEQ IT BCC PROREQ ;DEQUE SUCCESSFUL GO PROCESS IT IDLE: ;NOTHING TO DO, OR NOTHING SUCCESSFULLY DEQUED TST EXFLAG ;PENDING EXIT REQUEST ? BEQ IDLE1 ;IF NOT SKIP NEXT SECTION TST UITEN+2 ;CHECK IS IT A NORMAL EXIT BNE IDLE1 ;NORMAL EXIT WAIT FOR ANY I/O TO FINISH JMP EXIT ;EXPRESS REQ GO DIRECTLY TO KILL IDLE1: DIR$ #WAITME ;GO TO SLEEP BR GO ;HEY I WOKE UP TRAN2: JMP EXITCF ;SINCE OUT OF BRANCH RANGE ; ; .PAGE .SBTTL PROCESS I/O REQUEST ; ;SHOULD COME HERE TO PROCESS SOME REQUEST THAT ;WAS DEQUED CURRENT STATUS IS ;R0= UIT ADDRESS ;R1= RNA ;R2= ADDRESS OF ADDRESS OF PUD ;R5= ORIGINAL STATE OF EVENT FLAGS ; PROREQ: MOVB R.FC+1(R1),R3 ;DO CURSORY CHECK OF FUNCTION CODE BLT ILLFUN ;!!!!CAN'T HAVE NEGATIVE FUNCTION CODE CMP #MAXFUN,R3 ;ALSO COULD BE OVER MAXIMUM VALUE BLE ILLFUN ;ALSO A BADDIE CALL @#..VACC ;SEE IF REQUESTING PROGRAM HAS BCS ILLPRV ;OH-OH PRIVILEDGE VIOLATION JMP @#..DISP ;PASSES THE TESTS GO DISPATCH FUNCTION .PAGE .SBTTL ERROR & NORMAL RETURNS .MACRO ERRMAC,ERROR ;GENERAL ERROR RETURN MACRO MOV #ERROR,R3 ;ERROR CODE TO R3 BR OVER ;AND JOIN COMMON EXIT SEQUENCE .ENDM ; ILLFUN: ERRMAC IE.IFC ;ILLEGAL FUNCTION REQUESTED ; ILLBUF: ERRMAC IE.SPC ;ILLEGAL BUFFER ; ILLATT: ERRMAC IE.DAA ;ILLEGAL ATTACH ; ILLDET: ERRMAC IE.DNA ;ILLEGAL DETACH ; ILLPAR: ERRMAC IE.BAD ;ILLEGAL PARAMETER ; ILLPRV: ERRMAC IE.PRI ;PRIVILEGE VIOLATION ; NONODE: ERRMAC IE.NOD ;NO NODES FOR MCR BUFFER ; NORUN: ERRMAC IE.DNR ;FAILED TO RUN REQUESTED MCR TASK ; OVEROK: MOV #IS.SUC,R3 ;SUCCESSFUL OPERATION ; OVER: MOV R2,-(SP) ;SAVE PUD POINTER MOV R.FC(R1),-(SP) ;SAVE FUNCTION CODE CLR R2 ;CLEAR DECREMENT CLR R4 ;CLEAR 2ND STATUS CALL @#..IODN ;CALL IO DONE SUBROUTINE MOV (SP)+,R3 ;RESTORE FUNCTION CODE BIC #177775,R3 ;ISOLATE EXPRESS BIT MOV (SP)+,R2 ;RESTORE PUD POINTER ADD R3,R2 ;ADVANCE R2 IF AN EXPRESS REQ CLR 2(R2) ;CLEAR APPROPRIATE ADDRESS TO ENABLE JMP GO ;& RETURN HERE WE GO ROUND AGAIN ; ; ON EXIT WORD # 1 OF IO-STATUS BLOCK CONTAINS "ERROR" CODE .PAGE .SBTTL EXIT CODE EXIT: MOV UITEN,R5 ;GET FIRST UNIT ENTRY IN R5 EXITCF: ;JUMP TO HERE IF ..CINT FAILED !!! MOV #UITID,R0 CALL @#..DNRC ;CALL DECLARE NON RESIDENCY EXITDF: ;JUMP TO HERE IF ..DSUT FAILED !!! MOV #SCRAM,-(SP) ;GO EXIT EMT 377 ; .PAGE .SBTTL NORMAL FUNCTIONS ; ;ROUTINE TO WRITE MCR COMMAND LINE ; ;ENTER WITH ; ;R0 -> UIT ADDRESS ;R1 -> REQUEST NODE ;R2 -> UIT LOCATION CONTAINING PUD POINTER ; DOMCR: MOV R0,-(SP) ;SAVE IMPORTANT THINGS MOV R1,-(SP) MOV R2,-(SP) MOV R.PB(R1),R2 ;ADDRESS OF DATA (IN CALLER) TO R2 MOV R.PB+2(R1),R3 ;BYTE COUNT TO R3 MOV R3,BYTCNT ;SAVE IT FOR LATER MOV R.UI(R1),UICSAV ;SAVE UIC OF REQUESTOR ALSO MOV #BUFFER,R4 ;INTERNAL BUFFER ADDRESS -> R4 CALL ..BLXI ;VALIDATE & XFER LINE INTO MY BUFFER BCC 11$ ;BR IF OK MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 JMP ILLPRV ;ELSE RETURN ERROR STATUS 11$: MOV R.AT(R1),R1 ;GET ATL NODE OF REQUESTOR -> R1 BEQ 12$ ;SKIP NEXT IF AN EXPRESS REQ (NO ATL NODE) MOV A.TI(R1),TIPTR ;SAVE TI OF TASK IN QUESTION MOV .CRTSK,R1 ;NOW GET MY ATL POINTER IN R1 MOV TIPTR,A.TI(R1) ;CHANGE MY TI POINTER ACCORDINGLY 12$: MOV #BUFFER,R0 ;POINT TO COMMAND BUFFER MOV #1,R1 ;. NOT TERMINATOR FLAG -> R1 JSR PC,$CAT5 ;CONVERT REQ'D TASK NAME TO RAD 50 MOV R1,TASNAM ;SAVE REQUESTED TASK NAME IN RAD50 MOV #RADTAB,R5 ;POINT R5 AT LIST OF MFT TASK NAMES MOV #8.,R0 ;SET TO CHECK FOR 8. MFT TASKS MOV RADMFT,RQSDPB+S.PWTN+2 ;SET TO REQUEST ...MFT 21$: CMP R1,(R5)+ ;MATCHED A MFT TASK ? BEQ 22$ ;OUT OF LOOP IF WE DID SOB R0,21$ ;ELSE TRY AGAIN MOV #7,R5 ;SET LOOP COUNT FOR 7 MASSAGE NAMES MOV #MASNAM,R4 ;SET TO START OF MASSAGE NAME TABLE MOV MASRAD,RQSDPB+S.PWTN+2 ;CHANGE REQUESTED TASK TO ...MAS 666$: CMP R1,(R4)+ ;COMPARE REQ'D TASK NAME WITH MASSAGE NAME BEQ 22$ ;BR IF WE MATCH SOB R5,666$ ;ELSE TRY 7 MASSAGE NAMES MOV R1,RQSDPB+S.PWTN+2 ;NOT AN MFT TASK, DO DIRECT REQUEST 22$: 7$: MOV .CRTSK,R0 ;GET MY ATL AGAIN MOV A.TI(R0),R0 ;NOW HAVE PUD POINTER MOV U.RB(R0),R0 ;NOW HAVE PRIVILEGE WORD IN R0 MOV RQSDPB+R.QSTN+2,R1 ;AND TASK NAME IN R1 JSR PC,PRICHK ;CHECK USERS PRIVILEGES TST R0 ;CAN HE DO THIS BPL 77$ ;YES HE CAN MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 JMP ILLPRV ;AND RETURN "PRIVILEGE" ERROR 77$: MOV R4,R1 ;R1 AS NODE POINTER MOV #BUFFER,R0 ;SET UP START OF LINE POINTER MOV BYTCNT,R2 ;RESTORE BYTE COUNT TO R2 CMP R2,#80. ;TOO MANY CHARACTERS IN LINE ? BLE 23$ ;IF SO QUIT MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 JMP ILLBUF ;RETURN BAD BUFFER IO CODE 23$: MOV R2,-(SP) ;SAVE CHAR COUNT ADD R2,R0 ;BUMP PAST MESSAGE MOVB #33,(R0)+ ;FILL IN ESC FOR ...MFT MOV (SP)+,RQSDPB+S.PWCL ;FILL IN LINE LENGTH MOV #BUFFER,RQSDPB+S.PWCA ;AND LINE START MOV TASRAD,RQSDPB+S.PWTN ;SET TO RQS ...XXX MOV UICSAV,RQSDPB+S.PWPC ;WITH SAVE UIC AS REQUESTOR DIR$ #RQSDPB ;RUN ...XXX TST DIRSTA ;DID HE GO ? BGT 4$ ;YES HE DID MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 JMP NORUN ;AND DO ERROR IO DONE THING 4$: MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 JMP OVEROK ;DO SUCCESSFUL IO DONE ; ; ; ATTACH: ;HERE TO ATTACH TO A UNIT CALL @#..ATUN ;CALL ATTACH SUBROUTINE BCC 1$ ;WENT OK JMP ILLATT ;FAILED GET OUT 1$: JMP OVEROK ;FINISHED-- DO LEGAL EXIT ; ; DETACH: ;DETACH FROM A UNIT CALL @#..DTUN ;CALL DETACH SUB BCS TRAN3 ;DETACH FAILED, NOTIFY SYSTEM JMP OVEROK ;DO LEGAL EXIT TRAN3: JMP ILLDET ;AGAIN OUT OF BRANCH RANGE ; ; ; ; .PAGE .SBTTL EXPRESS FUNCTION HANDLERS ; ; ;FUNCTION 12 -------KILL REQUEST ;CLUDGES TO LOOK LIKE I/O RUNDOWN THEN ;ENTERS I/O RUNDOWN SEQUENCE ; ;FUNCTION 22 -------I/O RUNDOWN ;USES ..FLSH TO CLEAR ALL REQUESTS FROM THE CURRENT USER ; ;FUNCTION 42 -------EXIT (UNLOAD) ;VALIDATES REQUEST THEN SETS ;EXFLAG SO THAT NEXT TIME IN IDLE HANDLER ;DOES EXIT ; ; EXPFUN: MOV R.FC(R1),R3 ;GET FUNCTION CODE CMP #KILLR,R3 ;REQUEST FOR KILL ?? BEQ KILLRQ ;PROGRAM COMMITS HARI-KARI TST R.AT(R1) ;OTHERWISE EXEC BETTER BE ASKING FOR EXP BNE EXPILL ;NOT EXEC ---- THAT'S A NO-NO CMP #IORUND,R3 ;ITS THE EXEC/ I/O RUNDOWN ? BEQ IORNDQ ;YES GO DO IT CMP #EXITCO,R3 ;IF NOT RUNDOWN BETTER BE EXIT BEQ EXITGO ;YES IT'S AN EXIT GO DO IT EXPILL: JMP ILLFUN ;FELL THROUGH UNRECON'ED FUNCTION ; ; KILLRQ: MOV R.AT(R1),R4 ;SET UP RNA POINTER MOV R4,R.PB(R1) ;STORE ATL NODE ADDRESS MOV A.TD(R4),R.PB+2(R1) ;STORE STD NODE MOV (R2),R.PB+4(R1) ;STORE PUD START ;NOW JOIN I/O RUNDOWN ; ; IORNDQ: CALL @#..FLSH ;FLUSH QUEUE OF ALL USER REQUESTS JMP OVEROK ;BRANCH TO EXIT ROUTINE ; ; EXITGO: INC EXFLAG ;SET EXIT FLAG TO INDICATE JMP OVEROK ;BRANCH TO OVER, EN ; ; EXFLAG: .WORD 0 ;EXIT FLAG KILLR=12 ;KILL CURRENT I/O REQUEST IORUND=22 ;I/O RUNDOWN REQUEST EXITCO=42 ;EXIT AND UNLOAD ; .PAGE .SBTTL SYSTEM STATUS TABLES ; ; UITID: .WORD DISPCH ;POINTER TO DISPATCH TABLE .BYTE 1,0 ;NUMBER OF UNITS .WORD 0,0,0 UITEN: .WORD 0,0,0 ;FIRST ENTRY ; ; ; THE FUNCTIONS SUPPORTED ARE DISPCH: .WORD 0 ;ADDRESS TO BR TO IF SEND/REQ FAILS .WORD 0 ;ADDRESS TO BR TO IF SEND/REQ SUCCEEDS ;NOW THE FUNCTION CODE ENTRIES (2-WORDS) .BYTE 000,000 ;0 = EXPRESS FUNCTION .WORD EXPFUN .BYTE 010,142 .WORD DOMCR ;POINTER TO WRITE ROUTINE ILFN ;2 = READ LOGICAL .BYTE 020,140 ;3 = ATTACH .WORD ATTACH ;POINTER TO ROUTINE .BYTE 020,140 ;4 = DETACH .WORD DETACH ;POINTER TO DETACH ILFN ;5 = CONTROL ILFN ;6 = UNDEFINED .BYTE 010,140 ;7 = CLOSE OUT LUN .WORD ILLFUN ILFN ;10 = UNDEFINED ILFN ;11 = FIND FILE ILFN ;12 = ILLEGAL ILFN ;13 = REMOVE FILE ILFN ;14 = ENTER FILE ILFN ;15 = ACCESS FOR READ .BYTE 140,143 ;16 = ACCESS FOR READ/WRITE .WORD OVEROK ;DUMMY IT OUT .BYTE 140,147 ;17 = ACCESS FOR READ/WRITE/EXTEND .WORD OVEROK ;DUMMY IT OUT .BYTE 140,140 ;20 = DEACCESS .WORD OVEROK .BYTE 140,141 ;21 = READ VIRTUAL .WORD ILLFUN .BYTE 140,142 ;22 = WRITE VIRTUAL .WORD DOMCR ; .BYTE 140,140 ;23 = EXTEND .WORD OVEROK ;DUMMY IT OUT .BYTE 140,140 ;24 = CREATE .WORD OVEROK ;DUMMY IT OUT ILFN ;25 = DELETE FILE ILFN ;26 = READ ATTRIBUTES ILFN ;27 = WRITE ATTRIBUTES ;ENOUGH FUNCTIONS ALREADY !!!!!! .PAGE .SBTTL BUFFER AND MISC VARIABLES TIPTR: .WORD 0 ;SAVE TI POINTER HERE UICSAV: .WORD 0 ;SAVE UIC OF REQUESTOR HERE BYTCNT: .WORD 0 ;SAVE BYTE COUNT TASRAD: .RAD50 /.../ ;TWO WORD BUFFER FOR REQUESTED TASK NAME TASNAM: .RAD50 /XXX/ RADMFT: .RAD50 /MFT/ ;USED IF MCR WANTED IS A MFT FUNCTION MASRAD: .RAD50 /MAS/ ;USED IF MASSAGE FUNCTION WANTED ; ;TABLE OF LEGAL RAD50 MFT TASK NAMES RADTAB: .RAD50 /ABOALTCANDISENAFIXRESUNF/ MASNAM: ;TABLE OF POSSIBLE MASSAGE TASK NAMES .RAD50 /PRITYPPURDIRBLORECFRE/ ; ;COMMAND LINE BUFFER BUFFER: .BLKB 84. .END INIT