home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ZSYS / SIMTEL20 / ZSIG / FINDERR.DOC < prev    next >
Text File  |  2000-06-30  |  7KB  |  160 lines

  1.                                   FINDERR
  2.                                 VERSION 1.0
  3.  
  4.                                Ted H. Emigh
  5.                   Departments of Genetics and Statistics
  6.                       North Carolina State University
  7.                             Raleigh, NC  27695
  8.                            usenet: emigh@ecsvax
  9.  
  10.      One of the major advantages of ZCPR3 is the passing of messages from
  11. one utility to the next.  Unfortunately, almost all commercial packages do
  12. not have this mechanism.  This program was developed to help in the passing
  13. of messages from commercial programs to ZCPR3 utilities.  As an example:
  14. We may wish to have a compilation/assembly stop if there are errors.
  15. Otherwise, we may wish to link the program with a library to an executable
  16. program.  Microsoft's Macro-80 assembler (M80) and FORTRAN-80 compiler
  17. (F80) give a summary of the number of fatal and warning errors just before
  18. the assembler/compiler stops execution.  FINDERR looks at the fatal and
  19. warning errors from M80/F80 and sets the ZCPR3 registers if there have
  20. been any errors.
  21.  
  22.      Although it was designed for M80/F80, it should be relatively simple
  23. to add this type of error messages for any program that gives a summary of
  24. errors (or a total number of errors).
  25.  
  26. ZCPR3 MESSAGES:
  27.  
  28.      ZCPR3 allows the passing and testing of messages using the IF #
  29. construct, where # is a number between 0 and 9.  If a particular register
  30. is 0, then an error did not occur, if it is nonzero, then an error occured
  31. during assembly/compilation, and the specific value designates whether the
  32. error was fatal or a warning error.  In this version of FINDERR, ZCPR3
  33. Register 0 reflects the error status of a prior M80 assembly, and ZCPR3
  34. Register 1 reflects the error status of a prior F80 compilation.  FINDERR
  35. will check memory locations for both M80 and F80 -- but will be valid only
  36. ONE AT A TIME, and must be executed immediately after M80/F80.
  37.  
  38. THE NATURE OF SUMMARY MESSAGES:
  39.  
  40.      If a program gives a summary message, it must have locations to keep
  41. track of the errors (or summary data).  As the program exits, it will check
  42. these locations and print a message if it is appropriate.  You need to find
  43. these locations in order to make use of the summary information.   To find
  44. these locations, you need a good disassembler (RES, ZDASM, etc).
  45.  
  46. FINDING SUMMARY LOCATIONS:
  47.  
  48.      The first thing you must look for is the message that is printed out
  49. when there is an error, say, "Errors Detected".  Dump memory from 100H
  50. until you have found the message.  The message, typically will end with a
  51. '$', or 0, or with the 80H bit set, or will have a single byte at the
  52. beginning which contains the number of characters to display:
  53.     db    'Errors Detected',0DH,0AH,'$'    ;ending in '$'
  54.     db    'Errors Detected',0DH,0AH,0    ;ending in 0
  55.     db    'Errors Detected',0DH,0AH+80H    ;ending with 80H bit set
  56.     db    17,'Errors Detected',0DH,0AH    ;character count at the start
  57.      Normally, there are two ways for the program to print an error
  58. message: 1)  Loading the address of the summary message into a register
  59. (e.g., LXI H,ERRMSG), then calling a routine that prints the message; or 2)
  60. Having a CALL just before the summary message (the address of the summary
  61. message is then put on the stack).  The first is the most common situation.
  62.  
  63.      Once you have found the summary message, use your disassembler's
  64. 'FIND' function to find where the beginning location of the message has
  65. been referenced.  In this area, you will find the code that checks for the
  66. error count.  The following is an example (from Microsoft's M80 macro
  67. assembler, version 3.44).
  68.  
  69.     2EAD    LDHL    3CEDH        ;Location for number of fatal errors
  70.     2EB0    MOV    A,H        ;See if there are errors
  71.     2EB1    ORA    L
  72.     2EB2    JZ    2ECBH        ;No errors, print 'No'
  73.     2EB5    PUSH    H        ;These next
  74.     2EB6    CALL    1ADFH        ;    statements
  75.     2EB9    POP    H        ;        print the number
  76.     2EBA    LDA    40B4H        ;            of errors
  77.     2EBD    INR    A
  78.     2EBE    STA    3F5BH
  79.     2EC1    CNZ    1ADFH
  80.     2EC4    XRA    A
  81.     2EC5    STA    3F5BH
  82.     2EC8    JMP    2ED1H        ;Now print ' Fatal error(s)'
  83.     2ECB    LXI    H,2F4CH        ;Point to 'No' message
  84.     2ECE    CALL    2FD0H        ;Print it
  85.     2ED1    LXI    H,2F4FH        ;Point to ' Fatal error(s)' message
  86.     2ED4    CALL    2FD0H        ;Print it
  87.         .
  88.         .
  89.         .
  90.     2F4C    DB    'No',0
  91.     2F4F    DB    ' Fatal error(s)',0
  92.  
  93.      In this case, I searched for 2F4CH (the 'No' message), and found it
  94. referenced at 2ECBH.  The instruction just before this is an unconditional
  95. jump (JMP 2ED1H), so we need to 'FIND' 2ECBH as well.  This search leads to
  96. 2EB2H, and the instructions just prior to it.  We can see now that location
  97. 3CEDH is the 2-byte location for the number of errors (actually, from this
  98. segment all we know is that the word at 3CEDH is zero if there are no
  99. errors, and nonzero if there are errors).  Once you understand what to look
  100. for, it is not too difficult to find these locations.  Unfortunately, not
  101. all programs do this.  For example, neither ASM nor MAC keep track of the
  102. number of errors, so this will not work for those assemblers.
  103.  
  104.      When you have found the locations, and how many bytes each takes, you
  105. can add them to this program by changing the system equates at the
  106. beginning of the program.  For the distribution version, register 0 is zero
  107. if M80 found no errors, is one if M80 found at least one fatal error, and
  108. is two if M80 found no fatal errors but did find at least one warning
  109. error.  In addition, register 1 is zero if F80 found no errors, is one if
  110. F80 found at least one fatal error, and is two if F80 found no fatal
  111. errors, but did find at least one warning error.
  112.  
  113. USING FINDERR:
  114.  
  115.      FINDERR MUST be executed immediately following the termination of the
  116. program that it is checking, so that no memory locations are changed.  Note
  117. that this means that FINDERR should lie in the path, don't use CMDRUN to
  118. get it out of a library, as this may change the memory locations you wish
  119. to test.  The ZCPR3 registers are set IN CONTEXT WITH the program executed
  120. prior to FINDERR.  Hence, Register 0 is a valid test with FINDERR after
  121. M80, but is invalid if FINDERR is executed after F80.  The following ZEX
  122. file will assemble an M80 file and link/load it if there are no errors.  If
  123. there are warning errors, it will wait for programmer intervention, and if
  124. there are any fatal errors it will abort the assembly.
  125.  
  126. EXAMPLE:
  127.  
  128. ;
  129. ;   M80.ZEX -- MACRO-80 Assembler and Linker
  130. ;
  131. ;   ^& Suppress FALSE IF Printout
  132. if nul $1 ;note Print Error Message
  133. echo    ^G**** No Parameter Specified ****
  134. else    ;note Perform Assembly
  135. if ~empty $1.MAC ;note Print File Not Found
  136. echo    **** File Not Found ****
  137. else
  138. M80 =$1
  139. FINDERR
  140. if 0        ;note No errors found, link file
  141. ERA $1.BAK
  142. ERA $1.COM
  143. L80 /P:100,$1,$1/N,SYSLIB/S,/E
  144. else        ;note on IF REG 0
  145. if 0 2    ;note see if the errors are warnings
  146. echo    ^G***WARNING ERROR***
  147. if input Type T to Continue or F to Abort (Warning Errors)
  148. ERA $1.BAK
  149. ERA $1.COM
  150. L80 /P:100,$1,$1/N,SYSLIB/S,/E
  151. fi      ;note on IF INPUT
  152. else      ;note error is fatal
  153. echo   ^G***FATAL ERROR IN ASSEMBLY***
  154. fi      ;note IF REG 0 2
  155. ERA $1.REL
  156. fi;fi       ;note on IF NUL and IF EMPTY
  157. ;
  158. ;    Assembly Complete
  159. ;
  160.