        .PSECT  DATA,LONG 
DFNAM:  .ASCII /.PTR/
INFAB:  $FAB NAM=INNAM,DNA=DFNAM
INRAB:  $RAB FAB=INFAB
INNAM:  $NAM RSS=64,ESS=64,ESA=BUFN

OUTFAB: $FAB NAM=OUTNAM RAT=CR
OUTRAB: $RAB FAB=OUTFAB
OUTNAM: $NAM RSA=NAME,RSS=64
LEN:    .LONG 0
NAME:   .BLKB 64                        ; SPACE FOR FILE NAME OPENED
BUFN:   .BLKB   64
        BUFLEN=257
BUF:    .BLKB   257

; constants
        CR=^X0D

;********************

;   GETFILE

;********************


; THIS PROCEDURE TAKES THREE PARAMETERS;
; THE RMS ERROR NUMBER IS RETURNED IN R0

        FILE_STR_ADR=04            ; FILE NAME TO OPEN
        FILE_STR_LEN=08            ; LENGTH OF FILE NAME
        RTS=12                     ; ADDRESS OF RETURN STATUS BLOCK

; DESCRIPTION OF RETURN STATUS BLOCK

        RTS_OPENED=0              ; WAS A FILE OPENED?
        RTS_CR=3                   ; TO BE USED LATER
        RTS_LEN=4                  ; LENGTH OF FILE NAME OPENED
        RTS_NAME=8                 ; FILE NAME BUFFER 

; ENTRY POINT

        .ENTRY GETFILE,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10>
        MOVL    FILE_STR_ADR(AP),INFAB+FAB$L_FNA
        CVTLB   FILE_STR_LEN(AP),INFAB+FAB$B_FNS
        MOVL    RTS(AP),R10                     ; SET R10 TO RTS BLOCK ADDRESS
        ADDL3   #RTS_NAME,R10,INNAM+NAM$L_RSA   ; SET ADDRESS RETURNED NAME
        MOVL    #1,R9                           ; FILE EMPTY
        
;OPEN FILE

        $OPEN   FAB=INFAB
        CVTBL   INNAM+NAM$B_RSL,RTS_LEN(R10)
        CMPL    R0,#RMS$_NORMAL
        BEQL    10$                             ; BRANCH IF NORMAL
        CMPL    R0,#RMS$_FNF                    ; TEST FILE NOT FOUND
        BEQL    9$
        BRW     EXIT
9$:     CLRB    RTS_OPENED(R10)                 ;RET  NO FILE OPENED
        MOVL    #RMS$_NORMAL,R0
        RET
10$:    MOVB    #1,RTS_OPENED(R10)              ;RET FILE OPENED


;GET SPACE

        CALLS   #0,NEWBLOCK
        MOVL    R0,R6
        MOVL    8(R6),R3                ; R3 IS BLOCK ADDRESS
        MOVL    (R6),R8                 ; R8 IS REMAINING SPACE
    
;CONNECT FILE    

        $CONNECT RAB=INRAB
        CMPL    R0,#RMS$_NORMAL
        BEQL    20$
        BRW     EXIT
20$:    MOVL    R3,INRAB+RAB$L_UBF
        MOVW    R8,INRAB+RAB$W_USZ
READ:   CMPL    R8,#BUFLEN
        BGEQ    21$
        BRW     NOSPACE                         ; branch if not enough space.
21$:    $GET    RAB=INRAB
        CMPL    R0,#RMS$_NORMAL
        BNEQ    QUIT                            ; BRANCH IF NOT NORMAL
        CLRL    R9                              ; FILE NOT EMPTY
        CVTWL    INRAB+RAB$W_RSZ,R1             ;GET LENGTH OF LINE
        SUBL2   R1,R8                           ;UPDATE REMAINING SPACE
        MOVW    R8,INRAB+RAB$W_USZ              ;STORE NEW BUFFER SIZE
        ADDL2   R1,INRAB+RAB$L_UBF              ;UPDATE BUFFER ADDRESS
; ADD CR 
        MOVB    #CR,@INRAB+RAB$L_UBF            ;PUT CR
        INCL    INRAB+RAB$L_UBF                 ;UPDATE BUFFER ADDRESS
        DECL    R8                              ;UPDATE REMAINING SPACE
        MOVW    R8, INRAB+RAB$W_USZ             ;UPDATE BUFFER ADDRESS
        BRW     READ                            ;READ NEXT LINE
QUIT:   CMPL    R0,#RMS$_EOF                    ; CHECK IF AT EOF
        BEQL    100$
        BRW     EXIT                            ; ABNORMAL ERROR
100$:   TSTL    R9                              ; TEST TO SEE IF FILE IS EMPTY
        BNEQ    101$
        INCL    R8                              ; DELATE LAST CR
101$:   SUBL2   R8,(R6)                         ; RETURN LENGTH
        $CLOSE  FAB=INFAB
FINSH:  MOVL   #RMS$_NORMAL,R0                  ; RETURN STATUS
        RET
