.TITLE ...SPD FUNCTION TO CHANGE THE PUD OF A TTY: .SBTTL INTRODUCTION ;PROGRAM TO CHANGE THE PUD ENTRIES FOR A DEVICE ;(USUALLY A TELETYPE) ;AN MCR FUNCTION CALLED BY ;SPD TT0: 3 FOR EXAMPLE ; ; ;IT WILL RESET THE 4 DEVICE WORDS OF THE PUD IN ;QUESTION TO VALUES SPECIFIED BY THE CODE NUMBER ; ;NUMBER TYPE OF TERMINAL DESCRIBED ;______ ___________________________________ ;0 CONSOLE LA30 , MARGIN, 72 COL ;1 CONSOLE LA30, NO MARGIN, 80 COL. ;2 79 COL. SCOPE, ODD PARITY, IGNORE FORM-FEED ;3 79 COL. SCOPE, ODD PARITY, CLEAR & HOME ON FORM-FEED ;4 120 COL. LA36, ODD PARITY, IGNORE FORM-FEED,L.C. ;5 120 COL. LA36, ODD PARITY, SOFT. FORM-FEED,L.C. ;6 DUMB OLD ASR-33 TTY ;7 ASR-33 WITH 150 CHARACTER BUFFER ;8 80 COL HARD TERMINAL, NO PARITY,SOFT FORM FEED ; ;!!TASK BUILD COMMAND FILE ; ;SM:SPD/PR/-FP/MU,SPD/-SP=SM:SPD,DK0:[1,1]EXEC.STB ;/ ;LIBR=SYSRES:RO ;TASK=...SPD ;PRI=221 ;STACK=32 ;ASG=TI:2 ;PAR=GEN ;// ; ; ; .PAGE .SBTTL MAIN CODE .GLOBL .PUDBA,.PUDEA .MCALL QIO$C,EXIT$C,WTSE$C,RQST$C ; ; START: MOV #MCRDPB,-(SP) ;GET MCR DPB TO STACK EMT 377 ;DO IT MOV #MCRBUF,R0 ;R0 POINTS TO START OF LINE MOV R0,R1 ;PUT IN R1 ADD 0,R1 ;END OF LINE POINTER MOVB (R1),MCRTER ;SAVE MCR TERMINATOR MOV R1,TERPTR ;AND POINTER TO END OF LINE CMPB 4(R0),#71 ;REQ FOR OWN TTY PUD ? BGT 1$ ;NO ADD #4,R0 ;BUMP R0 POINTER TO CODE NUMBER MOV #"TT,DEVNAM ;SET TO TT DEVICE MOV .CRTSK,R5 ;GET MY ATL MOV A.TI(R5),R5 ;NOW MY TI PUD MOVB U.UN(R5),DEVNUM ;AND GET UNIT # JMP GOTNUM ;AND SKIP LOTS 1$: MOV 4(R0),DEVNAM ;SAVE ASCII DEV NAME MOV 6(R0),DEVNUM ;SAVE ASCII DEV NUMBER 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: ADD #6,R0 ;BUMP R0 PAST "SPD TT" ISITSP: CMPB (R0)+,#40 ;IS NEXT CHAR A SPACE BNE ISITSP ;NO LOOK AGAIN CMP R0,TERPTR ;ARE WE AT TERMINATOR BGE BADDEV ;YES A DUM-DUM ;NOW LET'S GET THE NUMBER CODE GOTNUM: MOVB (R0)+,R3 ;GET AN ASCII DIGIT IN R4 SUB #60,R3 ;CONVERT IT TO OCTAL CMP R0,TERPTR ;AT TERMINATOR ? BGE NUMDNE ;YES ITS ONLY 1 CHAR, WERE DONE MUL #10.,R3 ;NO MUL 1ST DIGIT BY 10 MOVB (R0),R1 ;GET 2ND DIGIT IN R1 SUB #60,R1 ;CONVERT IT TO AN OCTAL DIGIT ADD R1,R3 ;AND ADD IT TO UPPER DIGIT NUMDNE: CMP R3,#8. ;HOWS THE NUMBER ? BGT BADDEV ;WOOPS, TOO BIG TST R3 ;OR MAYBE IT'S BMI BADDEV ;NEGATIVE ??? GETPUD: 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 #48.,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 CHANGING THE PUD TST (R0)+ ;BUMP R0 TO DC1 WORD MUL #10,R3 ;TURN R3 TO A 4-WORD OFFSET ADD #PUDWDS,R3 ;PRESTO WE HAVE A POINTER CMP R3,#WDSEND ;BETTER CHECK IT BGE BADDEV ;JUST TO BE SURE MOV #LEGBIT,R4 ;POINTER TO LEGAL CHANGE TABLE -> R4 XFER: MOV (R0),R5 ;GET OLD DC WORD IN R5 MOV (R3)+,R1 ;NEW PUD WORD IN R1 MOV (R4)+,R2 ;LEGALITY MASK IN R2 BEQ SCRAM ;0 LEGALITY INDICATES 4 WORDS DONE XOR R1,R5 ;XOR NEW WORD WITH OLD BIC R2,R5 ;CLEAR BITS LEGALLY CHANGEABLE XOR R1,R5 ;XOR NEW WITH OLD AGAIN MOV R5,(R0)+ ;PUT NEW WORD IN PUD BR XFER ;AND DO ANOTHER SCRAM: CMP #33,MCRTER ;WAS TERMINATOR AN ALT MODE? BEQ NOMCR ;YES DONT REQUEST ...MCR RQST$C ...MCR ;REQUEST ...MCR NOMCR: EXIT$C ;AND EXIT ; ; ; .PAGE .SBTTL DATA & BUFFERS ; ;FIRST THE GET MCR DIRECTIVE (AND BUFFER) MCRDPB: .BYTE 127.,41. ;CODE & SIZE OF DPB MCRBUF: .BLKW 40. ;80-BYTE BUFFER ; ; ; ;MESSAGE FOR BAD DEVICE NAME ; BAD: .BYTE 12,15 .ASCII /BAD DEV. NAME OR CODE #/ .EVEN TAG: ;END OF MESSAGE POINTER ; ; ;NOW THE 4 NEW DEVICE CHARACTERISTIC WORDS FOR EACH CODE ; PUDWDS: .WORD 000000,020000,000001,110 ;0/ CONSOLE LA30 .WORD 000000,020000,000000,120 ;1/ LA30, NO MARGIN, 80 COL. .WORD 000000,010440,000000,117 ;2/ 79 COL SCOPE,SKIP FF, ODD PARITY .WORD 000000,010400,000000,117 ;3/ SAME AS ABOVE BUT CLEAR ON FF .WORD 000000,021440,000000,170 ;4/ 120 COL LA36,ODD PARITY, SKIP FF,LC .WORD 000000,021400,000000,170 ;5/ SAME AS ABOVE, BUT DO FF .WORD 000000,000000,000000,110 ;6/ #$%&'"! ASR-33 .WORD 000000,000000,000000,226 ;7/ SAME AS ABOVE BUT 150 CHAR. LINE .WORD 000000,021000,000000,120 ;8/ 80 COL HARD COPY, NO PARITY WDSEND: .WORD 0 ;END OF DATA POINTER IOST: .WORD 0,0 ;IO STATUS RETURN ; ; NOW THE FOR WORD MASK DEFINING BITS LEGALLY CHANGEABLE FOR ; EACH PUD WORD. A 1 BIT SIGNIFIES A BIT THAT CAN CHANGE ; LEGBIT: .WORD 04400 ;INT. BUFFERED, OUT SPOOLING BITS CHANGEABLE .WORD 171640 ;CARR. CONTROL, SCOPE, FF BITS CHANGEABLE .WORD 000001 ;MARGIN BIT ONLY CHANGEABLE .WORD 000377 ;ENABLE CHANGING BUFFER, BUT NOT TOO BIG ? .WORD 0 ;END OF TABLE INDICATOR ; ; DEVNAM: .ASCII /XX/ DEVNUM: .WORD 0 MCRTER: .WORD 0 ;MCR TERMINATION CHARACTER TERPTR: .WORD 0 ;POINTER TO END OF MCR LINE .END START