.TITLE DKREAD - LOGICAL READ/WRITE FOR DISK .IDENT /22JUN7/ ;14:50:00 LV ; .ENTRY DKREAD - LOGICAL READ/WRITE FOR DISK ;+ ; D K R E A D / D K W R I T ; ; PURPOSE: LOGICAL READ/WRITE FOR DISK ; ; INTERFACE: CALLING SEQUENCE: (FORTRAN-CALLABLE SUBROUTINE) ; CALL DKREAD(LUN,LBN,KBUF[,NBLKS,IERR]) ; CALL DKWRIT(LUN,LBN,KBUF[,NBLKS,IERR]) ; ; INPUT: LUN(INTEGER) = LOGICAL UNIT NUMBER PREVIOUSLY ; ASSIGNED TO THE DISK ; LBN(INTEGER) = LOGICAL DISK BLOCK NUMBER (0-4799) ; KBUF = FWA OF BUFFER ; NBLKS(INTEGER) = OPTIONAL PARAMETER SPECIFYING THE ; NUMBER OF BLOCKS TO TRANSFER (DEFAULT = 1) ; NOTE THAT A CHECK IS MADE TO SEE IF ; THE MAXIMUM NUMBER OF BLOCKS (63) ; HAS BEEN EXCEEDED. IF SO, AN ; I/O STATUS OF -99 IS RETURNED. ; IERR(INTEGER) = OPTIONAL PARAMETER THAT WILL BE SET ; TO THE VALUE OF THE I/O STATUS WORD ; FOR THE OPERATION ; ; THESE SUBROUTINES USE EVENT FLAG 16 TO CHECK FOR I/O COMPLETION ; ; LANGUAGE: MACRO-11 ; ; RESTRICTIONS: UNDER RSX-11D, THE DISK MUST BE MOUNTED AS A ; FOREIGN VOLUME (/CHA=[FOR]) OR WITH DEVICE ; CONTROL FUNCTIONS ENABLED (/CHA=[DCF]). ; UNDER RSX-11M, THE DISK MUST BE UNMOUNTED. ;- ; REVISIONS: ; 10-SEP-76 SS DON'T WAIT FOR I/O COMPLETE IF QIO FAILS, ; DON'T USE SPECIAL MACROS ; 06-MAY-77 LV UPDATED TO CONFORM TO STANDARDS ; .MCALL DIR$,QIO$,WTSE$C,RETURN EFN=16. ; EVENT FLAG FOR I/O COMPLETION DKREAD::MOV #IO.RLB,QIO+Q.IOFN ; SET UP READ LOGICAL FUNCTION BR DKRW ; GO TO COMMON CODE DKWRIT::MOV #IO.WLB,QIO+Q.IOFN ; SET UP WRITE LOGICAL FUNCTION ; ; COMMON CODE FOR READ/WRITE ; DKRW: MOV @2(R5),QIO+Q.IOLU ; TRANSFER LUN MOV @4(R5),QIO+Q.IOPL+10 ; AND BLOCK NUMBER MOV 6(R5),QIO+Q.IOPL ; BUFFER ADDRESS MOV #512.,QIO+Q.IOPL+2 ; DEFAULT BYTE COUNT CMPB (R5),#4 ; TEST FOR 4 PARAMETERS BLT $1 ; NO, GO CALL DRIVER CMP 10(R5),#-1 ; SEE IF NBLKS SPECIFIED BEQ $1 ; NO, GO CALL DRIVER TST @10(R5) ; SEE IF NBLKS > 0 BLE $1 ; NO, GO CALL DRIVER CMP @10(R5),#63. ; SEE IF NBLKS < 64 BGT TOMANY ; NO, SET I/O STATUS AND RETURN MOV R1,-(SP) ; SAVE R1 MOV @10(R5),R1 ; GET BLOCK COUNT MUL #512.,R1 ; NUMBER OF BYTES/BLOCK MOV R1,QIO+Q.IOPL+2 ; SET BYTE COUNT MOV (SP)+,R1 ; RESTORE R1 $1: DIR$ #QIO ; CALL DISK DRIVER BCC 20$ MOV $DSW,IOST BR L1 20$: WTSE$C EFN ; WAIT FOR COMPLETION L1: $15: CMPB (R5),#5 ; TEST FOR 5 PARAMETERS BLT $2 ; NO, RETURN CMP 12(R5),#-1 ; SEE IF STATUS TO BE RETURNED BEQ $2 ; NO, RETURN MOV R0,-(SP) ; RETURN I/O STATUS MOVB IOST,R0 MOV R0,@12(R5) MOV (SP)+,R0 $2: RETURN TOMANY: MOVB #-99.,IOST+1 ; SET I/O STATUS BR $15 ; RETURN STATUS QIO: QIO$ ,,EFN,,IOST,,<0,0,0,0,0,0> IOST: .WORD 0,0 .END