NOSPACE:
; SET UP SO LINE IS READ INTO BUF
        MOVL    INRAB+RAB$L_UBF,R3             
        MOVW    #BUFLEN,INRAB+RAB$W_USZ
        MOVL    #BUF,INRAB+RAB$L_UBF
READ2:  $GET RAB=INRAB
        CMPL    R0,#RMS$_NORMAL
        BEQL    40$
        BRW     QUIT
40$:    CLRL    R9                              ; ADD NO CR ON RET
        CVTWL    INRAB+RAB$W_RSZ,R7              ; GET LENGTH OF LINE
;ADD CR
        MOVB    #CR,BUF[R7]
        INCL    R7
        SUBL2   R7,R8                           ; UPDATE REMAINING SPACE
        BLSS    MORE
        MOVC3   R7,BUF,(R3)                     ; MOVE BUF (R3 IS UPDATED)
        BRW     READ2                           ; READ NEXT LINE
MORE:   
;  GET SOME MORE SPACE
        ADDL2   R8,R7                           ; AMOUNT TO MOVE TO OLD BUFFER
        MOVC3   R7,BUF,(R3)                     ; MOVE TO OLD BUFFER
        MNEGL   R8,R4                           ; AMOUNT TO MOVE TO NEW BUFFER
        MOVL    R1,R2                           ; SAVE BASE ADDRESS OF REST OF BUF
        CALLS   #0,NEWBLOCK                     ; GET NEW BUFFER
        MOVL    R0,R6
        MOVL    8(R6),R3
        MOVL    (R6),R8
        SUBL2   R4,R8                           ; UPDATE REMAINING SPACE
        MOVC3   R4,(R2),(R3)                    ; MOVE BUF TO NEW SPACE
        MOVL    R3,INRAB+RAB$L_UBF
        MOVW    R8,INRAB+RAB$W_USZ
        BRW     READ                            ; READ NEXT LINE

;**************************

;   FSTART

;**************************

; THIS PROCEDURE TAKES TWO PARAMETERS
        STR_LEN=04
        STR_ADD=08

        .ENTRY FSTART,^M<>
        CVTLB STR_LEN(AP),OUTFAB+FAB$B_FNS
        MOVL  STR_ADD(AP),OUTFAB+FAB$L_FNA
        $CREATE FAB=OUTFAB
        BLBS    R0,10$
        BRW    EXIT
10$:    $CONNECT RAB=OUTRAB
        BLBS    R0,11$
        BRW     EXIT
11$:    CLRL    LEN
        RET
;**************************

;   FPUT

;**************************

; THIS PROCEDURE TAKES TWO PARAMETERS

        LENGTH=04
        ADDR=08

        .ENTRY FPUT,^M<R2,R3,R4,R5,R6,R7>
        MOVL   LENGTH(AP),R6   
        MOVL    ADDR(AP),R7
        MOVL    LEN,R3
        BEQL    40$                     ; BRANCH IF NO PART LINE
        LOCC    #CR,R6,(R7)
        BEQL    PART
        SUBL3   #1,R0,R6                ; SET UP NEW LENGTH
        SUBL3   R7,R1,R0                ; GET LENGTH OF LINE
        ADDW3   R3,R0,OUTRAB+RAB$W_RSZ  ; SET LENGTH OF LINE
        MOVL    #BUF,OUTRAB+RAB$L_RBF   ; SET ADDRESS OF LINE
        MOVL    R7,R2
        ADDL3   #1,R1,R7                ; SET UP NEW ADDRESS
        MOVC3   R0,(R2),BUF[R3]
        $PUT    RAB=OUTRAB
        BLBC    R0,EXIT
        CLRL    LEN
40$:    LOCC    #CR,R6,(R7)
        BEQL    PART
        SUBL3   #1,R0,R6                ; SET UP NEW LENGTH
        SUBL3   R7,R1,R0                ; GET LENGTH OF LINE
        MOVW    R0,OUTRAB+RAB$W_RSZ     ; SET LENGTH OF LINE
        MOVL    R7,OUTRAB+RAB$L_RBF     ; SET ADDRESS OF LINE
        ADDL3   #1,R1,R7                ; SET UP NEW ADDRESS
        $PUT    RAB=OUTRAB
        BLBC    R0,EXIT
        BRW     40$
EXIT:   RET
PART:   MOVL    LEN,R3
        MOVC3   R6,(R7),BUF[R3]
        ADDL2   R6,LEN
        RET

;**************************

;   FFINISH

;**************************
        FLEN=04                         ; LEN OF NAME
        FNAME=08                        ; ADDRESS OF BUFFER TO RETRUN NAME IN
        
        .ENTRY FFINISH,^M<>
        CVTBL   OUTNAM+NAM$B_RSL,R1
        MOVL    R1,@FLEN(AP)
        MOVC3   R1,@OUTNAM+NAM$L_RSA,@FNAME(AP)
        $CLOSE  FAB=OUTFAB
        BLBC    R0,EXIT  
        RET
        .END
