SUBROUTINE ERRSUB C C PURPOSE: GENERAL ERROR CATCHER FOR CALCULATOR PROGRAM. ERROR C CODES PASSED THROUGH /FLAGS/ COMMON WITH NUMERIC VALUE SET C TO CORRECT ERROR MESSAGE: C C ERROR # MESS C C -1 INSUFFICIENT PROGRAM SPACE C -2 ILLEGAL OR UNRECOGNIZED COMMAND C -3 INVALID NUMERIC SPECIFIER C -4 ILLEGAL REGISTER REFERENCE C -5 ILLEGAL INDIRECT REGISTER REFERENCE C -6 ILLEGAL FLAG REFERENCE C -7 INVALID LABEL REFERENCE C C -9 INTEGER OVERFLOW C -10 INTEGER ZERO DIVIDE C -11 FLOATING OVERFLOW C -12 FLOATING ZERO DIVIDE C -13 FLOATING UNDERFLOW C -14 FPP FLOATING TO INTEGER CONVERSION C -21 UDEFINED EXPONENTIATION C -22 LOG NEGATIVE NUMBER C -23 SQUARE ROOT OF NEGATIVE NUMBER C -24 INVALID ARGUMENT TO LIBRARY C C WRITE OUT CURRENT COMMAND EXECUTING BY OUTPUTTING "CMND" IF LENGTH IS C POSITIVE (CMND IN ASCII FORM) OR BY FIRST RECODING COMMAND C IF LENGTH IS NEGATIVE (CMND IN INTERNAL FORM) AND THEN WRITING C CMND. PROGRAM RESET TO STATE 0 IF ERROR ENCOUNTERED DURING C PROGRAM EXECUTION, OR WHEN LOADING MEMORY FROM FILE. C C SORENSON 2/81 C COMMON/UNIT/LUNCMD,LUNOUT,LUNTI,LUNFIL COMMON/FLAGS/STATE,ERROR,STKLFT,NEST,ANGLES,DIGITS,RADIX,FLAG(4) BYTE FLAG,STATE,ERROR,STKLFT,ANGLES,DIGITS,RADIX,NEST COMMON/COMAND/LENGTH,CMND(40) BYTE CMND COMMON/MEMORY/PC,P(1000) INTEGER PC BYTE P COMMON/STACK/X,Y,Z,T,XLST DOUBLE PRECISION X,Y,Z,T,XLST COMMON/REGS/R(256) DOUBLE PRECISION R BYTE Q DATA Q/'?'/ I=ERROR ERROR=0 IF(I.GE.0)RETURN I=IABS(I) IF(STATE.LT.0)STATE=0 IF(LENGTH)1,2,3 C C REGENERATE COMMAND BY CALL TO RECODE C 1 CALL RECODE GO TO 3 C C DON'T KNOW WHAT COMMAND BLEW UP, PRINT '?' C 2 LENGTH=3 CMND(1)=Q CMND(2)=Q CMND(3)=Q 3 WRITE(LUNTI,4)(CMND(J),J=1,LENGTH) 4 FORMAT('0',9X,'Error executing ',40A1) C C DISPATCH TO CORRECT ERROR MESSAGE C GO TO (10,20,30,40,50,60,70,5,90,100,110,120,130,140, 15,5,5,5,5,5,210,220,230,240),I 5 WRITE(LUNTI,6) 6 FORMAT(10X,'Unexpected error') GO TO 1000 10 WRITE(LUNTI,11) 11 FORMAT(10X,'Insufficient program space') GO TO 1000 20 WRITE(LUNTI,21) 21 FORMAT(10X,'Illegal or unrecognized command') GO TO 1000 30 WRITE(LUNTI,31) 31 FORMAT(10X,'Invalid numeric specifier') GO TO 1000 40 WRITE(LUNTI,41) 41 FORMAT(10X,'Illegal register reference') GO TO 1000 50 WRITE(LUNTI,51) 51 FORMAT(10X,'Illegal indirect register reference') GO TO 1000 60 WRITE(LUNTI,61) 61 FORMAT(10X,'Illegal flag reference') GO TO 1000 70 WRITE(LUNTI,71) 71 FORMAT(10X,'Invalid label reference') GO TO 1000 90 WRITE(LUNTI,91) 91 FORMAT(10X,'Integer overflow') GO TO 1000 100 WRITE(LUNTI,101) 101 FORMAT(10X,'Integer zero divide') GO TO 1000 110 WRITE(LUNTI,111) 111 FORMAT(10X,'Floating overflow') GO TO 1000 120 WRITE(LUNTI,121) 121 FORMAT(10X,'Floating zero divide') GO TO 1000 130 WRITE(LUNTI,131) 131 FORMAT(10X,'Floating underflow') GO TO 1000 140 WRITE(LUNTI,141) 141 FORMAT(10X,'FPP floating to integer conversion error') GO TO 1000 210 WRITE(LUNTI,211) 211 FORMAT(10X,'Undefined exponentiation') GO TO 1000 220 WRITE(LUNTI,221) 221 FORMAT(10X,'Log of negative number') GO TO 1000 230 WRITE(LUNTI,231) 231 FORMAT(10X,'Square root of negative number') GO TO 1000 240 WRITE(LUNTI,241) 241 FORMAT(10X,'Invalid argument to library function') GO TO 1000 1000 RETURN END