.TITLE LINE EVALUATION ROUTINES .SBTTL SETUP .MCALL .CSISPC,.READW .MCALL .LOOKUP,.EXIT,.PURGE .GLOBL HIGPTR,TMP,PLEVEL,CLOSE,PNMFLG,PNAME .GLOBL TYPE,TYPECH,MOVCHR,ICHNO,ERRCNT .GLOBL VARTYP,LINPT,TYPE,TYPECH,PRTLIN .GLOBL GETVAR,GETLBL,IFRTN,LINENO,LIN,INBUF,INBFPT,INBLK,GETLIN .GLOBL ARGFLG,SKIP,SAVENO,EXT,SAVEPT,IOARA,RESTFI .GLOBL $UU,$VV,$WW,$XX,$YY,$ARTH .PSECT EVAL,I,RO,GBL .PAGE .SBTTL $UU,$VV,$WW,$XX,$YY NO EVALUATIONS ; FOR THOSE ROUTINES THAT DONT NEED ; TO BE EVALUATED $UU: $VV: $WW: $XX: $YY: 1$: INC LINPT JSR PC,MOVCHR TSTB R0 BNE 1$ RTS PC .PAGE .SBTTL $ARTH IS TO SCAN AN ARITHMETIC LINE $ARTH: MOV #LIN+6,LINPT JSR PC,GETVAR ; FOR FIRST VAR GOTTEN MOV #" ,VARTYP ; REST OF LINE IS ALL JST PART OF ARTH ; STATEMENT LIST: ; ALSO ALL SIMPLE LISTS ENTER HERE E1LB: JSR PC,GETVAR ; GET A VARIABLE IF THERE LISTT: TST ARGFLG ; END OF LINE FOUND YET BEQ E1LB ; NO-KEEP TRYING UNTILL YES RTS PC .PAGE .SBTTL $AC,$RC,$PR,$TY IS FOR I/O STATEMENTS ACCEPT,READ,PRINT,TYPE .GLOBL $AC,$RC,$PR,$TY ; OF THE FORM KEY WORD F,LIST $AC: $RC: $PR: $TY: E2EVL: JSR PC,MOVCHR JSR PC,TYPE TST TYPECH BGT 6$ JSR PC,GETLBL BR E2LB 6$: JSR PC,GETVAR E2LB: JMP LISTT ; SCAN LIST .PAGE .SBTTL $AS SCANS ASSIGN .GLOBL $AS $AS: JSR PC,GETLBL ; GET LABEL JSR PC,MOVCHR INC LINPT JSR PC,MOVCHR INC LINPT ; SKIP THE 'TO' IN ASSIGN N TO X JSR PC,GETVAR ; GET VAR NAME RTS PC .PAGE .SBTTL $BS,$EF,$RW BACKSPACE,ENDFILE,REWIND MAY USE VAR NAME .GLOBL $BS,$EF,$RW ; IN PLAC EOF A NUMBER $BS: $EF: $RW: JMP LIST ; JUST A SIMPLE LIST .PAGE .SBTTL $CL EVALUATES CALL SUBROUTINE .GLOBL $CL $CL: JSR PC,GETVAR MOV #"AG,VARTYP ; REST ARE ARGUMENTS E5LB: JMP LISTT ; LIST WITH TEST FIRST .PAGE .SBTTL $CN COMMON LIST AND COMMON/NAME/LIST .GLOBL $CN $CN: JSR PC,MOVCHR ; GET NXT CHR CMPB #'/,R0 ; NAMED COMMON???? BNE BLNKCM ; NO BLAMK COMMON INC LINPT JSR PC,GETVAR JSR PC,MOVCHR INC LINPT ; SKIP 2ND '/' BLNKCM: MOV #"CM,VARTYP ; COMMON LIST NEM E6LB: JMP LIST ; SIMPLE LIST .PAGE .SBTTL $DA RTN HANDLES DATA LINES .GLOBL $DA $DA: 2$: JSR PC,GETVAR TST ARGFLG BNE EVLDNE JSR PC,MOVCHR CMPB #'/,R0 BNE 2$ TST SKIP BNE 1$ INC SKIP BR 2$ 1$: CLR SKIP BR 2$ EVLDNE: RTS PC .PAGE .SBTTL $DE,$EN DECODE ENCODE .GLOBL $EN,$DE $DE: $EN: E8EVL: JSR PC,GETVAR ; IF CHR CNT SPECIFIED BY VAR-GET IT INC LINPT ; SKIP ',' JSR PC,MOVCHR JSR PC,TYPE TST TYPECH BGT EDLT JSR PC,GETLBL BR EDLT1 EDLT: JSR PC,GETVAR EDLT1: INC LINPT JSR PC,GETVAR JSR PC,MOVCHR CMPB #',,R0 BNE E8LB INC LINPT JSR PC,NDERCK E8LB: JMP LISTT ; LIUST WITH TEST FIRST .PAGE .SBTTL $DF DEFINE FILE .GLOBL $DF $DF: JSR PC,GETVAR ; GET L.U.N IF IT IS VAR NAME INC LINPT ; SKIP'(' JSR PC,GETVAR ; GET RECORD CNT IF VAR INC LINPT ; SKIP ',' JSR PC,GETVAR ; GET REC SIZE IF VAR INC LINPT JSR PC,MOVCHR ; GET PAST U INC LINPT JSR PC,MOVCHR ; GET PAST , INC LINPT JSR PC,GETVAR ; GET INDEX VAR INC LINPT ; GET PAST ) JSR PC,MOVCHR ; ANOTHER SPEC??',' TSTB R0 BEQ EVL9O INC LINPT BR $DF ; YES REPEAT EVL9O: RTS PC .PAGE .SBTTL $DI,$EQ,$EX,$PA,$BD,$PG,$VI .SBTTL DIMENSION, EQUIVALENCE,EXTERNAL,PARAMETER,PROGRAM,BLOCKDATA,VIRTUAL .GLOBL $DI,$EQ,$EX,$PA,$BD,$PG,$VI $BD: MOV BD,PNAME MOV BD+2,PNAME+2 ; DEFAULT NAME FOR BD IS BLKDAT $PG: INC PNMFLG $DI: $EQ: $EX: $PA: $VI: JMP LIST ; SIMPLE LIST BD: .RAD50 /BLKDAT/ .PAGE .SBTTL $DO DO N VAR=A,B,C .GLOBL $DO $DO: JSR PC,GETLBL ; GET END OF LOOP LABLE JMP LIST ; SIMPLE LIST .PAGE .SBTTL $ZZ HANDLED ELSWARE ; $ZZ IS END AND HANDLED ELSE WARE AS IT OUTPUTS ALL INFO ; ACCUMULATED AND RESETS FOR NEW RUN .PAGE .SBTTL $FN FIND(L.U.N'INDEX) .GLOBL $FN $FN: JSR PC,GETVAR ; GET FIRST VARIABLE JSR PC,MOVCHR ; SKIP QUOTE MARK INC LINPT ; UPDATE POINTER JMP LIST ; THE REST IS A SIMPLE LIST .PAGE .SBTTL $SU,$FU,$FI,$FL,$FR,$FD,$FC,$EY,$FH FUNCTION/SUBROUTINE/ENTRY .GLOBL $SU,$FU,$FI,$FL,$FR,$FD,$FC,$EY,$FH,$FB $SU: $FB: $FU: $FI: $FL: $FR: $FD: $FC: $EY: $FH: INC PNMFLG E14EVL: JSR PC,GETVAR CMP #"FR,VARTYP BNE 1$ JSR PC,MOVCHR CMPB #'*,R0 BNE 1$ INC LINPT JSR PC,MOVCHR INC LINPT CMPB #'8,R0 BNE 1$ MOV HIGPTR,R0 ADD #6,R0 MOV #"FD,-2(R0) 1$: MOV #"AG,VARTYP E14LB: JMP LISTT .PAGE .SBTTL $IN,$CH,$LG,$RL,$DP,$CX,$BY TYPE VAR ,TYPE*N VAR .GLOBL $IN,$CH,$LG,$RL,$DP,$CX,$BY $IN: $CH: $LG: $DP: $CX: $BY: JMP LIST $RL: 2$: JSR PC,GETVAR TST ARGFLG BNE E15DN JSR PC,MOVCHR CMPB #'*,R0 BNE 2$ TSTB R0 BNE 11$ INC ARGFLG BR 2$ 11$: INC LINPT JSR PC,MOVCHR INC LINPT CMPB #'8,R0 BNE 2$ MOV HIGPTR,R0 ADD #6,R0 MOV #"DP,-2(R0) BR 2$ E15DN: RTS PC .PAGE .SBTTL $IF HANDLES IF()A,B,B OR IF ()INSTR .GLOBL $IF $IF: CLR PLEVEL E16LB1: JSR PC,MOVCHR CMPB #'(,R0 ; FOUND '(' BNE E16RPC INC PLEVEL ; YES INC LINPT BR E16LB1 E16RPC: CMPB #'),R0 ; FOUND ')' BNE E16LB2 INC LINPT DEC PLEVEL ; YES BLT CONDNE ; IF .LT. 0 CONDITIONAL PART IF IF DONE BR E16LB1 E16LB2: JSR PC,GETVAR TST ARGFLG BEQ E16LB1 JMP $ERR ; E.O.L. MEANS ERROR CONDNE: JSR PC,MOVCHR ; GET 1ST CHR AFTER CONDITIONAL PART ; OF IF JSR PC,TYPE TST TYPECH BEQ STDIF ; NUMBER-STD 3 WAY BRANCH MOV #IFRTN,(SP) ; LETTER-INST TYPE IF-RESET RETURN ; FROM SUBROUTINE TO SPECIAL ; REENTRY POINT IN MAIN PROGRAM INC LINENO ; FOR COMPATABILITY WITH COMPILOR MOV LINPT,R1 MOV #LIN,R2 MOV #20040,(R2)+ MOV #20040,(R2)+ MOV #20040,(R2)+ E16LB3: MOVB (R1)+,(R2)+ ; SHIFT PART OF IF AFTER COND. TO ; BEGINNING OF LINE-MAKE SCANER THINK ; NEW LINE BNE .-2 ; NULL MEANS END OF LINE MOVB (R1)+,(R2)+ MOVB (R1)+,(R2)+ ; ADD SOME MORE NULLS JUST TO BE SAFE MOV #LIN,LINPT RTS PC STDIF: JSR PC,GETLBL INC LINPT TST ARGFLG BEQ STDIF RTS PC .PAGE .SBTTL $RD,$WR READ()/WRITE()--(N),(N'M),(N,M) .GLOBL $RD,$WR ; PLUS END= OR/AND ERR= IN THERE TOO $RD: $WR: E17EVL: JSR PC,GETVAR ; IF L.U.N. SPEC AS VAR-GET IT JSR PC,MOVCHR INC LINPT CMPB #'),R0 ; DONE WITH SPECS YET BEQ E17LST ; IF YES GO TO LIST SCANNER CMPB #',,R0 ; NON DIRECT ACESS I/O BEQ FMTIO JSR PC,GETVAR ; DIREC ACESS IO IF REC NO VAR,GET JSR PC,MOVCHR CMPB #'),R0 ; IF DONE DIRECT ACESS IO GO TO LIST SPEC BEQ E17LST INC LINPT JSR PC,FMTCK ; IF FORMATED DIREC ACESS-GET FORMAT JSR PC,MOVCHR CMPB #'),R0 ; DONE YET BEQ E17LST INC LINPT JSR PC,NDERCK ; ONLY THING LEFT IS END/ERR= BR E17LST FMTIO: JSR PC,FMTCK ; GET FORMAT JSR PC,MOVCHR INC LINPT CMPB #'),R0 ; DONE YET BEQ E17LST JSR PC,NDERCK ; ONLY THING LEFT-END/ERR= E17LST: ; DONE WITH I/O SPECS NOW GET I/O LIST E17LB: JMP LISTT FMTCK: JSR PC,MOVCHR JSR PC,TYPE TST TYPECH BNE 1$ JSR PC,GETLBL ; FORMAT SPEC IS LABEL BR FMOUT 1$: JSR PC,NDERCK ; VAR NAM,COULD BE END/ERR JSR PC,MOVCHR CMPB #'),R0 ; IF YES SHOULD BE DONE NOW BEQ FMOUT JSR PC,GETVAR ; NO-GET VAR NAM OF ARRAY SEPC OF FMT FMOUT: RTS PC NDERCK: MOV LINPT,TMP .MACRO CK L,LOC JSR PC,MOVCHR INC LINPT CMPB #''L,R0 BNE LOC .ENDM CK E,RTN CK N,RCK CK D,RTN BR EQTST RTN: MOV TMP,LINPT RTN1: RTS PC RCK: DEC LINPT CK R,RTN CK R,RTN EQTST: JSR PC,MOVCHR INC LINPT CMPB #'=,R0 BNE RTN JSR PC,GETLBL JSR PC,MOVCHR CMPB R0,#') BEQ RTN1 INC LINPT BR NDERCK .PAGE .SBTTL $GT GO TO 10 GO TO A GO TO ( , , ,),X ETC .GLOBL $GT $GT: JSR PC,MOVCHR JSR PC,TYPE ; WHAT THYPE OF GO TO IS IT TST TYPECH BGT ASGNGT ; CHR IS LETTER-ASSIGNED GO TO BEQ UNCDGT ; NUMBER -UNCONDITIONAL GO TO E18LB1: INC LINPT ; COMPUTED GO TO-SKIP'(' JSR PC,GETLBL ; GET LABEL TST ARGFLG ; END OF LINE BEQ .+6 JMP $ERR JSR PC,MOVCHR CMPB R0,#') BNE E18LB1 ; NO CONTINUE E18LB2: JSR PC,GETVAR ; GET THE VAR NME TST ARGFLG ; DONE?? BEQ E18LB2 ; NO-GOT PUNCTUATION INSTEAD RTS PC UNCDGT: JSR PC,GETLBL ; GET LABEL 1$: TST ARGFLG BNE E18DN ASGNGT: JSR PC,GETVAR ; GET VAR NAME E18LB3: TST ARGFLG ; END OF LINE-CETIONAL LABLE LIST CAN FOLLOW BNE E18DN INC LINPT JSR PC,GETLBL BR E18LB3 E18DN: RTS PC .PAGE .SBTTL $OP,$CE OPEN/CLOSE .GLOBL $OP,$CE $OP: $CE: E19EVL: JSR PC,ERCK 1$: JSR PC,MOVCHR INC LINPT CMPB #'),R0 BEQ E19DN CMPB #',,R0 BEQ E19EVL CMPB #'=,R0 BNE 1$ JSR PC,GETVAR BR E19EVL E19DN: JSR PC,GETVAR TST ARGFLG BEQ E19DN RTS PC ERCK: MOV LINPT,TMP CK E,ERNO CK R,ERNO CK R,ERNO JSR PC,MOVCHR INC LINPT CMPB #'=,R0 BNE ERNO JSR PC,GETLBL RTS PC ERNO: MOV TMP,LINPT RTS PC .PAGE .SBTTL $FO FORMAT (F4+ ONLY) .GLOBL $FO $FO: MOV #1,PLEVEL E2: 2$: JSR PC,MOVCHR INC LINPT CMPB #'),R0 BNE 1$ DEC PLEVEL BGT 2$ 22$: INC LINPT JSR PC,MOVCHR TSTB R0 BNE 22$ RTS PC 1$: CMPB #'(,R0 BNE 6$ INC PLEVEL BR 2$ 6$: CMPB #'<,R0 BEQ AG ; INSIDE ANGLE BRACKETS-START LOOKING FOR VARS CMPB #'',R0 BNE 3$ ; SKIP QUOTE HOLS .GLOBL SUEXP INC SUEXP 4$: JSR PC,MOVCHR INC LINPT CMPB #'',R0 BNE 4$ CLR SUEXP BR 2$ 3$: CMPB #'H,R0 ; 1 HOL CHR BNE 5$ INC LINPT BR 2$ 5$: JSR PC,TYPE ; IS IT NO TST TYPECH BNE 2$ CLR R1 7$: SUB #60,R0 ADD R0,R1 JSR PC,MOVCHR JSR PC,TYPE TST TYPECH BNE ECH INC LINPT ASL R1 MOV R1,-(SP) ASL R1 ASL R1 ADD (SP)+,R1 BR 7$ ECH: CMPB #'H,R0 ; HOL STATEMENT BEQ .+6 JMP E2 INC LINPT ; SKIP HOL MOV R1,SUEXP 1$: JSR PC,MOVCHR INC LINPT ; SKIP CHR DEC SUEXP BNE 1$ JMP E2 AG: JSR PC,GETVAR JSR PC,MOVCHR CMPB #'>,R0 ; RIGHT ANG BRK SAYS DONE SCANN BNE AG JMP E2 .PAGE .SBTTL $II INCLUDE FILE HANDLEING .GLOBL $II $II: CMP #6,SAVENO BNE NOVFS MOV #OVFMSG,R0 E21ERR: JSR PC,PRTLIN JSR PC,CLOSE BISB #10,@#53 INC ERRCNT CLR R0 .EXIT OVFMSG: .ASCIZ / INDEX-F-INCLUDE NESTING LIMIT EXCEEDED/ .EVEN NOVFS: SUB #4.,SAVEPT INC SAVENO MOV R1,-(SP) MOV R2,-(SP) MOV SAVEPT,R1 MOV INBLK,2.(R1) MOV INBFPT,(R1) INC ICHNO MOV SP,TMP SUB #40.,SP MOV SP,R1 1$: JSR PC,MOVCHR INC LINPT CMPB #'',R0 BNE 1$ 2$: JSR PC,MOVCHR INC LINPT CMPB #'',R0 BEQ NDINC MOVB R0,(R1)+ BR 2$ NDINC: CLRB (R1) MOV SP,R1 SUB #140.,SP MOV SP,R2 .CSISPC R2,#EXT,R1 ADD #30.,R2 .LOOKUP #IOARA,ICHNO,R2 BCC NOINCE MOV TMP,SP MOV (SP)+,R2 MOV (SP)+,R1 MOV #INLE,R0 BR E21ERR INLE: .ASCIZ /INDEX-F-INCLUDE FILE SPECIFICATION ERROR/ .EVEN NOINCE: CLR INBLK MOV TMP,SP MOV (SP)+,R2 MOV (SP)+,R1 .READW #IOARA,ICHNO,#INBUF,#256.,INBLK MOV #INBUF,INBFPT CMPB #15,INBUF BNE NOCR INC INBFPT NOCR: INC INBLK 1$: JSR PC,GETLIN TSTB LIN BEQ 1$ RTS PC RESTFI: DEC SAVENO .PURGE ICHNO DEC ICHNO MOV SAVEPT,R0 MOV (R0),INBFPT MOV 2.(R0),INBLK DEC INBLK .READW #IOARA,ICHNO,#INBUF,#256.,INBLK INC INBLK ADD #4.,SAVEPT RTS PC .PAGE .SBTTL $ERR--ERROR REPORTING .GLOBL $ERR $ERR: MOV #ERRMSG,R0 JSR PC,PRTLIN 45$: INC LINPT JSR PC,MOVCHR TSTB R0 BNE 45$ BISB #2,@#53 INC ERRCNT RTS PC ERRMSG: .ASCIZ /INDEX-W-UNKNOWN LINE TYPE OR SYNTAX ERROR/ .EVEN .END