;SECTION TO LIST THE PUD ENTRY FOR A DEVICE ;AN MCR FUNCTION CALLED BY ;INF PUD TT0: FOR EXAMPLE ; ;OR BY ; ;INF PUD TT0:/F TO GET A FULL LISTING ; (INCLUDING VOLUMN CONTROL BLOCK) ; ; .TITLE PUD .GLOBL .PUDBA,.PUDEA .MCALL QIO$C,EXIT$C,WTSE$C,RQST$C .enable lc ; ; PUD:: MOV #MCRBUF,R0 ;GET START OF COMMAND LINE MOV R0,R1 ;PUT IN R1 ADD MCRSIZ,R1 ;END OF LINE POINTER MOVB -(R1),FULLST ;SAVE POSSIBLE FULL LISTING SWITCH 1$: CMPB (R0)+,#40 ;A SPACE ? BEQ 2$ ;YES, LOOK FOR DEVICE NAME CMP R0,R1 ;AT TERMINATOR BLT 1$ JMP BADDEV ;SAY BAD DEVICE 2$: CMPB (R0)+,#40 ;A SPACE ? BEQ 3$ ;YES, HAVE DEVICE NAME CMP R0,R1 ;AT TERMINATOR BLT 2$ JMP BADDEV ;SAY BAD DEVICE 3$: MOVB (R0)+,DEVNAM MOVB (R0)+,DEVNAM+1 MOVB (R0)+,DEVNUM ;SAVE ASCII DEV NUMBER MOVB (R0)+,DEVNUM+1 ;AS NN OR N: MOVB DEVNUM,R1 ;GET 1ST CHAR OF DEVNUMBER CMPB #72,R1 ;IS 1ST CHAR OF R1 A ':' ? BNE DEVNOZ ;NO NOT 0 DEVICE CLR DEVNUM ;SET DEVNUM TO 0 BR DVNMOK ;AND FORGET FURTHER DECODING DEVNOZ: MOV DEVNUM,R3 ;SET IN R3 FOR DIVIDE CLR R2 ;CLEAR UPPER REG DIV #256.,R2 ;DIV BY 256 1ST DIG IN R3 (REM) ;2ND DIGIT IN R2 CMP #72,R2 ;IS 2ND CHAR A ':' BNE NMGT10 ;NO, DEV# GT 10 MOV R3,DEVNUM ;SAVE ASCII DIGIT SUB #60,DEVNUM ;AND CONVERT TO AN OCTAL NUMBER BR DVNMOK ;DECODING DONE NMGT10: SUB #60,R3 ;CONVERT REGS TO A BIN NUM SUB #60,R2 ;DO SAME FOR R2 MUL #10,R3 ;MULTIPLY 1ST DIGIT BY 10 ADD R2,R3 ;R3 NOW =DEV# MOV R3,DEVNUM ;AND SAVE IT DVNMOK: MOV .PUDBA,R0 ;GET START OF PUD MOV .PUDEA,R1 ;AND END ALSO NEXPUD: CMP (R0)+,DEVNAM ;CHECK DEV NAME BNE NMATCH ;IT DOESN'T COMPUTE !!! CMPB (R0),DEVNUM ;IF NAME OK, HOW BOUT # BEQ DOIT ;GOTCHA!!! NMATCH: ADD #U.SZ-2,R0 ;BUMP TO NEXT PUD SECTION CMP R0,R1 ;PAST END OF PUD BGE BADDEV ;YES MUST BE BAD DEV NAME BR NEXPUD BADDEV: QIO$C IO.WVB,2,1,,IOST,, ;TELL DUMMY AT KEYBD HE CAN'T TYPE WTSE$C 1 ;WAIT FOR QIO TO BE DONE BR SCRAM ;AND MAKE LIKE A TREE (LEAVE) DOIT: ;FINALLY WE CAN START OUTPUTTING INFO MOV DEVNAM,NAME ;STORE DEV NAME IN HEADER LINE MOV #2,R2 ;SET UP TO CONVERT 2 DIGIT NUMBER MOV DEVNUM,R4 ;NUMBER TO CONVERT IN R4 MOV #NUMBER+2,R3 ;POINTER IN R3 JSR PC,LOAOCT ;WRITE AN OCTAL NUM SUB #2,R0 ;BACK R0 UP TO START OF PUD QIO$C IO.WVB,2,1,,IOST,, ;WRITE HEADER LINE WTSE$C 1 ;WAIT FOR IO DONE MOV #TAG,R1 ;R1 POINTS TO START OF TAGS WTWORD: MOV R0,R4 ;PUD ADDRESS TO R4 MOV #6,R2 ;# OF CHARACTERS MOV #ONEPT-2,R3 ;POINT TO END OF ADDRESS STRING JSR PC,LOAOCT ;CONVERT ADDRESS TO OCTAL MOV (R0)+,R4 ;PUD WORD TO R4 MOV #6,R2 ;# OF CHARACTERS TO R2 MOV #ONEND,R3 ;POINTER TO END OF STRING IN R3 JSR PC,LOAOCT ;LOAD OCTAL NUMBER INTO ASCII BUFFER JSR PC,LOATAG ;LOAD NAME TAGE INTO BUFFER ALSO QIO$C IO.WVB,2,1,,IOST,, ;WRITE A LINE WTSE$C 1 ;AND WAIT FOR IT TST (R1) ;ARE WE THRU TAGS YET ? BNE WTWORD ;NO WRITE ANOTHER WORD OF THE PUD CMPB FULLST,#106 ;WAS THERE A /F SWITCH ON COMMAND ? BNE SCRAM ;NO, WE'RE DONE FOR NOW CLR FULLST ;YES CLEAR FLAG SO NEXT TIME WE EXIT TST (R1)+ ;BUMP R1 TO NEXT TAG BR WTWORD ;AND GO ROUND AGAIN SCRAM: RTS PC ;BACK TO MAIN ; ; ; ; ;SUBROUTINE TO CONVERT A WORD TO N OCTAL(ASCII)DIGITS ;AND WRITE THEM INTO AN ASCII BUFFER ;REGISTER USAGE ;ENTER WITH R2=# OF DIGITS TO CONVERT/PRINT ; R4=NUMBER TO BE CONVERTED ; R3 POINTING TO NEXT BYTE AFTER!! AREA TO BE WRITTEN ;OTHER REG'S USED, R4,R5 ; ; LOAOCT: MOV R4,R5 ;GET # IN LOWER ORDER REG CLR R4 ;CLEAR UPPER ORDER REG DIV #10,R4 ;DIVIDE BY 10 ADD #60,R5 ;CONVERT REMAINDER TO ASCII MOVB R5,-(R3) ;WRITE DIGIT SOB R2,LOAOCT ;IF NOT N DIGITS, DO AGAIN RTS PC ;IF DONE RETURN ; ; ;SUBROUTINE TO LOAD A 6 BYTE NAMETAG INTO A QIO LINE ; ;ENTERED WITH R1 POINTING TO START OF 6 BYTE TAG ;EXIT WITH R1 POINTING TO NEXT 6 BYTE TAG ;REG'S R2,R3 ALSO USED ; ; LOATAG: MOV #5,R2 ;SET TO MOVE 10 BYTES MOV #ONEPT,R3 ;START OF ONELINE MESSAGE NEXT: MOV (R1)+,(R3)+ ;MOVE TWO BYTES SOB R2,NEXT ;NOT DONE ? XFER 2 MORE RTS PC ;ELSE RETURN ; ; ; ;FINALLY LOTS OF ASCII DATA FOR MESSAGES ; ; HEADER: .BYTE 12,15 .ASCII /PUD entry for / .EVEN NAME: .ASCII /XX/ NUMBER: .ASCII /00:/ .EVEN ; ; ;LINE FOR REPORTING EACH PUD WORD ; ONELIN: .ASCII /000000 / ONEPT: .ASCII /XXXXXXXXXX 000000/ ONEND: ONELEN=ONEND-ONELIN ; ; ;MESSAGE FOR BAD DEVICE NAME ; BAD: .BYTE 12,15 .ASCII /INF PUD bad device name/ .EVEN ; ; ;NOW THE TAGS (NAMES OF PUD WORDS) ; .ENABLE LC TAG: .ASCII /Dev Name / .ASCII /Flags Word/ ;FLAGS WORD (UPPER BYTE) .ASCII /Dev Char 1/ .ASCII /Dev Char 2/ .ASCII /Dev Char 3/ ;THE 4 DEVICE PARAMETER WORDS .ASCII /Dev Char 4/ .ASCII /Att. Flag / ;ATTACH FLAG .ASCII /Red Point./ ;REDIRECT POINTER .ASCII /ATL Point./ ;ATL NODE POINTER .ASCII /Exp Req. / ;# OF EXPRESS REQ'S .ASCII /UIT Entry / ;POINTS TO UNIT ENTRY IN HANDLER .ASCII / / ;DEQUE BACKWARD POINTER (OBSOLETE) .ASCII /Int Vector/ ;INTERRUPT VECTOR .ASCII /Int Prior./ ;INTERRUPT PRIORITY .ASCII /1st Reg Ad/ ;IST REG ADDRESS .WORD 0 ;END OF BASIC LIST .ASCII /VCB Exten./ ;VOLUMN CTL BLOCK EXTENSION .ASCII /UIC / ;UIC CODES .ASCII /Vol Prot. / ;VOLUMN PROTECT WORD .ASCII /Access / ;ACCES RIGHTS WORD .ASCII /Defaul ACP/ ;DEFAULT ACP (RAD 50 1ST 3 CHARS) .ASCII /STD Addres/ ;STD ADDRESS OF CURRENT ACP .ASCII /TT Flags / ;TERMINAL FLAGS WORD .ASCII /Block high/ ;HIGH ORDER # OF BLOCKS .ASCII /Block low / ;LOW ORDER # OF BLOCKS .ASCII /Res word#4/ ;RESERVED WORD #4 .WORD 0 ;END OF 'FULL' LIST ;DONE WITH TAGS ; IOST: .WORD 0,0 ;FOR ERROR RETNS, ALSO END OF TAGS PTR DEVNAM: .ASCII /XX/ DEVNUM: .WORD 0 MCRTER: .WORD 0 ;MCR TERMINATION CHARACTER FULLST: .WORD 0 ;POSSIBLE ASCII F (FOR FULL LISTING .END