.TITLE NTDRV .IDENT /RJDK01/ ; ; SOMEWHAT HACKED ABOUT BY EJW ; .MCALL UCBDF$ UCBDF$ ; DEVICE DRIVER FOR PSEUDO DEVICE NT: ; ; ; ; UCB WORD DEFINITIONS ; ; -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.REC ; 12 U.CW2 **UNUSED ; 14 U.CW3 ** UNUSED ; 16 u.cw3 DEVICE BUFFER=512 ; 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 KISAR4=172350 ; DESPATCH TABLE ; $NTTBL:: .WORD $NTINT .WORD $NTRET .WORD $NTRET .WORD $NTRET ; ; ; SPECIAL READ STATUS FUNCTION IO.RST=17400 ;=31.*256.==37*400 ; ; INITIALISE FUNCTION 2400 IS QUEUED ; DEQUEUED BY IO.RST IO.INI=2400 $NTRET: RETURN $NTINT: ;R5=UCB ADDRESS ;R4=SCB ADDRESS ;R1=IO PKT ADDRESS MOV R1,R3 ;SAVE IOPKT MOVB I.FCN+1(R3),R0 ;GET FUNCTION CODE BNE 1$ ;NOT IOKIL MOV #IS.SUC,R0 CALLR $IOFIN 1$: CMPB R0,#30. ;LOOK AT CURRENT FUNCTION BLT 4$ ;NOT IO.RST ; THIS PART DEALS WITH IO.RST MOV (R4),R1 ;GET ADDRESS OF QUEUED PACKET BNE 2$ CLR R0 ;NOTHING THERE BR 3$ 2$: CMPB I.FCN+1(R1),#5 ;IS IT INITIALISE BNE 20$ ; INITIALISE QUEUED - REMOVE IT MOV R4,R0 ;LISTHEAD ADDRESS MOV R3,-(SP) ;SAVE CURRENT PACKET MOV R1,-(SP) ;SAVE QUEUED PACKET CALL $QRMVF ;DEQUEUE INITIALISE ; NOW TERMINATE INIT FUNCTION MOV #IS.SUC,R0 MOV R1,R3 ;ADDRESS OF QUEUED PACKET CLR R1 CALL $IOFIN MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R3 ;RESTORE R3 ; TERMINATE IO.RST AND RETURN STATUS TO USER 20$: MOV I.FCN(R1),R0 ;FUNCTION TO STAT1 MOV I.PRM+4(R1),R1 ;LENGTH TO STAT2 3$: CALLR $IOFIN ; ; READ WRITE AND INITIALISE IN CURRENT PACKET END UP HERE ; 4$: MOV R4,R0 ;GET LIST HEAD ADDRESS CMPB I.FCN+1(R3),#5 ;IS CURRENT FUNCTION INIT BEQ 5$ ;YES - QUEUE IT ; MUST BE READ OR WRITE - CHECK BUFFER LENGTH CMP I.PRM+4(R3),#17700 ;MAX MAPPED BY 1 APR TX IS 4096-32 WORDS BHI 51$ MOV (R0),R3 ;ANYTHING QUEUED BEQ 5$ ;NO SO INSERT IT CMPB I.FCN+1(R3),I.FCN+1(R1) ;SAME FUNCTION BEQ 5$ ;YES QUEUE UP CURRENT REQUEST ; CURRENT FUNCTION IS DIFFERENT FROM QUEUED FUNCTION ; IS QUEUED FUNCTION AN INIT CMPB I.FCN+1(R3),#5 BNE 6$ ;NO - SO WE HAVE A READ + WRITE 5$: ; INSERT PACKET IN DRIVER Q ; R0 ADDR LISTHEAD ; R1 ADDR PACKET CALLR $QINSP 51$: mov #ie.bad&377,r0 callr $IOFIN ; 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.cw3(R5) ;STORE TX LENGTH (WORKING SPACE) 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 MOV R4,R0 ;GET LISTHEAD ADDRESS CALL $QRMVF ;REMOVE FROM LIST ; ; WE NOW ORDER THE PACKETS SO THAT WRITE ISIN R1 AND READ IS ON THE STACK ; CMPB I.FCN+1(R1),#IO.WLB/400 ;WAS A WRITE REMOVED BEQ 14$ ;YES - SO ORDER IS OK ; ; NO - SWAP PACKETS ; MOV (SP)+,R0 MOV R1,-(SP) ;READ PKT NOW ON STACK MOV R0,R1 ;WRITE IN R1 ; ; TERMINATE WRITE PACKET ; 14$: MOV R1,R3 ;ADDRESS MOV I.PRM+14(R1),-(SP) ;SAVE REPLY CODE MOV #IS.SUC,R0 MOV u.cw3(R5),R1 CALL $IOFIN ; ; TERMINATE READ PACKET ; MOV (SP)+,R0 BNE 15$ MOV #IS.SUC,R0 ;NO USER REPLY - USE IS.SUC 15$: MOV (SP)+,R3 MOV U.CW3(R5),R1 CALLR $IOFIN .END