.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 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 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