VOLUME 49 DESCRIPTION: FORTRAN, RATIONAL FORTRAN PROGRAMS. CDOS ROUTINES FOR CP/M. NUMBER SIZE NAME COMMENTS -CATALOG.049 CONTENTS OF CP/M VOL. 49 49.1 4K 4FDCBIOS.DOC Files for running CP/M 2.0+ 49.2 2K 4FDCBIOS.HEX 49.3 13K 4FDCBIOS.Z80 on CDOS systems using this 49.4 1K 4FDCBOOT.HEX 49.5 2K 4FDCBOOT.Z80 BIOS and BOOT. 49.6 11K ABSTRACT.049 Abstracts of the files on this disk. 49.7 1K ASMDEF.RAT Used by LCAT, part of RATFOR. 49.8 6K ASTRO.FOR FORTRAN Astronomy program. 49.9 10K CDOS.DOC Comments on CDOS features. 49.10 2K CDOSCOPY.COM Full disk copy program 49.11 2K CDOSCOPY.DOC for CDOS systems, 49.12 4K CDOSCOPY.HEX single or double 49.13 26K CDOSCOPY.PRN density, and single 49.14 12K CDOSCOPY.Z80 or double sided. 49.15 1K CONSTS.RAT Definitions of some frequently used constants (RATFOR). 49.16 1K F77.DOC FORTRAN 77 Documentation. 49.17 1K F77DEF.RAT FORTRAN 77 Functions. 49.18 2K F77LIB.FOR Definitions of some intrinsic FORTRAN 77 functions. 49.19 3K FILTER.Z80 Source code for emulating CDOS 49.20 1K FILTER.HEX calls under standard CP/M. 49.21 6K FILTER2.Z80 Modified version of FILTER 49.22 1K FILTER2.HEX (above) 49.23 2K INDEX.Z80 RATFOR Subroutine. 49.24 1K INDEXT.FOR Test for INDEX.Z80. 49.25 1K IOER.Z80 Used by LCAT (RATFOR). 49.26 1K LCAT.DOC Used to concatenate Microsoft 49.27 3K LCAT.RAT .REL files. 49.28 2K MINV.DOC Matrix Inversion Determinant 49.29 3K MINV.FOR Calculator, FORTRAN and 49.30 3K MINV.RAT RATFOR source code. 49.31 2K RATCOMNS.RAT Used by RATFOR. 49.32 3K RATFOR.DOC Documentation of RATFOR. 49.33 40K RATFOR.FOR FORTRAN source code for RATFOR. 49.34 25K RATFOR.RAT RATFOR source code for RATFOR. 49.35 17K RATFOR.REL Microsoft .REL file, does not include library routines. 49.36 1K READLB.Z80 Subroutine for SCOPY (RATFOR). 49.37 1K RFG.CMD CDOS equivelent of a submit file. (^=$). 49.38 1K SCOPY.DOC Direct Disk I/O (RATFOR). 49.39 2K SCOPY.FOR FORTRAN source code. 49.40 1K SORTI.DOC Quicksort program (RATFOR). 49.41 2K SORTI.FOR FORTRAN Source code. 49.42 3K SORTI.RAT RATFOR Source code. 49.43 1K TRNSLT.Z80 Used by RATFOR. NOTE: Most of the FORTRAN files on this disk will run on Z-80 processors only, some will run only with Cromemco CDOS. Check the abstracts and .DOC files for more details. CBIOS for Cromemco 4FDC or CCS 2422 disk controller 4FDCBIOS.Z80 and 4FDCBOOT.Z80 are the bootstrap and Cbios for running CP/M 2.x with a Cromemco 4FDC controller board, a Z80* cpu, and minimum 20K of RAM. CP/M 1.4 can also be supported if some of the 2.x-only code is removed. This code is also applicable to, and tested upon, the California Computer Systems disk controller board model 2422, if a serial port at 0 compatible with CDOS is used (a 3P + S, or a Cromemco TUART, or the serial port on a Cromemco Single Card Computer.) This source is capable of supporting three types of disks: 5 inch (such as Wangco), 8 inch (such as Shugart), and single-arm voice-coil 8 inch (such as Persci). Between one and four drives are supportable, but no intermixing. There is no current support for double-sided drives, but it should be easily addable. There is no support for the double density mode in the Cro- memco 16FDC, or the CCS 2422. This bios is limited to 128 byte sectors. The 8 inch format is compatable with all CP/M and CDOS versions currently known. The 5 inch format (skew of 5) is compatable with all 5 inch CDOS formats currently used. It is assumed that the main console, at port zero, is already initialized by RDOS or some other program. If not, you can insert the necessary code into 4FDCBOOT.Z80. As additional features, the routine contains an optional reader-punch and printer support routine, via TUART and PRI boards, and a standard missing memory check. The external interrupt of the TMS 5501 is enabled on the 4FDC, which causes a 0FF interrupt, which is the same as a missing memory board. I like to use this to break out of loops without losing CP/M. If this is not desired, it is easily removed from the code. Also, in a commented section is a small modification so the DEL key (07FH) is changed to a Control-U by the CBIOS, for those who have Backspace on the terminal. I do not like to use two hands just to be able to erase a mistake. The source is for Cromemco Z80 assembler, and there are five constants in the front to be changed to select various options. First, select the type of drive: If 5 inch, LARGESW and PERSCISW should be 0. If 8 inch Shugart, LARGESW should be 1, PERSCISW 0. If Persci, PERSCISW should be 1. LARGESW should also be altered in 4FDCBOOT.Z80. Next, NUMDRIVES should be 1 to 4 for 5" and 8" drives, and 2 or 4 for Persci double-disk drives. Then, to have support for printer and TUART, BIGIOSW should be 1, otherwise 0. You might also wish to change BAUDRATE to the desired value for the reader-punch (110 baud is supplied). Note: if the CCS 2422 is used, it may be necessary to supply an initialization and bootstrap routine for the console port, if that is on a TUART addressed at zero. The current code does not initialize the port at zero, assuming that has been done before the disk was booted. The code for the TUART referred to here is for an additional TUART port, not the console port, but it is easy to add the necessary code to initialize the console port also. Finally, set BEGINADR to the start of the CBIOS. It is supplied as 0E400, which is for a 64K system. This should also be altered in 4FDCBOOT.Z80. The switches on the 4FDC are set exactly as described in the board manual. For a system over 48K, the ROM must be disabled upon bootstrapping. For a smaller system, the RDOS can stay in, or not, as you desire. For a CCS 2422 controller, the same statement applies, except the 2422 ROM need not be dis- abled unless the system memory exceeds 60K. 4FDCBOOT.HEX and 4FDCBIOS.HEX are supplied, assembled from the source files. They are set for a 64K version of CP/M. You can use them in another system if you can put about 8K at the upper end of memory (E000) and maybe 16K at the low end (0000) to be able to re-assemble the files. GENERAL NOTES ON CDOS' UNDOCUMENTED FEATURES When CDOSGEN asks you whether the drive is large [L] or small [S] try answering 'X'. You will then get a menu for Shugarts, etc. You can use the 'SYS.DIR' FCB create call of CDOS 1.07 or higher to access the directory regardless of its size or position on the disk. Although the FCB created with this call is write protected, you can reset that attribute bit and can then write to the directory as well as read it. Disk Labels. A directory label is written to the disk by STAT and is used to ascertain the storage capacity of the disk and the number of directory entries (64 to 512). The last 8 bytes of the first boot loader sector (usually side 0 track 0 sector 1) are always recorded in single density and contain eight bytes indicating the type of disk to the BIOS, eg LGSSSD for Large (8"), Single Sided, Single Density or LGDSDD for 8" Double Sided, Double Density diskettes (1.2 MBytes) STAT 2.15 was written for a WD1797 FDC chip (it records the side numbers into the address fields) although a WD1793 was eventually used. CDOS 2.36 does not support the 1797, however, and this chip will not work instead of the 1793 on the 16FDC. Double Density Recording Format: 16 sectors of 512 bytes are used per track.(MFM) A 12 interleave is used (1,C,7,2,D,8,3,E,9,4,F,A,5,10,B,6) Although a 4 interleave can be read as COM files in my 4MHz no wait state system a 6 interleave speeds throughput by a factor of two. (use 1,2,3,4,5,6,C,D,E,F,10,7,8,9,A,B). INIT can be modified to do this.. if interested write me and I will disclose all.... Finally, if someone has deciphered how to call the 2.36 BIOS directly without getting error returns I am all ears... Trevor Marshall, 26 Mirrelia Way, Ferndale, Western Australia 6155 phone International (619)4576049 or national (09)457 6059 14 December 1980 Notes added by: Chuck Weingart February 1, 1981 2152 W. Iowa Chicago, Ill 60622 On the "X" feature of CDOSGEN, described above, you must respond to several questions, such as "Fast or Slow", "Single or Double". All Shugart type drives are "slow". "Double" drives are those like the Persci, that have one seek mechanism for two different disks, or when you are using a Shugart 851 double sided drive as two "drives" (one "drive" on each side, requires rewiring the cable). In CDOSGEN 2.36, when you respond "S" to the drive type, you again get a "Fast or Slow?" question. MPI drives are "fast", and Shugart 400 and Wangco drives are "slow" in my experience. It is easy to attach one of the new Shugart 801/851 drives to the 4FDC, just use the "TS" data separator (install the jumper). If you are trying to use an old 800-1 or 801 drive, the data separator adjustments probably have to be changed to work with the 4FDC. To attach the MPI model 52 double-sided 5" drive to a 4FDC, just add a jumper on the 4FDC from J4 pin 21 to J2 pin 32, if one is not already there. Then gen a 5" double-sided drive at that position with 2.17 or greater, initialize some disks with INIT, and write a double-sided label with STAT, and you are ready to go. I converted to double-sided in one hour, and it's great! To attach a Shugart 851 to the 4FDC, install the TS jumper as noted above. Disconnect the wires 2, 12, 18, and 32 from the cable (at the drive end is easiest). Connect the Shugart pin 12 to the 4FDC pin 2 (for side select), Shugart pin 30 to 4FDC pin 4 (for Drive select 3), and Shugart pin 32 to 4FDC pin 18 (for Drive select 4). Connect a jumper from J4 pin 21 to J3 pin 2 if one is not already there. Use the "X" feature and 2.17 or greater, initialize disks with INIT, and label the disks with STAT for double-sided operation. CDOS 1.07 can be used unchanged on the California Computer Systems 2422 disk controller if there is a Cromemco compatible console port at 0, such as a 3P + S, Cromemco TUART, or the console on the Cromemco SCC. The latter will have to have two modifications made: the prom (U25) must be altered to put the parallel port at address 04 somewhere else (such as 0E), and there must be a 220 ohm resistor in series with U52 pin 6 (to delay PWR) and a 400pf capacitor from U52 pin 6 to ground (pin 8). CDOS 2.17 can be used on the CCS 2422 controller in single density if one uses the 1.07 bootstrap loader. The 2.17 bootstrap will not work without a hardware change on the 2422 board, and it is somewhat lengthy. There will be a persistent problem of read errors on track 2 sector 1, but this is due to the WD1793 chip. Just Retry the operation and it will clear up every time. CDOS 2.17 has a command, VERIFY, with one of three operands. VERIFY ON will enable read-after-write verification on the disk. VERIFY OFF will disable that, and just VERIFY will indicate the status of the feature. VERIFY is not present in CDOS 2.36. CDOS 2.17 and up has several undocumented commands: REM and ATTR. ATTR is the same as ATRIB, and REM is for inserting remarks into your batch file, because the REM line is ignored. Although it isnt currently stated in any Cromemco doc- umentation that I have seen (and I have written Cromemco twice about it with no answer), all versions of Cromemco software shipped since about February 1980 come with the system genned for 64K. If you have a copy of CDOS 1.07, you can run the 2.17 or 2.36 versions of CDOSGEN under 1.07 in order to generate a smaller system. The new versions of CDOSGEN will not run in a 32K system, tho, they are quite a bit bigger. For users of non-Cromemco memory boards that want to get a "full house" (64K), here is how to add a Phantom signal to the 4FDC. Add a jumper from IC46(74367) pin 15 to IC31(2708) pin 20. Add a jumper from IC46 pin 12 to pin 8 (ground). Add a jumper from IC46 pin 11 to S100 pin 67 (Phantom output). The memory board addressed at C000H must respond to the Phantom signal, of course. The RES switch (SW2) must be set on. This way, you can use the 4FDC RDOS program until CDOS is booted, then the EPROM will be turned off and the memory board "behind" it can then be used. This method must be used even in many boards that are advertised as "Cromemco banking compatible" because the boards do not have the feature of being bank-disabled upon power-up. CDOS 2.17 now takes about 11K minimum for itself. CDOS 2.36 now takes 14K minimum. STAT for 2.36 has several undocumented switches: /M, /N, /E, and /EZ. STAT/M allows you to change the "master" drive (the one that CDOS looks at if it cant find a program on the current drive). STAT/N gives a 5-up directory display. STAT/E is a directory erase, with prompting. STAT/EZ erases, and no prompts as I recall. Jordan Siedband tells me that 2.36 will not read CP/M disks correctly, cause unknown. Keep a copy of 2.17 around if you want to continue to use CPMUG stuff. There is one thing that is obvious to anyone who has looked: CP/M and CDOS directories are compatable only in "1.4 mode", that is, no system flags of any kind set in the directories, either CP/M 2.2 flags or CDOS flags. When they are not compatable, the one operating system will usually clobber directory entries in the other format or refuse to work. CDOS 1.07 and up have an undocumented error message: LOGICAL DISK ERROR n. This message is produced if you do something like request a track that does not exist, or a sector that does not exist, or try an operation that is impossible for the drive to perform. You will generally get these messages only if you are trying to do disk I/O thru the "BIOS" directly. There is a small bug in the Divide Integers CDOS call (8AH) in 2.17 - the BC register will be altered. No problem in 1.07 or 2.36 as far as I can tell. All versions of CDOS have the CP/M "BIOS" jump table in them, but none of them use it. That is, you can jump to the entries in this table, but cannot modify the jump addresses in the table and expect it to work. The first entry in the table, the "cold start" jump, is a jump to itself, because CDOS never uses this entry, and the user is not supposed to use it, either. This makes routines like FAST rather difficult to use under CDOS. Some CPMUG programs set themselves below the operating system by changing the address at location 6, but that will not work under CDOS. You can use the CDOS call 97H to do the same thing, see the manual for details. All versions of CDOS I have used try to initialize all TUART ports in the system. That is, they will output to ports 12, 13, 22, 23, 52, 53, 62, ... F2, and F3. If you have some other hardware at those addresses, good luck. CDOS will also zero out the Dazzler port at 0E every time it starts disk I/O. CDOS 2.17 and up will disable all interrupts when doing disk I/O and never re-enable. This means you can't use the timer interrupts available in the TMS5501. If anyone figures out what attributes S and U are, I would like to know. They can be set, reset, and listed, but dont seem to make any difference to the operating system. Could they be used for Hard disk files? SCOPY enables you to search a strange disk on drive B for ASCII files which may not be recoverable via a directory, and copy them to an MCOS file on drive A. This should permit recovery of files which have been erased, and is also intended for recovery of files from ISIS or GE disks. ABSTRACTS FOR CP/M USERS' GROUP VOLUME 49 ----------------------------------------- This volume consists mostly of Rational Fortran (RATFOR) files. A letter and abstract by the author are presented here, as well as several abstracts on various files by Chuck Weingart of the Chicago Area Computer Hobbyist Exchange. Please note that some of the files on this disk rely on Cromemco CDOS calls and are not compatible with "standard" CP/M systems. Almost ALL FORTRAN and RATFOR files require a Z-80 processor. See the abstracts by Chuck which point these out. 01/28/81 Jim Mills, CACHE SIG CP/M Chairman ------------------------------------------------------------ 1 E. Lakeview Dr. #17 Cincinnati, OH 45237. Oct 1, 1979 CP/M Users Group --etc-- I have enclosed a disk which has RATFOR.RAT adapted for Fortran-80. This gives essentially identical results to your volume 24 RATFOR.COM but is somewhat faster and gives people the chance to play with it. Also the foreign .COM file is hard to work with. I had to write a special program to copy it correctly on my system. The disk also has some useful sample programs. Tim Prince ------------------------------------------------------------ This disk contains mainly utility programs associated with the Ratfor preprocessor and helps to bring some of the FORTRAN 77 functions into FORTRAN-80. The Ratfor follows the Addison- Wesley code closely but uses BYTE variables as appropriate. Transliteration, which is done inefficiently in the A-W ver- sion, is omitted. The matrix inversion-determinant calculator MINV and the address quicksort SORTI are given as examples of the use of Ratfor. The INDEX subroutine is given both in FORTRAN (in F77LIB) and Z80 versions. As FORTRAN-80 does not permit the usage of this function to be as in FORTRAN 77, the calling sequence is somewhat arbitrary. LCAT, for concatenating .REL files, calls assembler library functions which may not be available on some systems. However, the .COM file may work anyway. SCOPY calls the READLB subroutine which will have to be rewritten for systems which do not support the same extended CP/M calls. Tim Prince ------------------------------------------------------------ REVIEWS BY CHUCK WEINGART RATFOR is a preprocessor for FORTRAN source programs which facilitates control constructs and text insertions, described in "Software Tools" by Kernighan and Plauger (Addison-Wesley). RATFOR source code is free form, with statements separated by ; or [CR]. Ratfor statements include extensions to Fortran such as IF ELSE, WHILE, REPEAT UNTIL, FOR, BREAK, NEXT, and INCLUDE. An earlier version of RATFOR.COM is in CPMUG V.24. This new version runs only on a Z80, is faster, has documentation (RATFOR.DOC), source (RATFOR.RAT, RATFOR.FOR), and uses RATCOMNS.RAT and TRNSLT.Z80. The resulting Fortran program is then compiled with Microsoft FORTRAN-80 or Cromemco Fortran, V3.21. This should run on any version of CP/M that supports the Fortran and has a Z80. (reviewed by Chuck Weingart) F77LIB.FOR is a file containing definitions of most of the new intrinsic functions in FORTRAN 77. These functions can be employed by searching the file F77LIB.REL which will be created by compiling F77LIB.FOR There is also an INCLUDE file CONSTS.RAT which automatically defines some frequently used constants. INDEX.Z80 is a subroutine given both in FORTRAN (in F77LIB) and Z80 versions. They are written in Cromemco Z80 Fortran and assembler language, but should be acceptable to Microsoft versions. INDEXT.FOR is a test for INDEX. There is some Fortran-77 documentation in F77.DOC and F77DEF.DOC. (reviewed by Chuck Weingart) LCAT.RAT are for concatenating Microsoft .REL files, described in LCAT.DOC. It calls CDOS Z80 assembler library functions which are not be available on CP/M systems. This is written for RATFOR, and uses ASMDEF.RAT and IOER.Z80, written in Cromemco Z80 assembler, Microsoft will also work. There are two possible problems with this routine, both related to the end-of-file. First, some versions of Microsoft Fortran did not put an eof (1A hex) at the end of the REL library. Second, this program stops if it hits 9E1A Hex, and there is a small chance of that ocurring in the middle of a file, so don't destroy your old library before checking the output of LCAT. (reviewed by Chuck Weingart) MINV.RAT and MINV.FOR contain a subroutine which inverts a matrix and calculates the determinant. It does not have any protection against the case where the equations are of wildly different orders of magnitude. There is a test case included in the file. These are included as tests for RATFOR, and the Fortran version will run on Microsoft or Cromemco Fortran, V3.21, any supported size and version of CP/M or CDOS, respectively. The DOC file includes some, but not all, info needed to use. Look at the test file included for more. (reviewed by Chuck Weingart) SORTI.RAT, SORTI.FOR are an address quicksort with a test driver program. Unfortunately, although the FORTRAN appears essentially identical to a successful program developed on a large system, the Microsoft version doesn't work yet. They are given as examples of the use of RATFOR. The SORTI.DOC file has some information describing the use of this routine. The FOR file will compile on Microsoft or Cromemco Fortran, V3.21, with any supported CP/M or CDOS, respectively. (reviewed by Chuck Weingart) SCOPY.FOR does direct disk I/O, either disk to disk or disk to console, described scantily in SCOPY.DOC. The FOR file should be useable by any Microsoft or Cromemco Fortran, V3.21. It calls the READLB.Z80 subroutine which will have to be rewritten for systems which do not support the same CDOS calls. READLB is written in Z80 assembler, Microsoft is acceptable. (reviewed by Chuck Weingart) ------------------------------------------------------------ NON-RATFOR PROGRAM REVIEWS FILTER.ASM FILTER.HEX FILTER2.ASM FILTER2.HEX FILTER.ASM is source taken from an article by J. Warner in the January, 1980 issue of Dr. Dobbs. It implements two essential CDOS calls, 80H and 86H, to allow some Cromemco software to run under CP/M*. This is commented Zilog Z80* source, and can be assembled by Microsoft or CDOS* assemblers. The chicken-egg problem is avoided by supplying the FILTER.HEX file to bring up the CDOS assembler. As supplied, Cromemco Fortran IV and COBOL will not work with it, more functions must be added. This routine is installed by making it part of the memory image of a program: using DDT, load FILTER.HEX, then load the Cromemco program starting at 200H, and then save the combined programs. When it gets control it boosts the function code filter into place at the top of the TPA and then moves the original program down to 100H and jumps to it. (reviewed by Chuck Weingart) FILTER2.ASM is the source for a modified version of FILTER.ASM, primarily minor improvements and one bug fix. More comments are also included from the original article in DDJ. The same installation procedures and comments as FILTER apply to FILTER2, including FILTER2.HEX. (FILTER2 is from the reviewer, Chuck Weingart.) Warning: CP/M and Cromemco CDOS directories are partially in- compatable. The first byte of each FCB must be made zero (1.4 mode). These routines do not allow most Cromemco software to run on non-Cromemco equipment. They are supplied here to let the Cromemco owner run his/her legitimately obtained programs under CP/M on Cromemco hardware. It does not appear that any any software supplied with versions of CDOS after 2.17 are compatible with CP/M (2.2) with FILTER. 4FDCBIOS.DOC 4FDCBIOS.Z80 4FDCBIOS.HEX 4FDCBOOT.Z80 4FDCBOOT.HEX 4FDCBIOS.Z80 and 4FDCBOOT.Z80 are the cbios and boot programs for running CP/M 2.x on a Cromemco 4FDC disk controller board, or a California Computer Systems 2422 disk controller, with a 3P + S or Cromemco TUART or similar console port at address 0. Assembly options include memory size, one to four drives, supp- ort for 5", 8" Shugart, and 8" Persci drives. Drivers for the Cromemco TUART for paper tape and Cromemco printer board are optionally included. The source is moderately commented, not structured, in Cromemco Z80 assembler; Microsoft can also be used. The source is supplied for two 8" Shugart drives and 64K, and 4FDCBIOS.HEX and 4FDCBOOT.HEX are the assembled output files. Since the 4FDC is designed for the Z80*, conversion to 8080 would be difficult. 4FDCBIOS.DOC contains detailed doc- umentation. (abstract by Chuck Weingart) CDOS.DOC This is an accumulation of comments by Trevor Marshall and this reviewer for users of Cromemco hardware and software. Nothing can be guaranteed, but everything is true as far as can be checked. (No attempt is made to help those who want to run the cheap Cromemco programs on CP/M without buying any Cromemco hardware). Must reading for CDOS users who participate in CPMUG. (reviewed by Chuck Weingart) CDOSCOPY.COM CDOSCOPY.DOC CDOSCOPY.HEX CDOSCOPY.PRN CDOSCOPY.Z80 CDOSCOPY is the COPY program, CPMUG 1.3, converted to Z80 and extensively rewritten by Trevor Marshall to work on the Cromemco CDOS operating system. The program supports 8" disks, single or double sided, single or double density. It is possible to con- vert the program for 5" disks, see the DOC file for details. As supplied, would require a 48K system to copy double-density disks, but I have not personally been able to verify operation that way. The program runs correctly, but unfortunatly slower than the COPY program because of CDOS internal operations. A single-sided, single density disk copies in around 5 minutes. Supplied are the source file (.Z80), the output (.HEX), the print file (.PRN), and the executable program (.COM). This pro- gram runs only on a CDOS system, with all Cromemco hardware as required by that operating system, and assembles only with the Cromemco Z80 assembler. (reviewed by Chuck Weingart) ASTRO.FOR is a series of Fortran routines to do astronomical calculations. (Borrowed from an old SMITHSONIAN ASTROPHYSICAL OBSERVATORY computing note.) Of only specialized interest but for the DECML, IDECML, and KDECML; These are routines for free format reading from Fortran. They are used by reading the characters into a LOGICAL*1 array of dimension of say 80, using a format of say 80A1. Successive calls to DECML as a function then give the real numbers on that line. The variable N is a pointer, the current column of the input buffer. Can be com- piled by CDOS or Microsoft Fortran IV, tho their usefulness can only be judged by an astronomer. (Reviewed bu Chuck Weingart) * Please note that Z80 is a trademark of Zilog, Inc. CP/M is a trademark of Digital Research, and CDOS is a trademark of Cromemco, Inc. Use of the term Z80 in this application is in no way meant to imply that this program was written by Zilog, (or Digital Research, or Cromemco).