.TITLE MTBLOCK -- MAGTAPE BLOCK UTILITIES FOR PASCAL .IDENT /00/ .MCALL DIR$,QIOW$,ALUN$ ; ;00 - 12-DEC-77 - JR BARR - CONVERTED FROM FORTRAN CALLS TO PASCAL ; ;------------------------------------------------------------------------------ ; ; THE MAGTAPE BLOCK UTILITIES FOR PASCAL ALLOW PASCAL PROGRAMMERS TO ; ACCESS MAGNETIC TAPES THROUGH PHYSICAL BLOCK I/O IN ORDER TO CREATE ; OR READ FOREIGN MAGTAPE FORMATS. THIS SET OF ROUTINES HAS BEEN ; EXTENDED TO ALLOW THE PROGRAMMER TO ALSO SKIP OVER MULTIPLE FILES ; OR RECORDS IN THE FORWARD DIRECTION, A POSITIVE MAXIMUM COUNT, OR ; IN A NEGATIVE DIRECTION, A NEGATIVE MAXIMUM COUNT. ; ; THE FOLLOWING PASCAL DATA TYPES ARE USED: ; ; TAPESTATUS=RECORD COUNT,DSW:INTEGER END; ; BUFFER=PACKED ARRAY [0..MAXBUFF] OF CHAR; ; ; THE FOLLOWING PASCAL EXTERNAL DECLARATIONS CAN BE USED TO ACCESS ; THE MAGTAPE UTILITY ROUTINES: ; ; PROCEDURE MTINIT( LUN,MTLUN,CHARAC:INTEGER; VAR STATUS:TAPESTATUS);EXTERN; ; LUN=THE TASK LOGICAL UNIT THROUGH WHICH THE MAGTAPE WILL BE ACCESSED ; MTLUN=THE PHYSICAL UNIT OF THE MAGNETIC TAPE DRIVE ; CHARAC=AN INTEGER WORD WHOSE BIT PATTERN REFLECTS WHICH CHARACTERISTICS ; ARE TO BE SET UPON INITIALIZATION OF THE TAPE DRIVE. THE FOLLOWING ; VALUES APPLY: ; 1=SET TO SPECIFY 556 BPI NRZ RECORDING DENSITY ; 2=SET TO SPECIFY 200 BPI NRZ RECORDING DENSITY ; 4=SET TO SPECIFY CORE-DUMP-MODE ; 8=SET TO SPECIFY EVEN PARITY OPERATION ; 64=SET TO PROHIBIT WRITING ON UNIT ; 128=SET TO INHIBIT WRITE-WITH-EXTENDED INTERRECORD GAP ; 2048=SET TO SPECIFY 1600 BPI PE ; STATUS.DSW=IO COMPLETION CODE ; ; PROCEDURE MTGETS( LUN:INTEGER; VAR STATUS:TAPESTATUS);EXTERN; ; LUN=THE TASK LOGICAL UNIT THROUGH WHICH THE MAGTAPE WILL BE ACCESSED ; STATUS.DSW=DIRECTIVE STATUS ; STATUS.COUNT=CURRENT VALUE OF THE CHARACTERISTICS WORD FOR THE MAGTAPE ; UNIT ACCESSED. IN ADDITION TO THE SETABLE VALUES SHOWN IN MTINIT ; THE FOLLOWING VALUES WILL BE RETURNED: ; 16=THE TAPE IS PAST THE EOT MARKER ; 32=LAST COMMAND ENCOUNTERED EOF RECORD ; 256=SELECT ERROR ON UNIT ; 512=UNIT IS REWINDING ; 1024=TAPE IS WRITE LOCKED ; 4096=UNIT IS 7-CHANNEL ; 8192=TAPE IS AT BOT (LOAD POINT) ; 16384=TAPE IS AT LOGICAL EOV ; 32768=TAPE IS PAST LOGICAL EOV ; ; PROCEDURE MTRWED( LUN:INTEGER; VAR STATUS:TAPESTATUS);EXTERN; ; LUN=THE TASK LOGICAL UNIT THROUGH WHICH THE MAGTAPE WILL BE ACCESSED ; STATUS.DSW=DIRECTIVE STATUS ; ; PROCEDURE MTWEOF( LUN:INTEGER; VAR STATUS:TAPESTATUS);EXTERN; ; CAUSES THE TAPE UNIT TO WRITE AN EOF (TAPE MARK) AT THE ; CURRENT POSITION OF THE TAPE. ; ; PROCEDURE MTUNLD( LUN:INTEGER; VAR STATUS:TAPESTATUS);EXTERN; ; CAUSES THE TAPE UNIT TO REWIND THE TAPE AND DESELECT IT. ; ; PROCEDURE MTSKRF( LUN:INTEGER; VAR STATUS;TAPESTATUS);EXTERN; ; CAUSES THE TAPE UNIT TO SKIP ONE RECORD IN THE FORWARD DIRECTION. ; ; PROCEDURE MTSKRB( LUN:INTEGER; VAR STATUS:TAPESTATUS);EXTERN; ; CAUSES THE TAPE UNIT TO SKIP ONE RECORD IN THE REVERSE DIRECTION. ; ; PROCEDURE MTSKFF( LUN:INTEGER; VAR STATUS:TAPESTATUS);EXTERN; ; CAUSES THE TAPE UNIT TO SKIP ONE FILE IN THE FORWARD DIRCTION. ; A FILE CONSISTS OF ONE OR MORE PHYSICAL BLOCKS FOLLOWED BY ; AN EOF (TAPE MARK). THE TAPE WILL BE POSITIONED JUST PAST THE ; TAPE MARK AT THE COMPLETION OF THE SKIP OPERATION. ; ; PROCEDURE MTSKFB( LUN:INTEGER; VAR STATUS:TAPESTATUS);EXTERN; ; CAUSE THE TAPE UNIT TO SKIP ONE FILE IN THE REVERSE DIRECTION. ; THE TAPE WILL BE POSITIONED JUST AFTER THE TAPE MARK OF THE ; FILE IN FRONT OF THE FILE SKIPPED OR AT BOT. ; ; PROCEDURE MTCTFF( LUN,MAXFILES:INTEGER; VAR STATUS:TAPESTATUS);EXTERN; ; CAUSES THE TAPE UNIT TO SKIP UP TO +MAXFILES IN THE FORWARD DIRECTION ; OR -MAXFILES IN THE REVERSE DIRECTION. STATUS.COUNT WILL BE SET TO ; THE NUMBER OF FILES SKIPPED. STATUS.DSW WILL BE SET TO IS.SUC IF ; MAXFILES WERE SKIPPED AND TO IE.EOV OR ?? DEPENDING ON WHETHER THE ; TAPE IS BEING SKIPPED FORWARD OR BACKWARDS. ; ; PROCEDURE MTCTRF( LUN,MAXRECORDS:INTEGER; VAR STATUS:TAPESTATUS);EXTERN; ; CAUSES THE TAPE UNIT TO SKIP +MAXRECORDS IN THE FORWARD DIRECTION ; OR -MAXRECORDS IN THE REVERSE DIRECTION. STATUS.COUNT WILL BE SET ; TO THE NUMBER OF RECORDS (PHYSICAL BLOCKS) SKIPPED IN EITHER DIRECTION ; UP TO MAXRECORDS (STATUS.DSW=IS.SUC), UNTIL A TAPE MARK IS DETECTED ; (STATUS.DSW=IE.EOF), OR UNTIL THE TAPE REACHES BOT (STATUS.DSW=??) ; OR EOT (STATUS.DSW=IE.EOV). ; ; PROCEDURE MTREAD( LUN:INTEGER; VAR BUFF:BUFFER; MAXBC:INTEGER; ; VAR STATUS:TAPESTATUS);EXTERN; ; CAUSES THE NEXT PHYSICAL BLOCK TO BE READ FROM THE TAPE UNIT INTO ; BUFF UP TO MAXBC CHARACTERS. IF THE PHYSICAL BLOCK CONTAINS MORE ; THAN MAXBC CHARACTERS, ONLY MAXBC CHARACTERS WILL BE READ INTO BUFF ; AND STATUS.DSW WILL BE SET TO IE.DAO. STATUS.COUNT WILL BE SET TO ; THE NUMBER OF CHARACTERS READ INTO BUFF IN ANY CASE. IT IS ALSO ; POSSIBLE TO GET ANY OF THE STATUS.DSW ERROR CODES SUCH AS IE.EOV ; IF THE TAPE IS AT THE END OF VOLUME, IE.EOF IF THE TAPE IS AT A ; TAPE MARK, OR IE.DNR IF THE DEVICE WENT OFF-LINE IN THE MIDDLE ; OF THE READ FUNCTION. ; ; PROCEDURE MTWRIT( LUN:INTEGER; VAR BUFF:BUFFER; BYTECT:INTEGER; ; VAR STATUS:TAPESTATUS);EXTERN; ; CAUSES BYTECT CHARACTERS TO BE WRITTEN TO THE TAPE UNIT FROM BUFF. ; STATUS.DSW WILL BE SET TO IS.SUC IF THE OPERATION WAS COMPLETED ; AND TO AN ERROR CONDITION IF THE OPERATION WAS UNSUCCESSFUL. ; ; ; MTLUN=0 EFN=5 ; .PSECT PASRUN ALUN: ALUN$ MTLUN,MT,0 QIOB: QIOW$ 0,MTLUN,EFN,,STATIS,,<0,0,0,0,0,0> ; STATIS: 0,0 .ENABLE LSB MTINIT:: MOV 10(R5),ALUN+A.LULU ;SET LUN TO ASSIGN MOV 6(R5),ALUN+A.LUNU ;SET MT UNIT NUMBER DIR$ #ALUN ;ASSIGN LUN TO TAPE BCS 7$ MOV 4(R5),QIOB+Q.IOPL ;SET CHARACTERISTICS WORD MOV #IO.STC,QIOB+Q.IOFN ;SET IO FUNCTION 1$: MOVB 10(R5),QIOB+Q.IOLU ;SET LOGICAL UNIT DIR$ #QIOB ;PERFORM THE OPERATION 7$: JSR PC,STATS ;SET STATIS ADD #12,R5 ;POP OFF PARAMETERS RTS PC ;RETURN ; MTWEOF:: MOV #IO.EOF,QIOB+Q.IOFN ;SET IO FUNCTION 100$: MOVB 4(R5),QIOB+Q.IOLU ;SET LOGICAL UNIT DIR$ #QIOB ;PERFORM THE OPERATION JSR PC,STATS ;SET STATIS ADD #6,R5 ;POP OFF PARAMETERS RTS PC ;RETURN ; MTGETS:: MOV #IO.SEC,QIOB+Q.IOFN ;SET IO FUNCTION BR 100$ ;DO IT LIKE THE REST OF THEM ; MTREWD:: MOV #IO.RWD,QIOB+Q.IOFN ;SET IO FUNCTION BR 100$ ;DO IT LIKE THE REST OF THEM ; MTUNLD:: MOV #IO.RWU,QIOB+Q.IOFN ;SET IO FUNCTION BR 100$ ;DO IT LIKE THE REST OF THEM ; MTSKRF:: MOV #IO.SPB,QIOB+Q.IOFN ;SET IO FUNCTION 200$: MOV #1,QIOB+Q.IOPL ;SET COUNT BR 100$ ;DO IT LIKE THE REST OF THEM ; MTSKFF:: MOV #IO.SPF,QIOB+Q.IOFN ;SET IO FUNCTION BR 200$ ;DO IT THE SAME TOO ; MTSKRB:: MOV #IO.SPB,QIOB+Q.IOFN ;SET IO FUNCTION 300$: MOV #-1,QIOB+Q.IOPL ;SET COUNT BR 100$ ;DO IT LIKE THE REST OF THEM ; MTSKFB:: MOV #IO.SPF,QIOB+Q.IOFN ;SET IO FUNCTION BR 300$ ;DO IT THE SAME TOO ; MTREAD:: MTRDIR:: MOV #IO.RLB,QIOB+Q.IOFN ;SET IO FUNCTION BR 400$ ;DO THE SAME AS WRITE ; MTWRIT:: MOV #IO.WLB,QIOB+Q.IOFN ;SET IO FUNCTION 400$: MOV 4(R5),QIOB+Q.IOPL+2 ;SET BYTE COUNT MOV 6(R5),QIOB+Q.IOPL ;SET BUFFER ADDRESS BR 1$ ;DO IT LIKE MTINIT ; MTCTFF:: MOV #IO.SPF,QIOB+Q.IOFN ;SET IO FUNCTION 500$: MOV 4(R5),QIOB+Q.IOPL ;SET MAXIMUM COUNT MOV 6(R5),QIOB+Q.IOLU ;SET LOGICAL UNIT DIR$ #QIOB ;PERFORM THE FUNCTION JSR PC,STATS ;SET STATIS ADD #10,R5 ;POP OFF PARAMETERS RTS PC ;RETURN ; MTCTRF:: MOV #IO.SPB,QIOB+Q.IOFN ;SET IO FUNCTION BR 500$ ;DO IT LIKE MTCTFF ; STATS: BCC 70$ ;GOOD STUFF MOV R0,-(SP) ;SAVE R0 MOV 2(R5),R0 ;STATIS BLOCK MOV @#$DSW,(R0)+ MOV @#$DSW+2,(R0) BR 77$ 70$: MOV R0,-(SP) MOV 2(R5),R0 MOV STATIS,(R0)+ MOV STATIS+2,(R0) 77$: MOV (SP)+,R0 RTS PC ; .END