;********* ; * ; BASIC0 * ; * ;********* .TITLE TRPHDL .SBTTL TRAP MACRO DEFINITIONS ; ; DOS VERSION FROM WHICH THE RSX VERSION EVOLVED WAS ORIGIANLLY A DECUS ; LIBRARY PROGRAM MODIFIED BY FRANK KORZENIEWSKI OF RPSLMC. ; ; BASIC TRAP HANDLER OBJECT MODULE 31 MAY 72 ; PROVIDES ONE WORD TRAP SUBROUTINE CALLS AND ; ERROR HANDLING ; ; MODIFIED BY LARRY SIMPSON 12-SEP-75 FOR ERROR TRAPS ONLY ; AND USE OF WORD ON STACK RETURNED BY RSX EXECUTIVE. ; ; MODIFIED FOR "MO" ERROR HANDLING ; BY LARRY SIMPSON 15-OCT-75 ; ; MODIFIED FOR "ON ERROR GOTO" USER ERROR HANDLING ; BY LARRY SIMPSON 13-DEC-76 ; ; MODIFIED FOR FLOATING POINT EXCEPTION ERROR HANDLING ; BY LARRY SIMPSON 17-DEC-76 ; RSX11D=1 ;DEFINE FOR RSX11D MO ERROR HANDLING ; GLOBAL PROGRAM EXTERNALS ; .GLOBL ENDSTK STOP02 TINPT TOTPT INPT OTPT .GLOBL STUDAT ENUDAT DETACH GOTO03 FPEXFL LINEFL ; ; GLOBALS DEFINED HERE .GLOBL FPERMS .IF DF RSX11D .GLOBL STRD .ENDC ; ; MO PARAMETER LIST GLOBALS .GLOBL PARLST P.ERCD P.LINE P.FCS P.FLNM P.FNAM ; ; MACRO CALLS .MCALL DIR$ ASTX$S .IF DF RSX11D .MCALL MOUT$ MODF$ MOWA$S .ENDC ;TRAP ENTRY POINT GLOBALS - FOR SVTK$ AND SFPA$ IN BASIC3 ; .GLOBL TRAP00 FPEXTR ; ; .MACRO TV .SYM .SYM = TRAP TRAP=TRAP+1 .GLOBL .SYM .ENDM .PAGE .SBTTL JSR MACRO DEFINITIONS ; ; MODIFICATION BY FRANK BORGER 5-SEP-75 ; ;CODE TO CONVERT TRAP SUBROUTINE CALLS TO NORMAL JSR'S ;FOR OPERATION UNDER RSX. ; ;DEFINE A GENERAL MACRO TO GENERATE A SECOND MACRO WHICH ;CONVERTS A TRAP NAME OF XXXXXX TO A ; JSR PC,XXXXXX ; .MACRO TRPSUB A,B .MACRO A JSR PC,B .ENDM .ENDM ; ; NOW ALL THE ONE-TIME TRAPS THAT BASIC USES ; TRPSUB ARYLG,ARYL00 ;COMPUTE ARRAY LENGTH TRPSUB ATOF,ATOF00 ;ASCII TO FLOATING TRPSUB ATOI,ATOI00 ;ASCII TO INTEGER TRPSUB CLOSEF,CLOS00 ;CLOSE ANY OPEN FILES TRPSUB CLRUSR,CLRU00 ;CLOSE TEMP USER SPACE (IF ANY) TRPSUB CRLF,CRLF00 ;DO [CR,LF] TRPSUB DIMCHK,DIMC00 ;CHECK LEGALITY OF DIMENSIONS TRPSUB EVAL,EVAL00 ;EVALUATE ARITHMETIC EXPRESSION TRPSUB EVALS,EVLS00 ;EVALUATE STRING EXPRESSION TRPSUB FINDLN,FIND00 ;FIND LINE NUMBER (IN R0) TRPSUB GETADR,GTDR00 ;GET ADDRESS OF A VARIABLE TRPSUB GETNUM,GET00 ;GET COMMAND PARAMETER TRPSUB GETSAD,GTSD00 ;GET ADDRESS OF STRING TRPSUB GETVAR,GETV00 ;GET TRUNCATED VARIABLE TRPSUB ITOA,ITOA00 ;CONVERT INTEGER TO ASCII TRPSUB JUNKIT,JUNK00 ;SKIP OVER TRASH TO END OF LINE TRPSUB PACK,PCK00 ;PACK LINE INTO WORKING STORAGE TRPSUB PRINTC,PRNT00 ;PRINT CHARACTER TRPSUB PRINTL,PRN00 ;PRINT LINE, R0=FBA,R1=LBA TRPSUB PRNTLN,PRLN00 ;PRINT LINE NUMBER TRPSUB PSHNAM,PSH00 ;PUSH NAMED VARIABLE ONTO LIST TRPSUB PSHSTR,PSHS00 ;PUSH STRING DESCRIPTOR ONTO LIST TRPSUB PUSH,PUSH00 ;PUSH ONE WORD INTO USER LIST TRPSUB SCRNCH,SCR00 ;DELETE N BYTES FROM USER SPACE TRPSUB SKIP,SKIP00 ;SKIP OVER SPACES IN INPUT TEXT TRPSUB SQUISH,SQU00 ;DELETE TEXT TO TERMINATOR AND PACK TRPSUB SRCHLF,SRCH00 ;SEARCH FOR LINE FEED USING R1 AS POINTER TRPSUB SRLST,SRL00 ;SEARCH FOR ITEM IN USER STORAGE TRPSUB STRLEN,STRL00 ;COMPUTE STRING LENGTH TRPSUB SUBSCR,SUBS00 ;COMPUTE A SUBSCRIPT EXPRESSION TRPSUB TSTCH,TST00 ;TEST CHAR (IN R2) ALPHA VS NUMERIC TRPSUB TSTOK,TSTU00 ;CHECK, IS THERE ENOUGH USER SPACE TRPSUB TWOCHR,TWO00 ;PACK TWO CHARACTERS IN R4 TRPSUB FNMBR,FNMB00 ;GET FILE NUMBER AND SET UP FILE .SBTTL BASIC STACK ITEMS FORMAT ; ; BASIC STACK ITEMS FORMATS ; ;THESE ITEMS ARE PLACED AND REMOVED FROM THE RUN TIME ;STACK. THIS STACK STARTS AT THE END OF THE USERS STATEMENTS ;AND EXTENDS TO THE END OF CORE. R5 IS USALLY A POINTER TO ;THE END OF THIS AREA. STRING ARITHMETIC USES END OF STACK TO ;END OF CORE AS TEMPORARY STRING WORKSPACE. ; ; MASK=000000 NUMERIC VARIABLES (SIMPLE+ARRAY) ; LENGTH=2+ARRAY SIZE ; WORD1=MASK+VAR NAME (2 SIXBIT CHARS) ; WORD2=2 DIMENSIONS (1 BYTE EACH) ; WORD3-N=VALUES ; MASK=020000 GOSUB/RETURN POINTER ; LENGTH=2 ; WORD1=020000 ; WORD2=GOSUB LINE NUMBER ; MASK=040000 FOR LOOP CONTROL TABLE ; LENGTH=7 ; WORD1=MASK+SIXBIT VAR NAME ; WORD2-3=END VALUE ; WORD4-5=STEP VALUE ; WORD6=FOR LINE NUMBER ; WORD7=FOR STATEMENT COUNT ; MASK=060000 NUMERIC FUNCTION ; LENGTH=3+ # OF DUMMY VARIABLES ; WORD1=MASK+FCN NAME (LETTER+OPTIONAL #) ; WORD2=# OF DUMMY VARIABLES ; WORD3=ADDRESS OF PAST = SIGN ; WORD4-N=DUMMY VARIABLE NAMES + TYPE MASK ; MASK=100000 STRING FUNCTION ; LENGTH=3+ # OF DUMMY VARIABLES ; WORD1=MASK+FCN NAME (LETTER+OPTIONAL #) ; WORD2=# OF DUMMY VARIABLES ; WORD3=ADDRESS OF PAST = SIGN ; WORD4-N=DUMMY VARIABLE NAMES + TYPE MASK ; MASK=120000 STRING VARIABLE ; LENGTH=3+STRING SPACE SIZE ; WORD1=MASK+10000+SIXBIT VAR NAME ($ DROPPED) ; WORD2=2 DIMENSIONS (1 BYTE EACH) ; WORD3=BYTE(MAX STRING LENGTH), BYTE(TYPE) ; TYPE=- VAR, TYPE=+ FIXED ; WORD4-N=STRING SPACE ; BYTE1=CURRENT LENGTH OF ELEMENT ; BYTE2-N=STRING DATA ; MASK=140000 FILE CONTROL BLOCK ; LENGTH=11.+BUFFER SIZE ; WORD1=MASK+FILE NUMBER+CODE BITS ; 000400=INPUT POSSIBLE ; 001000=OUTPUT POSSIBLE ; 002000=(SEQUENTIAL=0),(RANDOM=1) ; 004000=(ASCII=0),(BINARY=1) ; WORD2=CURRENT BUFFER POINTER (OUTPUT) ;MNT SIZE ; WORD3=MAX BYTE COUNT ; WORD4=UNUSED ;MNT STARTING BLOCK ; WORD5=ACTUAL BYTE COUNT ;NO. MNT ENTRIES ; WORD6=DATA BUFFER ADDRESS ; WORD7=UNUSED ;RESPONSE COUNT ; WORD8=FDB POINTER ; WORD9=EOF ROUTINE ADDRESS ;BLOCK# ; WORD10=RECORD NUMBER ;BYTE OFFSET ; WORD11=UNUSED ; WORD12-WORD59=FDB ; WORD60+=DATA BUFFER ; MASK=160000 SCRATCH STACK ITEM ; WORD1=MASK+LOWER BYTE WITH COUNT OF BYTES FOLLOWING ; WORD2-N=SCRATCH DATA ; ;+1 ; .SKIP ; .X ^INTRODUCTION ; ^THIS ^^BASIC\\ FOLLOWS ^^DEC\\'S ^^BASIC-11\\ AS MUCH AS POSSIBLE. ; ^PRIMARY DIFFERENCES ARE IN THE FILE ^I/^O. ; ^THE ^^OPEN, PRINT\\ AND ^^INPUT\\ STATEMENTS HAVE BEEN MODIFIED ; TO PROVIDE FULL ^^FILES-11\\ CAPABILITY FOR ^^ASCII\\ FILES BOTH ; FIXED AND VARIABLE LENGTH AND SEQUENTIAL AND RANDOM ACCESS. ; ^THE STATEMENT CONCATENATION CHARACTER IS THE COLON (:). ; ^ALL NUMERIC CALCULATION IS DONE IN FLOATING POINT (^^REAL*4\\ FOR YOU ; ^^FORTRAN\\ BUFFS). ; .SKIP ; .ID -5 ; ^STRING CONSTANTS ; .BR ; .X ^STRINGS ; ^STRING CONSTANTS ARE SPECIFIED WITH DOUBLE QUOTES. ; ^AT THIS POINT IT IS NOT POSSIBLE TO REPRESENT A DOUBLE QUOTE ; IN A STRING CONSTANT, I.E. A STRING DELIMITED BY DOUBLE QUOTES. ; ^HOWEVER, THIS LIMITATION MAY BE GOTTEN AROUND BY USING ^^INPUT\\ ; OR ^^READ\\ OR THE ^^CHR$\\ FUNCTION. ; .SKIP ; .ID -5 ; ^DATA AND FILE PRESERVATION ; .BR ; .X ^^CLEAR\\ ; .X ^^RUN\\ ; .X ^FILE CLOSE ; ^USER DATA IS NOW KEPT INTACT EXCEPT FOR ^^CLEAR\\ AND ^^RUN\\ COMMANDS. ; ^USER FILES ARE AUTOMATICALLY CLOSED ON EXECUTION OF THE ^^RUN\\ ; OR ^^CLEAR\\ COMMANDS AND ON EXIT FROM ^^BASIC\\. ; ^THEY REMAIN OPEN (UNLESS EXPLICITLY CLOSED BY A ^^CLOSE\\ COMMAND) ; ON PROGRAM STOP FOR DEBUGGING PURPOSES. ; .SL ; .ID -5 ; ^STRING VARIABLES ; .BR ; ^STRING VARIABLES ARE DECLARED IN A ^^DIM\\ STATEMENT AND CAN BE EITHER ; FIXED OR VARIABLE LENGTH. ; ^SEE ^^DIM\\ STATEMENT FOR THE SPECIFICS. ; .SL ; .ID -5 ; ^EXPONENTIATION ; .X ^EXPONENTIATION ; .X ^POWERS OF NUMBERS ; .BREAK ; ^EXPONENTIATION (_^) IS DONE IN TWO WAYS. ; ^IF THE EXPONENT IS AN INTEGER, THE BASE IS MULTIPLIED (OR DIVIDED) ; BY ITSELF THE APPROPRIATE NUMBER OF TIMES. ; ^IF THE EXPONENT CONTAINS A FRACTIONAL PART, A LOG - ANTILOG CALCULATION ; SEQUENCE IS USED. ; .SL ; .ID -5 ; .X ^^MCR\\ ; ^^MCR\\ ; .BREAK ; ^^BASIC\\ IS CALLED FROM THE ^^MCR\\ BY TYPING ^^BASIC\\ (OR ^^BAS\\) ; IN RESPONSE TO THE ^^MCR\\ PROMPT. ; ^A _<^C^R> MAY FOLLOW FOR NORMAL INTERACTIVE USE OR ONE OF TWO OTHER ; OPTIONS MAY FOLLOW BEFORE _<^C^R> FOR SPECIAL USES. ; ^IF A SPACE AND A ? FOLLOWED BY AN ARITHMETIC EXPRESSION FOLLOWS ^^BAS\\, ; THE VALUE OF THE EXPRESSION WILL BE PRINTED ON THE NEXT LINE FOLLOWED ; BY A RETURN TO THE ^^MCR\\. ; ^THIS IS USEFUL FOR QUICK DESK CALCULATOR TYPE CALCULATIONS. ; ^IF A SPACE (OR TAB) AND A FILE NAME WITH AN OPTIONAL SWITCH FOLLOW, ; THEN THAT FILE WILL BE READ IN AS A USER PROGRAM JUST AS IN THE ^^OLD\\ ; COMMAND. ; ^IF THE SWITCH (/^R^N) IS SPECIFIED, THE PROGRAM WILL ALSO BE RUN AS ; THOUGH THE ^^RUN\\ COMMAND HAD BEEN TYPED. ; ^A VALUE MAY BE SPECIFIED FOR THE SWITCH WHICH WILL DETERMINE THE ; LINE AT WHICH TO START EXECUTION. ; ^IF THE SWITCH (/^C^O) IS ADDED, THEN THE FILE RETRIEVED WILL BE ; ASSUMED TO BE PREVIOUSLY COMPILED AND A DEFAULT EXTENSION OF BAS ; MCR>BASIC PROG.BAS/RN ; MCR>BAS PROG/RN:150 ; MCR>BAS ? 4*SIN(.532) ; \\ ; .FILL ;- ; BASIC TRAP AND ERROR HANDLER - ; ERROR CALLS IN BASIC ARE MADE BY TRAP CALLS; NORMAL SUBROUTINE ; TRANSFERS ARE MADE BY JSR PC'S UNDER RSX ; ; SUBROUTINE CALLS ARE MADE BY MACRO'S WHICH ARE EXPANDED INTO JSR'S. ; .SBTTL TRAP ERROR CALLS - MACRO DEFINITIONS ; ; THE FOLLOWING IS A LIST OF IMPLEMENTED ERROR CALLS. ALL ERRORS LESS ; THAN "FENCE" ARE FATAL, ALL GREATER ARE NON-FATAL. ; ; FATAL ERROR CALLS ; TRAP=104400 ;PROTOTYPE TRAP INSTR. FOR MACRO TV OVFERR ;USER STORAGE OVERFLOW - 0 TV UNRERR ;UNRECOGNIZED STATEMENT - 1 TV GOERR ;ILLEGAL GOTO OR GOSUB - 2 TV ILCERR ;ILLEGAL CHARACTER TERMINATING STMT - 3 TV RETERR ;RETURN WITHOUT GOSUB - 4 TV SBSERR ;BADLY FORMED SUBSCRIPT - 5 TV SUBERR ;SUBSCRIPT OUT OF RANGE - 6 TV PARERR ;MISMATCHED PARENTHESES - 7 TV LETERR ;ILLEGAL LET - 8 TV OPRERR ;ILLEGAL RELATIONAL OPERATOR IN IF - 9 TV IFERR ;ILLEGAL IF - 10 TV PRNERR ;ILLEGAL PRINT - 11 TV LINERR ;INPUT LINE TOO LONG - 12 TV DIMERR ;BAD DIMENSION - 13 TV DMVERR ;NOT ENOUGH ROOM IN STORAGE FOR THE ARRAY - 14 TV DEFERR ;BADLY FORMED DEFINE - 15 TV LNNERR ;ILLEGAL LINE NUMBER OR DIMENSION VALUE - 16 TV DMDERR ;DIM OF PREVIOUSLY DECLARED OR USED ITEM - 17 TV INPERR ;BAD VARIABLE IN INPUT LIST - 18 TV REAERR ;BAD VARIABLE IN READ LIST - 19 TV RE1ERR ;OUT OF DATA - 20 TV RE2ERR ;BAD FORMAT IN A DATA STATEMENT - 21 TV FORERR ;ILLEGAL FOR STATEMENT - 22 TV NXTERR ;NO NEXT MATCHING FOR - 23 TV NXMERR ;NEXT WITHOUT FOR - 24 TV UNMERR ;UNMATCHED QUOTES IN STATEMENT - 25 TV EXFERR ;EXTERNAL FUNCTION NOT PROPERLY SET UP - 26 TV ILFERR ;ILL FORMED EXPRESSION - 27 TV CSIERR ;COMMAND STRING ERROR - 28 TV STRERR ;SBS FUNCTION ERROR - 29 TV STXERR ;SYNTAX ERROR IN FUNCTION - 30 TV OPNERR ;SYNTAX ERROR IN OPEN - 31 TV CLSERR ;SYNTAX ERROR IN CLOSE - 32 TV FNMERR ;INVALID FILE NUMBER - 33 TV EOFERR ;END OF FILE ERROR - 34 TV CLOSER ;FCS ERROR DURING CLOSE - 35 TV OPENER ;FCS ERROR DURING OPEN - 36 TV CALERR ;ERROR IN PROCESSING CALL STATEMENT - 37 TV ARGERR ;ERROR IN PROCESSING CALL ARGUMENTS - 38 TV STOERR ;ERROR IN STORE DURING CALLED ROUTINE - 39 TV OPLBER ;ERROR IN SYNTAX OR LUN IN USE IN LIB OPEN - 40 TV OPLFER ;FCS ERROR IN LIBRARY OPEN OR FIRST READ - 41 TV SLPERR ;ERROR IN SLEEP COMMAND - 42 TV WATERR ;ERROR IN WAIT COMMAND - 43 TV TMOERR ;TIMEOUT ERROR ON INPUT - 44 TV PRIERR ;PRIORITY ERROR - 45 TV PRFERR ;PROGRAM FILE ERROR - 46 TV FACERR ;FILE ACCESS MODE ERROR - 47 TV LODERR ;ERROR IN LOADED USER SUBROUTINE - 48 TRAP=104500-2 ;SET ADDRESS FOR START OF DEBUGGING CODES TV TM1ERR ;DEBUGGING ERROR #1 - 62 TV TM2ERR ;DEBUGGING ERROR #2 - 63 ; ; NON-FATAL ERROR CALLS ; TRAP=104500 ;SET ADDRESS FOR NON-FATAL ERRORS FENCE=TRAP-104400 ; TV LOGERR ;LOG OF NEGATIVE OR ZERO NUMBER - 64 TV SQRERR ;SQUARE ROOT OF NEGATIVE NUMBER - 65 TV DVFERR ;DIV.-MUL. OVERFLOW OR UNDERFLOW - 66 TV FIXERR ;NUMBER TOO LARGE TO FIX - 67 TV FOFERR ;FLOATING POINT OVERFLOW - 68 TV FUFERR ;FLOATING POINT UNDERFLOW - 69 TV NXVERR ;NON-EXISTENT VARIABLE - 70 TV IN1ERR ;TOO MUCH DATA TYPED - 71 TV IN2ERR ;NOT ENOUGH DATA TYPED - 72 TV IN3ERR ;ILLEGAL CHARACTERS ON INPUT - 73 TV VALERR ;ERROR IN VAL FUNCTION - 74 ; ; END OF DIAGNOSTIC CALLS ; .SBTTL ERROR TRAP HANDLER ; ; ; TRAP AND ERROR HANDLER ; FATAL ERRORS WIPE OUT THE SYSTEM STACK AND RETURN TO THE ; COMMAND INTERPRETER AFTER GIVING THE DIAGNOSTIC. NON-FATAL ; ERRORS RETURN TO THE CALLING ROUTINE. ; REGISTER ASSIGNMENTS ; R0 = %0 ;TEMPORARY AND PARAMETER TRANSFER R1 = %1 ;TEMPORARY AND PARAMETER TRANSFER R2 = %2 ;SCRATCH R3 = %3 ;SCRATCH R4 = %4 ;SCRATCH R5 = %5 ;USER LIST POINTER SP = %6 ;BASIC STACK POINTER PC = %7 ;PROGRAM COUNTER ; TRAP=104400 ;FOR USE BY TRAP HANDLER ; .PSECT BASIC0,RW,I,LCL,REL,CON ;MAIN OF TRPHDL TRAP00: MOV (SP)+,R2 ;2*LOWER BYTE IN R2 MOV (SP)+,(SP) ;SET STACK FOR RTS PC ASR R2 ;LOWER BYTE OF TRAP IN R2 CMP R2,#FENCE ;IS IT FATAL? BGT ERRR01 ;JUMP IF NON-FATAL MOV #TINPT,INPT ;RESET FILE CONTROL BLOCK ADDRESSES MOV #TOTPT,OTPT CLR LINEFL ;IN CASE BINARY OR INPUT LINE FAILED MOV ENUSAV,ENUDAT ;RESTORE OLD END OF DATA IN CASE CORRUPTED CLOSEF ;IN CASE FROM OLD MOV ENDSTK,SP ;ZAP THE STACK MOV #STOP02,-(SP) ;GET NEW RETURN ADDRESS ERRR01: MOV R2,PARLST+P.ERCD ;PUT ERROR CODE IN PARAMETER LIST .IF DF RSX11D INC R2 ;INCREMENT TO USE FOR REC NO MOV R2,MODPB+M.ONUM ;PUT IN DPB FOR MO MOV MOLUN,MODPB+M.OLUN ;SET UP LUN PROPERLY .ENDC MOV LINENO,PARLST+P.LINE ;PUT CURRENT LINE NO IN PAR LIST TST ERRBRN ;ERROR HANDLING ROUTINE DEFINED? BGT ERBR ;IF SO, BRANCH CLR WTMAG ;SET FOR NO TIME OUT CMP R2,#FENCE+1 ;SEE IF MODIFIED ERROR CODE PAST FATAL BGT 2$ ;IF SO, SKIP DETACH JSR PC,DETACH ;NULLIFY ^O 2$: .IF DF RSX11D DIR$ #MODPB ;PERFORM MO QIO BCS ERRR06 ;IF MO DIDN'T GO, DO REGULAR MESSAGE MOWA$S ;WAIT FOR MO TO FINISH 1$: BR ERRR07 ;IF OK EXIT ROUTINE .ENDC ERRR06: MOV R1,-(SP) ;SAVE TEXT POINTER .IF DF RSX11D DEC R2 ;GET CODE BACK TO ORIGINAL VALUE .ENDC MOV R2,R1 MOV #ERRR02,R0 ;ASCII DESTINATION ITOA MOV OTPT,-(SP) ;SAVE CURR FILE CONTROL BLOCK ADDR MOV #TOTPT,OTPT ;FORCE OUTPUT TO TERMINAL CRLF MOV #ERRR03,R0 ;START OF MESSAGE PRINTL ;PRINT THE LINE MOV #ERRR05,R0 PRINTL PRNTLN ;AND THE LINE NUMBER CRLF MOV (SP)+,OTPT ;RESTORE FILE CONTROL BLOCK POINTER ERRR04: MOV (SP)+,R1 ;RESTORE R1 ERRR07: TST FPEXFL ;ANY FLOATING POINT EXCEPTIONS? BEQ 1$ ;IF NOT, SKIP PROCESSING JSR PC,FPERMS ;IF SO, REPORT THEM 1$: RTS PC ;AND RETURN ERBR: MOV ERRBRN,R0 ;ERROR ROUTINE LINE NUMBER IN R0 MOV ENDSTK,SP ;ZAP THE STACK CLR -(SP) ;INDICATE EXACT LINE NUMBER WANTED CLR ERRBRN ;JUST IN CASE ERROR IN ERROR ROUTINE MOV USR,R1 ;START SEARCH FROM START OF CODE JMP GOTO03 ;GO TO IT ; ; CODE TO HANDLE FLOATING POINT EXCEPTION TRAPS ; NO REGISTERS ARE DESTROYED ; FPEXTR: MOV 2(SP),(SP) ;MOVE FEC STATUS (OVERWRITE ADDRESS) MOV R0,2(SP) ;SAVE R0 MOV (SP)+,R0 ;FEC -> R0 MOV R2,-(SP) ;SAVE R2 CLR R2 ;PREPARE FOR FUTURE USE ASR R0 ;DIVIDE ERROR NUMBER BY 2 DEC R0 ;AND DECREMENT BLE 2$ ;IF ZERO OR NEG, NO ERROR CMP R0,#4 ;IF > 4, ALSO BGT 2$ ;NO ERROR TO REPORT SEC ;GET BIT READY TO SHIFT IN 1$: ROL R2 ;SHIFT OVER ONE SOB R0,1$ BIS R2,FPEXFL ;SET APPROPRITE FLAG BIT 2$: MOV (SP)+,R2 ;RESTORE OLD R2 MOV (SP)+,R0 ;RESTORE OLD R0 ASTX$S ;EXIT FROM AST ROUTINE ; ; THIS SUBROUTINE SHOULD BE CALLED FOR ERROR MESSAGE PROCESSING ; AFTER POSSIBLE FLOATING EXCEPTION ERRORS. ; IT CHECKS THE FLOATING POINT EXCEPTION FLAGS WORD AND PRINTS ; TRAPS TO THE APPROPRIATE ERROR ROUTINE (USER OR SYSTEM) ; NOTE THAT IN THE CASE OF A USER ERROR ROUTINE BRANCH, ONLY ; THE FIRST OF THE FOUR FLOATING POINT ERRORS WHICH OCCURS ; WILL BE ACTED UPON AND RECORDED. ; ; REGISTERS USED - R0,R2 ; FPERMS: MOV FPEXFL,R0 ;GET ERROR BIT CODES IN R0 MOV #2$-4,R2 ;JUMP LIST ADDRESS TO R2 CLR FPEXFL ;CLEAR THE FLAGS, SO WE DON'T LOOP 3$: ADD #4,R2 ;STEP THROUGH THE LIST ASR R0 ;AND NOW GET ERROR BIT IN 'C' BCC 1$ ;IF NOT SET, NO ACTION MOV R0,-(SP) ;SAVE REGISTERS IN CASE MOV R2,-(SP) ;WE COME BACK HERE JMP (R2) ;GO DO ERROR TRAP 1$: BNE 3$ ;IF STILL BITS LEFT, KEEP CHECKING RTS PC 2$: DVFERR ;FLOATING DIVIDE BY ZERO BR 5$ FIXERR ;FLOATING -> INTEGER CONVERSION OVFLOW BR 5$ FOFERR ;FLOATING OVERFLOW ERROR BR 5$ FUFERR ;FLOATING UNDERFLOW ERROR 5$: MOV (SP)+,R2 ;RESTORE SAVED REGISTERS MOV (SP)+,R0 BR 3$ ; .IF DF RSX11D STRD: .WORD STR1E-STR1 ;DEFINE STRING(FILENAME) LENGTH .WORD STR1 ;ADDRESS OF FILENAME STRING STR1: .ASCIZ /SD:[1,2]BASIC/ STR1E: .ENDC .END ; ; TRAP01: VA ARYL00 ;COMPUTE ARRAY LENGTH VA ATOF00 ;ASCII TO FLOATING VA ATOI00 ;ASCII TO INTEGER VA CLOS00 ;CLOSE ANY OPEN DATASETS VA CLRU00 ;DELETE TEMPORARY USER SPACE IF ANY VA CRLF00 ;TYPE VA DIMC00 ;CHECK LEGAL DIMENSION VA EVAL00 ;EVALUATE EXPRESSION VA EVLS00 ;EVALUATE A STRING EXPRESSION VA FIND00 ;FIND LINE NUMBER SPECIFIED IN R0 VA GTDR00 ;GET ADDRESS OF VARIABLE ELEMENT VA GET00 ;GET PARAMETERS FOR COMMAND VA GTSD00 ;GET A STRING VAR ADDRESS VA GETV00 ;GET TRUNCATED VARIABLE VA ITOA00 ;INTEGER TO ASCII VA JUNK00 ;FIND LOGICAL END OF LINE VA PCK00 ;PACK LINE INTO WORKING STORAGE VA PRNT00 ;TYPE ONE CHARACTER FROM R2 VA PRN00 ;PRINT LINE - R0=FBA, R1=LBA VA PRLN00 ;TYPE LINE NUMBER VA PSH00 ;PUSH NAMED VARIABLE ON LIST VA PSHS00 ;PUSH NAMED STRING VAR TO LIST VA PUSH00 ;PUSH ONE WORD ON THE USER STACK VA PUT00 ;PUSH A VALUE ON THE LIST VA SCR00 ;DELETE N BYTES FROM USER SPACE VA SKIP00 ;SKIP BLANKS IN WORKING STORAGE VA SQU00 ;DELETE TEXT TO TERMINATOR VA SRCH00 ;SEARCH FOR LINE FEED VA SRL00 ;SEARCH FOR ITEM IN USER STORAGE VA STRL00 ;CALC STRING ARRAY LENGTH VA SUBS00 ;COMPUTE SUBSCRIPT EXPRESSION VA TST00 ;TEST ALPHABETIC VS NUMERIC VA TSTU00 ;CHECK FOR ENOUGH USER SPACE VA TWO00 ;PACK TWO CHARACTERS IN R4 VA TXT00 ;GET EVEN USER STORAGE ADDRESS VA FNMB00 ;SETUP FILE CONTROL BLOCK FOR I/O ; ; END OF TRAP HANDLER