.TITLE PTT - TERMINAL FUNNIES FOR PT100 .MCALL EXIT$S,SPWN$,QIOW$C,GCMLB$,GCML$,FSRSZ$,ISTAT$,STATE$,TRAN$ .MCALL ALUN$S,GLUN$C .NLIST BEX UCBADR = 54240 ;TT1: UCB ADDRESS ADMCLR = 32 ;CLEAR FOR THE ADM-3A U.TTYP = 46 ;TERMINAL TYPE OFFSET IN UCB .NLIST ME FSRSZ$ 1 MCRB: GCMLB$ 2,PTT,,1 ;COMMAND LINE BUFFER CMDTBL: .ASCII /BL/ .ASCII /BO/ .ASCII /UN/ .ASCII /RV/ .ASCII /L1/ .ASCII /L2/ .ASCII /L3/ .ASCII /L4/ .ASCII /IL/ .ASCII /DL/ .ASCII /DC/ .ASCII /CL/ .ASCII /TP/ .ASCII /BT/ .ASCII /EL/ .ASCII /BL/ .ASCII /CT/ .ASCII /ST/ .ASCII /CC/ .ASCII /NO/ .ASCII /SC/ .ASCII /RC/ .ASCII /DB/ .ASCII /SI/ .ASCII /WI/ .ASCII /SR/ .ASCII /UP/ .ASCII /DO/ .ASCII /SW/ .ASCII /SB/ .ASCII /SH/ .ASCII /LO/ .ASCII /OF/ .ASCII /NG/ .ASCII /GR/ CMDTBE = .-CMDTBL MCRTBL: .WORD BLINK,BOLD,UNDER,REVRSE,L1,L2,L3,L4,IL,DELINE,DELCHR,CLEAR,TOP .WORD BOTTOM,ELINE,BLINE,CLRTAB,SETAB,CL1TAB,NO,SAVCUR,RESCUR,DOUBLE .WORD SINGLE,WIDE,SCROLL,CURUP,CURDWN,SWHITE,SBLACK,SHORT,LONG,OFF .WORD NOGRPH,GRAPH .PAGE BLINK: .BYTE 33,133,65,155,177 BOLD: .BYTE 33,133,61,155,177 UNDER: .BYTE 33,133,64,155,177 REVRSE: .BYTE 33,133,67,155,177 OFF: .BYTE 33,133,155,33,133,161,177 GRAPH: .BYTE 33,50,60,177 NOGRPH: .BYTE 33,50,102,177 L1: .BYTE 33,133,61,161,177 L2: .BYTE 33,133,62,161,177 L3: .BYTE 33,133,63,161,177 L4: .BYTE 33,133,64,161,177 IL: .BYTE 33,133,61,114,177 DELINE: .BYTE 33,133,62,113,177 DELCHR: .BYTE 33,133 DC1: .BYTE 60 DC2: .BYTE 60 .BYTE 120,177 CLEAR: .BYTE 33,133,62,112,177 TOP: .BYTE 33,133,61,112,177 BOTTOM: .BYTE 33,133,60,112,177 ELINE: .BYTE 33,133,113,177 BLINE: .BYTE 33,133,61,113,177 CLRTAB: .BYTE 33,133,63,147,177 SETAB: .BYTE 33,110,177 CL1TAB: .BYTE 33,133,147,177 CURUP: .BYTE 33,133,61,101,177 CURDWN: .BYTE 33,133,61,102,177 SCROLL: .BYTE 33,133 SC1: .BYTE 60 SC2: .BYTE 60 .BYTE 73 SC3: .BYTE 60 SC4: .BYTE 60 .BYTE 162,177 CURADR: .BYTE 33,133 CA1: .BYTE 60 CA2: .BYTE 60 .BYTE 73 CA3: .BYTE 60 CA4: .BYTE 60 .BYTE 110,177 SAVCUR: .BYTE 33,67,177 RESCUR: .BYTE 33,70,177 DOUBLE: .BYTE 33,43,63,33,133,61,102,33,43,64,33,133,61,101,33,67,177 SINGLE: .BYTE 33,43,65,177 WIDE: .BYTE 33,43,66,177 SWHITE: .BYTE 33,133,77,65,150,177 SBLACK: .BYTE 33,133,77,65,154,177 SHORT: .BYTE 33,133,77,63,154,177 LONG: .BYTE 33,133,77,63,150,177 NO: .BYTE 177 NEXT: .BYTE 33,70,33,133,61,102,177 ACURSR: .BYTE 33,75 ACURR: .BYTE 0 ACURC: .BYTE 0 .BYTE 177 .EVEN .PAGE PBUF: .BYTE 33,133,61,101 ;132 CHARACTER BUFFER .BLKW 64. PBUFL = .-PBUF-4 ;LENGTH CMD: .WORD 0 ;COMMAND CHARS. TRM: .WORD 0 ;TERMINAL NUMBER FLG: .WORD 0 ;FLAG FOR MORE ADMFLG: .WORD 0 ;FLAG ADM-3A TERMINALS LUNINF: .BLKW 6 ;LUN INFO BUFFER SYN: .ASCII /PTT> *** SYNTAX ERROR ***/ SYNL = .-SYN .EVEN .PAGE ; ; R0 = POINTER TO THE COMMAND STRING ; R5 = LENGTH OF THE COMMAND STRING ; R4 = POINTER TO THE ACTUAL COMMAND SEQUENCE ; START: GCML$ #MCRB ;GET A COMMAND BCC .+6 ;OKAY JMP OUT ;EXIT CLR TRM ;ASSUME TI: CLR R1 ;INIT MOV #KEYS,R2 ;KEYWORD PTR MOV MCRB+G.CMLD+2,R4 ;GET ADDRESS MOV MCRB+G.CMLD,R3 ;LENGTH MOV #TTYCMD,R5 ;STATE TABLE PTR CALL .TPARS ;TRANSLATE COMMAND LINE BCC START ;OKAY JMP SYNTAX ;EXIT SAVCMD: MOV .PSTPT,R0 ;GET STRING POINTER MOVB (R0)+,CMD ;GET 1ST 2 LETTERS MOVB (R0),CMD+1 ; CLR FLG ;INIT MOV #CMDTBL,R1 ;PTR TO COMMANDS 1$: CMP #CMDTBL+CMDTBE,R1 ;AT THE END? BNE .+4 ;NO BR SYNTAX ;JUST EXIT IF NO MATCH CMP (R1)+,CMD ;IS THIS IT? BNE 1$ ;NO TST -(R1) ;BACK UP WHERE WE SHOULD BE SUB #CMDTBL,R1 ;GET OFFSET ADD #MCRTBL,R1 ;GET COMMAND ADDRESS MOV (R1),CMD ; MOV #PBUFL,R1 ;INIT QIO PRINT LENGTH RETURN ; DO THE ASSIGN LUN FOR A TERMINAL ASSGN: MOV .PNUMB,TRM ;SAVE THE TERMINAL NUMBER MOV #"TT,R1 ;TERMINAL NAME ALUN$S #4,R1,TRM ;DO THE ASSIGN CALL TTYPE ;DETERMINE TERMINAL TYPE RETURN ; DETERMINE TERMINAL TYPE TTYPE: CLR ADMFLG ;ASSUME VT100 GLUN$C 4,LUNINF ;GET LUN INFO TST LUNINF+2 ;IS IT THE CONSOLE? BNE .+6 ;FORGET ABOUT THE CONSOLE JMP OUT ;JUST GET OUT MOV LUNINF+2,R1 ;GET TTY NUMBER DEC R1 ;MAKE OFFSET MUL #60,R1 ;INTO UCB LIST ADD #UCBADR,R1 ;GET UCB ADDRESS CMP #10,U.TTYP(R1) ;IS IT AN ADM-3A? BNE .+10 ;NO COM ADMFLG ;FLAG IT RETURN CMP #15,U.TTYP(R1) ;IS IT A VT100 OR PT100? BNE .+4 ;NO, SO EXIT RETURN JMP OUT ;ONLY HANDLE'S TWO TYPES .PAGE EXECUT: CMP #PBUFL,R1 ;NOTHING? BEQ EXE2 ;JUST EXIT IF SO TST R1 ;DID WE FILL IT? BLE 2$ ;YES 1$: CLRB (R2)+ ;OTHERWISE, NULL OUT REMAINDER SOB R1,1$ ;LOOP 2$: QIOW$C IO.WBT,4,1,,,, ;PRINT THE MESSAGE BCC EXE2 ;OKAY MOV $DSW,R5 ;SAVE DSW HALT ;EXIT EXE2: MOV #PBUF+2,R2 ;REINIT MOV #PBUFL,R1 ; RETURN SYNTAX: QIOW$C IO.WVB,5,1,,,, ;REPORT THE ERROR OUT: EXIT$S SAVCU1: MOV #-1,FLG ;SIGNAL THE CURSOR COORDINATES MOV .PNUMB,R1 ;GET THE NUMBER MOVB .PNUMB,ACURR ; MOV .PNUMH,R0 ; DIV #10.,R0 ; BIC #177760,R1 ;ONE'S DIGIT BIC #177760,R0 ;TEN'S DIGIT ADD #60,R0 ;MAKE ASCII ADD #60,R1 ; CMP #DELCHR,CMD ;IS THIS A DELETE CHARACTER? BNE 2$ ;NO CLR FLG ;SIGNAL THAT NO CURSOR MOVE MOVB R0,DC1 ;SAVE MOVB R1,DC2 ; RETURN 2$: MOVB R0,CA1 ;SAVE MOVB R1,CA2 ; CMP #SCROLL,CMD ;IS THIS A SCROLL REGION COMMAND? BNE 1$ ;NO CLR FLG ;IF YES, NO CURSOR MOVEMENT MOVB R0,SC1 ;SAVE MOVB R1,SC2 ; 1$: RETURN ; NOW DO FOR THE COLUMNS SAVCU2: CMP #DELCHR,CMD ;IS IT A DELETE CHARACTER? BNE .+4 ;NO RETURN ;YES, 2ND NUMBER IS ZERO MOV .PNUMB,R1 ;GET THE NUMBER MOVB .PNUMB,ACURC ; MOV .PNUMH,R0 ; DIV #10.,R0 ; BIC #177760,R1 ;ONE'S DIGIT BIC #177760,R0 ;TEN'S DIGIT ADD #60,R0 ;MAKE ASCII ADD #60,R1 ; MOVB R0,CA3 ;SAVE MOVB R1,CA4 ; MOVB R0,SC3 ;SAVE MOVB R1,SC4 ; RETURN .PAGE MSGPRT: CALL BLDCMD ;FORM COMMAND STRING CALL EXECUT ;AND PRINT IT RETURN ; JUST FORM THE COMMAND STRING BLDCMD: MOV #PBUF+2,R2 ;PTR TO OUTPUT PRINT BUFFER MOV #PBUFL,R1 ;LENGTH TST ADMFLG ;ADM-3A TERMINAL? BEQ .+6 ;NO JMP ADMTTY ;YES, HANDLE SPECIALLY TST FLG ;NEED TO PUT OUT CURSOR CONTROL? BEQ 1$ ;NO CLR FLG ;TO BE USED AGAIN MOV #CURADR,R0 ;GET ADDR OF COMMAND CALL COPY ;DO THE COPY BCC .+6 ;STILL GOT ROOM CALL EXECUT ;PRINT IT 1$: MOV CMD,R0 ;POINT TO COMMAND STRING CALL COPY ;DO THE COPY BCC .+6 ;STILL GOT ROOM CALL EXECUT ;PRINT IT RETURN ; BUILD THE MESSAGE AND COMMAND MSGBLD: CALL BLDCMD ;BUILD THE COMMAND 1ST MOV R4,R0 ;SAVE OUR POSITION MOV R3,FLG ; 2$: CMPB #'\,(R4) ;MORE COMMANDS? BEQ 4$ ;NO MOVB (R4)+,(R2)+ ;COPY IT DEC R3 ;COUNT IT BLE 4$ ;OKAY SOB R1,2$ ;LOOP CALL EXECUT ;PRINT IT BR 2$ ;CONTINUE 4$: CMP #DOUBLE,CMD ;IS IT A SPECIAL DOUBLE? BNE 10$ ;NO MOV R0,-(SP) ;SAVE MOV #NEXT,R0 ;IF SO, PRINT ANY MESSAGE TWICE 5$: CALL COPY ;DO THE COPY BCC .+10 ;STILL GOT ROOM CALL EXECUT ;PRINT IT BR 5$ ;CONT MOV (SP)+,R0 ;RECOVER SUB R3,FLG ;FIGURE SIZE OF MESSAGE 3$: MOVB (R0)+,(R2)+ ;COPY MESSAGE AGAIN DEC FLG ;COUNT IT BLE 10$ ;OKAY SOB R1,3$ ;LOOP CALL EXECUT ;PRINT IT BR 3$ ;CONT 10$: CALL EXECUT ;BE SURE TO DUMP IT RETURN .PAGE ; ; COPY THE INITIAL CODES ; COPY: CMPB #177,(R0) ;END OF CODES? BNE .+6 ;NO CLC ;YES, SIGNAL IT RETURN ; MOVB (R0)+,(R2)+ ;COPY IT SOB R1,COPY ;COUNT IT SEC ;SIGNAL LACK OF COMPLETION RETURN ; ; HANDLE SPECIAL ADM-3A ; ADMTTY: CLR PBUF ;ELIMINATE EXTRA ESC CHARACTERS CLR PBUF+2 ; TST FLG ;CURSOR MOVE? BEQ 1$ ;NO MOVB ACURR,R0 ;GET ROW VALUE DEC R0 ;MAKE AN OFFSET ADD #40,R0 ; MOVB R0,ACURR ; MOVB ACURC,R0 ;GET COLUMN VALUE DEC R0 ;MAKE AN OFFSET ADD #40,R0 ; MOVB R0,ACURC ; MOV #ACURSR,R0 ;GET PTR TO COMMAND CALL COPY ;DO IT 1$: CMP #CLEAR,CMD ;IS IT A CLEAR COMMAND? BNE 2$ ;NO MOVB #ADMCLR,(R2)+ ;SEND COMMAND TO CLEAR DEC R1 ;COUNT IT BGT 2$ ;DONE? CALL EXECUT ;YES 2$: CLR CMD ;DON'T CHECK FOR DOUBLE RETURN .PAGE ; ; STATE TABLE ISTAT$ CMDS,KEYS STATE$ TTYCMD ;CHECK FOR TERMINAL NUMBER TRAN$ '#,ASSIGN ;GET TTY NUMBER IF A "#" TRAN$ $LAMDA,,TTYPE ;CONTINUE IF NOT ; STATE$ CMDTB TRAN$ $STRNG,,SAVCMD ;GET COMMAND STRING STATE$ TRAN$ ':,CURSOR ;CHECK FOR CURSOR COORDINATES TRAN$ $LAMDA ;CONTINUE IF NOT ; STATE$ GOTCR TRAN$ $EOS,$EXIT,MSGPRT ;END OF INPUT TRAN$ '/,CONT,MSGBLD ;CHECK FOR A MESSAGE TRAN$ $LAMDA,CONT2 ;BUT NOT REQUIRED ; STATE$ CONT TRAN$ $EOS,$EXIT ;END OF INPUT TRAN$ '\,CMDTB ;HAD A MESSAGE; GOT NEW COMMAND TRAN$ $LAMDA,$EXIT ;HAD A MESSAGE; END OF THE ROAD ; STATE$ CONT2 TRAN$ $EOS,$EXIT,MSGPRT ;END OF INPUT TRAN$ '\,CMDTB,MSGPRT ;FORM THE COMMAND AND DO IT TRAN$ $LAMDA,$EXIT,MSGPRT ;FORM AND DO COMMAND; END OF THE ROAD ; STATE$ ASSIGN TRAN$ $NUMBR,CMDTB,ASSGN ;PROCESS TERMINAL NUMBER ; STATE$ CURSOR TRAN$ $DNUMB,,SAVCU1 ;SAVE ROW POSITION STATE$ TRAN$ ': ;SKIP NEXT ":" STATE$ TRAN$ $DNUMB,GOTCR,SAVCU2 ;SAVE COLUMN POSITION STATE$ .END START