;$IO SPEC DEVICE SPECIFIC CONTROL FUNCTIONS ;. 14-SEPT-76 P. CANNON ;. ;. THIS MODULE PROVIDES THE FORTRAN PROGRAMMER WITH THE ABILITY ;. TO CONTROL CERTAIN DEVICE SPECIFIC FUNCTIONS FOR A ;. MAGNETIC TAPE. THE FUNCTIONS ALLOWED ARE WRITE-EOF,REWIND, ;. SPACE FORWARD,ETC. ;. ;. CALL ISPEC(FDB,FUNC,/CNT/,/CHR/,/STAT/) ;. CALL SPEC(FDB,FUNC,/CNT/,/CHR/,/STAT/) ;. ;. FDB FILE DESCRIPTOR BLOCK ;. FUNC FUNCTION CODE ;. 1 OFF LINE ;. 2 WRITE EOF ;. 3 REWIND ;. 4 SKIP RECORDS (CNT= NBR OF RECORDS TO SPACE PAST, ;. POSITIVE IF FORWARD,NEGATIVE IF REVERSE) ;. 5 SKIP FILES (CNT= NBR OF EOF MARKS TO SPACE PAST, ;. POSITIVE IF FORWARD,NEGATIVE IF REVERSE) ;. 6 SET TAPE CHARACTERISTICS. THE TAPE CHARACTERISTICS ;. BITS ARE SPECIFIED IN THE PARAMETER CHR. ;. 7 SENSE TAPE CHARACTERISTICS (STATUS). THE ;. CHARACTERISTIC BITS ARE RETURNED IN THE ;. PARAMETER CHR. ;. CNT THIS PARAMETER IS USED IN CONJUNCTION WITH FUNCTION ;. CODES 4 AND 5. IT CONTAINS THE NUMBER OF RECORDS/ ;. FILES TO SPACE PAST. (POSITIVE IS FORWARD, NEGATIVE ;. IS REVERSE. ;. CHR THIS PARAMETER IS USED WITH FUNCTION CODE 6. ;. IT CONTAINS 16 BITS OF INFORMATION WHICH IS ;. TRANSMITTED TO THE TAPE DRIVE TO ESTABLISH ;. CERTAIN CHARACTERISTICS, SUCH AS ;. ;. SEE THE I/O DRIVER MANNUAL UNDER MAGNETIC TAPE ;. FOR A DETAILED DESCRIPTION OF THESE BITS. ;. ;. STAT THIS PARAMETER IS USED WITH FUNCTION CODE 7. ;. IT IS A 16 BIT WORD THAT THE TAPE DRIVE RETURNS ;. TO THE USER PROGRAM. THUS ALLOWING THE USER TO ;. EXAMINE THE VARIOUS CHARACTERISTICS OF THE ;. TAPE DRIVE. ;. THIS SHOULD NOT BE INTERPRETTED AS THE STATUS OF ;. THE LAST I/O OPERATION. THE STATUS OF THE LAST ;. I/O OPERATION IS AVAILABLE IN THE FIRST WORD OF ;. THE 2 WORD I/O STATUS BLOCK IN THE FDB. ;. NOTE: THE OPTIONAL PARAMETERS /CNT/,/CHR/,/STAT/ ARE ;. MUTUALLY EXCLUSIVE AND ONLY ONE OF THE THREE MAY ;. BE SPECIFIED PER CALL. ;. .TITLE SPEC - DEVICE SPECIFIC FUNCTIONS .IDENT /V01/ .PSECT .GLOBL ISPEC,SPEC .GLOBL IOFERR,FTQIO .MCALL WAIT$ .SBTTL ISPEC - ISSUE FUNCTION, RETURN IMMEDIATELY EF: .WORD 0 ;ADDRESS OF PARAMETER LIST .WORD 0 ;NBR OF TIMES CALLED ISPEC: MOV R5,EF ;SAVE ADDRESS OF PARAMETER LIST INC EF+2 ;ADD ONE TO THE NBR OF TIMES CALLED MOV (R5)+,R4 ;LOAD THE NUMBER OF PARAMETERS MOV (R5)+,R0 ;LOAD FDB ADDRESS MOV @(R5)+,R3 ;LOAD THE FUNCTION CODE ;IS FUNCTION CODE TOO SMALL ? BLE 1$ ;YES-ERROR,FUNCTION CODE OUT OF RANGE CMP R3,#7 ;IS FUNCTION CODE TOO LARGE ? BGT 1$ ;YES-ERROR,FUNCTION CODE OUT OF RANGE DEC R3 ;1-->0 ASL R3 ;TIMES 2 TO FORM AN INDEX INTO THE ;TRANSLATE TABLE. MOV TRANS(R3),R3 ;TRANSLATE TO AN I/O FUNCTION CODE ;FOR A MAGTAPE SUB #2,R4 ;REDUCE THE NUMBER OF PARAMETERS BY 2. CLR R1 ;ASSUME THERE ARE NO PARAMETERS JSR PC,OTPAR ;LOOK FOR THE OPTIONAL PARAMETER (CNT) JSR PC,OTPAR ;LOOK FOR THE OPTIONAL PARAMETER (CHR) CLR R2 JSR PC,FTQIO JSR PC,OTPR ;RETURN R1 TO THE OPTIONAL PARAMETER ;(STAT). RTS PC ; ; 1$: ;HERE ON AN ERROR. THE FUNCTION CODE ;IS OUT OF RANGE. RTS PC ; ; .SBTTL SPEC - ISSUE FUNCTION, RETURN ON FUNCTION COMPLETE SPEC: JSR PC,ISPEC ;EXECUTE FUNCTION WAIT$ R0 ;WAIT ON I/O COMPLETE JSR PC,IOFERR RTS PC .PAGE ; TRANSLATE TABLE WHICH WILL CONVERT THE CODE IN "FUNC" TO ; THE APPROPRIATE I/O FUNCTION CODE FOR THE "QIO$" MACRO IN ; RSX-11M. TRANS: .WORD IO.RWU ;REWIND AN TURN UNIT OFF LINE .WORD IO.EOF ;WRITE END-OF-FILE MARK (EOF) .WORD IO.RWD ;REWIND UNIT .WORD IO.SPB ;SPACE BLOCKS (RECORDS) .WORD IO.SPF ;SPACE FILES .WORD IO.STC ;SET TAPE CHARACTERISTICS .WORD IO.SEC ;SENSE TAPE CHARACTERISTICS (STATUS) .PAGE .SBTTL OTPAR - LOAD AN OPTIONAL PARAMETER ;ENTER ; R4 CONTAINS THE NUMBER OF PARAMETERS REMAINING TO BE PROCESSED ; R5 POINTS TO THE NEXT PARAMETER IN THE ARGUMENT LIST TO BE ; PROCESSED ;EXIT ; R4 IS DECREMENTED; IF NO PARAMETERS ARE LEFT, NO ACTION ; IS TAKEN ; R5 IS INCREMENTED BY 2. ; IF THE ADDRESS OF THE PARAMETER IS NOT -1, THEN THE VALUE ; OF THE PARAMETER IS RETURNED IN R1. ; OTPAR: DEC R4 ;DECREMENT THE NBR OF PARAMETERS ;ARE ANY PARAMETERS LEFT ? BMI 2$ ;NO- THEN EXIT CMP (R5),#-1 ;YES- IS THE PARAMETER'S ADDRESS ;EQUAL TO -1 ? BEQ 1$ ;YES - THEN INCREMENT PAST AND EXIT. MOV @(R5),R1 ;NO-LOAD R1 WITH THE VALUE OF THE ;PARAMETER 1$: TST (R5)+ ;ADVANCE POINTER TO NEXT PARAMETER 2$: RTS PC .PAGE .SBTTL OTPR - STORE INTO AN OPTIONAL PARAMETER ;ENTER ; R4 CONTAINS THE NUMBER OF PARAMETERS REMAINING TO BE PROCESSED ; R5 POINTS TO THE NEXT PARAMETER IN THE ARGUMENT LIST TO BE ; PROCESSED ; R1 CONTAINS THE VALUE TO BE STORED IN THE PARAMETER. ;EXIT ; R4 IS DECREMENTED,IF NO PARAMETERS ARE LEFT,NO ACTION IS TAKEN ; R5 IS INCREMENTED BY 2. ; IF THE ADDRESS OF THE PARAMETER IS NOT -1, THEN THE VALUE ; IN R1 IS STORED IN THE PARAMETER. OTPR: DEC R4 ;DECREMENT THE NBR OF PARAMETERS ;ARE ANY PARAMETERS LEFT ? BMI 2$ ;NO- THEN EXIT CMP (R5),#-1 ;IS THE PARAMETER'S ADDRESS EQUAL TO ; -1 ? BEQ 1$ ;YES- INCREMENT THE POINTER AND EXIT MOV R1,@(R5) ;NO-THEN STORE THE VALUE IN R1 IN ;THE PARAMETER. 1$: TST (R5)+ ;ADVANCE THE POINTER 2$: RTS PC ;EXIT .END