.TITLE LOGON .IDENT /V01/ .MCALL QIOW$,DIR$,FDBDF$,FDOP$A,FINIT$,GCMLB$,FSRSZ$,RQST$,GCML$ .MCALL CMKT$ ;DISSASSEMBLY OF HEL ;ANNOTATION BY F. BORGER ;DEPT. OF MEDICAL PHYSICS ;MICHAEL REESE MEDICAL CENTER ;MARCH/76 ; ;MAIN PURPOSE OF DISASSEMBLY TO MODIFY HELLO SO THAT IT ;SUPPORTS REESE VARIABLE DEFAULT DEVICE OPTION ; ;A/ ...PWD NOW SUPPORTS THE OPTION OF SETTING UP DEFAULT DEVICE ; INFORMATION IN THE FILE ATTRIBUTES SECTION OF A GIVEN DIRECTORY ; WORD 26 OF THE FILE ATTRIBUTES AREA MAY CONTAIN A 2-CHARACTER ; ASCII DEVICE NAME, AND BYTE 30 AN ASCII UNIT NUMBER ; ;B/ HELLO WILL CHECK THIS AREA AND IT THE STRING DOES EXIST, IT WILL ; SEARCH THE PHYSICAL UNIT DIRECTORY UNTIL IT FINDS A MATCH, AND THEN ; (AFTER ACCOUNTING FOR POSSIBLE REDIRECTS,) WILL INSERT THE APPROPRIATE ; PUD ADDRESS INTO LOCATION U.LBH (NOT USED BY TT DEVICES) OF THE PUD ; FOR THE TELETYPE CURRENTLY LOGGING ON ; ;C/ IF NO DEFAULT DEVICE ASCII STRING EXISTS, OR IF THE PUD IN QUESTION ; CAN'T BE FOUND, HELLO WILL INSTEAD INSERT A PUD POINTER FOR THE ; 'DEFAULT DEFAULT DEVICE', OBTAINED FROM LEFTOVER LOCATION IN SCOM ; (.MCRPW+2) ; ; ;LOGON 0 0 000000 ;V01 0 6 000000 ;. ABS. 114 5 000000 ;A.HA 100 4 000000 ;A.TI 100 4 000000 ;FD.CCL 100 4 000000 ;FD.REC 100 4 000000 ;FD.TTY 100 4 000000 ;H.UIC 100 4 000000 ;IE.ABO 100 4 000000 ;IO.KIL 100 4 000000 ;IO.RAT 100 4 000000 ;IO.RLB 100 4 000000 ;IO.WVB 100 4 000000 ;UT.LG 100 4 000000 ;UT.PR 100 4 000000 ;U.TF 100 4 000000 ;U.UI 100 4 000000 ;.CRTSK 100 4 000000 ;.FINIT 100 4 000000 ;.FSRCB 100 4 000000 ;.GCML1 100 4 000000 ;.PARSE 100 4 000000 ; 50 5 000640 ;PURE 50 5 001356 ;$$FSR1 354 5 001020 ;PURE 50 3 000400 .PSECT PURE ;CONTROL BLOCK FOR READ ATTRIBUTES RDACNB: .BYTE 374,40 ;FN CODE, XFER SIZE IN BYTES .WORD RATBUF ;ADDRESS OF BUFFER .WORD 0 ; ; ;VARIOUS ASCII MESSAGES PROMPT: .ASCII /PASSWORD>/ PROMPL=.-PROMPT ; ; BADPWD: .ASCII /HEL -- ILLEGAL PASSWORD/ BADPWL=.-BADPWD ; ; SYNBAD: .ASCII /HEL -- SYNTAX ERROR/ SYNBAL=.-SYNBAD .EVEN ; ; READBA: .ASCII /HEL -- READ FAILURE ON DIRECTORY ENTRY/ READBL=.-READBA .EVEN ; ; ;DIRECTIVE TO REPORT DIRECTORY ENTRY READ FAILURE RDFDIR: QIOW$ IO.WVB,5,1,,IOSTAT,, ; ;ASCII MESSAGE FOR DIRECTIVE FAILURE DIRBAD: .ASCII /PWD -- DIRECTIVE FAILURE/ DIRBAL=.-DIRBAD .EVEN NODIR: .ASCII /HEL -- NON EXISTANT ACCOUNT/ NODIRL=.-NODIR .EVEN HELPRO: .ASCII <12><15>/HEL>/<5> HELPRL=.-HELPRO .EVEN ; ; ;DIRECTIVE TO REPORT FAILURE OF SOME OTHER DIRECTIVE DFADIR: QIOW$ IO.WVB,5,1,,IOSTAT,, ; ; ;DIRECTIVE TO REPORT NON-EXISTANT ACCOUNT DIRDPB: QIOW$ IO.WVB,5,1,,IOSTAT,, ; ; ;DIRECTIVE TO READ ATTRIBUTES OF DIRECTORY FILE RATDIR: QIOW$ IO.RAT,4,1,,IOSTAT,, ; ; ;DIRECTIVE TO ISSUE 'PASSWORD>' PROMPT PRODIR: QIOW$ IO.WVB,5,1,,IOSTAT,, ; ; ;DIRECTIVE TO REPORT SYNTAX ERROR SYNDIR: QIOW$ IO.WVB,5,1,,IOSTAT,, ; ; ;DIRECTIVE TO REPORT WRONG PASSWORD ILLDIR: QIOW$ IO.WVB,5,1,,IOSTAT,, ; ; ;DIRECTIVE TO READ PASSWORD (NO ECHO) RPWDIR: QIOW$ IO.RLB+20,6,1,,IOSTAT,, KMKDIR: CMKT$ ;CANCLE ALL MARK TIME REQUESTS ;DIRECTIVE TO CANCLE READ PASSWORD DIRECTIVE IF WE TIME OUT KRDDIR: QIOW$ IO.KIL,5,2,,IOSTAT+4,0 REQMCR: RQST$ ...MCR ;TRY TO GET MCR BACK .PSECT RATBUF: .BLKW 20 ;FILE ATTRIBUTES BUFFER FSRSZ$ 1 FDB: FDBDF$ ;DEFINE FDB FDOP$A 4 ;SET LUN DATSET: .WORD 0 ;DATA SET DESCRIPTOR .WORD 0 UICSIZ: .WORD 0 ;UIC DESCRIPTOR (SIZE) UICSTA: .WORD 0 ;AND START ADDRESS .WORD 0 ;DEFAULT FILE NAME DESCRIPTOR .WORD 0 .BLKW 3 UIC: .WORD 0 ;OCTAL VALUE OF UIC STRING MODULO: .WORD 0 ;MODULO OF UIC STRING (8. OR 10.) PRIFLA: .WORD 0 ;FLAG FOR PRIVILEDGED UIC IOSTAT: .BLKW 4 DFDEV: .WORD 0 ;DEFAULT DEVICE ASCII STRING DFUNIT: .WORD 0 ;DEFAULT UNIT NUMBER (OCTAL) ; ; ; DIRECTIVE TO DO A MARK TIME MKTDPB: .BYTE 23.,5 .WORD 2 ;EVENT FLAG MKTINT: .WORD 30. ;INTEVAL .WORD 2 ;ONE SECOND INTERVALS .WORD KILPRO ;ADDRESS OF ROUTINE TO TRAP TO GCLBUF: GCMLB$ ,HEL,,5 ;SPECIFY PROMPT STRING, LUN .PSECT PURE SYNJMP: JMP SYNERR ;BRANCH AID NEEDED BECAUSE OF ADDED CODE START: MOV .CRTSK,R0 ;MY ATL POINTER IN R0 MOV PS.EXP,-(SP) ;SAVE OLD STATUS BIS #140,PS.EXP ;DISABLE TSK SW SO ATL NOT RELINKED MOV .ATLLH,R1 ;START OF ATL IN R1 1$: MOV (R1),R1 ;GET NEXT OR FIRST ATL ENTRY CMP R0,R1 ;IS THIS ME BEQ 1$ ;SKIP IF IT IS CMP R1,.ATLLH+2 ;OR ARE WE THROUGH ATL ? BEQ 2$ ;YES CAN SAFELY RUN CMP A.TD(R0),A.TD(R1) ;NO IS THIS ANOTHER ...HEL ? BNE 1$ ;NO CMP A.TI(R0),A.TI(R1) ;YES IS TI THE SAME ? BNE 1$ ;NO TRY AGAIN JSR PC,..ENB0 ;NOW RE-ENABLE TASK SWITCHING JMP SCRAM ;HEL ALREADY ACTIVE SO SCRAM RIGHT NOW 2$: JSR PC,..ENB0 ;NO OTHER HEL, RE-ENABLE TASK SWITCHING JSR PC,.FINIT ;INIT FSR AREA DOMKT: MOV #30.,MKTINT ;SET FOR A 30. SECOND MARK TIME DIR$ #MKTDPB ;DO MARK TIME BCS ERRJMP ;BRANCH IF DIRECTIVE FAILED GCML$ #GCLBUF,#HELPRO,#HELPRL ;GET COMMAND LINE BCC GOTCML ;BR IF THERE WAS ONE ERRJMP: JMP SCRAM ;SIMPLE ERROR PROCEEDURE, EXIT GOTCML: DIR$ #KMKDIR ;KILL MARK TIME REQUESTS BCS ERRJMP ;BR IF AN ERROR TST G.CMLD(R0) ;CHECK SIZE OF COMMAND LINE BEQ DOMKT ;BR IF NOTHING THERE MOV G.CMLD+2(R0),R2 ;BUFFER START TO R2 MOV R2,UICSTA ;SAVE STARTING ADDRESS OF STRING CMPB (R2)+,#133 ;FIRST CHARACTER A '[' ? BNE SYNJMP ;IF NOT, A SYNTAX ERROR MOV #10,MODULO ;OK SET FOR MODULO 8 (OCTAL) STRING JSR PC,DECUIC ;DECODE UIC ASCII STRING TO OCTAL TST R1 ;OCTAL VALUE NEGATIVE ? BEQ SYNJMP ;OR 0 A NO NO BR IF SO BIT #177400,R1 ;OR IS IT TOO BIG ? BNE SYNJMP ;ALSO AN ERROR MOVB R1,UIC+1 ;OK SAVE GROUP CODE (OCTAL) CMPB R5,#54 ;NOW LOOKING AT A ',' ? BNE SYNJMP ;IF NOT SYNTAX ERROR JSR PC,DECUIC ;OK DECODE USER CODE TST R1 ;DO SAME CHECK OF NUMBER AS FOR GROUP BEQ SYNJMP BIT #177400,R1 BNE SYNJMP MOVB R1,UIC ;AND SAVE USER CODE CMPB #135,R5 ;SHOULD NOW BE LOOKING A A ']' BNE SYNJMP ;IF NOT ALSO SYNTAX ERROR MOV R2,UICSIZ ;SAVE CURRENT POINTER POSITION SUB UICSTA,UICSIZ ;SUB START POSITION = SIZE IN BYTES MOV .CRTSK,R0 ;GET MY ATL MOV #77406,-(SP) ;NEW PDR TO STACK MOV A.HA(R0),-(SP) ;AND PAR TO SWAP INTO MY HEADER JSR PC,SWAP ;SWAP INTO TASK HEADER MOV UIC,H.UIC+40000 ;CHANGE MY UIC TO BE GUY'S AT TTY JSR PC,SWAP ;SWAP BACK AGAIN CMP (SP)+,(SP)+ ;RESTORE STACK POINTER MOV #FDB,R0 ;FDB ADDRESS -> R0 MOV #FDB+F.FNB,R1 ;FILE NAME BLOCK ADDRESS -> R1 MOV #DATSET,R2 ;DATASET DESCRIPTOR BLOCK ADDRESS -> R2 CLR R3 ;NO DEFAULT FILE NAME BLOCK JSR PC,.PARSE ;SET UP FDB BY DIRECTORY ID BCC 11$ ;BR IF WENT OK JMP DIRFAI ;JMP IF CAN'T HACK IT 11$: DIR$ #RATDIR ;READ FILE ATTRIBUTES BCS REAFAI ;REPORT COULDN'T READ ATTRIBUTES BIC #UT.PR,PRIFLA ;CLEAR 'PRIVILEDGED' BIT CMPB UIC+1,#10 ;GROUP CODE <= 10 ? BHI 2$ ;BR IF NOT BIS #UT.PR,PRIFLA ;ELSE RESET 'PRIVILEDGED' BIT 2$: TSTB RATBUF+32 ;ANY PASSWORD THERE ? BEQ PWDOK ;IF NOT, NO NEED TO CHECK DIR$ #PRODIR ;DO 'PASSWORD>' PROMPT BCS SCRAM ;ERROR EXIT MOV #30.,MKTINT ;CHANGE INTERVAL TO 30. SECONDS DIR$ #MKTDPB ;DO MARK TIME BCS SCRAM ;TAKE ERROR EXIT DIR$ #RPWDIR ;READ PASSWORD BCS SCRAM ;EXECUTE SOPHISTICATED ERROR ROUTINE (EXIT) DIR$ #KMKDIR ;CANCLE MARK TIME CMPB #IE.ABO,IOSTAT ;ERR CODE BEQ SCRAM ;DO ERROR EXIT CLR R5 1$: TSTB RATBUF+32(R5) ;END OF PASSWORD? BEQ PWDOK ;YES NO NEED TO CHECK CMPB RATBUF+32(R5),GCLBUF+244(R5) ;SAME LETTER? BNE ILLPWD ;PASSWORDS NOT SAME, REPORT IT INC R5 ;BUMP TO NEXT CHAR OF PASSWORD CMP R5,#6 ;CHECKED 6 CHARACTERS YET ? BCS 1$ ;LOOP IF NOT PWDOK: MOV .CRTSK,R5 ;GET MY ATL INDICATOR MOV A.TI(R5),R5 ;GET MY TI INDICATOR MOV UIC,U.UI(R5) ;NEW UIC TO TI PUD BIS #UT.LG,U.TF(R5) ;SAY I'M LOGGED ON BIC #UT.PR,U.TF(R5) ;CLEAR MY 'PRIVILEDGED' BIT BIS PRIFLA,U.TF(R5) ;MAKE ME PRIVILEDGED ONLY IF GROUP <= 10 ; ; ADDED CODE TO SUPPORT DEFAULT DEVICE INFO MOV R5,-(SP) ;SAVE TI PUD POINTER MOV RATBUF+26,DFDEV ;STORE DEFAULT DEVICE ASCII NAME BEQ NODFDV ;IF NONE, USE DEFAULT DEFAULT DEVICE MOVB RATBUF+30,DFUNIT ;STORE DEFAULT UNIT NUMBER BIC #60,DFUNIT ;CHANGE IT FROM ASCII TO OCTAL MOV .PUDBA,R5 ;FIRST PUD ADDRESS -> R5 CKPUD: CMP (R5),DFDEV ;ASCII DEVICE NAME SAME ? BNE NOMAT ;BR IF NO MATCH CMPB 2(R5),DFUNIT ;UNIT NUMBERS SAME ? BNE NOMAT ;BR IF NOT JSR PC,..REDT ;FOUND PUD, GO THROUGH REDIRECT CHAIN MOV R5,R0 ;PUD POINTER -> R0 DFDVOK: MOV (SP)+,R5 ;RESTORE TI PUD POINTER MOV R0,U.LBH(R5) ;STORE DF DEV PUD POINTER IN TI PUD FOR ;GUY NOW LOGGING ON DIR$ #REQMCR ;REQUEST MCR BR SCRAM ;AND GIT NOMAT: ADD #U.SZ,R5 ;BUMP R5 TO NEXT PUD ENTRY CMP R5,.PUDEA ;AT END OF PUD ? BHIS NODFDV ;DIDN'T FIND PUD, USE DEFAULT DEFAULT DEVICE BR CKPUD ;ANOTHER PUD EXISTS, CHECK IT NODFDV: ;NO DEFAULT DEVICE, OR COULDN'T FIND PUD MOV .MCRPW+2,R0 ;DEFAULT DEFAULT DEVICE PUD POINTER -> R0 BR DFDVOK ;AND GO INSERT HIM SYNERR: DIR$ #SYNDIR ;REPORT SYNTAX ERROR BR SCRAM ;AND LEAVE REAFAI: DIR$ #RDFDIR ;REPORT READ ATTRIBUTES FAILURE BR SCRAM ;AND LEAVE DIRFAI: CMPB #IE.NSF,F.ERR(R0) ;WAS ERROR DIRECTORY DOESN'T EXIST ? BNE REAFAI ;NO REPORT WE COULDN'T READ ATTRIBUTES DIR$ #DIRDPB ;YES REPORT DIRECTORY NOT THERE BR SCRAM ILLPWD: DIR$ #ILLDIR ;REPORT WRONG PASSWORD BR SCRAM ;AND LEAVE SCRAM: MOV #463,-(SP) ;AN EXIT DPB -> STACK EMT 377 KILPRO: DIR$ #KRDDIR ;KILL PENDING READ OF PASSWORD TST (SP)+ ;CLEAR ADDRESS OF IOSTATUS BLOCK FROM STACK MOV #563,-(SP) ;MOVE AST EXIT DBP TO STACK EMT 377 ; ; ;SUB TO CONVERT UIC GROUP OR USER CODE TO OCTAL DECUIC: MOV #6,R4 ;MAX CHAR COUNT TO R4 CLR R1 ;CLEAR ANSWER 1$: MOVB (R2)+,R5 ;FIRST CHARACTER TO R5 CMP #57,R5 ;ASCII CODE < '0' ? BPL 3$ ;BAD CHARACTER CMP #67,R5 ;ASCII CHARACTER > '7' ? BMI 2$ ;PROBABLY BAD 11$: CLC ;CHAR OK CLEAR ERROR BIT MUL MODULO,R1 ;MULTIPLE PREV ANSWER BY BASE 8 OR 10.,R1 BCS 4$ ;WOOPS, NUMBER TOO BIG BIC #177760,R5 ;CHANGE ASCII CHAR TO OCTAL ADD R5,R1 ;ADD TO PREVIOUS TOTAL SOB R4,1$ ;AND LOOP TILL DONE BR 3$ 2$: CMP #12,MODULO ;ARE WE WORKING BASE 10. ? BNE 3$ ;NO CMP #71,R5 ;YES DIGITS '8' AND '9' ARE LEGAL BPL 11$ ;DIGIT NOW OK 3$: RTS PC ;RETURN 4$: TST (SP)+ ;SYNTAX ERROR, REMOVE SUB RETURN FROM STACK JMP SYNERR ;AND REPORT SYNTAX ERROR ; ;SUB TO SWAP PAGE DESCRIPTORS SWAP: MOV 177604,-(SP) ;ADDR OF USER PDR4 -> STACK MOV 177644,-(SP) ;ADDR OF USER PAR4 -> STACK MOV R4,-(SP) MOV .CRTSK,R4 ;MY ATL ENTRY TO R4 MOV 177776,-(SP) ;STATUS REG TO STACK MOV #144340,177776 ;CLUDGE STATUS REGISTER MOV #77406,177604 ;RESET PDR MFPI A.HA(R4) ;CORE ADDRESS OF ME NOW ON STACK MOV (SP)+,177644 ;RESET PAGE ADDRESS REG MOV 12(SP),40026 MOV 14(SP),40006 MOV (SP)+,177776 ;RESTORE STATUS REGISTER MOV 10(SP),177644 ;RESTORE PAR4 MOV 12(SP),177604 ;AND PDR 4 MOV (SP)+,R4 MOV (SP)+,4(SP) MOV (SP)+,4(SP) RTS PC .END START