*20 / FRED -- FILE REPLACEMENT, ENTRY, AND DELETION / MAR 19, 1970 / / / BETA REGISTER DEFINITIONS / (13 AND 14 ARE UNUSED) / PARAM=1 RDWR=2 FDV=2 PARM2=3 XPNT=4 XPNT2=5 LP1=6 LP2=7 MARK=10 ENTSW=11 NFSW=12 RET3=15 RET2=16 RETURN=17 / / LOAD ADDRESS OF DIAL INDEX -- DO NOT MODIFY: RAMIFICATIONS ARE OVERWHELMING / INDEX=1000 / / PDP-8 MODE INSTRUCTIONS FOR USE AFTER IOB / LRMF=6244 LRIB=6234 LRIF=6224 / / / ENTRY POINTS FOR MAJOR ROUTINES OF FRED / / DJR JMP LOOKUP DJR JMP NTR0R. / / RETURN IMMEDIATELY FOLLOWING THE JMP (P+1) IF THE FILE ALREADY EXISTS. / RETURN TO P+2 IF THERE IS NO ROOM FOR THE FILE. / RETURN TO P+3 IF OPERATION COMPLETE (DIAL INDEX HAS BEEN UPDATED). / NTR000, SET RET3 / SAVE RETURN 0 JMP LKP010 / LOOKUP NAME IN INDEX JMP NTR020 / THIS NAME IS NOT IN INDEX JMP NTR010 / NAME IS IN INDEX, BUT NOT WITH THIS TYPE / / WE FOUND A FILE OF THIS NAME AND TYPE / LDA I / GET CONSTANT -2 -2 ADD XPNT2 / POINT TO POINTER AREA - 2 STC MARK / SAVE PO / INDICATE READ OPERATION 700 JMP COMMON / GO TO COMMON PROCESSING WRITE, SET RETURN / SAVE RETURN 0 SET I RDWR / INDICATE WRITE OPERATION 704 COMMON, SET I RET2 / SET CODE FOR USER CALL 7777 JMP GETFLD / SETUP TO ADDRESS PARAMETERS RWENT, LDA PARAM / GET FIRST WORD OF PARAMETERS ROR 6 / MOVE BANK NO TO RIGHT HALF STH / HOLD FOR EXTENDED ADDRESSING EXT ROL I 6 / RESTORE UNIT BITS RIGHT BCL I / KEEP TWO HIGH-ORDER BITS FOR AXO 7774 /. . . PLUS LOW-ORDER IN LINK BSE I / SET HIGH-ORDER UNIT BITS FOR AXO EXT, 0020 AXO / SET EXTENDED OPERATIONS BITS LDA I PARAM / GET MEMORY ADDR FROM PARAMS STC MEMADD / HOLD FOR TAPE USE ROL I 4 / GET UNIT BIT INTO POSITION BSE / SET DESIRED READ/WRITE OP CODE RDWR STC CMND / SET READ/WRITE INSTRUCTION LDA I PARAM / GET START BLOCK NUMBER STC IOBLK / SET APPOROPRIATELY LDA I PARAM / BLOCK COUNT... COM /... MADE NEGATIVE STC RDWR / STORE IN INDEX IOLOOP, LDA I / GET MEMORY ADDRESS FOR DATA MEMADD, 0 / ADDRESS FOR NEXT BLOCK TMA / TELL THE TAPE WHERE ADA I / UPDATE ADDRESS 400 / BY BLOCK LENGTH STC MEMADD / STORE NEW ADDR CMND, RDC / MODIFIED FOR DESIRED OPERATION IOBLK, 0 / BLOCK NUMBER WANTED LDA I / GET CONSTANT 1 1 ADM / UPDATE BLOCK NUMBER IOBLK XSK I RDWR / SKIP IF END OF OPERATION JMP IOLOOP / ELSE CONTINUE EJECT / / IO IS COMPLETE -- RETURN TO CALLER / XSK RET2 / SKIP IF USER CALL JMP RETURN / RETURN NOW IF INTERNAL CALL IOB LRMF / RESTORE TO DESIRED STATUS SET 0 / RESTORE RETURN JMP RETURN JMP 0 / GO TO CALLER / / / / GETFLD -- GET CALLERS FIELDS AND PARAMETERS / / ENTERED IN LINC MODE, WITH 10-BIT PARAMETER POINTER IN AC. / RETURN WITH INDIRECT POINTER IN LOCATION 1 TO / DATA FIELD CONTAINING PARAMETERS. / GETFLD, BSE I / SET BIT 0 (SOON BECOMES BIT 1) 4000 ROL I 2 / BIT 1 TO LINK ROR 2 / RESTORE 2-11, SET BIT 1 STC PARAM / HOLD AC CONTENTS STC ENTSW / CLEAR ENTSW IOB LRIB ROR 3 / INST FLD TO AC 7-11 LZE / SKIP IF PARMS IN INST FLD ROL 5 / DF TO AC 7-11 BCL I / DROP OTHER BITS 7740 BSE I / BUILD LDF INST LDF STC GTF010 / SAVE IT LZE I / IS DF ALREADY SET? GTF010, LDF / NO - SET IT JMP 0 / RETURN TO CALLER EJECT / / LOOKUP - FIND NAMED FILE IN DIAL INDEX / / ENTERED IN LINC MODE WITH ADDRESS OF A PARAMETER / LIST IN AC. / / 0/ UNIT NUMBER / / 1/ FILE NAME / / 2/ CONTD / / 3/ CONTD / / 4/ CONTD / / 5/ TYPE (S OR B)/ / 6/ STARTING BLOCK / 7/ NO OF BLOCKS / / LOOKUP, SET I RET3 / INDICATE EXTERNAL CALL 7777 LKP000, SET RET2 / SAVE RETURN JMP 0 JMP GETFLD / SETUP PARAMETER POINTER / / READ THE INDEX / SET PARM2 / MOVE PARAMETER POINTER TO ALT AREA PARAM LDA I / INIT AC 1 IOB LRIF / GET INSTRUCTION FIELD ROL 3 / MOVE FIELD NO TO RIGHT HALFWORD STH / STORE DATA ADDRESS FOR INDEX READ XPARM+1 ROL 3 / BANK NO TO BITS 0-2 BCL I / DROP ALL BUT BANK NO 0777 BSE PARM2 / COMBINE WITH UNIT NO STC XPARM / STORE INTO PARAMETER LIST SET I RDWR / SETUP READ CODE 700 SET I RETURN / SETUP RETURN JMP FROM READ JMP LKP010 / INST MOVED FOR LATER USE SET I PARAM / SETUP PARAMETER POINTER XPARM JMP RWENT / GO TO READ INDEX LKP010, SET I XPNT INDEX LDA XPNT / GET FIRST WORD OF INDEX SAE I / SKIP IF VALID FOR INDEX 5757 / FIRST WORD OF INDEX SKP / NOT AN INDEX -- BUILD ONE JMP LKP020 / INDEX IS OK -- GO TO NAME SCAN / / THERE IS NO INDEX -- CREATE ONE / LDA I / GET FILLER WORD 5757 STA XPNT / STORE IN NEXT INDEX WORD XSK I XPNT / INCREMENT AND TEST FOR END JMP .-2 / ZAP ANOTHER STA XPNT / ZAP LAST WORD XSK I PARM2 / MAKE PARM2 LOOK LIKE WE SOUGHT MATCH JMP ERRTN / RETURN NO FIND EJECT / / SCAN INDEX FOR NAME / LKP020, LDA I PARM2 / GET FIRST WORD OF NAME STC WORD1 / SAVE AT COMPARE INST LKP030, LDA I / CONSTANT 7 7 ADM / ADD IT TO INDEX POINTER XPNT XSK XPNT / TEST FOR END OF INDEX SKP / SKIP NOT END JMP ERRTN / OTHERWISE RETURN NO SUCCESS LDA I XPNT / GET A WORD OF INDEX NAME SAE I / SKIP OUT OF LOOP IF FIRST WORDS EQUAL WORD1, 0 JMP LKP030 / LOOP IF NOT EQUAL SET XPNT2 / FIRST WORDS EQUAL XPNT / START FINAL COMPARE SET FDV / POINT TEMPORARY FDV INDEX PARM2 SET I LP2 / SET LOOP COUNTER -3 LKP050, LDA I FDV / GET NEXT TWO CHARS SAE I XPNT2 / COMPARE TO THOSE IN INDEX ENTRY JMP LKP030 / UNEQUAL - RETURN TO SEARCH LOOP XSK I LP2 / LOOP TO COMPARE ENTIRE NAME JMP LKP050 / / IF WE GET HERE, WEVE FOUND THE NAME / LDA I FDV / PICK UP SOURCE/BINARY CODE SHD I / IS THE CODE S? 2300 JMP WNTS / YES - GIVE HIM SOURCE SHD I / IS THE CODE B? 0200 JMP WNTB / YES - GIVE HIM BINARY / / COME HERE ON DETECTING ERROR, OR UNSUCCESSFUL FIND / ERRTN, XSK RET3 / TEST FOR INTERNAL CALL JMP RET2 / RETURN NOW IF INTERNAL SET 0 / MOVE IN RETURN JMP RET2 IOB LRMF JMP 0 /RETURN TO CALLER EJECT / / WEVE FOUND WHAT HE WANTS - GIVE IT HIM / WNTB, XSK I XPNT2 / CANT SKIP, BUT THIS ... XSK I XPNT2 /...FAKES OUT THE POINTER WNTS, XSK RET3 / IF INTERNAL CALL... XSK I RET2 /...SETUP FOR THREE RETURNS LDA I XPNT2 / GET STARTING BLOCK NO FROM INDEX STA I FDV / STORE IN CALLERS PARAMETER LIST LDA I XPNT2 / GET NO OF BLOCKS APO / SKIP IF DESIRED DATA EXISTS JMP ERRTN / RETURN ERROR IF NO FILE XSK RET3 / DONT STORE RESULT IF INTERNAL SKP STA I FDV / RETURN NO OF BLOCKS XSK I RET2 / INCREMENT JMP RETURN ADDRESS JMP ERRTN / NOT REALLY AN ERROR / / PARAMETERS TO READ ROUTINE / XPARM, 0 / FIELD AND UNIT INDEX / DATA ADDRESS 346 / BLOCK NUMBER 2 / BLOCK COUNT EJECT / / REPLACE -- REPLACE A NAMED ENTRY IN DIAL INDEX / / ENTERED IN LINC MODE AFTER CALLING ENTER. / MAY BE CALLED ONLY IMMEDIATELY AFTER ENTER HAS RETURNED TO P+1, / INDICATING THAT A FILE OF THE PROPOSED NAME AND TYPE ALREADY EXISTS. / RPL000, SET RET3 / SAVE RETURN 0 XSK I ENTSW / TEST FOR NAME FOUND, SET "REPLACE" RPL010, HLT / ILLEGAL SEQUENCE -- STOP XSK ENTSW / TEST FOR CONTINUE AFTER HALT JMP RPL010 / BAD BOY -- STOP AGAIN JMP GTF010 / SET CORRECT DF LDA I / ZAP LENGTH FIELD OF THIS FILE 5757 STA XPNT2 JMP FSP000 / ALL LOOKS GOOD -- DO YOUR THING / / ENTER -- ADD A NAMED ENTRY TO DIAL INDEX / / ENTERED IN LINC MODE WITH AC POINTING TO A PARAMETER LIST / IDENTICAL TO THAT FOR LOOKUP, EXCEPT THAT THE FILE-LENGTH / FIELD IS FILLED BY THE USER. / / RETURN IMMEDIATELY FOLLOWING THE JMP (P+1) IF THE FILE ALREADY EXISTS. / RETURN TO P+2 IF THERE IS NO ROOM FOR THE FILE. / RETURN TO P+3 IF OPERATION COMPLETE (DIAL INDEX HAS BEEN UPDATED). / NTR000, SET RET3 / SAVE RETURN 0 JMP LKP000 / LOOKUP NAME IN INDEX JMP NTR020 / THIS NAME IS NOT IN INDEX JMP NTR010 / NAME IS IN INDEX, BUT NOT WITH THIS TYPE / / WE FOUND A FILE OF THIS NAME AND TYPE / LDA I / GET CONSTANT -2 -2 ADD XPNT2 / POINT TO POINTER AREA - 2 STC MARK / SAVE POINTER FOR REPLACE SET I ENTSW / INDICATE READY-FOR-REPLACE 1776 JMP RTRN0 / GO HOME / / FOUND THE NAME, BUT NOT TYPE / NTR010, LDA I / CONSTANT -2 -2 ADD XPNT2 / FROM POINTER INDEX STC MARK / SAVE ADDR OF FILE POINTERS JMP NTR030 / GO BEGIN SCAN FOR FILE SPACE / / NOTHING FOUND IN THE LOOKUP SCAN / NTR020, SET I MARK / INDICATE NO FIND 7777 NTR030, XSK I RET3 / NO NAME CONFLICT, INCREMENT RETURN EJECT / / FSP - FIND SPACE ON DIAL TAPE FOR NEW FILE / FSP000, LDA I / PICK UP SKIP-NEG INSTRUCTION APO I / MOVED TO FCF050 STC FCF050 / STORE IN INDEX-SCAN ROUTINE LDA I 5 ADD PARM2 / POINT TO USERS START BLOCK FIELD STA / HOLD FOR LATER LP1 STC LP2 / STORE POINTER LDA I LP2 / PICK UP LENGTH APO / TEST FOR POSITIVE LEN REQUEST JMP RTRN0 / ELSE RETURN ERROR AZE I / SKIP IF LEN NOT ZERO JMP RTRN0 / BOMB IF NULL REQUEST STA / HOLD LENGTH HANDY TRYLEN COM ADA I / SUBTRACT LEN FROM HIGHEST BLOCK NO, LOW FILE 270 FSP010, AZE I / SKIP NOT ZERO CLR / FORCE TRUE ZERO IF RESULT IS 7777 APO / SKIP IF STILL ON THE TAPE JMP FSP020 / NO SPACE IN LOW FILE AREA STC TRY / HOLD TRIAL STARTING BLOCK JMP FCF000 / GO FIND POSSIBLE CONFLICT JMP FSP030 / HOORAY -- NO CONFLICT LDA / NOPE -- THAT TRY IS NO GOOD TRYLEN COM / SUBTRACT THE SEARCH LENGTH FROM... ADA XPNT /... THE START BLOCK OF CONFLICT FILE... JMP FSP010 /...AND TRY AGAIN / / WEVE FOUND NO SPACE LARGE ENOUGH IN THE LOWER FILE AREA / FSP020, SET I NFSW / SET NO-FIND SWITCH 0 LDA I / PICK UP MINUS END OF TAPE -1000 ADD TRYLEN / MINUS LAST FEASIBLE START BLOCK STC UPLIM / HOLD AS SCAN LIMIT JMP FSP035 / ENTER UPPER SCAN / / TRY POINTS TO GOOD SPACE IN LOWER AREA / FSP030, SET I NFSW / INDICATE SPACE FOUND 7777 LDA / PICK UP OLD TRY TRY STA / SAVE IT SVTRY ADD TRYLEN / GET END BLOCK ADA I / GET COMPARE CONSTANT (TRYEND-2*INDEX LOC) -716 STC UPLIM / MINUS HIGHEST DESIRABLE STARTING BLOCK FSP035, LDA I / GET SKIP-POS INSTRUCTION APO / MOVED TO FCF050 STC FCF050 / STORE IN INDEX SCAN ROUTINE LDA I / INITIAL STARTING BLOCK, UPPER FILE 470 FSP040, STA / SET NEW TRY BLOCK TRY ADD UPLIM / COMPARE TO MAXIMUM USABLE BLOCK APO I / SKIP IF STILL IN USEFUL REGION JMP FSP050 / NO SPACE IN THIS AREA JMP FCF000 / SEARCH FOR CONFLICT JMP FSP060 / WEVE FOUND SPACE LDA XPNT / THIS TRY WONT WORK... ADA XPNT2 /...SO TRY AT END OF CONFLICT FILE JMP FSP040 / / THERE WAS NO SPACE FOUND IN UPPER FILE AREA / FSP050, XSK NFSW / SKIP IF FOUND IN LOWER AREA JMP RTRN0 / RETURN BAD NEWS -- NO SPACE LDA / GET START BLOCK OF FILE IN LOWER AREA SVTRY STC TRY / THATS THE ONE WELL USE / / THERE IS SPACE AT TRY / FSP060, XSK MARK / WAS THERE A FILE BY THIS NAME JMP FSP100 / YES - GO USE THAT ENTRY / / WE MUST SEARCH FOR EMPTY INDEX SPACE / SET I MARK / INITIALIZE MARK POINTER INDEX FSP070, LDA I / BUMP INDEX INDEX 7 ADM MARK XSK MARK / TEST FOR END OF INDEX SKP / NOT END JMP RTRN0 / NO SPACE IN INDEX -- RETURN ZERO LDA I MARK / FIRST WORD OF INDEX NAME SAE I / CHECK FOR EMPTY ENTRY 5757 JMP FSP070 / NOT EMPTY, TRY NEXT / / MARK POINTS TO AN UNUSED INDEX ENTRY / PUT THE NAME INTO IT / LDA PARM2 / FIRST WORD OF USER NAME STA MARK / PLUNK INTO INDEX LDA I PARM2 / 2ND STA I MARK LDA I PARM2 / 3RD STA I MARK LDA I PARM2 / 4TH STA I MARK LDA I PARM2 / TYPE CONTROL (S OR B) SHD I / IS TYPE S 2300 JMP FSP080 / YES SHD I / IS TYPE B 0200 JMP FSP090 / YES JMP RTRN0 / NO-- BOMB NOW EJECT / / HE WANTS A SOURCE FILE -- SCRATCH THE BINARY POINTERS / FSP080, SET LP2 / TEMP POINTER MARK XSK I LP2 / CANT SKIP XSK I LP2 / DITTO LDA I / GET 57S... 5757 STA I LP2 / STORE THEM... STA I LP2 /... IN BINARY POINTERS JMP FSP100 / / HE WANTS BINARY FILE / FSP090, LDA I 5757 STA I MARK / STORE 57S... STA I MARK /...IN SOURCE POINTERS / / MARK NOW POINTS TO POINTER AREA OF DESIRED TYPE IN A NAMED INDEX ENTRY / FSP100, LDA / PICK UP STARTING BLOCK TRY STA I MARK / STORE IN INDEX STA LP1 / STORE IN USERS LIST LDA I LP1 / GET LENGTH STA I MARK / STORE IN INDEX / / NOW EVERYBODY IS HAPPY EXCEPT THE TAPE, WHICH HASNT BEEN UPDATED / SET I RDWR / SETUP WRITE CODE 704 SET I RETURN / SETUP RETURN JMP JMP FSP110 / INST MOVED FOR LATER USE SET I PARAM / SETUP PARAMETER POINTER XPARM JMP RWENT / GO DO THE WRITE FSP110, XSK I RET3 / BUMP RETURN ADDR RTRN0, SET 0 / MOVE RETURN JMP TO 0 RET3 IOB LRMF / RESTORE USERS FIELDS JMP 0 / GO TO CALLER EJECT / / FIND POSSIBLE CONFLICT BETWEEN INDEX ENTRY AND TRIAL STARTING BLOCK / / CALLER MUST SET OR CLEAR I-BIT IN FCF050 TO SELECT DESIRED FILE AREA / FCF000, SET RET2 / SAVE RETURN 0 SET I XPNT / INITIALIZE POINTER TO INDEX IN CORE INDEX+6 FCF010, XSK I XPNT / SKIP ON END OF INDEX SKP JMP RET2 / END OF INDEX, RETURN NO CONFLICT XSK I XPNT / INCREMENT AGAIN, NO SKIP POSSIBLE LDA / PICK UP POINTER XPNT ROR I 3 / MOVE BIT 9 TO LINK LZE / SKIP IF NAME AREA OF ENTRY JMP FCF040 / JMP IF POINTER AREA LDA XPNT / GET FIRST WORD OF NAME SAE I / SKIP IF EMPTY ENTRY 5757 JMP FCF030 / WORD IS VALID NAME LDA I / GET CONSTANT 6 6 ADM / ADDRESS NEXT ENTRY - 2, THIS ONE IS EMPTY XPNT JMP FCF010 / TRY NEXT INDEX ENTRY FCF030, LDA I / INCREMENT BY 4 4 ADM /...TO ADDRESS POINTER XPNT / / XPNT NOW ADDRESSES A STARTING BLOCK NO / FCF040, LDA XPNT / PICK UP STARTING BLOCK ADA I / SUBTRACT INDEX LOCATION -347 FCF050, APO / REVERSE SENSE BIT MAY BE SET BY CALLER JMP FCF010 / TRY AGAIN IF WRONG FILE AREA SET XPNT2 / TEMP POINT TO LENGTH WORD XPNT LDA I XPNT2 / PICK UP LENGTH APO / SKIP IF LENGTH POS JMP FCF010 / NEG LEN -- NO FILE HERE EJECT / / WE NOW HAVE A VALID INDEX ENTRY / COMPARE IT TO TRY / LDA XPNT / STARTING BLOCK OF THIS FILE BCL I / CLEAR GARBAGE IN HIGH THREE BITS 7000 COM ADD TRY / SUBTRACT XSTART FROM TRY APO / SKIP IF TRY ABOVE XSTART JMP FCF060 / JMP IF BELOW / / TRY IS ABOVE THE START OF THIS FILE / COM / MAKE DIFFERENCE NEGATIVE ADA XPNT2 / SUBTRACT DIFFERENCE FROM FILE LENGTH APO / ZERO RESULT WILL BE NEG (7777) JMP FCF010 / NO CONFLICT, TRY NEXT ENTRY JMP FCF070 / CONFLICT FOUND -- RETURN / / THE TRY IS BELOW OR AT THE START OF THIS FILE / FCF060, ADD TRYLEN / SUBTRACT STARTING DIFF FROM LEN OF TRY APO / SKIP IF CONFLICT JMP FCF010 / NO CONFLICT - TRY NEXT ENTRY / / WE HAVE FOUND A CONFLICT -- RETURN IT TO CALLER / FCF070, XSK I RET2 / INCREMENT RETURN ADDRESS JMP RET2 / GO BACK / / WORK AREA / TRY, 0 TRYLEN, 0 SVTRY, 0 UPLIM, 0 EJECT / / DELETE -- REMOVE A FILE FROM THE DIAL INDEX / / SAME CALLING SEQUENCE AS LOOKUP, EXCEPT NO ALTERNATE RETURNS / DEL000, SET RET3 / SAVE RETURN 0 JMP LKP000 / LOOKUP NAME IN INDEX JMP RTRN0 / DIDNT FIND THE FILE JMP RTRN0 / DITTO LDA I / DECREMENT XPNT2 -1 ADM /...TO ADDRESS START BLOCK FIELD XPNT2 LDA I / EMPTY AREA INDICATOR 5757 STA XPNT2 / ZAP START BLOCK FIELD STA I XPNT2 / DITTO LEN LDA / GET POINTER XPNT2 BCO I / ADDRESS OTHER TYPE LEN FIELD 2 STC XPNT2 LDA XPNT2 / PICK LENGTH OF OTHER-TYPE FILE APO I / SKIP IF OTHER-TYPE EMPTY JMP DEL030 / GO RE-WRITE INDEX LDA I / BOTH TYPES EMPTY -- CLEAR NAME 5757 STA XPNT / ZAP FIRST WORD OF NAME STA I XPNT / 2ND STA I XPNT / 3RD STA I XPNT / 4TH / / WAS THAT THE LAST FILE / SET I XPNT / POINT TO START OF INDEX INDEX-1 DEL010, SAE I XPNT / IS THERE A NON-EMPTY ENTRY JMP DEL030 / YES - REWRITE XSK XPNT / CHECK FOR END JMP DEL010 / NOT YET - LOOP / / INDEX IS EMPTY: MAKE IT A NON-INDEX / CLR SET I XPNT / POINT TO INDEX INDEX-1 STA I XPNT / ZERO ONE WORD XSK XPNT / LAST ONE ? JMP .-2 / NO - LOOP / / RE-WRITE INDEX / DEL030, SET I RDWR / SET WRITE CODE 704 SET I RETURN / RETURN JUMP FOR R/W ROUTINE JMP RTRN0 SET I PARAM XPARM JMP RWENT / DO THE WRITE THING, AND RETURN TO CALLER EJECT / / THIS WILL CAUSE AN ASSEMBLY ERROR IF ROUTINE BECOMES SO LARGE / THAT INDEX WILL OVERLAY CODE WHEN IT IS READ IN ASMIFM INDEX-. NAUGHTY BAD BOY - ROUTINE IS TOO BIG FOR ONE FIELD. / IN CASE OF MINOR SIZE PROBLEMS, REMOVE 5 LINES OF CODE AT FCF040. / REMOVE 3 LINES AT FSP000, AND THREE LINES AT FSP035. THIS SHOULD / REMOVE ALL REFERENCES TO FCF050. ALL OTHER TAGS MUST BE RETAINED. / / / / END OF FRED /