.TITLE VTDRV .IDENT /RJDK01/ .MCALL UCBDF$ UCBDF$ ; DEVICE DRIVER FOR PSEUDO DEVICE VT: ; ; ; ; UCB WORD DEFINITIONS ; ; -4 U.LUIC LOGON UIC ; -2 U.OWN OWNING TERMINAL ; 0 U.DCB DCB PTR ; 2 U.RED REDIRECT PTR ; 4 U.CTL CONTROL BYTE ; 5 U.STS UNIT STATUS ; 6 U.UNIT UNIT # ; 7 U.ST2 STATUS EXTENSION ; 10 U.CW1 DV.TTY!DV.CCL!DV.REC ; 12 U.CW2 U2.LOG ; 14 U.CW3 ** UNUSED ; 16 U.CW4 DEVICE BUFFER=132 ; 20 U.SCB SCB PTR ; 22 U.ATT TCB OF ATT TASK ; 24 U.BUF ; 26 ---- ; 30 U.CNT ! USED TO GET CHAR FROM IOPKT ;1 32 U.BUF2 ;2 34 ------ ;3 36 ;4 40 ;5 42 ;6 44 ;7 46 ;8 50 ;9 52 U.UIC !DEFAULT UIC KISAR4=172350 ; DESPATCH TABLE ; $VTTBL:: .WORD $VTINT .WORD $VTRET .WORD $VTRET .WORD $VTRET ; ; ; SPECIAL READ STATUS FUNCTION IO.RST=17400 ;=31.*256.==37*400 ; SPEACIAL TELL MCR FUNCTION IO.MCR=17000 ;=30.*256.==36*400 ; ; $VTRET: RETURN U.BUF2=U.CNT+2 U.CNT2=U.CNT+6 U.FLGS=U.CNT+10 U.LEN=U.CNT+12 U.LSTH=U.CNT+14 U.NLST=U.CNT+16 U.TMPB=U.CNT+20 $VTINT: MOV R1,R3 ;SAVE IOPKT MOVB I.FCN+1(R3),R0 ;GET FUNCTION CODE BNE 1$ ;NOT IOKIL 2$: MOV #IS.SUC,R0 MOV (R4),R1 BEQ 3$ MOV I.FCN(R1),R1 ;GET TX TYPE FROM PACKET IF Q'D 3$: BIC #177400,R0 CALLR $IOFIN 1$: CMPB R0,#30. BGT 2$ ;SIMPLY AN ENQUIRE STATUS BEQ 100$ CMPB R0,#IO.WLB/400 BEQ 4$ CMPB R0,#IO.RLB/400 BEQ 4$ MOV #IE.IFC,R0 BR 3$ 4$: cmp i.prm+4(r3),#17700 bhi 51$ MOV R4,R0 ;GET LISTHEADADDR MOV (R0),R3 ;ANY IN? BEQ 5$ ;NO SO INSERT IT CMPB I.FCN+1(R3),I.FCN+1(R1) ;SAME FUNCTION BNE 6$ ;NO SO DEQUE THEM 5$: ; INSERT PACKET IN DRIVER Q ; R0 ADDR LISTHEAD ; R1 ADDR PACKET CALLR $QINSP 51$: mov #ie.bad&377,r0 callr $IOFIN ;mcr command line 100$: mov #84.,r1 CALL $ALOCB BCC 101$ MOV #IE.UPN,R0 BR 3$ 101$: MOV R0,-(SP) MOV KISAR6,-(SP) TST (R0)+ MOV R5,(R0)+ MOV I.PRM+4(R3),R1 CMP R1,#80. BLOS 102$ MOV #80.,R1 102$: MOV I.PRM+2(R3),R2 MOV I.PRM(R3),KISAR6 110$: MOVB (R2)+,(R0)+ SOB R1,110$ MOV (SP)+,KISAR6 MOV (SP)+,R1 MOV R3,-(SP) CALL $QMCRL MOV (SP)+,R3 BR 2$ ; ; DEQUEUE PAIR OF PACKETS -- CURRENT & TOP OF LIST ; AND COPY 1-> OTHER ; 6$: MOV R1,-(SP) ;SAVE CURRENT PKT ON STACK CMPB I.FCN+1(R1),#IO.WLB/400 ;WAS IT WRITE BNE 7$ MOV R1,R2 ;R2 IS WRITE PKT MOV (R4),R3 ;R3 IS READ PKT BR 8$ 7$: MOV R1,R3 ;R3 IS READ PKT MOV (R4),R2 ;R2 IS WRIT PKT 8$: MOV I.PRM+4(R2),R0 MOV I.PRM+4(R3),R1 ;GET LENGTHS CMP R0,R1 BLOS 9$ ;R0 SHORTER OR SAME MOV R1,R0 9$: MOV R0,U.LEN(R5) ;STORE TX LENGTH MOV R0,U.CNT2(R5) ;AND FOR WRITER MOVB I.PRM+6(R2),R1 BEQ 95$ ;NULL VFCC CMPB R1,#'$ BEQ 95$ MOV #IS.CR,U.TMPB(R5) BR 96$ 95$: MOV #IS.SUC&377,U.TMPB(R5) ;SAVE PUTATIVE STATUS 96$: MOV KISAR4,-(SP) MOV KISAR6,-(SP) ;SAVE ADDRESSING STATE MOV I.PRM(R2),KISAR4 MOV I.PRM(R3),KISAR6 ;MAP TO BUFFERS BIC #040000,I.PRM+2(R2) ;MAP WRITER TO APR4 MOV R5,-(SP) MOV I.PRM+2(R2),R1 MOV I.PRM+2(R3),R4 ;GET PTRS 10$: MOVB (R1)+,R5 MOVB R5,(R4)+ SOB R0,10$ ;TX DATA BUFFER MOV R5,R0 ;R0 IS LAST CHAR MOV (SP)+,R5 ;UNSTACK UCB MOV (SP)+,KISAR6 MOV (SP)+,KISAR4 MOV U.SCB(R5),R4 ;RESTORE SCB CMPB R0,#15 ;WAS LAST CHR CR BEQ 11$ CMPB R0,#33 BEQ 11$ CMPB R0,#32 BEQ 12$ BR 13$ 11$: MOVB R0,U.TMPB+1(R5) DEC U.LEN(R5) BR 13$ 12$: MOV #IE.EOF&377,U.TMPB(R5) DEC U.LEN(R5) 13$: ;DONE TX OF BUFFER MOV R4,R0 CALL $QRMVF CMPB I.FCN+1(R1),#IO.WLB/400 BEQ 14$ ;YES ORDER IS OK MOV (SP)+,R0 MOV R1,-(SP) ;READ PKT NOW ON STACK MOV R0,R1 ;WRITE IN R1 14$: MOV R1,R3 MOV #IS.SUC,R0 MOV U.CNT2(R5),R1 CALL $IOFIN MOV (SP)+,R3 MOV U.LEN(R5),R1 MOV U.TMPB(R5),R0 CALLR $IOFIN .END