; ;********* ; * ; BASIC0 * ; * ;********* .TITLE BASIC0 .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 ; ; MODIFIED FOR FLOATING POINT EMULATION (CONDITIONAL ON 'FPPEMU') ;DSS1 ; FPPEMU IS DEFINED (OR NOT) IN PREFIX ASSEMBLY FILE ;DSS1 ; BY DANIEL STEINBERG 18-JAN-79 ;DSS1 ; ;DSS1 ; MODIFIED TO INCLUDE 'VARIABLE TYPE MISMATCH ERROR' (VTMERR - 52) ;DSS1 ; WHEN STRING AND NUMERIC VARIABLES ARE MIXED TOGETHER (PREVIOUSLY, THE ;DSS1 ; PROGRAM TRAPPED OUT ON ODD ADDRESS OR ILLEGAL INSTRUCTION OR MEMORY FAULT) ;DSS1 ; *** THIS IS NOT THE ONLY ERROR THAT CAN BE GENERATED WHEN THERE IS ;DSS1 ; A MISMATCHED EXPRESSION....THE WHOLE ERROR CODE STRUCTURE WILL ;DSS1 ; EVENTUALLY BE MODIFIED *** ;DSS1 ; BY DANIEL STEINBERG 14-FEB-79 ;DSS1 ; ;DSS1 ; FIXED MINOR BUG IN ERROR ROUTINE UNDER RSX11M ;DSS1 ; D.S. ;DSS1 ; ;DSS1 ; ;DSS1 ;-355,,/;DSS1/ ;DSS1 ; TV VTMERR ;VARIABLE TYPE MISMATCH CHANGED TO #54, (FB) ; DEFINE FOR RSX11D IF RSX11M IS NOT DEFINED BY HEADER FILE TO MACRO ; .IF NDF RSX11M RSX11D=1 ;DEFINE FOR RSX11D MO ERROR HANDLING .ENDC ; GLOBAL PROGRAM EXTERNALS ; .GLOBL ENDSTK STOP02 TINPT TOTPT INPT OTPT .GLOBL STUDAT ENUDAT DETACH GOTO03 FPEXFL LINEFL ; ; GLOBALS DEFINED HERE .GLOBL FPERMS CTCENT .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 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 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 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 TSTCH,TST00 ;TEST CHAR (IN R2) ALPHA VS NUMERIC TRPSUB TSTOK,TSTU00 ;CHECK, IS THERE ENOUGH USER SPACE TRPSUB FNMBR,FNMB00 ;GET FILE NUMBER AND SET UP FILE ;+1 ; .SKIP ; .X ^INTRODUCTION ; ^THIS ^^BASIC\\ FOLLOWS ^^DEC\\'S ^^BASIC-11\\ IN ITS BASIC ORIENTATION. ; ^ADVANCED FEATURES TEND TO FOLLOW MAY FOLLOW FOR NORMAL INTERACTIVE USE OR ONE OF TWO OTHER ; OPTIONS MAY FOLLOW BEFORE _<^C^R> FOR SPECIAL USES. ; .FG 1 ; ^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. ; .FG 1 ; ^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. ; .FG 1 ; ^IF THE SWITCH (/^R^N) IS SPECIFIED, THE PROGRAM WILL ALSO BE RUN AS ; THOUGH THE ^^RUN\\ COMMAND HAD BEEN TYPED. ; ^A SWITCH OF THE FORM "{BAS} ; MCR>{BASIC PROG.BAS/RN} ; MCR>{BAS PROG/RN:150} ; MCR>{BAS ? 4*3+2} ; \\ ; .FILL ;- ;+2 ; ^THE SUBSET OF COMMANDS LISTED IN THIS CHAPTER IS PRIMARILY USED TO CONTROL ; EXECUTION OF 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$ ; .IFT ;IF FPP EMULATION, DO IT DIFFERENTLY ;DSS1 ;DSS1 FPEXTR=0 ;DEFINE FPEXTR (SO THERE WON'T BE AN UNDEFINED GLOBAL) ;DSS1 FPERMS: MOV R0,-(SP) ;SAVE REGS ;DSS1 MOV R1,-(SP) ;DSS1 STST R1 ;GET FLOATING EXCEPTION CODE, IF ANY ;DSS1 SUB #ERRDIV,R1 ;4=DIVIDE BY ZERO ;DSS1 BLT 1$ ;6=CONVERSION TO INTEGER ERROR ;DSS1 CMP R1,#ERRUNR-ERRDIV ;8=OVERFLOW ;DSS1 BGT 1$ ;10=UNDERFLOW ;DSS1 ASL R1 ;DSS1 ADD #5$,R1 ;DSS1 JSR PC,(R1) ;DSS1 1$: MOV (SP)+,R1 ;RESTORE REGS ;DSS1 MOV (SP)+,R0 ;DSS1 RTS PC ;DSS1 5$: DVFERR ; 4 ;DSS1 RTS PC ;DSS1 FIXERR ; 6 ;DSS1 RTS PC ;DSS1 FOFERR ; 8 ;DSS1 RTS PC ;DSS1 FUFERR ; 10 ;DSS1 RTS PC ;DSS1 ;DSS1 .ENDC ;DSS1 ;DSS1 ;-554,595,/;DSS1/ ;DSS1 .IF DF RSX11D STRD: .WORD STR1E-STR1 ;DEFINE STRING(FILENAME) LENGTH .WORD STR1 ;ADDRESS OF FILENAME STRING STR1: .ASCIZ /LB:[1,2]BASIC/ STR1E: .ENDC .END