.TITLE MAGTAPE SUPPORT SUBROUTINES .IDENT /1.00/ ; ; THESE ROUTINES PERFORM ALL THE I/O NEEDED FOR CONTROLLING THE ; MAGTAPE DRIVE ; .MCALL QIOW$,DIR$ ; .GLOBL REWIND,REWUNL,MOUSNS,SENSMT,SPACEB,SPACEF,SETCHR,WRTEOF .GLOBL ERASE,WRITE,READ,ATTACH,DETACH ; REWND: QIOW$ IO.RWD,1,1,,IOSTAT ;REWIND TAPE REWUN: QIOW$ IO.RWU,1,1,,IOSTAT ;REWIND AND UNLOAD TAPE MOUSN: QIOW$ IO.SMO,1,1,,IOSTAT,,<0> ;MOUNT TAPE & SENSE CHARACTERISTICS SENS: QIOW$ IO.SEC,1,1,,IOSTAT ;SENSE CHARACTERISTICS SPCBK: QIOW$ IO.SPB,1,1,,IOSTAT,,<0> ;SPACE BLOCKS SPCFL: QIOW$ IO.SPF,1,1,,IOSTAT,,<0> ;SPACE FILES ; SETCH: QIOW$ IO.STC,1,1,,IOSTAT,,<0> ;SET CHARACTERISTICS WREOF: QIOW$ IO.EOF,1,1,,IOSTAT ;WRITE A TAPE MARK (EOF) ERAS: QIOW$ IO.ERS,1,1,,IOSTAT ;ERASE TAPE WRIT: QIOW$ IO.WLB,1,1,,IOSTAT,,<0,0> ;WRITE TAPE RED: QIOW$ IO.RLB,1,1,,IOSTAT,,<0,0> ;READ TAPE ATT: QIOW$ IO.ATT,1,1,,IOSTAT ;ATTACH TAPE DET: QIOW$ IO.DET,1,1,,IOSTAT ;DETACH TAPE ; IOSTAT: .BLKW 2 ;I/O STATUS BLOCK ; PARM1=2 PARM2=4 ; ; ATTACH/DETACH TAPE DRIVE ; ATTACH: DIR$ #ATT,ERR ;ATTACH TAPE DRIVE BR RET ;FINISH IN COMPLETION ROUTINE ; DETACH: DIR$ #DET,ERR ;DETACH TAPE DRIVE BR RET ;CLEAN UP ; ; REWIND/REWIND & UNLOAD TAPE ; REWIND: DIR$ #REWND,ERR ;REWIND TAPE BR RET ;CLEAN UP ; REWUNL: DIR$ #REWUN,ERR ;REWIND & UNLOAD TAPE BR RET ; ; MOUNT & SET TAPE CHARACTERISTICS ; MOUSNS: TST (R5) ;SEE IF PARAMETER PASSED BNE 10$ ;IF NE YES CLR MOUSN+Q.IOPL ;ELSE REMOVE ADDRESS OF BITS TO SET BR 20$ ;& BRANCH AROUND 10$: MOV @PARM1(R5),MOUSN+Q.IOPL ;SET TAPE CHARACTERISTICS 20$: DIR$ #MOUSN,ERR ;MOUNT TAPE & SET CHARACTERISTICS BR RET ; ; SENSE CHARACTERISTICS ; SENSMT: DIR$ #SENS,ERR ;SENSE TAPE CHARACTERISTICS BR RET ; ; SPACE FORWARD FILE/BLOCK ; SPACEF: TST (R5) ;SEE IF PARAMETER PASSED BNE 10$ ;IF NE YES MOV #1,Q.IOPL+SPCFL ;ELSE DEFAULT TO 1 FILE BR 20$ ;BRANCH AROUND 10$: MOV @PARM1(R5),Q.IOPL+SPCFL ;GET # FILES TO SPACE 20$: DIR$ #SPCFL,ERR ;SPACE FILE(S) BR RET ; SPACEB: TST (R5) ;SEE IF PARM PASSED BNE 10$ ;IF NE YES MOV #1,Q.IOPL+SPCBK ;DEFAULT TO 1 BLOCK BR 20$ 10$: MOV @PARM1(R5),Q.IOPL+SPCFL ;GET # BLOCKS TO SPACE 20$: DIR$ #SPCBK,ERR ;SPACE BLOCK(S) BR RET ; ; SET CHARACTERISTICS OF TAPE ; SETCHR: MOV @PARM1(R5),SETCH+Q.IOPL ;GET CHARACTERISTICS TO SET DIR$ #SETCH,ERR ;SET THEM BR RET ; WRTEOF: DIR$ #WREOF,ERR ;WRITE A TAPE MARK BR RET ; ERASE: DIR$ #ERAS,ERR ;ERASE TAPE BR RET ; WRITE: MOV PARM1(R5),WRIT+Q.IOPL ;GET INPUT BUFFER ADDRESS MOV @PARM2(R5),WRIT+Q.IOPL+2;GET LENGTH OF BUFFER DIR$ #WRIT,ERR ;WRITE A BLOCK TO TAPE BR RET ; READ: MOV PARM1(R5),RED+Q.IOPL ;GET OUTPUT BUFFER ADDRESS MOV @PARM2(R5),RED+Q.IOPL+2 ;GET LENGTH DIR$ #RED,ERR ;READ A BLOCK ; ; COMMON RETURN CODE FOR ALL ROUTINES ; RET: MOV #-1,R0 ;ASSUME ERRONEOUS CODE CMP #IS.SUC,IOSTAT ;SUCCESSFUL? BNE 10$ ;IF NE NO MOV IOSTAT+2,R0 ;YES - RETURN STATUS CODE IN R0 10$: RETURN ;RETURN TO USER ; ; COMMON DIRECTIVE ERROR ROUTINE ; ERR: MOV $DSW,R0 ;RETURN DSW TO USER RETURN ; .END