Notes on RFITS program. General Comments -- The code is well structured, modular, and the identifiers are well chosen for the most part, with some exceptions. I liked the file list technique, and have incorporated it into the card image reader I wrote to test MTIO. On the critical side, the code is not sufficiently well commented. A few comments explaining the general approach are needed; the use of the record buffer, the placement of unrecognized keywords in the image header, and so on are important things that can only be derived at present by a very detailed analysis of the code. Functionally the program has some serious limitations as noted below. Detailed Comments -- On functionality: (1) Keywords BUNIT, BLANK, DATE, DATE_OBS, ORIGIN, CRVALn, CRPIXn, etc., etc. should all be recognized. Many of these have direct complements in the image header and it is merely a matter of mapping the value directly. Without doing so we cannot save and restore IRAF images in FITS tape form without serious loss of information. Our intention is eventually to map nonstandard FITS keywords by name into the user fields. A similar table driven mapping of the standard fields might therefore be desirable. This would also make the reader more robust and easier to modify to read nonstandard or future (extended) formats. (2) Something should be done about indefinite pixels. It is easy to check for FITS BLANK value and map into the appropriate INDEF. This function should be encapsulated in a separate procedure, because it will have to be modified when we add bad pixel lists to IMIO. (3) BITPIX=32 is not really implemented. Eight bits of precision lost is too much. Also, SIMPLE='F' should not result in an irrecoverable abort; a subsequent program may be able to recover the data if it can at least be read into an imagefile. For similar reasons, it would be best if it were possible to move pixels to disk without conversion. Doing everything in real forces binary conversion of the pixels, as well as causing the loss of precision for type long. On coding: (1) Error checking is only partially implemented. As a rule, low level procedures should "errchk" all subprocedures which perform i/o, so that the higher level procedures can decide whether or not they want to catch errors (makes code easier to modify, i.e., to add an error handler in the future). (2) The stack should be unchanged upon exit from a procedure. SALLOC is used improperly in several places (noted on listing). (3) The constants defining the FITS standard should be parameterized in an include file with comments, or in an external lookup table. I do not know what GROUPS, PCOUNT, GCOUNT are, and I had to think a bit to figure out what the 11, 29, etc. were. The exact version of the standard implemented by the program should be defined all in one place, so that others can see what version of the standard is implemented without having to read and understand the whole program, and to make it easier to modify the program to read future and nonstandard "FITS" files. Also numbers like "11", "29" etc. are inherently hard to understand. Even "80" may have to be changed to read a nonstandard or improperly written format. (4) Defined expressions should be enclosed in parenthesis to guarantee that they are evaluated properly. The definitions of SZB_BIT, SZ_UBYTE, etc. do not work if enclosed in parenthesis. This is very tricky; if I were to inherit the program, I would have "fixed" those definitions at first sight by adding parens, just to be safe, and then the code would no longer work. Use of integer division in expressions where the operands of unknown size is bad. (5) The "8" in the definition of SZB_BIT is machine dependent. I have added an NBITS_BYTE definition to iraf.h. Do not let machine dependence creep into code!! (6) I have added WRDSWP and ACHTB_ to the system libraries.