CPMLIB DOC CPMLIB DOCCPMLIB MODCPMLIB REL)DIVCOM SRTINT% DIFLIM% DIFLOG% ALG would. Then, in the LINK-80 step, request a search of CPMLIB prior to the normal search of FORLIB. For example: L80 prog,CPMLIB/S,FORLIB/S,prog/N/E The search of CPMLIB should come before the search of FORLIB. The routines available in the Cns. By means of this library, the following CP/M functions may be added to any FORTRAN program: Input a character from the console without a terminating carriage return. (Two forms of this function are supported.) Test for the presence of a fYZZY SRT [\Z/REFC SRT]ZXXZ SRT^FILES CRC _`-level" routines are: FCB$ ..... Build a CP/M File Control Block. FNAME$ ... Extract a CP/M File Name from a string. MAP$ ..... Map character to upper case. ERROR$ ... Print error messages from the library. Finally, there are the machine-level cMUMATH% DOC`!"#$%&'()*+,LPFILTANBAS@-./01234LPFILTANINT5678MPYCOM SRT9MTXMPY SRT:PAR/SER SRT;POL/REC SRT<REC/POL SRT=ese are described first. The "high-level" routines are: EXIST .... Test for presence of a file. ERASE .... Erase a file. GETCMD ... Get the command line "tail". INCHR .... Input character from console (with echo). INKEY .... Input character fromile. Erase a file or group of files. Rename a file. Get the command line "tail" as program input. The library is made up of three levels of subroutines. The highest level are those routines normally called from within a user program. Thalls to BDOS. Normally a user program will not call these routines directly. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To use the library, you just need to CALL the appropriate routines from your program. Compile as you normally CPMLIB.DOC Version 1.0 January 12, 1982 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPMLIB is a library of routines which can be called from Microsoft FORTRAN-80 programs to interface with selected CP/M CCP and BDOS functioREFC/Z SRT>SER/PAR SRT?SERIES% DIFI@ABCDEFGHISMATX SRT JKSOLVE4% EQN'LMNOPTEST FOR$QRSTUTRGNEG% ALGVWXXMATS SRT YZ console (without echo). RENAME ... Rename a file. Second is a group of routines which provide support to the high-level routines. These may also be called from a user program if required. They are described at the end of this document. The "lowPMLIB are: CALL EXIST ( NDRIVE, STRING, NBYTES, IOK ) CALL ERASE ( NDRIVE, STRING, NBYTES ) CALL GETCMD ( STRING ) CALL INCHR ( NOPT, CHAR ) CALL INKEY ( NOPT, CHAR ) CALL RENAME ( NDRIVE, FNOLD, FNNEW, NBOLD, NBNEW ) CALL FCB$ ( STund, a NO FILE error will be generated. Output Arguments: IOK ...... Returned value: 0 = file doesn't exist 1 = file exists * * * * * * * * * * * * SE ( NDR, FILNAM, NLONG ) Assuming that, in the last example, NDR = 2, FILNAM is a byte array containing "ab.x", and NLONG = 4, then all of the examples will erase the file AB.X on drive B:. * * * * * * * * * * * * * * * * * * * * * * Usage: CALL ERASE ( NDRIVE, STRING, NBYTES ) NDRIVE = < integer > STRING = < byte array > NBYTES = < integer > Erase a CP/M file. The file being erased shoultes in the STRING array. If entered as zero, the STRING will be assumed to be 11 bytes long, with the file name blank filled (in the same format as for a Microsoft OPEN call). In this mode, the drive cannot ode, the drive cannot be passed in the file name. Note: The drive may be specified in several ways. If more than one specification is used, they must all agree or a DRIVE CONFLICT error will be generated. If the file to RING, LSTRNG, FCB ) CALL FNAME$ ( STRING, LSTRNG, NDRIVE, FILNAM ) CALL MAP$ ( AIN, AOUT ) CALL ERROR$ ( NERROR, ANAME, ARRAY ) A detailed description of each routine follows: + + + + + + + + + + + + HIGH LEVEL ROUTINES + + + + + + > STRING = < byte array > NBYTES = < integer > IOK = < integer > Test to see if a file exists. Input Arguments: NDRIVE ... Drive number (1=A:, 2=B:, etc.) If entered as zero, then the currently-logged drive is u * * * E X I S T * * * * * * * * * * * * * Usage: CALL EXIST ( NDRIVE, STRING, NBYTES, IOK ) NDRIVE = < integer d be closed before this routine is called. Otherwise, duplicate FCB's will exist for the file and unpredictable results may occur. Input Arguments: NDRIVE ... Drive number (1=A:, 2=B:, etc.) If entered as zero, then the currently-logged be passed in the file name. Note: The drive may be specified in several ways. If more than one specification is used, they must all agree or a DRIVE CONFLICT error will be generated. If the file to be erased cannot be fobe erased cannot be found, a NO FILE error will be generated. Output Arguments: (none) Examples of valid calls: CALL ERASE ( 0, 'b:ab.x', 6 ) CALL ERASE ( 2, 'AB.X', 4 ) CALL ERASE ( 2, 'AB X ', 11 ) CALL ERA+ + + + Primary Entry Points into the Library * * * * * * * * * * * * * E R A S E * sed unless the STRING array contains a drive specification in the file name. STRING ... A byte array containing a valid CP/M file name. The name may contain a drive specification if desired. NBYTES ... The number of byS ... The number of bytes in the STRING array. If entered as zero, the STRING will be assumed to be 11 bytes long, with the file name blank filled (in the same format as for a Microsoft OPEN call). In this m drive is used unless the STRING array contains a drive specification in the file name. STRING ... A byte array containing a valid CP/M file name. The name may contain a drive specification if desired. NBYTE * G E T C M D * * * * * * * * * * * * * Usage: CALL GETCMD ( ARRAY ) ARRAY = < byte array > This routine will get the "command line tail" and ents: NOPT ..... Option for interpretation of input character. (Add the following values together to determine the value to use.) 0 = (no option) 1 = wait for a character to be typed 2 = map low NOPT = < integer > CHAR = < byte > This subroutine reads a character from the console. The character is immediately echoed to the console. It is also returned as the value of the argument CHAR. If no character is pending at the console, e does is pass it to the FORTRAN program, after leading blanks are stripped off. Some other considerations: You MUST get the "tail" before any disk operations are performed in the program. Otherwise, CP/M may overwrite the command lin* * * * Usage: CALL INKEY ( NOPT, CHAR ) NOPT = < integer > CHAR = < byte > This function reads a character from the console. The character is not echoed to the console. It is returned as the value of the argument CHAR. If noay will contain the number of characters to follow. Only these characters are valid. The remainder of the array will be unchanged from its original contents, or will contain "garbage". pass it into the calling program. Leading blanks are stripped off. The "tail" is that part of the command line that follows the program name. For example, if the following line were typed at the console following a CP/M prompt: b:foo opti(Add the following values together to determine the value to use.) 0 = (no option) 1 = (no option) 2 = map lower case alphabet to upper case 4 = stop execution if ctrl-C Output Arguments: CHAxecution halts until a character is typed. The character is transmitted as soon as it is typed. The RETURN or ENTER key is not required to complete the entry. Input Arguments: NOPT ..... Option for interpretation of input character. e buffer during a disk operation. Thus, you should call this routine as one of the first activities in your program. You should scan the "tail" carefully, watching out for trailing and imbedded blanks. The line will be passed e character is pending at the console, the NUL character (ASCII 0) is returned and execution of the program continues. The character is transmitted as soon as it is typed. The RETURN or ENTER key is not required to complete the entry. Input Argum * * * * * * * * * * * * * I N C H R * * * * * * * * * * * * * Usage: CALL INCHR ( NOPT, CHAR ) ons:a,c,d,f,l the system would load program FOO.COM from drive B: and the "tail" would be the character string OPTIONS:A,C,D,F,L. CP/M will always map the command line to upper case. The user's program must interpret the "tail". All this routineR ..... The resulting character. * * * * * * * * * * * * * I N K E Y * * * * * * * * * "tail". Otherwise, important data or program instructions may be overwritten by the command line information. Dimensioning the variable to 80 bytes is usually sufficient. The FIRST BYTE of the returned arrxactly as typed except for mapping to upper case. Input arguments: (none) Output arguments: ARRAY .... This is a byte array, which must be dimensioned in the calling program to a length sufficient to hold the entireer case alphabet to upper case 4 = stop execution if ctrl-C Output Arguments: CHAR ..... The resulting character. * * * * * * * * * * * * * R> FILNAM = < byte array > Subroutine to extract a CP/M file name from an input character string. Complete error trapping is NOT included in this routine. Thus, the programmer should excercize some caution in the use of this routine. Asterisks (*xample, NDR = 2, FIL1 is a byte array containing "ab.x", FIL2 is a byte array containing "cd.y", NB1 = 4, and NB2 = 4, then all of the examples will rename the file AB.X to CD.Y on drive B:. + + + + + + + + + + + + LOW LEVEL ROUTINES + + + + + DRIVE ... Drive number (1=A:, 2=B:, etc.) If entered as zero, then the currently-logged drive is used unless the FNOLD or FNNEW array contains a drive specification in the file name. FNOLD .... A byte array containing ang. The first 12 bytes will be initialized to the drive and file specified in STRING. The remainder will be zeroed. * * * * * * * * * * * * If the new file name already exists, a FILE ALREADY EXISTS error will be generated. If the old file cannot be found, a NO FILE error will be generated. Output Arguments: (none) Examples of valid calls: CALL RENAME ( 0 E N A M E * * * * * * * * * * * * * Usage: CALL RENAME ( NDRIVE, FNOLD, FNNEW, NBOLD, NBNEW ) NDRIVE = < integer > FNOLD = < byte array > FNNEW = < byte array > * * * * * * * * * * * * Usage: CALL FCB$ ( STRING, LSTRNG, FCB ) STRING = < byte array > LSTRNG = < integer > FCB = < byte array > Subroutine to build a valid File Control Bl+ + + + + Service Routines for High-Level Routines * * * * * * * * * * * * * F C B $ * valid CP/M file name. FNNEW .... A byte array containing a valid CP/M file name. The name may contain a drive specification if desired. FNOLD is the old name; FNNEW is the new name. NBOLD ... The number of bytes in th * F N A M E $ * * * * * * * * * * * * * Usage: CALL FNAME$ ( STRING, LSTRNG, NDRIVE, FILNAM ) STRING = < byte array > LSTRNG = < integer > NDRIVE = < integer , 'b:ab.x', 'cd.y', 6, 4 ) CALL RENAME ( 0, 'ab.x', 'b:cd.y', 4, 6 ) CALL RENAME ( 2, 'ab.x', 'cd.y', 4, 4 ) CALL RENAME ( 2, 'AB X ', 'CD Y ', 0, 0 ) CALL RENAME ( NDR, FIL1, FIL2, NB1, NB2 ) Assuming that, in the last e NBOLD = < integer > NBNEW = < integer > Rename a CP/M file. The file being renamed should be closed before this routine is called. Otherwise, duplicate FCB's will exist for the file and unpredictable results may occur. Input Arguments: Nock (FCB) Input arguments: STRING ... Input string ( a byte array ) of length LSTRNG LSTRNG ... Integer value is length of STRING array in bytes. Output arguments: FCB ...... The completed FCB ( a byte array ) which must be 36 bytes lo call). In this mode, the drive cannot be passed in the file name. Note: The drive may be specified in several ways. If more than one specification is used, they must all agree or a DRIVE CONFLICT error will be generated. e FNOLD array. NBNEW ... The number of bytes in the FNNEW array. If entered as zero, the array will be assumed to be 11 bytes long, with the file name blank filled (in the same format as for a Microsoft OPEN) are expanded into questions for the file name and file type, and drive information is extracted if it is included in the string as the first character followed by a colon (:). Thus, all valid CP/M file descriptions will be handled properly. Inputse are somewhat interdependent, and should be arranged so that a single search through the library can resolve all references. The last level contains the assembly language routines that perform the CP/M function calls. They should be last, s< byte array > Error printing routine. Input Arguments: NERROR ... Number of the error message to print. ANAME .... A six-byte name for the routine which called the error. ARRAY .... A byte array, the contents of which depend on ly 11 characters. The format of the output arguments is such that they serve two purposes: 1) To construct a Microsoft FORTRAN call to the OPEN subroutine, use the form: CALL OPEN ( lun, FILNAM(2), NDRIVE ) where 'lun' is the unit nu.COM, M80.COM and LIB.COM. The CPMLIB files are assumed to be on drive B:. A) CPMLIB structure CPMLIB.REL should be thought of as being divided into three levels of subroutines. The first are the primary entry points from FORTRAN programs. acter, no mapping takes place. Input Arguments: AIN ..... The one-byte value to be mapped. Output Arguments: AOUT .... The one-byte value mapped to u.c. * * * * * * * * * * * * Arguments: STRING ... Input string ( a byte array ) of length LSTRNG LSTRNG ... Integer value is length of STRING array in bytes. Output Arguments: NDRIVE ... Integer value of drive number: 0 = logged in drive 1 = drive A: the error being processed. Output Arguments: (none) x-byte name for the routine which called the error. ARRAY .... A byte array, the contents of which depend on mber. Specifying FILNAM(2) in the argument list passes the address of the second element which is the first character of the 11-byte file name. 2) To construct a CP/M file control block (FCB), use the FILNAM array as the first 12 bytes of tThese routines are all at the beginning of the library. Since there is no interdependence between them, they have been placed in alphabetical order. The second level contains various service routines for the primary entry point routines. The * E R R O R $ * * * * * * * * * * * * * Usage: CALL ERROR$ ( NERROR, ANAME, ARRAY ) NERROR = < integer > ANAME = < byte array > ARRAY = 2 = drive B: etc. FILNAM ... Output string ( a byte array ) of length 12. The first byte duplicates the drive value in NDRIVE. The remaining bytes are the name and extension, blank-filled to exact CPMLIB.MOD This is a short guide to modifying the contents of CPMLIB.REL. In the examples that follow, the "system disk" is assumed to be on drive A:. That drive is assumed to contain the Microsoft FORTRAN-80 package, including F80.COM, L80* * * * * * * * * * * * Usage: CALL MAP$ ( AIN, AOUT ) AIN = < byte > AOUT = < byte > Map a lower case character to upper case. If the input character is not a lower case alphabet charhe FCB, and the drive specification will be placed in the first byte as required. * * * * * * * * * * * * * M A P $ * ince they can be called by any of the higher-level routines. The first two levels are written in FORTRAN and are contained in the file CPMINT.FOR which stands for CP/M INTerface. The third level routines are written in assembly and are contUQ dtUD4Hy=I1%E@%` h-%`X! a``@V 8 ,Xn£@~@|"E@X$F"`#h b`V X2~`b=OIǕJaА g|e B:X2~0X``(`PV; Once the new or modified routines are compiled and assembled, use the LIB-80 program to construct your new library. LIB works on the currently-logged drive, so log in to drive B: if that is where the CPMLIB files are. A>B: B>A:LIB *PMINT.FOR. Then, recompile the entire FORTRAN file. A>F80 =B:CPMINT.FOR If new BDOS function calls are required, set the appropriate equates in CPMFN.MAC and reassemble it. A>M80 =B:CPMFN.MAC Otherwise, you may need to write a new as@g|e 8B3@p8G@m2e` a1FCB$؀d5cERROR$נ:QTTgQVT TU5Hy=I1%E@b,>p(4?)`S*% ~,h*}\Xc`(,h1.4`0h: |"n*tions are in the file CPMFN.MAC / CPMFN.REL and the entry points contain the BDOS function number -- CPMF19, for example, is the entry for BDOS function number 19. Additional routines are in files with alphabetic suffixes. The first (and only) ained in the files CPMFN.MAC and CPMFNA.MAC. CPMFN.MAC contains the BDOS calls, and CPMFNA.MAC contains the command line routine. Both of the assembly language routines assume a standard ORG 0000H version of CP/M. If your CP/M has a different NEWLIB=CPMINT,CPMFN,CPMFNA */E Test the new library. If it is OK, then you can erase the old library and rename the new one. B>ERA CPMLIB.REL B>REN CPMLIB.REL=NEWLIB.REL sembly language routine. You will also need to reassemble to change the CP/M origin if your version is not ORG 0000H. In this case, all .MAC files will need to be edited and reassembled. By convention, the high level routines are all writte 4cV?j?d |eXZA`-@fc{UiSy8g>֮cьO݄LaXe@8C@u8Frc3K5)6[`p1aP &; AeT&FC@" e#!Fm2j1g")'Ly@`k *jfile in this category is CPMFNA.MAC / CPMFNA.REL for command line processing. The second would be CPMFNB, etc. While not essential, this convention does define an orderly system for naming the routines in the library. C) Rebuilding the Libraryorigin, you will need to reassemble these two routines. B) Adding or Changing Functions New functions can be added by writing the appropriate FORTRAN interface routine. That routine, and any support routines it needs, should be inserted into CQTT`TU$4Xy=I1%E@b,`4(R Ȣ h`- `Poc V?j?-@c Xq3@7q5PV Ff7@W1h=c S,h*Ơ:ZX-XnX#3bj{JI9s֌g|e c:,@XCsolves all references. The ERROR$ routine is placed last in the FORTRAN section, since in the future any of the other routines may issue a call to it. The assembly routines are all named with a prefix of CPMF (for CP/M Function). The BDOS funcn with no interdependence. They are inserted at the beginning of the library in alphabetical order. The secondary FORTRAN routines all have names ending with a dollar sign ($). They must be arranged so that a single search thru the library ree&5 @d!&' m#Q 5pRST4(y=I1%E@b,.A80X#3ώ`XZFP*`fPX`V?g>X:}QXZFP@ 2e@ c7*H5xT4)RSV`T0)mPP1, N !i7L)o9 mP3.L2@@Mdh&HedȓZ(ERROR$PQT5c A5CPMF17QN`d5c#9@@aѐpI9taӐLf@wd`ESeh*wX2DU0" (USULdS% c j &1@,F*@1 bPj?c|eU@b,@1=bE,R*?pYOݔ,R1fbb0H݄ *a Xx&/BF+u8dEXhU!VX{J*1d #! R2*PT &Q I8PT DHy=I1%e&.~:ZZ#-@#qe&2@!Ơ adp`o>֮cz@YnYC@,*:ZX#-@fc{UiSy8g>֮cьO8݄LyXZAdp Ff7X7sj?#-Tb2:j)G["EX@V`Pȋ C|G&ma*͹,;1Tͻ@"EX@V`0ȋ CG&m#a *ͦ`L:l1CͧBEX@V`0ȋ CV&m]a *ͭS&LXb- %`؂1 Sr Dxi6Dqab,q`bA 8\,XnXpE`UnV?Y*zN2@ vP>HƤUXpUb,F*À,T: v*À?pYO݄ *a Xx&9"F+u8dEXhUVX{J+fFi":RSVgSSQ`e$TXy=I1%E@b,>p(4 4-e`<\nK1<\x%t*Vf |-!` h HU@h8U@6h"Ȁl2p}\O8ݔ0!Yb*:ZZ#-@#qC@G&ma*2ͻ ;1R`P%-@ (e 3oHaVX 2"@$ LEX@F>%GʷpxL!X@UnV :6l|fVQ8,ڄè3p! !X@UnV :6|fVQ8\%@ "*`Vf @e #' MQ# pSQI ddRHy=I1%E@b,>p(4 %Դ<\2.K pZ!b s  GDXxuXx*ÀXDXxuXx*À11*>'TpuXTuXXU@¬w,@!XpUnV,Yn8,# 4a)qxfҐ&,pXG@m82e Pa15 0FC@" g#' Fr@b2$f!&Cj1e ")'LQ`jH)Љ Dd4"Hy=I1%E@b,`4(- @,*XDX(uX(*1*>'T< bsj FqP m8Q`d5d@xEG(h.T`Gs &Z<j 3LdS% c j &QN`d5c#9@@aѐpI9taӐLf@wd`ESeh*wX2DU0" (USULdS% c j &------------------------------------ FUNCTION ERF(EX1), WHEN EX1 EQ MINF, -1 EXIT, WHEN EX1 < 0, -ERF(-EX1) EXIT, WHEN ZERO(EX1), 0 EXIT, WHEN EX1 EQ PINF, 1 EXIT, SIMPU('ERF,EX1), ENDFUN $ --------------------------------- PROPERTY LIM, ERF, FUNCTION (EX1), WHEN (EX1:LIM1(EX1,#LIM)) EQ PINF, 1 EXIT, WHEN EX1 EQ MINF, -1 EXIT, WHEN EX1 EQ CINF, ? EXIT, WHEN MEMBER (EX1, '(? PZERO MZERO)), EX1 EXIT, ERF(EX1), ENDFUN $ 104.100 REM ***********DIVCOM*********** A=TEMP.REAL : B=TEMP.IMAG C=TEMP1.REAL : D=TEMP1.IMAG E=C*C+D*D IF E<1E-12 THEN E=1E-12 TEMP.REAL=(A*C+B*D)/E TEMP.IMAG=(B*C-A*D)/E RETURN  EX1 EQ MINF, -1 EXIT, WHEN EX1 EQ CINF, ? EXIT, WHEN MEMBER (EX1, '(? PZERO MZERO)), EX1 EXIT, ERF(EX1), ENDFUN $ file INT%.DIF 02/26/82 Make a new file INT.DIF as follows: (1) Start with the old file INT.DIF. (2) Insert in it, at the end (just before RDS() $ ), all of this file below the line: ------------------------- file LIM%.DIF GAE - Feb. 1982 Make a new version of file LIM.DIF as follows: (1) Start with the original LIM.DIF. (2) Add at the end (just before RDS () $ ) the rest of this file: ---------------------------- file LOG%.ALG Make a new version of LOG.ALG as follows: (1) Start with the original LOG.ALG. (2) Replace FUNCTION LOG (near the beginning of the file) with this file below the line: -------------------------------------------------------- @: -7 ? #I^(2/3); @: #I*SIN(#PI/3) + COS(#PI/3) With TRGNEG, we get: ? #I^(2/3); @: 1/2 + 3^(1/2)*#I/2 ============================================================ SOLVE4.EQN The file SOLVE4.EQN replaces SOLd, so that DEFINT(#E^-X^2,X,MINF,PINF) can be calculated. Many of the most common infinite series can be evaluated. Most of the files furnished here cannot be loaded as-is by muSIMP. I have included the character `%' in the names of such files: muAS) EXIT, WHEN ATOM(EX1), LIST('LOG, EX1, EX2) EXIT, WHEN APPLY(GET('LOG,FIRST(EX1)), ADJOIN(EX2,ARGEX(EX1))) EXIT, LIST('LOG, EX1, EX2), ENDFUN $  43202. Perhaps we can exchange programs (hard copy form, or even on disk - 8" CP/M only, please). G. A. Edgar March 1, 1982 ============================================================ ARITH.MUS This file is a replacement for the existing ARIcking a branch for a multi-valued function is expected), the calculation of #I^(2/3) as 1/2 + 3^(1/2)*#I/2 can be carried out. Formulas for the solution of third and fourth degree equations are included. Exact values of many more of the trig function--- FUNCTION LOG (EX1, % Optional: % EX2), WHEN EMPTY(EX2), LOG (EX1, LOGBAS) EXIT, WHEN ZERO(EX1), ?(LIST('LOG, EX1, EX2)) EXIT, WHEN EX2 EQ 1, ?(LIST('LOG, EX1, EX2)) EXIT, WHEN PBRCH AND EX1 EQ 1, 0 EXIT, WHEN PBRCH AND EX1=EX2, 1 E text editor. Descriptions of the new files and/or the differences in the new versions are given below. I have included many calculator-mode examples. When you have loaded a new file, I recommend that you try at least a couple of the examples for SIMP will not load a file containing it unless the % is doubled. Instructions for creating a RDS-able file from the %-file are contained at the beginning of the file. Normally this is involves merging the file with one of the old muMATH files, using a MUMATH%.DOC documentation for the muMATH files on this disk These files are to be used with the muMATH/muSIMP symbolic mathematics system. I will assume that anyone reading this has at least a minimal familiarity with that system. The files havTH.MUS. The only difference is in evaluation of powers #I^R when PBRCH is non-false and the exponent is rational. In that case, #I^R is replaced by a complex exponential. Example: ? #I^(2/3); @: #E ^ (#I*#PI/3) ? TRGEXPD: -7; s can be obtained; for example COS(#PI/16) and SIN(11*#PI/15). Evaluation of the inverse trig functions are included, so that calculations like DEFINT(1/(1+X^2),X,MINF,PINF) can be done (answer: #PI). Also,values for the error function have been addeXIT, WHEN NEGMULT(TRGEXPD,7) AND EX2=#E, 2*#I*ATAN(#I*(1-EX1)/(1+EX1)) EXIT, WHEN PBRCH AND ZERO (MOD(EX1,EX2)), 1 + LOG (QUOTIENT(EX1,EX2), EX2) EXIT, WHEN NOT(EX2 EQ LOGBAS) AND POSMULT(LOGEXPD,2), LOG(EX1,LOGBAS) / LOG(EX2,LOGBthat file to make sure it is working properly. I would be interested in hearing from other users of muMATH, especially those who have written programs to do non-trivial mathematical tasks. My address: Gerald Edgar, 107 W. Dodridge St., Columbus, OHe new files different names, since you may sometimes want to use the old version instead of the new one. These files will allow many calculations to be done that could not be done with the original muMATH release. When PBRCH is non-false (so that pie been named according to the usual muSIMP scheme to display their dependences upon each other. Most of the files are intended as enhancements or replacements for files fur- nished with muMATH. I recommend that you keep the original files and give thVE.EQN. It was constructed by adding the formulas for third and fourth degree equations to SOLVE.EQN. Usage is the same as described in the manual. (In some of the following examples, the new version of ARITH.MUS has made a difference.) ? SOG.ALG. ============================================================ LOG.ALG This file contains only one new feature. I can't think of a situation in which to use it; I have included it only because it is the logical reverse of a feature of ATRG7-5^(1/2)+(30-5^(1/2)*6)^(1/2))^(1/2) / 4 ============================================================ ATRG.TRG This file handles inverse trigonometric functions. It depends on TRGNEG.ALG. The functions in this file are: ASIN(X) a== -1-1/(3^(1/2)*#E^(#I*#PI/6))-#E^(#I*#PI/6)/ 3^(1/2)+#I/#E^(#I*#PI/6)-#E^(#I*#PI/6)*#I, X == -1-1/(3^(1/2)*#E^(#I*#PI/6))-#E^(#I*#PI/6)/ 3^(1/2)-#I/#E^(#I*#PI/6)+#E^(#I*#PI/6)*#I} ? TRGEXPD(@,-7); @: {X == 1-#I/3^(1/2)l in connection with some of the other files: ? DEFINT(1/(1+X+X^2),X,-1/2,0); @: #PI / 3^(3/2) ? DEFINT(1/(1+X^2),X,MINF,PINF); @: #PI This feature is helpful also with SERIES.DIF, described below. When TRGEXPD is a positi SIN and COS of rational multiples of #PI, where the denominator is a power of 2 possibly multiplied by 3 or 5 (or both) are included. These are cases that can be evaluated using only square roots. (I have not included all such angles that are theoretLVE(9*X^3-3*X^2-8*X+4==0,X); @: {X == -1, X == 2/3+5*#I/(3^(1/2)*6)-3^(1/2)*5*#I/18} ? EXPD(@); @: {X == -1, X == 2/3} ? EXPD((X-1)*(X-2)*(X-3)*(X-4)); @: 24 - 50*X + 35*X^2 - 10*X^3 + X^4 ? SOL in terms of ASIN and ATAN. Example: ? ACOS(U); @: #PI/2 - ASIN(U) Certain elementary reductions are carried out: ? ATAN(TAN(U)); @: U ? ACOS(SIN(X)); @: #PI/2 - X Inverse trig functions are evaluated in a frc sine of X ACOS(X) arc cosine of X ATAN(X) arc tangent of X ACOT(X) arc cotangent of X ASEC(X) arc secant of X ACSC(X) arc cosecant of X Firstly, if PBRCH is non-false, these functions are all written +#I/3^(1/2), X == -1, X == -3} ? EXPD(@); @: {X == 1, X == -1, X == -3} Of course, this last example used file TRGNEG.ALG for the evaluation of the complex exponentials. This file is not as usefuve multiple of 7, inverse trigonometric functions are converted to expressions involving logarithms: ? ATAN(U); @: ATAN (U) ? TRGEXPD(@,7); @: #I*LN((#I+U)/(#I-U)) / 2 The reverse transformation is described below in file LOically possible, such as #PI/17 and #PI/65537.) Examples: ? DENNUM: -6; @: -6 ? COS(2*#PI/5); @: -1/4 + 5^(1/2)/4 ? COS(#PI/16); @: (2^(3/4)+(1+2^(1/2))^(1/2))^(1/2) / 2^(7/8) ? SIN(11*#PI/15); @: (VE(@,X); @: {X == 4, X == 1, X == 3, X == 2} ? EXPD((X-1)*(X+1)*(X+3)); @: -3 - X + 3*X^2 + X^3 ? SOLVE(@,X); @: {X == -1+6/(3^(3/2)*#E^(#I*#PI/6))+2*#E^(#I*#PI/6)/ 3^(1/2), X ew cases. (I have essentially just included a list of the cases in the program, probably not a very good algorithm.) ? ASIN(1/2); @: #PI / 6 ? ASEC(2^(1/2)); @: #PI / 4 ? ATAN(MINF); @: -#PI / 2 This is usefuese roots to 1, 2, and -4 ? Can you even tell which root is 1 ? ============================================================ TRGNEG.ALG This is a replacement for the existing TRGNEG.ALG. Exact evaluation of many more functions is now possible.l as you might expect at first. I must admit that the above examples are contrived so that they will look good. To see an example where the formulas do not work well, try EXPD((X-1)*(X-2)*(X+4)); and then SOLVE(@,X); Can you get muMATH to simplify th.TRG, above. In file ATRG, inverse trig functions are replaced by logarithms when TRGEXPD is a positive multiple of 7. In this file, the reverse can be done. If TRGEXPD is a negative multiple of 7, then natural logarithms are converted to inverse tt before `LOGBAS: #E,') and then just after these four lines (still before `LOGBAS: #E,') add a new line: WHEN NOT INDET, LIM1(EX1,#LIM) EXIT, Now you should get the correct answers: ? LIM(R+S); @: R + @: -1 + #PI/3^(3/2) + LN(2)/3 ? SIGMA(N^2/((2*N+1)*4^N),N,0,PINF); @: -1/9 + LN(3/2)/4 - LN(1/2)/4 ? LOGEXPD(@,30); @: -1/9 + LN(3)/4 Without LOG.ALG: ? SIGMA(N*X^N/N!,N,0,PINF); @: #E^X * X * LOG(#E,#E) mory): ? DEFINT(#E^-X^2,X,MINF,PINF); @: #PI ^ (1/2) ============================================================ SERIES.DIF This file is a replacement for the existing file SIGMA.ALG. Usage of SIGMA and PROD are as described in the contain EX1:LIM1(EX1,#LIM), rather than EX1:LIM(EX1,#LIM), 3. Also in file LIM.DIF, the handling of LIM with only one argument supplied is not as specified in the manual. For example, try the following: ) ? SIGMA(2^N/(4*N-1)!,N,3,PINF); @: -421/1260 - SIN(2^(1/4))/2^(3/4) - 2^(1/4)/(4* #E^2^(1/4)) + 2^(1/4)*#E^2^(1/4)/4 ? SIGMA((-1)^N/N,N,1,PINF); @: - LN(2) ? SIGMA(X^N/(2*N+3),N,1,PINF); @: ??? 1 + Xrig functions. Example: ? A:LOG(U); @: LN(U) ? TRGEXPD: -7; @: -7 ? EVAL(A); @: 2 * #I * ATAN((#I-#I*U)/(1+U)) ============================================================ INT.DIF and LIM.DIF There are mis a bit fuzzy here) in muMATH (at least in version 2.12). 1. In file DIF.ALG, in the function beginning PROPERTY DIF, DEFINT, the line just before ENDFUN should end EVSUB(EX1,EX2,EX3), For example Try this one to see an impressive-looking answer: ? SIGMA((-1)^N/(5*N+2),N,0,PINF); ============================================================ In addition to these descriptions, let me list a few bugs (or misprints - the distinction manual. The file has been completely rewritten. Notice that SERIES requires DIF.ALG and is larger than SIGMA. All of the series that SIGMA can do and several of the most common infinite series can be summed. The program may ask questions in the ? LIM(R+S); @: ? ? LIM((X-X^2)/(1-X)); @: 0 If you get these (wrong) answers, here is a fix: In FUNCTION LIM , move the four lines between BLOCK and ENDBLOCK (inclusive) to the beginning (jus ??? ENTER SIGN (0 + -)? + ??? 1 - X ??? ENTER SIGN (0 + -)? + ??? X ??? ENTER SIGN (0 + -)? + -1/3 - LN(1-X^(1/2))/(2*X^(3/2)) + LN(1+X^(1/2))/(2* X^(3/2)) - 1/X ? SIGMA((-1)^N/(3*N+1),N,1,PINF);inor changes in these files to take into account the error function ERF. Examples: ? ERF(0); @: 0 ? ERF(MINF); @: -1 The following example is done with INT.DIF, INTMORE.INT, LIM.DIF, and LOG.ALG (for those with a lot of me, ? DIF( DEFINT(F(T),T,X,0), X ); should yield @: -F(X) not @: -F(T) 2. In file LIM.DIF, in the function beginning PROPERTY LIM, !, (near the end of the file), the second line should. ? SIGMA(N^2*3^N,N,1,K); @: -3/2 + 3^(1+K)*K + 3^(1+K)*K^2/2 - 3^(2+K)*K/2 + 3^(1+K)/2 - 3^(3+K)/4 + 3^(3+K)/4 ? SIGMA((-1)^N*X^(2*N+1)/(2*N+1)!,N,0,PINF); @: ??? - X^2 ??? ENTER SIGN (0 + -)? - SIN(Xmanner of LIM in order to determine which method to use or to determine whether a series converges. The files LOG.ALG, TRGNEG.ALG, and ATRG.TRG may be useful with this file. Some of the examples below were done with the help of these additional files S ? LIM((X-X^2)/(1-X)); @: (X-X^2) / (1-X) 4. This one is not really a bug, but it will speed up LIM involving exponents when LOG.ALG is not loaded. In FUNCTION LIM , change LOGEXPD: 70, to 0 : A22.IMAG=MIN FOR LOOP=1 TO N REM * REM ***** COMPUTE ZA ***** REM * IF RLA(LOOP) GT MAX/2 OR LA(LOOP) GT MAX/2 THEN GOTO 3.00 IF RCA(LOOP) GT MAX/2 OR CA(LOOP) LT 2*MIN THEN GOTO 4.00 TEMP.REAL=RLA(LOOP) : TEMP.IMAG=W*LA(LOOP=VAL(RLA$) PRINT "CA,RCA FOR SECTION ";LOOP; INPUT CA$,RCA$ IF CA$="-" THEN CA(LOOP)=MIN ELSE CA(LOOP)=VAL(CA$) IF RCA$="-" THEN RCA(LOOP)=MIN ELSE RCA(LOOP)=VAL(RCA$) PRINT "RB,LB,CB FOR SECTION ";LOOP; INPUT RB$,LB$,CB$ IF RB$="-" THear the top of the page, the second sentence should begin When TRGEXPD is a negative multiple of 7, The correct information is given on page 9-28. ============================================================= T "NUMBER OF DATA POINTS ?";M DEL=(LOG(FMAX)-LOG(FMIN))/(M-1) IF Q$="Y" THEN LPRINTER WIDTH 80 REM * REM ***** CALCULATE AND PRINT DATA ***** REM * PRINT "FREQ ALPHA(DB) ANG(ALPHA) ZIN ANG(ZIN)" PRINT "-------------(10) 1.00 PRINT TAB(24);"LOW PASS FILTERS" REM * REM ***** REQUEST COMPONENT DATA ***** REM * INPUT "NUMBER OF SECTIONS ?";N INPUT "RG,RL ? ";RG,RL PRINT "TYPE IN SECTION PARAMETERS. TYPE - IF ELEMENT NOT USED" PRINT "FOR SHORTED SERIES ARM, LOGEXPD: 10, then in PROPERTY LIM, ^, at the beginning (just after the comment % Fluid vars ... % ) add five new lines: BLOCK WHEN FREE(EX3,INDET) OR FREE(EX4,INDET), EX2:EX4, EX1:EX3 EXIT, $ IF Q$="Y" THEN LPRINTER WIDTH 80 PRINT PRINT " LOW PASS FILTER ANALYSIS " PRINT PRINT "FILTER CONSTANTS" PRINT PRINT "RG=";RG PRINT "RL=";RL PRINT FOR LOOP=1 TO N PRINT "LA";LOOP;" =";LA(LOOP),"RLA";LOOP;" =";RLA(LOOP) PRINT "CAEN RB(LOOP)=MIN ELSE RB(LOOP)=VAL(RB$) IF LB$="-" THEN LB(LOOP)=MIN ELSE LB(LOOP)=VAL(LB$) IF CB$="-" THEN CB(LOOP)=MAX ELSE CB(LOOP)=VAL(CB$) NEXT LOOP REM * REM ***** PRINT HEADING AND INPUT DATA ***** REM * INPUT "HARD COPY ? (Y OR N)";Q REM * PROGRAM LPFILTAN BY E.R. LE CLEAR 8-15-79 CONSOLE REM * THIS PROGRAM EVALUATES LOW PASS FILTERS FOR REM * TRANSMISSION CHARACTERISTICS AND INPUT IN- REM * PEDANCE VERSUS FREQUENCY. THE FILTER IS TER- REM * MINATED IN A LOAD RESISTANCE RL A------------------------------------------------------" PRINT FOR LOOPF=0 TO (M-1) F=EXP(LOG(FMIN)+DEL*LOOPF) W=6.2832*F A11.REAL=1.0 : A11.IMAG=MIN REM UNIT MATRIX A12.REAL=MIN : A12.IMAG=MIN A21.REAL=MIN : A21.IMAG=MIN A22.REAL=1. SET LA=RLA=0" PRINT "FOR OPEN SHUNT ARM, SET RB=1E15" MIN=1E-15 : MAX=1E15 FOR LOOP=1 TO N PRINT "LA,RLA FOR SECTION ";LOOP; INPUT LA$,RLA$ IF LA$="-" THEN LA(LOOP)=MAX ELSE LA(LOOP)=VAL(LA$) IF RLA$="-" THEN RLA(LOOP)=MIN ELSE RLA(LOOP) EX2:EX4*LOG(EX3,#E), EX1:#E, ENDBLOCK, and finally change the next-to-last line (just before ENDFUN) from EX1^EX2, to LIM1(EX3,#LIM)^LIM1(EX4,#LIM), 5. In the manual, page 9-4, item 4. n";LOOP;" =";CA(LOOP),"RCA";LOOP;" =";RCA(LOOP) PRINT "RB";LOOP;" =";RB(LOOP),"LB";LOOP;" =";LB(LOOP),"CB";LOOP;" =";CB(LOOP) PRINT NEXT LOOP REM * REM ***** INPUT FREQUENCY DATA ***** REM * 2.00 CONSOLE INPUT "FMIN,FMAX ?";FMIN,FMAX INPU---< CA >-------< RCA >-----------O REM * l REM * REM * l REM * REM * l REM * REM * l REM * O---------------------------------------O REM * DIM LA(10),RLA(10),CA(10),RCA(10),RB(10),LB(10),CBND CONSISTS REM * OF N "L" SECTIONS. EACH "L" SECTION CONSISTS REM * OF THE FOLLOWING COMPONENTS: REM * REM * ----< LA >-------< RLA >----- REM * l l REM * l l REM * O-----) TEMP1.REAL=RCA(LOOP) : TEMP1.IMAG=-1/(W*CA(LOOP)) GOSUB 103.100 REM COMPLEX MULTIPLY TEMP1.REAL=RLA(LOOP)+RCA(LOOP) : TEMP1.IMAG=W*LA(LOOP)-1/(W*CA(LOOP)) GOSUB 104.100 REM COMPLEX DIVIDE ZA.REAL=TEMP.REAL : ZA.IMAG=TEMP.IMAG M2R : DELI=TEM1I-TEM2I TEMP.REAL=TEMPA.REAL : TEMP.IMAG=TEMPA.IMAG TEMP1.REAL=TEMPC.REAL : TEMP1.IMAG=TEMPC.IMAG GOSUB 104.100 TEMPA.REAL=TEMP.REAL : TEMPA.IMAG=TEMP.IMAG TEMP.REAL=DELR : TEMP.IMAG=DELI TEMP1.REAL=TEMPC.REAL : TEMP1.IMAG=TEMPC.ZINI REM NORMALIZE TRANSFER FUNCTION TEMP1.REAL=RG+ZINR : TEMP1.IMAG=ZINI GOSUB 104.100 REM TEMP=2*ZIN/(RG+ZIN) TEMP1.REAL=C11.REAL : TEMP1.IMAG=C11.IMAG GOSUB 104.100 REM COMPLEX DIVIDE GOSUB 100.100 REM CONVERT TO POLAR ALP ZB.REAL=RB(LOOP) : ZB.IMAG=W*LB(LOOP)-1/(W*CB(LOOP)) REM * REM ***** COMPUTE X MATRIX FOR SECTION ***** REM * TEMP.REAL=ZA.REAL+ZB.REAL : TEMP.IMAG=ZA.IMAG+ZB.IMAG TEMP1.REAL=ZB.REAL : TEMP1.IMAG=ZB.IMAG GOSUB 104.100 REM COM*********** A=TEMP.REAL : B=TEMP.IMAG C=TEMP1.REAL : D=TEMP1.IMAG E=C*C+D*D IF E<1E-12 THEN E=1E-12 TEMP.REAL=(A*C+B*D)/E TEMP.IMAG=(B*C-A*D)/E RETURN 109.100 REM ***********ZXXZ*********** TEMP.REAL=TEMPA.REAL : TEMP.IMAG=TEMPA.IMAG TEM REM MULTIPLY X MATRICES [C]=[A]X[B] TEMPA.REAL=C11.REAL : TEMPA.IMAG=C11.IMAG TEMPB.REAL=C12.REAL : TEMPB.IMAG=C12.IMAG TEMPC.REAL=C21.REAL : TEMPC.IMAG=C21.IMAG TEMPD.REAL=C22.REAL : TEMPD.IMAG=C22.IMAG GOSUB 109.100 REM [X] TO [Z] GOTO 5.00 3.00 IF RCA(LOOP) GT MAX/2 OR CA(LOOP) LT 2*MIN THEN \ PRINT "ERROR IN SERIES ARM";LOOP : GOTO 1.00 ZA.REAL=RCA(LOOP) : ZA.IMAG=-1/(W*CA(LOOP)) GOTO 5.00 4.00 IF RLA(LOOP) GT MAX/2 OR LA(LOOP) GT MAX/2 THEN \ PRINT "ERRTO 10 PRINT NEXT I CONSOLE INPUT "NEW FREQ PLOT(F), NEW PARAMETERS(P) OR QUIT(Q)";S$ IF S$="F" THEN GOTO 2.00 IF S$="P" THEN GOTO 1.00 IF S$="Q" THEN STOP GOTO 1.00 100.100 REM ***********REC/POL*********** TEMP.MAG=SQR(TEMP.REAL*TEMP.RHA.MAG=20*LOG(TEMP.MAG)/LOG(10) ALPHA.PHA=TEMP.PHA PRINT USING "#.###^^ ####.## ####.## #.###^^ ####.##";\ F,ALPHA.MAG,ALPHA.PHA,ZIN.MAG,ZIN.PHA NEXT LOOPF PRINT REM * REM ***** PROGRAM OPTIONS ***** REM * FOR I=1 PLEX DIVIDE B22.REAL=TEMP.REAL : B22.IMAG=TEMP.IMAG B12.REAL=ZA.REAL : B12.IMAG=ZA.IMAG TEMP.REAL=1.0 : TEMP.IMAG=MIN TEMP1.REAL=ZB.REAL : TEMP1.IMAG=ZB.IMAG GOSUB 104.100 REM COMPLEX DIVIDE B21.REAL=TEMP.REAL : B21.IMAG=TEMP.IMAP1.REAL=TEMPD.REAL : TEMP1.IMAG=TEMPD.IMAG GOSUB 103.100 TEM1R=TEMP.REAL : TEM1I=TEMP.IMAG TEMP.REAL=TEMPB.REAL : TEMP.IMAG=TEMPB.IMAG TEMP1.REAL=TEMPC.REAL : TEMP1.IMAG=TEMPC.IMAG GOSUB 103.100 TEM2R=TEMP.REAL : TEM2I=TEMP.IMAG DELR=TEM1R-TEREM * REM ***** COMPUTE POLAR INPUT INPEDANCE ***** REM * ZINR=TEMPA.REAL : ZINI=TEMPA.IMAG TEMP.REAL=ZINR : TEMP.IMAG=ZINI GOSUB 100.100 REM CONVERT TO POLAR ZIN ZIN.MAG=TEMP.MAG : ZIN.PHA=TEMP.PHA TEMP.REAL=2*ZINR : TEMP.IMAG=2*OR IN SERIES ARM";LOOP : GOTO 1.00 ZA.REAL=RLA(LOOP) : ZA.IMAG=W*LA(LOOP) REM * REM ***** COMPUTE ZB ***** REM * 5.00 IF RB(LOOP) GT MAX/2 OR LA(LOOP) GT MAX/2 OR CB(LOOP) LT 2*MIN THEN \ PRINT "ERROR IN SHUNT ARM";LOOP : GOTO 1.00 EAL+TEMP.IMAG*TEMP.IMAG) TEMP.PHA=57.296*ATN(TEMP.IMAG/TEMP.REAL) RETURN 103.100 REM ***********MPYCOM*********** A=TEMP.REAL : B=TEMP.IMAG C=TEMP1.REAL : D=TEMP1.IMAG TEMP.REAL=A*C-B*D TEMP.IMAG=A*D+B*C RETURN 104.100 REM ***********DIVCOM.REAL=C22.REAL : A22.IMAG=C22.IMAG NEXT LOOP REM * REM ***** SET UP TERMINATION MATRIX ***** REM * B11.REAL=1.0 : B11.IMAG=MIN B12.REAL=MIN : B12.IMAG=MIN B21.REAL=1/RL : B21.IMAG=MIN B22.REAL=1.0 : B22.IMAG=MIN GOSUB 111.100 G B11.REAL=1.0 : B11.IMAG=MIN GOSUB 111.100 REM MULTIPLY X MATRICES [C]=[A]X[B] A11.REAL=C11.REAL : A11.IMAG=C11.IMAG REM RENAME MATRIX FOR NEXT LOOP A12.REAL=C12.REAL : A12.IMAG=C12.IMAG A21.REAL=C21.REAL : A21.IMAG=C21.IMAG A22IMAG GOSUB 104.100 TEMPB.REAL=TEMP.REAL : TEMPB.IMAG=TEMP.IMAG TEM3R=TEMPC.REAL : TEM3I=TEMPC.IMAG TEMP.REAL=1 : TEMP.IMAG=0 TEMP1.REAL=TEM3R : TEMP1.IMAG=TEM3I GOSUB 104.100 TEMPC.REAL=TEMP.REAL : TEMPC.IMAG=TEMP.IMAG TEMP.REAL=TEMPD.REAL 'A >$?%Y@ZA$p%p&Y'Z @$A%$B%C&Y'Z B$C%[\]^_ `!a"b#c2d3e.f/g0h1i,j-4[c\d]g^h5\c[d]h^g6[e\f]i^j------------$d4d4p6p.7 )NK..    ! ".#  p6W . 7 ]! p ]! p 762 ]! p ]! p 76$ ]!% ]!& ]!G=B1*C2+A1*D2+D1*G2+C1*H2 C21.REAL=A2*E1-B2*F1+E2*G1-F2*H1 C21.IMAG=A2*F1+B2*E1+E2*H1+F2*G1 C22.REAL=C2*E1-D2*F1+G1*G2-H1*H2 C22.IMAG=C2*F1+D2*E1+H1*G2+G1*H2 RETURN KI#.###^^ ####.## ####.## #.###^^ ####.##c#5J#5K#5F#5H#d46d4Lp6 E pL.L7 Jd46 4gNEW FREQ PLOT(F), NEW PARAMETERS(P) OR QUIT(Q)n;M1'MF7 6MP7 6@MQ7 6@G$$%%II.%$GN$OY7܀Pofd4 LOW PASS FILTER ANALYSIS $d4d4FILTER CONSTANTS$d4d4RG=$#d4RL=$ #d4d4 p6G . 7LA$ # =$ ]!#5RLA$ # =$ ]!#d4CA$ # =$ ]!#5RCA$ # =$ ]!#d4RB$ # =$ ]!#5LB$ # =: TEMP.IMAG=TEMPD.IMAG TEMP1.REAL=TEM3R : TEMP1.IMAG=TEM3I GOSUB 104.100 TEMPD.REAL=TEMP.REAL : TEMPD.IMAG=TEMP.IMAG RETURN 111.100 REM ***********MTXMPY*********** A1=A11.REAL : B1=A11.IMAG : C1=A12.REAL : D1=A12.IMAG E1=A21.REAL : F1=A21.IMAIES ARM$ #d46@( ]!) ]! ]! p ]! p ]! p 7QERROR IN SHUNT ARM$ #d46@* ]!+ ]! ]!p$(*%)+&*'+ ,$-%.(/)$.% &*'+ 0$1' ]!p0 ǀ& ]! ]!' ]! ]!p ($)%6 ]! p ]! p 7wERROR IN SERIES ARM$ #d46@( ]!) ]!p06 ]! p ]! p 7ERROR IN SER1$1E-15$1E15$6.2832$1.0$57.296$1E-12$*8 RXg              JLOW PASS FILTERS$d4NUMBER OF SECTIONS ?n;"'RG,RL ? n;" "'TYPE IN SECTION PARAMETERS. TYPE - IF ELEMENT NOT USED$d4FOR SHORT%P&Q'$NPOQ%NQOPN$O%P&Q'RPPQQR.7 *R.$NPOQR%OPNQR$<%=&B'C ǀS$T%$>%?&@'A ǀU$V%WSUXTV$<%=&@'A <$=%$W%X&@$ ]!#5CB$ # =$ ]!#d4d467gFMIN,FMAX ?n;""'NUMBER OF DATA POINTS ?n;"'NNpY7QPofFREQ ALPHA(DB) ANG(ALPHA) ZIN ANG(ZIN)$d4-------------------------------------------------------G : G1=A22.REAL : H1=A22.IMAG A2=B11.REAL : B2=B11.IMAG : C2=B12.REAL : D2=B12.IMAG E2=B21.REAL : F2=B21.IMAG : G2=B22.REAL : H2=B22.IMAG C11.REAL=A1*A2-B1*B2+C1*E2-D1*F2 C11.IMAG=B1*A2+A1*B2+C1*F2+D1*E2 C12.REAL=A1*C2-B1*D2+C1*G2-D1*H2 C12.IMA%2.3  04567 8!9":#;6G2.3 . / 0 p1 ,.-  0<4=5>6?7@8A9B:C; MD<E=$D%E FGHI$Dp%Ep&D'E &4'5  JGNp pN-7 ]! 6 ]!X-7 ]! 6 ]!XRB,LB,CB FOR SECTION $ #dn;111'-7Z ]! 6f ]!X-7~ ]! 6 ]!X-7 ]! 6 ]!X6'HARD COPY ? (Y OR N)n;1'ED SERIES ARM, SET LA=RLA=0$d4FOR OPEN SHUNT ARM, SET RB=1E15$d4 . . p67 . 7LA,RLA FOR SECTION $ #dn; 11' -7v ]! 6 ]! X-7 ]! 6 ]!XCA,RCA FOR SECTION $ #dn;11'7\e[f^i]j8c_d`gahb9c`d_gbha:e_f`aibj;e`f_biajPLOT(F), NEW PARAMETERS(P) OR QUIT(Q)n;M1'MF7 6MP7 6@MQ7 6@G$$%%II.%$GN$OB22.IMAG C11.REAL=A1*A2-B1*B2+C1*E2-D1*F2 C11.IMAG=B1*A2+A1*B2+C1*F2+D1*E2 C12.REAL=A1*C2-B1*D2+C1*G2-D1*H2 C12.IMAG=B1*C2+A1*D2+D1*G2+C1*H2 C21.REAL=A2*E1-B2*F1+E2*G1-F2*H1 C21.IMAG=A2*F1+B2*E1+E2*H1+F2*G1 C22.REAL=C2*E1-D2*F1+G1*G2-H1*H2 C22.IMAG=C2*F1+D2*E1+H1*G2+G1*H2 RETURN C2+A1*D2+D1*G2+C1*H2 C21.REAL=A2*E1-B2*F1+E2*G1-F2*H1 C21.IMAG=A2*F1+B2*E1+E2*H1+F2*G1 C22.REAL=C2*E1-D2*F1+G1*G2-H1*H2 103.100 REM ***********MPYCOM*********** A=TEMP.REAL : B=TEMP.IMAG C=TEMP1.REAL : D=TEMP1.IMAG TEMP.REAL=A*C-B*D TEMP.IMAG=A*D+B*C RETURN 111.100 REM ***********MTXMPY*********** A1=A11.REAL : B1=A11.IMAG : C1=A12.REAL : D1=A12.IMAG E1=A21.REAL : F1=A21.IMAG : G1=A22.REAL : H1=A22.IMAG A2=B11.REAL : B2=B11.IMAG : C2=B12.REAL : D2=B12.IMAG E2=B21.REAL : F2=B21.IMAG : G2=B22.REAL : H2=102.100 REM ***********PAR/SER*********** A=TEMP.REAL : B=TEMP.IMAG Q=B/A IF Q<1E-12 THEN Q=1E-12 TEMP.REAL=A/(1+1/(Q*Q)) TEMP.IMAG=B/(1+Q*Q) RETURN 100.000 REM ***********POL/REC*********** TEMP.REAL=TEMP.MAG*COS(TEMP.PHA/57.296) TEMP.IMAG=TEMP.MAG*SIN(TEMP.PHA/57.296) RETURN TEMP.REAL=50*TEMR : TEMP.IMAG=50*TEMI RETURN /57.296) TEMP.REAL=1+SR : TEMP.IMAG=SI TEMP1.REAL=1-SR : TEMP1.IMAG=-SI GOSUB 104.100 TEMR=TEMP.REAL : TEMI=TEMP.IMAG 100.100 REM ***********REC/POL*********** TEMP.MAG=SQR(TEMP.REAL*TEMP.REAL+TEMP.IMAG*TEMP.IMAG) TEMP.PHA=57.296*ATN(TEMP.IMAG/TEMP.REAL) RETURN 105.100 REM ***********REFC/Z*********** A=TEMP.MAG : B=TEMP.PHA SR=A*COS(B/57.296) IF SR<1E-12 THEN SR=1E-12 SI=A*SIN(B/57.296) TEMP.REAL=1+SR : TEMP.IMAG=SI TEMP1.REAL=1-SR : TEMP1.IMAG=-SI GOSUB 104.100 TEMR=TEMP.REAL : TEMI=TEMP.IMAG 101.100 REM ***********SER/PAR*********** A=TEMP.REAL : B=TEMP.IMAG Q=B/A IF Q<1E-12 THEN Q=1E-12 TEMP.REAL=A*(1+Q*Q) TEMP.IMAG=B*(1+1/(Q*Q)) RETURN  file SERIES%.DIF GAE - Feb. 1982 Make a file called SERIES.DIF as follows: (1) Start with this file (SERIES%.DIF). (2) Insert in it (at the spot marked INSERT HERE) the two functions FUNCTION QUERY and FUNCTION : EXPD(PROD(INDET-INDET3,INDET3,0,EX6-1)), EX9: (INDET+1)*EX8, EX9: EVSUB(EX9,INDET,EX3)-EVSUB(EX9,INDET,EX2-1), EXPD(EX9)/(1+EX6)+SIGMA(INDET^EX6-EX8,INDET,EX2,EX3) EXIT, EX8: SIGMA1(INDET4,0,EX1), WHEN FREE(EX8, 'SIGMA),(1-2*EX3*EX6+EX6^2,#E)+EX1*ATAN((EX6-EX3)/EX4)+EX1*(#PI/2-EX2), ENDFUN $ FUNCTION SIGMA2(EX1, EX2, % Local: % EX3, EX4, EX5, EX6), EX4: DEN(EX1), EX5: NUM(EX1), EX6: EX2^(1/EX4), EX3: (2/EX4)*#PI, EX1: -LOG(1-EX6,#E), BLOCK WHEN EX5REXPD: 6, DENNUM: NUMNUM: DENDEN: -30, EXPBAS: BASEXP: 30, NUMDEN: 0, EVAL (EX1), ENDFUN $ FUNCTION LINCF(EX1, INDET), WHEN FREE(EX1:(EVSUB(EX1,INDET,INDET+1)-EX1),INDET), EX1 EXIT, ENDFUN $ FUNCTION SIGSB2(EX1,EX2, % Local: % EXX2-2, ENDLOOP, WHEN EX5 EQ 0, -EX1 EXIT, EX1 EXIT, EX1: EX1+(-1)^EX5*LOG(1+EX6,#E), EX2: EX4-2, LOOP WHEN EX2 EQ -1, EXIT, EX1: EX1-SIGSB3(EX5,EX2*EX3,EX6), EX2: EX2-2, ENDLOOP, WHEN EX5 EQ 0, -EX1 EXIT, E WHEN EX3 EQ EX2, EXIT, EX4: DIF(EX4,INDET3), EX3: EX3+1, ENDLOOP, EVSUB(EX4,INDET3,EX1) EXIT, % EX3 EQ 0 % EX4: #PI/EX2, WHEN MOD(EX2,2) EQ 0, SIGMA(SIGSB2((2*INDET2+1)*EX4,EX1),INDET2,0,(EX2-2)/2)/(EX2/2) EXIT, SIGN. They can be found at the beginning of file LIM.DIF or file INT.DIF. (3) Finally, delete this comment up to the line. ----------------------------------------------------------- % File SERIES.DIF Infinite series. %, EX1 EXIT, EX2: (EX4-1)/2, LOOP WHEN EX2 EQ 0, EXIT, EX1: EX1+SIGSB3(EX5,EX2*EX3,EX6), EX2: EX2-1, ENDLOOP, EX1, ENDFUN $ FUNCTION SIGMA2M(EX1,EX2, % Local: % EX3,EX4,EX5,EX6), EX4: DEN(EX1), EX5: NUM(EX1), EX6: EQ 0, EXIT, EX1: EX1+(-EX4/EX5)*EX6^EX5, ENDBLOCK, WHEN MOD(EX4,2) EQ 0, EX1: EX1-(-1)^EX5*LOG(1+EX6,#E), EX2: (EX4-2)/2, LOOP WHEN EX2 EQ 0, EXIT, EX1: EX1+SIGSB3(EX5,EX2*EX3,EX6), EX2: EX2-1, ENDLOOP3, EX4), EX3: COS(EX1), EX4: SIN(EX1), #E^(EX3*EX2)*COS(EX4*EX2), ENDFUN $ FUNCTION SIGF(EX1,EX2,EX3, % Local: % EX4, INDET2, INDET3), INDET2: 'INDET2, INDET3: 'INDET3, WHEN EX3 > 0, EX4: SIGF(INDET3,EX2,0), LOOP WHEN EXX1, ENDFUN $ FUNCTION SIGMA1(EX7,EX6,EX1, % Local: % INDET3,INDET4,EX8,EX9), % Fluid: EX2,EX3,EX5,INDET % INDET3: 'INDET3, INDET4: 'INDET4, WHEN POSITIVE(EX6), WHEN EX5 EQ 1 AND EX7 EQ 1, WHEN EX3 EQ PINF, PINF EXIT, EX8 (#E^-EX1+2*SIGMA(SIGSB2((2*INDET2+1)*EX4,EX1),INDET2,0,(EX3-3)/2))/EX2, ENDFUN $ FUNCTION SIGSB3(EX1,EX2,EX6, % Local: % EX3,EX4,EX5), EX3: COS(EX2), EX4: SIN(EX2), EX5: COS(EX1*EX2), EX1: 2*(COS((EX1-1)*EX2)-EX3*EX5)/EX4, -EX5*LOG % rewritten, Feb. 1982 - GAE DIF.ALG is required. LOG, TRGNEG, ATRG may be useful with this file. % % INSERT HERE % FUNCTION FCTR1(EX1, % Local: % PWREXPD, NUMNUM, DENDEN, DENNUM, NUMDEN, BASEXP, EXPBAS), PW EX2^(1/EX4), EX3: #PI/EX4, EX1: 0, BLOCK WHEN EX5 EQ 0, EXIT, EX1: (EX4/EX5)*EX6^EX5, ENDBLOCK, WHEN MOD(EX4,2) EQ 0, EX2: EX4-1, LOOP WHEN EX2 EQ -1, EXIT, EX1: EX1-SIGSB3(EX5,EX2*EX3,EX6), EX2: EEX2 EXIT, (#E^EX1+2*SIGMA(SIGSB2(INDET2*EX4,EX1),INDET2,1,(EX2-1)/2))/EX2, ENDFUN $ FUNCTION SIGFM(EX1,EX2,EX3, % Local: % EX4, INDET2, INDET3), INDET2: 'INDET2, INDET3: 'INDET3, WHEN EX3 > 0, EX4: -SIGFM(INDET3,EX2,0), LOOP 3 EQ EX2, EXIT, EX4: DIF(EX4,INDET3), EX3: EX3+1, ENDLOOP, EVSUB(EX4,INDET3,EX1) EXIT, % EX3 EQ 0 % EX4: 2*#PI/EX2, WHEN MOD(EX2,2) EQ 0, (#E^EX1+#E^-EX1+ 2*SIGMA(SIGSB2(INDET2*EX4,EX1),INDET2,1,(EX2-2)/2))/ WHEN MEMBER(EX8, '(PINF MINF CINF ?) ), EX8 EXIT, LOOP EX6: EX6-1, WHEN EX6<0, EXIT, EX8: INDET4*DIF(EX8,INDET4), ENDLOOP, INDET4: EX7, EXPD(EX8) EXIT, LIST('SIGMA,EX5*INDET^EX6*EX7^IN SIGMA(EX1,INDET,EX2,EX3) + SIGMA(EX4,INDET,EX2,EX3) ENDFUN $ FUNCTION PROD (EX1, INDET, EX2, EX3, % Local: % EX4, LOGEXPD), WHEN INTEGER(EX2) AND INTEGER(EX3), EX4: 1, LOOP WHEN EX2 > EX3, EX4 EXIT, EX4: EX4 * EVSUB(EX1,,EX3), ENDFUN $ FUNCTION SIGMA (EX1, INDET, EX2, EX3, % Local: % EX4, EX5, EX6, EX7, EX8, EX9, EX10, DENNUM, LEX1, SIGN), DENNUM: 30, WHEN EX2 = MINF, WHEN EX3 = PINF, SIGMA(EX1,INDET,0,PINF)+SIGMA(EVSUB(EX1,INDET,-INDET),IDET), EX10: EX8/EX6, EX4: QUOTIENT(NUM(EX10),DEN(EX10)), EX2: EX2+EX4, EX8: EX8-EX4*EX6, EX10: EX8/EX6, WHEN MOD(DEN(EX10),2) EQ 0, WHEN SIGN(EX1) EQ -1, (-SIGMA2M(EX10,-EX7)+ SIG6: EX6+EX10 EXIT, WHEN FREE(EX10: EX10/INDET, INDET) AND FREE(EX9,INDET), EX7: EX7*EX9^EX10 EXIT, EX5: EX5*EX8 EXIT, EX5: EX5*EX8, ENDBLOCK, ENDLOOP, EX4*SIGMA1(EX7,EX6,EX7), ENDFUN $ PROPERTY SIGMA, +,EX7^INDET,INDET,-EX4,EX2-EX4-1) EXIT, (-EX7)^(-EX8/EX6-EX4)*(SIGFM((-EX7)^(1/EX6),EX6,EX8) -SIGMAX(EX5*EX7^INDET,INDET,-EX4,EX2-EX4-1)) EXIT, EX7^(-EX8/EX6-EX4)*SIGF(EX7^(1/EX6),EX6,EX8) -SIGMAX(EX5*EX7^INDET,INDDET,INDET,EX2,EX3) EXIT, % EX6=0 % WHEN FREE(EX5,INDET), WHEN EX3 EQ PINF, WHEN SIGN(1-EX1) EQ 1, WHEN SIGN(1+EX1) EQ 1, EX5*EX7^EX2/(1-EX7) EXIT, '? EXIT, PINF EXIT, WHEN EX7=1, EX5*(EX3-EX2+1 EX1: EXPD(NUM(EX1))/DEN(EX1), WHEN APPLY(GET('SIGMA,FIRST(EX1)), ARGEX(EX1)) EXIT, EX4: FCTR1(EX1), BLOCK WHEN PRODUCT(EX4), LEX1: REST(EX4) EXIT, LEX1: LIST(EX4), ENDBLOCK, EX6: 0, EX4: EX5: EX7: 1, LOOP WHEN ATOM(LEX1)NDET,1,PINF) EXIT, SIGMA(EVSUB(EX1,INDET,-INDET),INDET,-EX3,PINF) EXIT, WHEN INTEGER(EX2) AND INTEGER(EX3), EX4: 0, LOOP WHEN EX2 > EX3, EX4 EXIT, EX4: EX4 + EVSUB(EX1,INDET,EX2), EX2: EX2 + 1, ENDLOOP EXIT, MAX((-EX7)^(INDET+EX10)*(-1)^INDET/(INDET+EX10),INDET,EX2,0)) *(-EX7)^-EX10*EX7^-EX4/EX6 EXIT, (SIGMA2(EX10,EX7)+SIGMAX(EX7^(INDET+EX10)/(INDET+EX10),INDET,EX2,0)) *EX7^-(EX10+EX4)/EX6 EXIT, (SIGMA2(EX10,EX7) FUNCTION (EX1, EX4), % fluid: INDET, EX2, EX3 % WHEN ZERO (EVSUB(EX1,INDET,INDET+1) + EX4), EVSUB(EX1,INDET,EX2)+EVSUB(EX4,INDET,EX3) EXIT, WHEN ZERO (EVSUB(EX4,INDET,INDET+1) + EX1), EVSUB(EX4,INDET,EX2)+EVSUB(EX1,INDET,EX3) EXIT, ET,-EX4,EX2-EX4-1) EXIT, LIST('SIGMA,EX5*EX7^INDET,INDET,EX2,EX3) EXIT, LIST('SIGMA,EX5*EX7^INDET,INDET,EX2,EX3), ENDFUN $ FUNCTION SIGMAX(EX1, INDET, EX2, EX3), WHEN EX2 > EX3+1, -SIGMA(EX1,INDET,EX3+1,EX2-1) EXIT, SIGMA(EX1,INDET,EX2) EXIT, EX5*(EX7^EX2-EX7^(EX3+1))/(1-EX7) EXIT, WHEN NUMBER(EX6:LINCF(1/EX5,INDET)) AND EX3=PINF, WHEN (EX8:SIGN(1+EX1)) EQ -1, '? EXIT, WHEN EX8 EQ 0 AND NOT EX7=EX1, '? EXIT, WHEN SIGN(1-EX1) EQ 1, EX8: EXPD(1/EX5-EX6*IN, EXIT, EX8: POP(LEX1), BLOCK WHEN FREE(EX8, INDET), EX4: EX4*EX8 EXIT, WHEN EX8=INDET, EX6:EX6+1 EXIT, WHEN POWER(EX8), EX9: SECOND(EX8), EX10: THIRD(EX8), WHEN EX9=INDET AND POSITIVE(EX10), EXAND INTEGER(EX8:EXPD(EX9-INDET*EX6)), EX4: QUOTIENT(EX8,EX6), EX8: MOD(EX8,EX6), EX2: EX2+EX4, WHEN MOD(EX6,2) EQ 0, WHEN SIGN(EX1) EQ 1, EX7^(-EX8/EX6-EX4)*SIGF(EX7^(1/EX6),EX6,EX8) -SIGMAX(EX5*+SIGMAX(EX7^(INDET+EX10)/(INDET+EX10),INDET,EX2,0)) *EX7^-(EX10+EX4)/EX6 EXIT, WHEN SIGN(EX6) EQ 1, PINF EXIT, MINF EXIT, WHEN FIRST(EX9:1/EX5) EQ '! AND EX3=PINF, EX9:SECOND(EX9), WHEN POSITIVE(EX6:LINCF(EX9,INDET)) INDET,EX2), EX2: EX2 + 1, ENDLOOP EXIT, WHEN EX1=INDET, EX3!/(EX2-1)! EXIT, WHEN FREE(EX1,INDET), EX1^(EX3-EX2+1) EXIT, WHEN APPLY(GET('PROD,FIRST(EX1)), ARGEX(EX1)) EXIT, LIST ('PROD, EX1, INDET, EX2, EX3), ENDFUN $ PROPE GOSUB 103.100 T5R=TEMP.REAL : T5I=TEMP.IMAG TEMP.REAL=T1R : TEMP.IMAG=T1I TEMP1.REAL=T4R : TEMP1.IMAG=T4I GOSUB 103.100 Q1R=TEMP.REAL : Q1I=TEMP.IMAG Q2R=Q1R+T5R : Q2I=Q1I+T5I TEMP.REAL=Q2R : TEMP.IMAG=Q2I TEMP1.REAL=S21.REAL : TEMP1.IMAG,INDET,EX2,EX3) * PROD(EX4,INDET,EX2,EX3), ENDFUN $ PROPERTY PROD, ^, FUNCTION (EX1, EX4) % fluid: EX2, EX3, INDET % WHEN FREE(EX4,INDET), PROD(EX1,INDET,EX2,EX3)^EX4 EXIT, WHEN FREE(EX1,INDET), EX1^SIGMA(EX4,INDET,EX2,EX3) EXIT, Q10R=TEMP.REAL : Q10I=TEMP.IMAG Q11R=Q10R-4*T5R : Q11I=Q10I-4*T5I TEMP.REAL=Q11R : TEMP.IMAG=Q11I TEMP1.REAL=S21.REAL : TEMP1.IMAG=S21.IMAG GOSUB 104.100 TEMP1.REAL=Q5R : TEMP1.IMAG=Q5I GOSUB 104.100 Q14R=TEMP.REAL : Q14I=TEMP.IMAG B.REAL=RTY PROD, +, FUNCTION (EX1, EX4), % fluid: EX2, EX3, INDET % WHEN EX1=INDET AND FREE(EX4,INDET), (EX3+EX4)!/(EX2+EX4-1)! EXIT, WHEN EX4=INDET AND FREE(EX1,INDET), (EX3+EX1)!/(EX2+EX1-1)! EXIT, ENDFUN $ PROPERTY PROD, *, FUNCTION (EAG=Q5I TEMP1.REAL=S21.REAL : TEMP1.IMAG=S21.IMAG GOSUB 104.100 Q6R=TEMP.REAL : Q6I=TEMP.IMAG C.REAL=Q6R/100 : C.IMAG=Q6I/100 TEMP.REAL=T2R : TEMP.IMAG=T2I TEMP1.REAL=T3R : TEMP1.IMAG=T3I GOSUB 103.100 Q7R=TEMP.REAL : Q7I=TEMP.IMAG Q8R=Q7R=S21.IMAG GOSUB 104.100 Q3R=TEMP.REAL : Q3I=TEMP.IMAG A.REAL=Q3R/2 : A.IMAG=Q3I/2 TEMP.REAL=T2R : TEMP.IMAG=T2I TEMP1.REAL=T4R : TEMP1.IMAG=T4I GOSUB 103.100 Q4R=TEMP.REAL : Q4I=TEMP.IMAG Q5R=Q4R-T5R : Q5I=Q4I-T5I TEMP.REAL=Q5R : TEMP.IMENDFUN $ RDS() $ HEN FREE(EX4,INDET), PROD(EX1,INDET,EX2,EX3)^EX4 EXIT, WHEN FREE(EX1,INDET), EX1^SIGMA(EX4,INDET,EX2,EX3) EXIT, 25*Q14R : B.IMAG=25*Q14I RETURN EMP1.IMAG=S21.IMAG GOSUB 104.100 TEMP1.REAL=Q5R : TEMP1.IMAG=Q5I GOSUB 104.100 Q14R=TEMP.REAL : Q14I=TEMP.IMAG B.REAL=107.100 REM ***********SMATX*********** T1R=1+S11.REAL : T1I=S11.IMAG T2R=1-S11.REAL : T2I=-S11.IMAG T3R=1+S22.REAL : T3I=S22.IMAG T4R=1-S22.REAL : T4I=-S22.IMAG TEMP.REAL=S12.REAL : TEMP.IMAG=S12.IMAG TEMP1.REAL=S21.REAL : TEMP1.IMAG=S21.IMAG X1, EX4), % fluid: EX2,EX3, INDET % WHEN EXPD(EVSUB(EX1,INDET,INDET+1)*EX4) EQ 1, EVSUB(EX1,INDET,EX2)*EVSUB(EX4,INDET,EX3) EXIT, WHEN EXPD(EVSUB(EX4,INDET,INDET+1)*EX1) EQ 1, EVSUB(EX4,INDET,EX2)*EVSUB(EX1,INDET,EX3) EXIT, PROD(EX1+T5R : Q8I=Q7I+T5I TEMP.REAL=Q8R : TEMP.IMAG=Q8I TEMP1.REAL=S21.REAL : TEMP1.IMAG=S21.IMAG GOSUB 104.100 Q9R=TEMP.REAL : Q9I=TEMP.IMAG D.REAL=Q9R/2 : D.IMAG=Q9I/2 TEMP.REAL=Q2R : TEMP.IMAG=Q2I TEMP1.REAL=Q8R : TEMP1.IMAG=Q8I GOSUB 103.100 file SOLVE4%.EQN GAE - Feb. 1982 Make a file called SOLVE4.EQN as follows: (1) Start with the existing file SOLVE.EQN. (2) Delete the entire FUNCTION SOLEXP (about 50 lines). (3) Insert in its place the entire file SOLVE4%.EX7: (EX8*EX8-3*EX7)/EX9, ENDBLOCK, LIST((-EX8+EX9+EX7)/3, (-EX8+#OMSQ*EX9+#OMEGA*EX7)/3, (-EX8+#OMEGA*EX9+#OMSQ*EX7)/3), ENDFUN $ FUNCTION BIQUAD1(EX6,EX7,EX8,EX9,EX10), %fluid : EX2 % EX6: BIQUAD(EX6,EX7,EX8,EX9,EX10), U1:BIQUAD1(EX6,EX7,EX8,EX9,EX10) EXIT, WHEN NOT ZERO(EX9), EX1:CUBIC1(EX6,EX7,EX8,EX9) EXIT, WHEN NOT ZERO(EX8), EX1:QUADRAT1(EX6,EX7,EX8) EXIT, EX1:LINEAR1(EX6,EX7) EXIT, END WHEN SUM(EX1), LEX3:REST(EX1), EX6:EX7:EX8:EX9:EX10:0, EX2:FALSE, LOOP EX3: POP(LEX3), BLOCK WHEN FREE(EX3,INDET), EX6: EX6+EX3 EXIT, EX4: EX5: 1, BLOCK WHEN PRODUCT(EX3), LEX4: REST(EX3) EION(SOLF(POP(EX6)), UNION(SOLF(POP(EX6)), SOLF(POP(EX6)))), ENDFUN $ #OMEGA: -1/2 + #I*3^(1/2)/2 $ #OMSQ: -1/2 - #I*3^(1/2)/2 $ FUNCTION CUBRT(EX1, % local : % PBRCH), PBRCH: TRUE, EX1^(1/3), ENDFUN $ FUNCTION CUBIC(EX6,EX WHEN EX5^3=EX2, EX9:EX7, EX7:EX4, EX2:EX5 EXIT, WHEN EX5^4=EX2, EX10:EX7, EX7:EX4, EX2:EX5 EXIT, WHEN EX5^3=EX2^2, EX9: EX7, EX8: EX4, EX7: 0, EX2: EX2/EX5 EXIT, QN below this line: ------------------------------------------------------------- FUNCTION SOLEXP (EX1, % Local: % EX2,EX3,EX4,EX5,EX6,EX7,EX8,EX9,EX10,LEX1,LEX2,LEX3,LEX4), EX1: NUM (FCTR(EX1)), BLOCK WHEN SUM(EX1), EX1: NUM(EXPD(E % SOLF(-EX6/EX7), ENDFUN $ FUNCTION QUADRAT1(EX6,EX7,EX8), % fluid : EX2 % EX6: QUADRAT(EX6,EX7,EX8), UNION (SOLF(POP(EX6)),SOLF(POP(EX6))), ENDFUN $ FUNCTION SQRT(EX1, %local % PBRCH), PBRCH: TRUE, EX1^(1/2), ENDFUN $ FUNLOOP EXIT, WHEN NOT FREE(EX1,INDET), EX2: EX1, EX1: SOLF(0) EXIT, EX1: FALSE, ENDBLOCK, LEX2: UNION(EX1, LEX2), WHEN ATOM (LEX1), LEX2 EXIT, ENDLOOP, ENDFUN $ FUNCTION LINEAR1(EX6,EX7), % fluid : EX2XIT, LEX4: LIST(EX3) ENDBLOCK, LOOP EX3: POP(LEX4), BLOCK WHEN FREE(EX3, INDET), EX4: EX4*EX3 EXIT, EX5: EX5*EX3 ENDBLOCK, WHEN ATOM(LEX4)7,EX8,EX9) WHEN EX6=0, ADJOIN(0,QUADRAT(EX7,EX8,EX9)) EXIT, EX8: EX8/EX9, EX7: EX7/EX9, EX6: EX6/EX9, EX6: QUADRAT((EX8^2-3*EX7)^3, 2*EX8^3-9*EX8*EX7+27*EX6,1), EX9: CUBRT(POP(EX6)), BLOCK WHEN EX9=0, EX7: CUBRT(POP(EX6)) EXIT, EWHEN EX5^2=EX2^2, EX9: EX4, EX8: EX7, EX7: 0, EX2: EX5/EX2 EXIT, EX2:0 ENDBLOCK, WHEN ZERO(EX2), EX1: LIST (EX1 "==" 0) EXIT, WHEN ATOM (LEX3), WHEN NOT ZERO(EX10), EXX1)) EXIT, ENDBLOCK, WHEN ZERO(EX1), LIST(INDET "==" ARB(#ARB)) EXIT, WHEN FREE(EX1, INDET), FALSE EXIT, BLOCK WHEN PRODUCT(EX1), LEX1: REST(EX1) EXIT, LEX1: LIST(EX1) ENDBLOCK, LOOP EX1: NUM(EXPD(POP(LEX1))), BLOCK CTION QUADRAT(EX6,EX7,EX8), WHEN E6=0, ADJOIN(0,LINEAR(EX7,EX8)) EXIT, EX6:SQRT(EX7^2-4*EX8*EX6), LIST((-EX7+EX6)/(2*EX8), (-EX7-EX6)/(2*EX8)), ENDFUN $ FUNCTION CUBIC1(EX6,EX7,EX8,EX9), %fluid : EX2 % EX6: CUBIC(EX6,EX7,EX8,EX9), UN EX2^4, EX10: EX10+EX4 EXIT, WHEN NOT ZERO(EX9), EX2:0 EXIT, WHEN NOT ZERO(EX10), EX2:0 EXIT, WHEN EX5^2 = EX2, EX10:EX8, EX8:EX7, EX7:EX4, EX2:EX5 EXIT, WHEN NOT ZERO(EX8), EX2:0 EXIT, , EXIT ENDLOOP, WHEN EMPTY(EX2), EX7: EX4, EX2: EX5 EXIT, WHEN EX5 = EX2, EX7: EX7+EX4 EXIT, WHEN EX5 = EX2^2, EX8: EX8+EX4 EXIT, WHEN EX5 = EX2^3, EX9: EX9+EX4 EXIT, WHEN EX5 =NION(UNION(SOLF(POP(EX6)), SOLF(POP(EX6))), UNION(SOLF(POP(EX6)), SOLF(POP(EX6)))), ENDFUN $ FUNCTION BIQUAD(EX6,EX7,EX8,EX9,EX10, % local : % EX1), WHEN EX6=0, ADJOIN(0,CUBIC(EX7,EX8,EX9,EX10)) EXIT, EXME routine C 400 CONTINUE WRITE ( 3, 9985 ) READ ( 3, 9995 ) NDRIVE WRITE ( 3, 9400 ) READ ( 3, 9990 ) (FILNAM(J), J = 1, 25 ) WRITE ( 3, 9410 ) READ ( 3, 9990 ) (FILNM2(J), J = 1, 25 ) CALL RENAME ( in the function search. DATA NTEST / 3 / DATA YES / 'Y' / DATA ZERO / 0 / C C Get the command line tail C (tests the GETCMD routine) C and EX9+EX10+EX6+EX8)/4, (-EX9+EX10-EX6-EX8)/4, (-EX9-EX10+EX6-EX8)/4, (-EX9-EX10-EX6+EX8)/4), ENDFUN $ INCHR ( NOPT, A ) WRITE ( 3, 9210 ) A, A GOTO 8900 C C INKEY routine C 200 CONTINUE WRITE ( 3, 9980 ) READ ( 3, 9995 ) NOPT WRITE ( 3, 9200 ) CALL INKEY ( NOPT, A ) WRITE ( 3, 9210 ) A, A d dimension (5) = value of variable NFUNC DIMENSION FUNCT(6, 5) C DATA FUNCT / 'I','N','C','H','R',' ', A 'I','N','K','E','Y',' ', B 'E','R','A','S','E',' ', C 'R','E','N','A','M','E', 9: EX9/EX10, EX8: EX8/EX10, EX7: EX7/EX10, EX6: EX6/EX10, EX1: CUBIC(-(EX9^3-4*EX9*EX8+8*EX7)^2, 3*EX9^4-16*EX9*EX9*EX8+16*EX9*EX7+16*EX8*EX8-64*EX6, -3*EX9*EX9+8*EX8, 1), EX10:SQRT(POP(EX1)), EX6:SQRT(POP(EX1)) 20 NLONG = NBYTES IF ( NLONG .GT. NTEST ) NLONG = NTEST DO 50 J = 1, NFUNC KFUNC = J K2 = 0 DO 40 K = 1, NLONG K1 = K + 1 IF ( ARRAY(K1) .EQ. FUNCT(K,J) ) K2 = K2 + 1 40 CONTINUE IF ( K2 .EQ.see what other routine is C to be tested. C CALL GETCMD ( ARRAY ) C C See what command is desired C NBYTES = ARRAY(1) IF ( NBYTES .GT. 0 ) GOTO 20 WRITE ( 3, 9000 ) GOTO 8950 C C C Program to TEST the functions supported in CPMLIB. C C Version 1.0 C January 12, 1982 C C Author: William R. Brandoni C C Language: Microsoft FORTRAN-80 C C C To use this program: C (assuming drive A: is thGOTO 8900 C C ERASE routine C 300 CONTINUE WRITE ( 3, 9985 ) READ ( 3, 9995 ) NDRIVE WRITE ( 3, 9300 ) READ ( 3, 9990 ) (FILNAM(J), J = 1, 25 ) CALL ERASE ( NDRIVE, FILNAM, 25 ) GOTO 8900 C C RENA D 'E','X','I','S','T',' '/ C The variable NFUNC should be the number of functions C searched for in the program. DATA NFUNC / 5 / C The variable NTEST is the maximum number of characters C tested, BLOCK WHEN EX10*EX6=0, EX8:SQRT(POP(EX1)) EXIT, EX8:(-EX9^3+4*EX9*EX8-8*EX7)/(EX6*EX10), ENDBLOCK, LIST((-EX9+EX10+EX6+EX8)/4, (-EX9+EX10-EX6-EX8)/4, (-EX9-EX10+EX6-EX8)/4, (-EX9-EX10-EX6+EX8)/4), ENDFUN $ NLONG ) GOTO 60 50 CONTINUE WRITE ( 3, 9100 ) GOTO 8900 60 GOTO ( 100, 200, 300, 400, 500 ), KFUNC C C INCHR routine C 100 CONTINUE WRITE ( 3, 9980 ) READ ( 3, 9995 ) NOPT WRITE ( 3, 9200 ) CALL LOGICAL*1 ( A-H, O-Z ) DIMENSION ARRAY(80) DIMENSION FILNAM(25) DIMENSION FILNM2(25) C The array FUNCT should be dimensioned as follows: C 1st dimension (6) = max. number of characters in function names C 2ne system + FORTRAN drive and C drive B: contains all of the CPMLIB files) C 1) Compile using F80 C 2) Link using L80, as follows: C A>L80 B:TEST,B:CPMLIB/S,FORLIB/S,B:TEST/N/E C 3) Run the TEST program C C IMPLICITNDRIVE, FILNAM, FILNM2, 25, 25 ) GOTO 8900 C C EXIST routine C 500 CONTINUE WRITE ( 3, 9985 ) READ ( 3, 9995 ) NDRIVE WRITE ( 3, 9500 ) READ ( 3, 9990 ) (FILNAM(J), J = 1, 25 ) CALL EXIST ( NDRIVE, FILN 2*EX1), -COSPI1(EX2-EX1,EX2) EXIT, WHEN EX2 EQ 3, HALF EXIT, WHEN EX2 EQ 5, WHEN EX1 EQ 1, COSPION5 EXIT, COS2PION5 EXIT, WHEN EX2 EQ 15, WHEN EX1 EQ 1, COSPION15 EXIT, WHEN EX1 EQ 2, COS2PION15 EXIT, WHEN EX1 EQ 4, SIN, *, (more than 50 lines). (3) Replace the deleted material with this file starting below this line: ------------------------------------------------------------- FUNCTION SIN (EX1, % Local: % EX2), WHEN NEGLT (EX1), ' will test the erase function.',//) 9100 FORMAT(/,' Invalid function name.' ) 9200 FORMAT(/,' Touch any key .... ') 9210 FORMAT(/,' The key was ASCII ', I3, ' which is graphic ', A1 ) 9300 FORMAT(/,' Enter name of file to erase ... ') 940 0, COSPI(-EX1) EXIT, BLOCK WHEN EX1 > 2, EX1: EX1 - 2*QUOTIENT(NUM(EX1),2*DEN(EX1)) EXIT, ENDBLOCK, BLOCK WHEN EX1 > 1, EX1: 2-EX1 EXIT, ENDBLOCK, WHEN MULTIPLE(DEN(EX1),2), WHEN EX1 > HALF, -((1+COSPI(2*EX1))*HALAM, 25, IOK ) IF ( IOK .EQ. 1 ) WRITE ( 3, 9510 ) IF ( IOK .EQ. 0 ) WRITE ( 3, 9520 ) GOTO 8900 C C All done C 8900 CONTINUE WRITE ( 3, 9989 ) CALL INCHR ( 2, ANS ) IF ( ANS .EQ. YES ) GOTO 60 8950 CONTIS(-EX1) EXIT, WHEN NUMBER(EX2:EX1/#PI), COSPI(EX2) EXIT, WHEN POSMULT (TRGEXPD, 7), (1/(EX2:#E^(#I*EX1)) + EX2) * HALF EXIT, SIMPU ('COS, EX1), ENDFUN $ ROOT5: 5^HALF $ SIXRT5: 6*ROOT5 $ COSPION5: ( 1+ROOT5)/4 $ COS2PION5: -SIN(-EX1) EXIT, WHEN NUMBER(EX2:EX1/#PI), COSPI(HALF - EX2) EXIT, WHEN POSMULT (TRGEXPD, 7), #I * (1/(EX2:#E^(#I*EX1)) - EX2) * HALF EXIT, SIMPU ('SIN, EX1), ENDFUN $ FUNCTION COS (EX1, % Local: % EX2), WHEN NEGLT (EX1), CO0 FORMAT(/,' Enter old name of file ... ') 9410 FORMAT(/,' Enter new name of file ... ') 9500 FORMAT(/,' Enter name of file to test ... ') 9510 FORMAT(/,' ... FILE EXISTS ...') 9520 FORMAT(/,' ... FILE DOES NOT EXIST ...') 9980 FORMAT(/,' Option F)^HALF EXIT, ((1+COSPI(2*EX1))*HALF)^HALF EXIT, EX1: DIVIDE(NUM(EX1), EX2: DEN(EX1)), WHEN MOD(POP(EX1),2) = 1, -COSPI1(EX1,EX2) EXIT, COSPI1(EX1,EX2), ENDFUN $ FUNCTION COSPI1(EX1,EX2), WHEN EX1 EQ 0, 1 EXIT, WHEN LESSER (EX2, file TRGNEG%.ALG GAE - Feb. 1982 Make a new version of file TRGNEG.ALG as follows: (1) Begin with the original file TRGNEG.ALG. (2) Delete everything from FOURONPI: 4 / #PI $ up to (but not including) PROPERTYNUE C C Formats C 9000 FORMAT(//,' To test a function, type the function name',/, A ' after the program name on the command line.',//, B ' For example:',/, C ' A>TEST ERASE',//, D (-1+ROOT5)/4 $ COSPION15: (-1+ROOT5+(30+SIXRT5)^HALF)/8 $ COS2PION15: ( 1+ROOT5+(30-SIXRT5)^HALF)/8 $ COS4PION15: ( 1-ROOT5+(30+SIXRT5)^HALF)/8 $ COS7PION15: (-1-ROOT5+(30-SIXRT5)^HALF)/8 $ FUNCTION COSPI(EX1, % local : % EX2), WHEN EX1 <... ') 9985 FORMAT(/,' Drive ( 0, 1, 2, etc.) ... ') 9989 FORMAT(//,' Another try (y/n) ... ') 9990 FORMAT(25A1) 9995 FORMAT(I5) END  COS4PION15 EXIT, COS7PION15 EXIT, LIST('COS,#PI*EX1/EX2), ENDFUN $ S2PION5 EXIT, WHEN EX2 EQ 15, WHEN EX1 EQ 1, COSPION15 EXIT, WHEN EX1 EQ 2, COS2PION15 EXIT, WHEN EX1 EQ 4,AG TEMP.REAL=TEM2R : TEMP.IMAG=TEM2I TEMP1.REAL=Q3R : TEMP1.IMAG=Q3I GOSUB 104.100 TEMPB.REAL=TEMP.REAL : TEMPB.IMAG=TEMP.IMAG TEMP.REAL=TEM1R : TEMP.IMAG=TEM1I TEMP1.REAL=Q3R : TEMP1.IMAG=Q3I GOSUB 104.100 TEMPD.REAL=TEMP.REAL : TEMPD.IMAG100 S12.REAL=TEMP.REAL : S12.IMAG=TEMP.IMAG TEMP.REAL=Q6R : TEMP.IMAG=Q6I TEMP1.REAL=T6R : TEMP1.IMAG=T6I GOSUB 104.100 S21.REAL=TEMP.REAL : S21.IMAG=TEMP.IMAG TEMP.REAL=T8R : TEMP.IMAG=T8I TEMP1.REAL=T6R : TEMP1.IMAG=T6I GOSUB 104.100 S2P1.IMAG=TEMPC.IMAG GOSUB 103.100 Q2R=TEMP.REAL : Q2I=TEMP.IMAG Q3R=Q1R-Q2R : Q3I=Q1I-Q2I TEM1R=TEMPA.REAL : TEM1I=TEMPA.IMAG TEM2R=-TEMPB.REAL : TEM2I=-TEMPB.IMAG TEM3R=-TEMPC.REAL : TEM3I=-TEMPC.IMAG TEM4R=TEMPD.REAL : TEM4I=TEMPD.IMAG TEMR-T1R : T7I=Q4I-T1I TEMP.REAL=T2R : TEMP.IMAG=T2I TEMP1.REAL=T5R : TEMP1.IMAG=T5I GOSUB 103.100 Q5R=TEMP.REAL : Q5I=TEMP.IMAG T8R=Q5R-T1R : T8I=Q5I-T1I TEMP.REAL=T7R : TEMP.IMAG=T7I TEMP1.REAL=T6R : TEMP1.IMAG=T6I GOSUB 104.100 S11.REAL=T2.REAL=TEMP.REAL : S22.IMAG=TEMP.IMAG RETURN  S21.REAL=TEMP.REAL : S21.IMAG=TEMP.IMAG TEMP.REAL=T8R : TEMP.IMAG=T8I TEMP1.REAL=T6R : TEMP1.IMAG=T6I GOSUB 104.100 S2108.100 REM ***********XMATS*********** TEMP.REAL=A.REAL : TEMP.IMAG=A.IMAG TEMP1.REAL=D.REAL : TEMP1.IMAG=D.IMAG GOSUB 103.100 Q1R=TEMP.REAL : Q1I=TEMP.IMAG TEMP.REAL=B.REAL : TEMP.IMAG=B.IMAG TEMP1.REAL=C.REAL : TEMP1.IMAG=C.IMAG GOSUB 103.P.REAL=TEM4R : TEMP.IMAG=TEM4I TEMP1.REAL=Q3R : TEMP1.IMAG=Q3I GOSUB 104.100 TEMPA.REAL=TEMP.REAL : TEMPA.IMAG=TEMP.IMAG TEMP.REAL=TEM3R : TEMP.IMAG=TEM3I TEMP1.REAL=Q3R : TEMP1.IMAG=Q3I GOSUB 104.100 TEMPC.REAL=TEMP.REAL : TEMPC.IMAG=TEMP.IMEMP.REAL : S11.IMAG=TEMP.IMAG Q6R=100*C.REAL : Q6I=100*C.IMAG TEMP.REAL=T1R : TEMP.IMAG=T1I TEMP1.REAL=T6R : TEMP1.IMAG=T6I GOSUB 104.100 Q7R=TEMP.REAL : Q7I=TEMP.IMAG TEMP.REAL=Q6R : TEMP.IMAG=Q6I TEMP1.REAL=Q7R : TEMP1.IMAG=Q7I GOSUB 103.110.100 REM ***********YZZY*********** TEMP.REAL=TEMPA.REAL : TEMP.IMAG=TEMPA.IMAG TEMP1.REAL=TEMPD.REAL : TEMP1.IMAG=TEMPD.IMAG GOSUB 103.100 Q1R=TEMP.REAL : Q1I=TEMP.IMAG TEMP.REAL=TEMPB.REAL : TEMP.IMAG=TEMPB.IMAG TEMP1.REAL=TEMPC.REAL : TEMEAL=T2R : TEMP.IMAG=T2I TEMP1.REAL=T4R : TEMP1.IMAG=T4I GOSUB 103.100 Q3R=TEMP.REAL : Q3I=TEMP.IMAG T6R=Q3R-T1R : T6I=Q3I-T1I TEMP.REAL=T3R : TEMP.IMAG=T3I TEMP1.REAL=T4R : TEMP1.IMAG=T4I GOSUB 103.100 Q4R=TEMP.REAL : Q4I=TEMP.IMAG T7R=Q4100 Q2R=TEMP.REAL : Q2I=TEMP.IMAG T1R=Q1R-Q2R : T1I=Q1I-Q2I T2R=A.REAL+50*C.REAL : T2I=A.IMAG+50*C.IMAG T3R=A.REAL-50*C.REAL : T3I=A.IMAG-50*C.IMAG T4R=D.REAL+50*C.REAL : T4I=D.IMAG+50*C.IMAG T5R=D.REAL-50*C.REAL : T5I=D.IMAG-50*C.IMAG TEMP.R=TEMP.IMAG RETURN P.IMAG TEMP.REAL=TEM1R : TEMP.IMAG=TEM1I TEMP1.REAL=Q3R : TEMP1.IMAG=Q3I GOSUB 104.100 TEMPD.REAL=TEMP.REAL : TEMPD.IMAGRC = 14 01 POL/REC .SRT CRC = A2 ED REC/POL .SRT CRC = 85 EE REFC/Z .SRT CRC = 41 A9 SER/PAR .SRT CRC = 8D A8 SERIES% .DIF CRC = DB A5 SMATX .SRT CRC = 85 73 SOLVE4% .EQN CRC = 71 58 TEST .FOR CRC = DD 00 TRGNEG% .ALG CRC = 00 D8 U-G-FORM.L TEMP1.IMAG=TEMPC.IMAG GOSUB 103.100 TEM2R=TEMP.REAL : TEM2I=TEMP.IMAG DELR=TEM1R-TEM2R : DELI=TEM1I-TEM2I TEMP.REAL=TEMPA.REAL : TEMP.IMAG=TEMPA.IMAG TEMP1.REAL=TEMPC.REAL : TEMP1.IMAG=TEMPC.IMAG GOSUB 104.100 TEMPA.REAL=TEMP.REAL : TEMPA.IM1A CPMFN .MAC CRC = E4 A4 CPMFN .REL CRC = 99 CC CPMFNA .MAC CRC = 48 64 CPMFNA .REL CRC = 3D 4A CPMINT .FOR CRC = BC 91 CPMINT .REL CRC = ED DA CPMLIB .DOC CRC = 7A D5 CPMLIB .MOD CRC = 56 28 CPMLIB .REL CRC = AD 4B CRCK .COM CRC =EM3I GOSUB 104.100 TEMPC.REAL=TEMP.REAL : TEMPC.IMAG=TEMP.IMAG TEMP.REAL=TEMPD.REAL : TEMP.IMAG=TEMPD.IMAG TEMP1.REAL=TEM3R : TEMP1.IMAG=TEM3I GOSUB 104.100 TEMPD.REAL=TEMP.REAL : TEMPD.IMAG=TEMP.IMAG RETURN AG=TEMP.IMAG TEMP.REAL=DELR : TEMP.IMAG=DELI TEMP1.REAL=TEMPC.REAL : TEMP1.IMAG=TEMPC.IMAG GOSUB 104.100 TEMPB.REAL=TEMP.REAL : TEMPB.IMAG=TEMP.IMAG TEM3R=TEMPC.REAL : TEM3I=TEMPC.IMAG TEMP.REAL=1 : TEMP.IMAG=0 TEMP1.REAL=TEM3R : TEMP1.IMAG=T106.100 REM ***********Z/REFC*********** A=TEMP.REAL TEMP.REAL=A-50 TEMP1.REAL=A+50 : TEMP1.IMAG=TEMP.IMAG GOSUB 104.100 TEMP.MAG=SQR(TEMP.REAL*TEMP.REAL+TEMP.IMAG*TEMP.IMAG) TEMP.PHA=57.296*ATN(TEMP.IMAG/TEMP.REAL) RETURN  CD 2B DIVCOM .SRT CRC = 51 CC INT% .DIF CRC = 3F FE LIM% .DIF CRC = 06 54 LOG% .ALG CRC = DB 03 LPFILTAN.BAS CRC = ED 16 LPFILTAN.INT CRC = C3 97 MPYCOM .SRT CRC = 21 D8 MTXMPY .SRT CRC = 43 FF MUMATH% .DOC CRC = 41 31 PAR/SER .SRT C109.100 REM ***********ZXXZ*********** TEMP.REAL=TEMPA.REAL : TEMP.IMAG=TEMPA.IMAG TEMP1.REAL=TEMPD.REAL : TEMP1.IMAG=TEMPD.IMAG GOSUB 103.100 TEM1R=TEMP.REAL : TEM1I=TEMP.IMAG TEMP.REAL=TEMPB.REAL : TEMP.IMAG=TEMPB.IMAG TEMP1.REAL=TEMPC.REAL :-CATALOG.083 CRC = AD C9 ABSTRACT.083 CRC = 77 D0 APPENDIX.DOC CRC = AB 3C ARITH% .MUS CRC = 05 1F ATRG .TRG CRC = 8B 47 CMATH .DOC CRC = C3 E3 COMCALC .BAS CRC = 10 18 COMCALC .INT CRC = EE 33 COMDISK .DOC CRC = C8 1E CONTENT .DSK CRC = D5 IB CRC = F1 43 XMATS .SRT CRC = BD 1E YZZY .SRT CRC = 82 5B Z/REFC .SRT CRC = C6 05 ZXXZ .SRT CRC = 83 94 = 8B 47 CRC = DB A5 SMATX .SRT CRC = 85 73 SOLVE4% .EQN CRC = 71 58 TEST .FOR CRC = DD 00 TRGNEG% .ALG CRC = 00 D8 U-G-FORM.L