.TITLE IMPUR ; ; DEFINE THIS MODULE FOR RSX11D ; RSX11D=1 ; ; DEFINE TRAP SUBSTITUTIONS USED IN THIS MODULE ; .MACRO TRPSUB A,B .MACRO A JSR PC,B .ENDM .ENDM ; ; NOW THE ONE TIME TRAPS USED HERE ; TRPSUB CRLF CRLF00 ;DO TRPSUB PRINTL PRN00 ;PRINT LINE TRPSUB SKIP SKIP00 ;GET NEXT NON-BLANK OR NON-TAB CHAR ; .IF NDF TASK ; MESSAGE LINE FOR ERROR REPORTING MODULE (NO MO:) ; .GLOBL ERRR03 ERRR02 ERRR05 ERRBRN PARLST .GLOBL P.ERCD P.LINE P.FCS P.FLNM P.FNAM .IF DF RSX11D .GLOBL MODPB M.OLUN M.ONUM MOLUN .ENDC .IFF .IF DF RSX11D .GLOBL .MOLUN .ENDC .ENDC .IF DF SNGUSR .IF DF RSX11D .GLOBL .MOLUN .ENDC .ENDC ; ; DECLARE MACROS TO BE CALLED ; .IF DF RSX11D .MCALL MODF$ MOUT$ .ENDC ; DEFINE GENERAL IMPURE PSECT ; .PSECT IMPUR,RW,CON ERRR03: .ASCII /ERROR / ERRR02: .ASCII / / ERRR05: .ASCII / AT LINE / .BYTE 0 .EVEN ; ; DATA BLOCK FOR MO PROCESSING AND STORAGE OF ERROR INFO ; ERRBRN: .WORD 0 ;LINE NUMBER FOR ERROR HANDLING ROUTINE PARLST: .WORD ERRR03 ; .WORD 0 ;ERROR CODE HERE .WORD ERRR05 ; .WORD 0 ;LINE NUMBER HERE .WORD 0 ;FCS ERROR CODE HERE .WORD 0 ;FILE NUMBER (LUN) .WORD 0 ;POINTER TO FILE NAME STRING P.ERCD=2 P.LINE=6 P.FCS=10 P.FLNM=12 P.FNAM=14 .IF DF RSX11D MOLUN: ;DEFINE PSUEDONYM FOR .MOLUN FOR SYMBOL TABLE LINK .MOLUN: .BLKW 1 ;PLACE FOR TASK BUILDER TO FILL IN LUN FOR MO MODF$ ;DEFINE MO SYMBOLS MESDST=SY$STM ;OUTPUT TO LOGGING DEVICE (I THINK TI) MODPB: MOUT$ STRD,PARLST,,CONT,MESDST,,,,.MOLUN .ENDC ; ; MATH ROUTINE IMPURE AREA (BASIC1) ; .IF NDF TASK .GLOBL M.I TIMBUF .ENDC M.I: .WORD 13507 ;THIS WORD GETS MODIFIED TIMBUF: .BLKW 8. ;BUFFER FOR TIME PARAMETERS ; .IF NDF TASK ; IMPURE AREA FOR BASIC2 ; .GLOBL ATTDET STATUS SLEN Q.IOFN .ENDC ; ; MACRO CALLS FOR BASIC2 IMPURE AREA ; .MCALL QIOW$ ATTDET: QIOW$ IO.ATA,2,1,,STATUS,, ;DPB FOR ATTACH AND DETACH STATUS: .BLKW 2 SLEN: .WORD 0 ;STRING LENGTH STORAGE LOCATION ; ; IMPURE AREA FOR BASIC3 ; ; MACRO CALLS USED IN THIS PART OF IMPURE CODE ; .MCALL FDBDF$ FDAT$A FDRC$A FDOP$A NMBLK$ .MCALL CSI$ .IF NDF TASK ; ; GLOBALS USED IN BASIC3 ; .GLOBL TRMSIZ TINPT LNKTIN INPBUF TOTPT .GLOBL TCOUNT LNKTOT OUTBUF SOTPT SCOUNT .GLOBL LNKSAV SAVBUF OINPT LNKOLD INPT .GLOBL OTPT ERRADD TRMFDB COMFDB COMFNB .GLOBL CSIBLK CSDSPT CSBUFS CSBUFF CSBUFL .GLOBL NEWLIN REMTRM OP.LEN OP.LUN OP.EOF .GLOBL OP.RAC OP.RTP FDBSAV ; ; GENERAL SYSTEM POINTER AREA GLOBALS ; .GLOBL WORK USR ENDUSR LINENO STCOUN .GLOBL RUNF BRFLAG FPEXFL ENDTXT DATI .GLOBL RNDM ENDSTK STUDAT ENUDAT QFLG .GLOBL BLSKFL LINEFL LINELN LINEHD BOLNHD .GLOBL LASTEX STUEPT STUROU WTUNIT WTMAG .GLOBL STUFDB ENUSAV UNLDSV TOTPT STGOSB .GLOBL STFONX TRCFLG .ENDC ; .SBTTL FILE CONTROL BLOCKS AND FDB'S ; ;TERMINAL INPUT FILE CONTROL BLOCK ; TRMSIZ=132. ;DEFINE MAX TERMINAL SIZE .WORD 0 ;FLAGS WORD IN CASE USED TINPT: .WORD INPBUF ;OUTPUT POINTER .WORD TRMSIZ ;MAX BC .BYTE 4,0 ;STAT/MODE .WORD 0 ;ACTUAL BC .WORD INPBUF ;DATA ADDRESS .WORD 0 ;LINK BLOCK ERR LNKTIN: .WORD TRMFDB ;TERMINAL FDB POINTER .WORD 0 ;EOF ADDRESS INPBUF: .BLKB TRMSIZ+2 ;BUFFER ; ; TERMINAL OUTPUT CONTROL BLOCK ; TOTPT: .WORD OUTBUF+1 ;CHAR POINTER .WORD TRMSIZ ;MAX BC .BYTE 4,0 ;STAT/MODE TCOUNT: .WORD 1 ;ACTUAL BYTE COUNT (START PAST CARR CNTL) .WORD OUTBUF ;DATA ADDRESS .WORD 0 ;LINK BLOCK ERR LNKTOT: .WORD TRMFDB ;LINK DDB POINTER .WORD 0 ;EOF ADDRESS OUTBUF: .BLKB TRMSIZ+2 ;OUTPUT BUFFER ; ; SAVE OUTPUT CONTROL BLOCK ; SOTPT: .WORD SAVBUF ;CHAR POINTER .WORD TRMSIZ ;MAX BC .BYTE 4,0 ;STAT/MODE SCOUNT: .WORD 0 ;ACTUAL BYTE COUNT .WORD SAVBUF ;DATA ADDRESS .WORD 0 ;LINK BLOCK ERR LNKSAV: .WORD COMFDB ;LINK DDB POINTER .WORD 0 ;EOF ADDRESS SAVBUF: .BLKB TRMSIZ ; ; OLD INPUT CONTROL BLOCK ; OINPT: .WORD 0 ;NOT USED FOR INPUT .WORD TRMSIZ ;MAX BC .BYTE 4,0 ;STAT/MODE .WORD 0 ;ACTUAL BC .WORD INPBUF ;DATA ADDRESS .WORD 0 ;LINK BLOCK ERR LNKOLD: .WORD COMFDB ;LINK DDB POINTER .WORD 0 ;EOF ADDRESS ; ; INPUT/OUTPUT CONTROL BLOCK POINTERS ; INPT: .WORD TINPT OTPT: .WORD TOTPT ERRADD: .WORD 0 ; ;VARIOUS FDB'S ; TRMFDB: FDBDF$ ;TERMINAL FDB FDAT$A R.VAR,FD.FTN!FD.CR,80. FDRC$A ,OUTBUF,80. FDOP$A 2 ; COMFDB: FDBDF$ FDOP$A 1,CSDSPT,COMFNB COMFNB: NMBLK$ PROGRAM,BAS,0,SY,0 ; ; IMPURE AREA FOR CSI WORK ; CSI$ CSIBLK: .BLKB C.SIZE ;DEFINE CSI PARAMETER BLOCK CSDSPT=CSIBLK+C.DSDS ;DEFINE DATA SET POINTER ASSOCIATED WITH CSI CSBUFS=40. ;DEFINE LENGTH OF BUFFER CSBUFF: .BLKB CSBUFS ;ALLOCATE BUFFER CSBUFL: .WORD 0 ;LOCATION FOR ACTUAL LENGTH ; ; SWITCH TARGETS FOR OVERLAY ETC. ; NEWLIN: .WORD 0 REMTRM: .WORD 0 ;REMARK TRIM FLAG ; ; IMPURE AREA FOR USER FILE OPEN CODE ; .GLOBL OP.MXL ;GLOBAL DEFINED AT TKB TIME FOR MAX # OF LUNS OP.LEN: .WORD 0 ;BUFFER FOR FILE LENGTH OP.LUN: .WORD 0 ;BUFFER FOR LUN OP.EOF: .WORD 0 ;BUFFER FOR EOF LINE NUMBER OP.RAC: .WORD 0 ;RECORD ACCESS WORD OP.RTP: .WORD 0 ;RECORD TYPE WORD FDBSAV: .WORD 0 ; ; GENERAL SYSTEM POINTER AREA ; WORK: .WORD 0 ;TEMP TEXT POINTER SAVE LINEHD: .WORD 0 ;POINTER TO LINE HEADER FOR CURRENT LINE LINENO: .WORD 0 ;TEMPORARY LINE NUMBER CELL STCOUN: .WORD 0 ;STATEMENT POSITION COUNT IN LINE RUNF: .WORD 0 ;RUN FLAG BRFLAG: .WORD 0 ;BREAK (^C) FLAG FPEXFL: .WORD 0 ;FLOATING POINT EXCEPTION FLAGS RNDM: .WORD 1 ;RANDOMIZE WORD ENDSTK: .WORD 0 ;BOTTOM OF STACK QFLG: .BYTE 0 ;FLAG FOR MCR PRINT TRCFLG: .BYTE 0 ;FLAG FOR TRACE MODE BLSKFL: .WORD 0 ;FLAG FOR BLANK SKIP LINEFL: .WORD 0 ;FLAG FOR INPUT LINE COMMAND LINELN: .WORD 0 ;LENGTH OF LINE FOR INPUT LINE LASTEX: .WORD 0 ;LAST LINE EXECUTED BEFORE STOP STUEPT: .WORD CALNAM ;START OF USER ENTRY POINT TABLE STUROU: .WORD 0 ;START OF USER DEFINED MACRO ROUTINES USR: .WORD 0 ;START OF USER PROGRAM TEXT ENDTXT: .WORD 0 ;END OF USER PROGRAM TEXT BOLNHD: .WORD 0 ;BOTTOM OF LINE HEADERS STUDAT: .WORD 0 ;START OF USER DATA AREA ENUDAT: .WORD 0 ;END OF USER DATA AREA STGOSB: .WORD 0 ;START OF GOSUB/RETURN POINTERS STFONX: .WORD 0 ;START OF FOR/NEXT CTRL BLOCKS STUFDB: .WORD 0 ;START OF USER FDB AREA ENDUSR: .WORD 0 ;END OF BASIC TASK AREA AND ;END OF USER FDB AREA DATI: .WORD 0 ;DATA POINTER (OFFSET FROM USR) ENUSAV: .WORD 0 ;SAVE LOCATION FOR ENUDAT IN CASE ERROR UNLDSV: .WORD 0 ;SAVED LOCATION FOR UNLOAD ; WTUNIT: .WORD 0 ;UNITS FOR WAIT TIMEOUT WTMAG: .WORD 0 ;CORRESPONDING MAGNITUDE .IF NDF TASK ; ; IMPURE AREA FOR QUESTION PROCESSING ROUTINES ; .GLOBL MPARLS QLUN QSTAT QNAM STROUT .GLOBL ANS1 STRIN COUNT .ENDC MPARLS: QLUN: .BLKW 2 ;INPUT LUN FOR QUESTION LIBRARY QSTAT: .BLKW 3 ;OUTPUT STATUS QNAM: .BLKW 2 ;INPUT QUESTION NAME STROUT: .BLKW 3 ;OUTPUT STRING VARIABLE ANS1: .BLKW 2 ;INPUT NUMERIC VALUE STRIN=STROUT ;INPUT STRING FOR DISPLAY IN FRONT OF MC ANS COUNT=STRIN+4 ;COUNT OF CHARS PER RESPONSE ; ; START OF PSECT FOR EVENTUAL USER AREA ; .PSECT $$$$US,RW,CON,REL ;PSECT TO DEFINE END OF USER STORAGE ENDBAS: .BYTE S.EOL ;LEADING LINE FEED FOR USER PROGRAM ; ; MACROS USED IN INIT CODE ; .MCALL DIR$ SVTK$S SRDA$S SFPA$S FINIT$ .MCALL GTSK$S GLUN$S OPEN$W GMCR$ CSI$SW .MCALL CSI$ND CSI$SV FSRSZ$ MSG001: .ASCII /RSX BASIC/<15><12>/VERSION / .BYTE 0 .EVEN .SBTTL BEGIN - INIT CODE ; ; BASIC INITIALIZATION CODE ; THIS CODE RESIDES IN THE USER'S AREA AND IS OVERLAYED ; BY THE USER TEXT AND USER STACK. ; ONLY ONCE EXECUTED CODE MAY BE HERE!!!!!!!! ; BEGIN: LDFPS #3400 ;SET FPP STATUS REG FOR INTERRUPTS DIR$ #MCRDPB ;GET MCR COMMAND LINE (JUST TO CLEAR) MOV @#$DSW,MCRCNT ;GET CHAR COUNT FROM DSW SVTK$S #VECTAB,#8. ;SET UP SST VECTOR TABLE SFPA$S #FPEXTR ;SPECIFY FLOATING POINT EXCEPTION AST FINIT$ GTSK$S #TSKPAR ;GET TASK PARAMETERS BIC #1,TSKPAR+32 ;MAKE SURE END IS EVEN MOV TSKPAR+32,R0 ;AND PUT IN ITS PLACE MOV R0,ENDUSR MOV R0,BOLNHD MOV R0,STUDAT ;SET UP USER DATA AREA START MOV R0,ENUDAT ;AND END MOV R0,ENUSAV ;AND ERROR SAVE POINTER MOV R0,STUFDB ;AND ALSO START OF USER FDB'S MOV R0,STGOSB ;START OF GOSUB/RETURN POINTERS MOV R0,STFONX ;START OF FOR/NEXT CTRL BLOCKS GLUN$S #2,#TSKPAR ;GET TERMINAL LUN INFO MOV TSKPAR+12,R1 ;LEN OF LINE IN R1 CMP #TRMSIZ,R1 ;CAN ONLY HANDLE MAX TERMINAL WIDTH BGE 1$ MOV #TRMSIZ,R1 1$: MOV R1,TOTPT+2 ;PUT IT IN CONTROL BLOCK FOR OUTPUT MOV R1,TINPT+2 ;AND FOR INPUT OPEN$W #TRMFDB,,,,,R1 ;OPEN TERMINAL FOR INPUT AND OUTPUT MOV #ENDBAS,R1 ;SET BEGINNING OF USER AREA AT END OF CODE MOV R1,USR ;SET UP TEXT POINTER MOV R1,UNLDSV ;SET UP UNLOAD POINTER MOV R1,STUROU ;AND START OF USER ROUTINES MOV R1,R5 ;SET UP USER LIST POINTER MOVB #S.EOL,(R5)+ ;WITH LF IN FIRST TEXT BYTE MOV R5,ENDTXT ;SAVE FOR RESTART MOV SP,ENDSTK ;SAVE FOR ZAPPING CLR LINENO ;CLEAR THE LINE NUMBER MOV #MCRDPB+G.MCRB,R1 ;START OF BUFFER -> R1 MOV R1,R3 ;DUPLICATE START IN R3 MOV MCRCNT,R0 ;LEN IN R0 ADD R0,R3 ;R3 POINTS PAST END 2$: MOVB (R1)+,R2 ;NEXT CHAR IN R2 CMPB R2,#40 ;LOOK FOR SPACE BEQ 3$ ;BR IF FOUND CMPB R2,#11 ;ELSE IT MIGHT BE TAB BEQ 3$ ;BR IF FOUND SOB R0,2$ ;KEEP LOOKING BR BEGIN1 ;NOTHING SPECIAL, SO DO MESSAGE 3$: SKIP ;GET NEXT NON-BLANK CHAR -> R2 DEC R1 ;BACK UP POINTER CMPB R2,#'? ;IS IT ONE LINE MCR PRINT BEQ 4$ ;IF SO, BRANCH CMPB R2,#'@ ;ARE WE COMING FROM BATCH? BNE 5$ ;IF NOT, BRANCH INC R1 ;MAKE SURE CSI NOT SCREWED UP INC RUNF ;WE MUST RUN IF BATCH 5$: SUB R1,R3 ;GET LENGTH OF STRING -> R3 MOV R3,R4 ;PUT IT IN PROPER REGISTER MOV R1,R3 ;ADDRESS IN R3 MOV #STRSWT,R2 ;STARTING SWITCH TABLE IN R2 JSR PC,CSINT0 ;INTERPRET COMMAND STRING JMP OLD02 ;GO FINISH AS OLD COMMAND 4$: MOVB #1,QFLG ;SET MCR PRINT FLAG MOV R3,R0 ;END ADDRESS -> R0 MOV #MCRDPB+G.MCRB+80.,ENDTXT ;DON'T WIPE OUT MCR BUFFER MOV ENDTXT,R5 ;SAME GOES FOR R5 MOV #S.EOL,(R5)+ ;COPY ABOVE PROCEDURE MOV #MCRCNT+4,R2 ;FAKE OUT R2 INTO THINKING IT'S MOV R1,MCRCNT ;IN A DATA CONTROL BLOCK CLRB -1(R1) ;KLUDGE SO LINE NOT MOVED OVER MOV #INIT01,-(SP) ;ADDRESS FOR RETURN MOV R0,-(SP) ;JUST TO KEEP STACK STRAIGHT JMP PCK03 ;GO CHECK STRING AND EXECUTE BEGIN1: MOV #MSG001,R0 ;INITIAL MESSAGE PRINTL MOV #IDNTFY,R0 ;GET IDENTIFICATION STRING ADDRESS -> R0 PRINTL ;PRINT IT OUT CRLF ;AND TERMINATE IT JMP INIT00 MCRCNT: .WORD 0 ;COUNTER FOR MCR COMMAND LINE BUFFER MCRDPB: GMCR$ TSKPAR: .BLKW 20 ;BUFFER FOR TASK PARAMETERS STRSWT: CSI$SW RN,1,RUNF,,,STRSVT CSI$SW RT,1,REMTRM CSI$SW CO,2,REMTRM CSI$ND STRSVT: CSI$SV DECIMAL,LINENO,2 CSI$ND ; ; THE FOLLOWING LINE SHOULD BE INCLUDED ONLY IN THE FINAL TASK LINK ; THEREFORE THE CONDITIONAL ; .IF DF TASK ! SNGUSR FSRSZ$ 7,512.*6+134. ;ALLOW 6 OPEN FILES AT ONCE (PLUS TERMINAL) .ENDC ; ; THE FOLLOWING MACRO IS USED TO GENERATE TABLE ENTRIES IN A PSECT ($$$$UR) ; WHICH IMMEDIATELY PRECEDES THE USER AREA. .PSECT $$$$UR,RW,I,GBL,REL,CON CALNAM: .MACRO CALTBL NAME .NCHR $$$CH1,NAME .IF GT,<$$$CH1-6> .ERROR .ENDC .RAD50 /NAME/ .GLOBL NAME .IF LE,<$$$CH1-3> .WORD 0 .ENDC .WORD NAME .ENDM ; ; FOLLOWING ARE THE ENTRY POINTS FOR THE QUESTION PROCESSING ROUTINES ; CALTBL INSTRG ;INSERT STRING SUBROUTINE CALTBL MDIS ;DEFINE CALL ENTRY POINT CALTBL CDIS CALTBL RDIS CALTBL MPOS CALTBL CPOS CALTBL RPOS CALTBL MQTXT CALTBL CQTXT CALTBL RQTXT CALTBL MATXT CALTBL CATXT CALTBL RATXT CALTBL CQNAM CALTBL RQNAM .END BEGIN