In M-Plus V2.1, the Internal I/O mechanism is not implemented. Fortunately, this is a very simple addition to make. First, an explanation of the Internal I/O mechanism. In the I/O packet, there are three words that describe the I/O status block. These are: I.IOSB Virtual IOSB address I.IOSB+2 APR 6 bias I.IOSB+4 APR 6 displacement These are setup by $DRQIO, are basically ignored by the rest of the I/O system (including the drivers), and are used by $IOFIN to store the final I/O status. Under V3.0, if I.IOSB+4 has bit zero set (byte alignment), then $IOFIN uses I.IOSB+2 as an APR bias and I.IOSB+4 (zero bit masked) as an entry point to a system process to finish I/O. This is the mechanism that VFDRV uses. NOTE: You will also have to edit VFPRE.MAC which checks for the definition of R$$IIC or add the definition of this symbol to RSXMC.MAC. To make Internal I/O work under V2.1, correct IOSUB.MAC or patch the following code into the $IOFIN routine: MOV I.IOSB+4(R3),R2 ;GET ADDRESS OF I/O STATUS BLOCK BEQ 10$ ;IF EQ NO I/O STATUS BLOCK SPECIFIED ; THE FOLLOWING IS THE START OF THE INTERNAL I/O CODE BIT #1,R2 ;INTERNAL I/O COMPLETION REQUESTED? BEQ 21$ ;IF LO BIT NOT SET, NO DEC R2 ;CLEAR LO BIT MOV KISAR5,-(SP) ;SAVE CURRENT MAPPING MOV KISAR6,-(SP) ;... MOV I.IOSB+2(R3),KISAR5 ;MAP I/O COMPLETION ROUTINE MOV KISAR5,KISAR6 ;MAY BE MAPPED THROUGH APR 6 .IF DF K$$DAS MOV KINAR5,-(SP) ;SAVE I-SPACE MOV KINAR6,-(SP) ;... MOV KISAR5,KINAR5 ;MAP I-SPACE MOV KISAR6,KINAR6 ;... .IFTF ; K$$DAS CALL (R2) ;CALL INTERNAL I/O COMPLETION ROUTINE .IFT ; K$$DAS MOV (SP)+,KINAR6 ;RESTORE MAPPING MOV (SP)+,KINAR5 ;... .ENDC ; K$$DAS MOV (SP)+,KISAR6 ;RESTORE MAPPING MOV (SP)+,KISAR5 ;RESTORE MAPPING RETURN ;DONE 21$: ;REFERENCE LABEL ; END OF INTERNAL I/O COMPLETION CODE MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK TCB ....... Have fun, folks.