;THIS IS THE FILE PROCESSING SECTION OF THE PROGRAM XMT ;IT OPENS THE FILE TO BE TRANSMITTED, READS IT, AND CLOSES IT. ; .TITLE FILPRO .MCALL FSRSZ$,FDBDF$,FDRC$A,FDOP$A,FDBF$A,NMBLK$ .MCALL OPEN$R,CLOSE$,GET$,EXIT$S ; LUN=2 .PSECT BFFER,D,GBL,OVR ;SECTION FOR READER BUFFER BUFLN=512. ;SIZE OF BUFFER FILEBF: .BLKB BUFLN ;BUFFER ; .PSECT FDBSEC,D,GBL,CON FSRSZ$ 3,,FDBSEC ;SEE I/O OPERATIONS MANUAL CHAPTER 2 INFIL: FDBDF$ ;FOR A DESCRIPTION OF THESE MACROS FDRC$A ,FILEBF,BUFLN FDOP$A LUN,DAT1,DFNB,FO.RD,FA.ENB!FA.DLK!7 ; DFNB: NMBLK$ XMT,DAT,,SY,0 ;SET DEFAULT NAME TO SY:XMT.DAT DAT1: ;DATASET DESCRIPTER INDVLN: .WORD 0,0 ;LENGTH AND ADDRESS OF DEVICE BUFFER INUCLN: .WORD 0,0 ;LEN AND ADDR OF UIC DESCRIPTOR BUFFER INAMLN: .WORD 0,0 ;LEN AND ADDR OF FILE NAME ; COLON: .ASCII /:/ LEFT: .ASCII /[/ RIGHT: .ASCII /]/ .EVEN INDEV: .BLKB 6. ;DEVICE DESCRIPTOR INUIC: .BLKB 10. ;UIC DESCRIPTOR INAM: .BLKB 14. ;FILE NAME DESCRIPTOR ; ; OPE - Open the input file for XMT, Cadnet, V. 3.0 ; ; Fortran Callable. Calling Sequence: ; call ope (lenin, in, ids) ; ; Where: ; lenin - length of string in ; in - file specification string for input file ; ids - status code. = 0 => all ok ; < 0 => error ; ; .PSECT OPENER,I,LCL,CON ;SECTION FOR FILE OPENING CODE OPE:: MOV @2(R5),R2 ;MOVE FILENAME LENGTH TO R2 MOV 4(R5),R1 ;MOVE ADDRESS OF FILENAME TO R1 CLR @6(R5) ;CLEAR THE STATUS CODE TST R2 ;TEST FOR NULL FILE NAME BEQ OPENFL ; ;CHECK FILE NAME FOR PRESENCE OF A DEVICE SPEC. COLON IN FIRST FIVE CHARS ; MOV #5,R3 LOP1: CMPB (R1)+,COLON ;CHECK FOR COLON BEQ DEV ;BRANCH IF ONE IS PRESENT SOB R3,LOP1 MOV 4(R5),R1 ;RESET R1 TO BEGINNING OF NAME AND BR CHKUIC ;BRANCH TO CHECK UIC SPEC ; ;A DEV SPEC HAS BEEN FOUND. MOVE IT TO INDEV, AND SET INDVLN TO ITS LENGTH ; DEV: CLR INDVLN ;CLEAR ANY OLD DEV SPEC MOV 4(R5),R1 ;RESET R1 TO BEGINNING OF FILE NAME MOV #INDEV,R4 ;LOAD ADDRESS OF INDEV IN R4 MOV R4,INDVLN+2 ;AND MOVE IT TO DATASET DESCRIPTOR LOP2: MOVB (R1),(R4)+ ;MOVE A CHARACTER TO DEV BUFFER INC INDVLN ;COUNT IT CMPB (R1)+,COLON ;AND CHECK FOR END OF DEV SPEC BEQ CHKDEC ;BRANCH IF TRUE SOB R2,LOP2 BR OPENFL ;END OF FILE NAME, OPEN THE FILE ; CHKDEC: DEC R2 ;DECREMENT R2 TO ACCOUNT FOR COLON TST R2 ;TEST FOR END OF FILE NAME BEQ OPENFL ; CHKUIC: CMPB (R1),LEFT ;IF A UIC WAS GIVEN A '[' IS HERE BNE FNAME ;IF NOT DEAL WITH FILE NAME CLR INUCLN ;CLEAR ANY OLD UIC SPEC MOV #INUIC,R4 ;LOAD ADDRESS OF INUIC IN R4 MOV R4,INUCLN+2 ;MOVE IT TO DATASET DESCRIPTOR LOP3: MOVB (R1),(R4)+ ;MOVE A CHARACTER INC INUCLN ;COUNT IT CMPB (R1)+,RIGHT ;AND CHECK FOR UIC SPEC END BEQ FNADEC ;BRANCH IF TRUE SOB R2,LOP3 BR OPENFL ;END OF FILE NAME, OPEN FILE ; FNADEC: DEC R2 ;DECREMENT R2 TO ACCOUNT FOR ']' TST R2 ;CHECK FOR END OF FILE NAME BEQ OPENFL FNAME: CLR INAMLN ;CLEAR ANY OLD FILE NAME MOV #INAM,R4 ;LOAD ADDRESS OF INAM IN R4 MOV R4,INAMLN+2 ;MOVE IT TO DATASET DESCRIPTOR LOP4: MOVB (R1)+,(R4)+ ;MOVE A CHARACTER INC INAMLN ;COUNT IT SOB R2,LOP4 ; OPENFL: OPEN$R #INFIL ;OPEN THE FILE BCS OPNERR ;CHECK FOR ERROR RTS PC ;RETURN TO MAIN PROG OPNERR: MOV #-1,@6(R5) ;SET NEGATIVE STATUS CODE AND RETURN RTS PC ; READF - Read a record from the input file for XMT, Cadnet V. 3.0 ; ; Fortran Callable. Calling Sequence: ; call readf (line, linlen, ids) # read a line of the file ; ; Where: ; line - logical record read from the file ; linlen - length of this logical record ; ids - status code. < 0 => error ; > 0 => eof ; = 0 => all ok ; .PSECT READER,I,LCL,CON ;SECTION TO READ A LINE OF THE FILE READF:: MOV 2(R5),R1 ;MOVE ADDRESS OF LINE DESTINATION TO R1 CLR @4(R5) ;ZERO LENGTH OF FILE RECORD CLR @6(R5) ;CLEAR STATUS CODE ; GET$ #INFIL ;READ A LINE OF THE FILE INTO 'BUFFER' BCS GETERR ;CHECK FOR AN ERROR MOV F.NRBD(0),R2 ;MOVE LENGTH OF LINE TO R2 TST R2 ;CHECK FOR ZERO LENGTH LINE BEQ NULLIN ;BRANCH IF TRUE MOV R2,@4(R5) ;MOVE LENGTH OF LINE TO ARGUMENT ; MOV #FILEBF,R4 ;LOAD R4 WITH ADDR OF LINE FROM FILE LP1: MOVB (R4)+,(R1)+ ;MOVE LINE A CHAR AT A TIME TO ARG SOB R2,LP1 NULLIN: RTS PC ;RETURN TO MAIN PROG ; ; I/O ERROR CODE: DETERMINE IF AN EOF WAS ENCOUNTERED ; GETERR: CMPB #IE.EOF,F.ERR(R0) ;CHECK FOR END OF FILE ERROR BNE SKP ;IF NOT END OF FILE BRANCH CLOSE$ #INFIL ;CLOSE THE FILE, INC @6(R5) ;SET A POSITIVE STATUS CODE, AND RTS PC ;RETURN TO MAIN PROG SKP: DEC @6(R5) ;OTHER KIND OF ERROR, SET NEGATIVE RTS PC ;STATUS CODE AND RETURN .END