.TITLE DEV ; PROGRAM DEVICE INSERTING A PSUEDO DEVICE INTO THE DEVICE LIST ; WRITTEN BY: FRANK PENNER ; APRIL 1981 ; modified for M/plus, July 1983 .MCALL QIOW$,EXIT$S,DIR$ .MCALL CALL,RETURN .MCALL DCBDF$,UCBDF$ DCBDF$ ;DEFINE DCB OFFSETS UCBDF$ ;DEFINE UCB OFFSETS IOST: .BLKW 2 ;I/O STATUS BLOCK QIODPB: QIOW$ IO.WLB,TLUN,TEFL,,IOST,,<,,VFC> TLUN= 5 TEFL= 2 VFC= 40 OUTBUF: .BLKB 132. DEVICE: ;DCB .WORD 0 ;D.LNK LINK TO NEXT DCB .WORD .RS0 ;D.UCB PTR TO 1ST UCB FOR THIS DEV .ASCII /RS/ ;D.NAM DEVICE NAME .BYTE 0,0 ;D.UNIT HIGH AND LOW UNIT #'S .WORD END-.RS0 ;D.UCBL LENGTH OF UCB .RS0: ;UCB .WORD DEVICE ;U.DCB BACKPTR TO DCB .WORD .RS0 ;U.RED REDIRECT PTR .BYTE 0,0 ;U.CTL U.STS CONTROL AND STATUS .BYTE 0,0 ;U.UNIT U.CT2 UNIT # AND UNIT STAT EXT .WORD DV.PSE ;U.CW1 CHARACTERISTICS WORD 1 PSEUDO DEV .WORD 0 ;U.CW2 char word 2, used for pointer ;to secpool block containing index block END: ;28 WORDS FOR SAVING TERM CONTEXT ;in sec pool ;0 U.STS SAVE BYTE and U.TFRQ save byte ;2 SAVED TERMINAL NUMBER ;4 SAVED LOGIN UIC ;6 SAVED ATTACH WORD ;10 UCBX ADDRESS ;12 STATUS TRIPLE WORD ;14 ;16 ;20 SAVED I/O PACKET ADDRESS ;22 unit # ;24 RS0: UCB address ;26 saved U.TBSZ ;30 saved U.CW2 (not all bits) ;32 saved name field ;34 eight words ;36 ;40 ;42 ;44 ;46 ;50 ;52 saved login time ;54 three words ;56 ;60 saved hangup time ;62 three words ;64 ;66 saved default UIC START: CALL $SWSTK,200$ ;SWITCH TO SYSTEM STATE MOV #END-DEVICE,R1 ;;SIZE OF BLOCK NEEDED FROM POOL CALL $ALOCB ;;GET BLOCK FROM POOL BCS 100$ ;;COULDN'T GET IT MOV R0,R5 ;;RO HAS ADDRESS OF POOL BLOCK ASR R1 ;;CONVERT BYTES TO WORDS MOV #DEVICE,R2 ;;PUT ADDRESS OF STUFF TO BE MOVED IN R2 1$: MOV (R2)+,(R0)+ ;;MOV IT WORD AT A TIME SOB R1,1$ ;;DO ALL WORDS IN DEVICE DCB AND UCB MOV R5,R4 ;;PUT OUR DCB ADDRESS IN R4 ADD #.RS0-DEVICE,R4 ;;POINT TO OUR UCB MOV R4,D.UCB(R5) ;;SET UCB PTR IN DCB MOV R4,U.RED(R4) ;;SET REDIRECT PTR IN OUR UCB MOV R5,U.DCB(R4) ;;SET UCB BACKPTR TO DCB MOV $DEVHD,D.LNK(R5);;PUT ADDRESS OF FIRST DCB IN OUR DCB MOV R5,$DEVHD ;;PUT ADDRESS OF OUR UCB IN LISTHEAD MOV #4,R1 ;;we want 4 32 word blocks = 128 words CALL $ALSEC ;;allocate secpool for index block BCS 100$ ;;if C set, failed MOV #KISAR6,R3 ;;point to APR used for pool mapping MOV (R3),-(SP) ;;save current mapping MOV #140000,R2 ;;virtual address of secpool MOV R0,(R3) ;;R0 has APR value to map block ASH #5,R1 ;;R1 has # of 32 word blocks, MUL by 32 2$: CLR (R2)+ ;;zero all pointers SOB R1,2$ ;;in sec pool block MOV R0,U.CW2(R4) ;;point pointer to secpool block in UCB MOV (SP)+,(R3) ;;restore mapping 100$: RETURN ;;RETURN TO USER STATE 200$: EXIT$S .END START