.TITLE LINE TYPE .MCALL ..V2..,.REGDEF ..V2.. .REGDEF .GLOBL FINLIN,STOLBL,EVLRTN,$ARTH .GLOBL LIN,KEY,SCANLN,PRTLIN,LINTYP,LINPT,NEM .GLOBL LABL,VARTYP,KEY,MOVCHR,PLEVEL,EQFLG,$ERR .CSECT LTYPE .PAGE SCANLN: ;FROOM THE TABLE OF KEY WORDS DETERMINE WHAT THYPE OF ;LINE THIS IS CLRB @FINLIN ;IF COLS 73+USED FOR NO.S -DONT USE MOV #LIN,R4 MOV #LABL,R3 CHRFTC: MOVB (R4)+,R0 ;GET ANY LABL DEF CMPB #' ,R0 BEQ NXTLCH CMPB #'0,R0 BNE XFR CMP #LABL,R3 BEQ NXTLCH XFR: MOVB R0,(R3)+ NXTLCH: CMP #LIN+5,R4 BNE CHRFTC LBLBLK: CMP #LABL,R3 BEQ NOLABL LBLB1: CMP #LABL+6,R3 BEQ STLABL MOVB #' ,(R3)+ BR LBLB1 STLABL: MOV #"* ,VARTYP JSR PC,STOLBL NOLABL: MOV #LIN+6,R4 MOV R4,LINPT MOV #KEY,R2 ;SET UP TO SCAN FOR KEY WORD CLR R3 NOKELB: INC R3 MOV #LIN+6,R4 KEYLB: MOVB (R2)+,R1 BEQ FDMTCH 1$: MOVB (R4)+,R0 CMPB #' ,R0 BEQ 1$ CMPB R1,R0 BEQ KEYLB NXTKEY: TSTB (R2)+ BNE NXTKEY BR NOKELB FDMTCH: DEC R3 ASL R3 MOV EVLRTN(R3),LINTYP ;STORE LINE TYPE MOV NEM(R3),VARTYP CLR PLEVEL ;SET PAREN LEVEL=0 CLR EQFLG ;FOUND= FLAG=0 MOV R4,R1 MOV R4,LINPT .MACRO DBLCK NO,DST CMP #"NO,VARTYP BNE .+6 JMP DST .ENDM ; SINCE SOME KEY WORDS ARE LT 6 CHRS AND COUTLD ; BE THAT WE HAVE JST LOCATED A VAR NAME THAT ; MATCHES THE KEY WORD TO THE PONT CHECKED, A DOUBLE ; CHECK MUST BE MADE( DO IS THE BEST EXAMLE) DBLCK CL,ECALL ;CHECK CALL DBLCK DA,EDATA ;CHECK DATA DBLCK DO,EDO ;CHECK DO DBLCK ZZ,EEND ;HECK END DBLCK GT,EGOTO ;DITTO GO TO DBLCK WW,EPAUSE DBLCK PR,EPRINT DBLCK RC,EREAD DBLCK UU,ESTOP DBLCK TY,ETYPE DBLCK RL,EREAL DBLCK <= >,EARTH ;IS IT ARITHMETIC STATMEMENT DBLCK CE,ECLOSE DBLCK EY,ENTRY DBLCK OP,EOPEN DBLCK BY,EBYTE JMP DCOUT ;NON OF ABOVE-NO CHECK NEEDED JUST GET OUT EOPEN: ECLOSE: MOV #1,PLEVEL ENTRY: EDATA: EBYTE: EREAL: ECALL: EGOTO: EPRINT: EREAD: ETYPE: ECLLB: MOVB (R1)+,R0 ;GET CHR FROM LINE BEQ ECLLEX ;IF NULL DONE CHECK CMPB #50,R0 ;IS IT '(' BNE ECRPTS ;SKIP NEXT IF NO INC PLEVEL ;INC PAREN LEVEL BR ECLLB ;NEXT CHR ECRPTS: CMPB #51,R0 ;IS IT ')' BNE ECSLTS ;SKIP NEXT IF NOT DEC PLEVEL ;DEC PAREN LEVEL BR ECLLB ;NEXT CHR ECSLTS: CMPB #'!,R0 BEQ 1$ TST PLEVEL ;ARE WE AT 0 PLEVEL??? BNE ECLLB ;IF NO THEN NO NEED DOING EXTRA WORK,NEXT CHR PLEASE CMPB #57,R0 BNE ECEQTS ;HAVE WE ENCOUNTERD A 0 PLEVEL,BEFORE = SLASH 1$: JMP DCOUT ;YES-GOOD DATA STATEMENT ECEQTS: CMPB #75,R0 ;HOW ABOUT A ZERO LEVEL = BNE ECLLB ;NO GO BACK FOR NEW CHR MOV #$ARTH,LINTYP ;THIS IS ARITH STATEMENT-RE CLASSIFY MOV #"= ,VARTYP ECLLEX: JMP DCOUT ;CHECK DONE EDO: MOVB (R1)+,R0 ;GET CHR FROM LINE BEQ EDER ;NULL HERE MEANS ERROR-GO TO ERROR RTN CMPB #'(,R0 ;IS TO '(' BNE .+10 ;SKIP NEXT IF NOT INC PLEVEL ;INC PAREN LEVEL BR EDO ;GO BACK FOR NEW CHR CMPB #'),R0 ;')' BNE .+10 DEC PLEVEL BR EDO TST PLEVEL ;SAME ROUTINE AS BEFORE BNE EDO TST EQFLG ;HAVE WE FOUND '=' YET BNE CMCK ;IF YES GO TO COMMA CHECK CMPB #'=,R0 ;'='?? BNE EDO ;NO GO BACK FOR NEW CHR INC EQFLG ;YES SET EQ FOUIND FLAG BR EDO CMCK: ;OK AT THIS POINT WE HAVE FOUND ; A ZERO LEVEL '=' NO TO CONFERM DO WE MUST FIND ; A ZERO LEVEL ',' AFTER THE '=' CMPB #',,R0 ;','??? BNE EDO ;NO GRAB ANOTHER CHR EDOUT: JMP DCOUT ;IT IS A DO TYPE EXIT EDER: ;OK IS IT ARITH OR ERROR MOV #$ARTH,LINTYP ;SET TO ARTIH STATEMENT MOV #"= ,VARTYP TST EQFLG ;WAS EQ FLAG FOUND BNE EDOUT ;YES = FOUND-IT IS ARITH STATEMENT MOV #$ERR,LINTYP ;NO = FOUND-UNKNOWN STATEMENT-SET MOV #"$$,VARTYP ;ERROR LINETYPE BR EDOUT EEND: MOVB (R1)+,R0 BEQ EDOUT CMPB #' ,R0 BEQ EEND CMPB #'!,R0 BEQ EDOUT MOV #$ARTH,LINTYP MOV #"= ,VARTYP JMP EARTH ;AND LET ARITH RTN CONFERME ESTOP: EPAUSE: EPSKP: MOVB (R1)+,R0 BEQ EPOUT CMPB #' ,R0 BEQ EPSKP CMPB #47,R0 BEQ EPOUT CMPB #42,R0 BEQ EPOUT CMPB #'!,R0 BEQ EPOUT CMPB #'=,R0 BNE EPSKP MOV #$ARTH,LINTYP ;OOPS MOV #"= ,VARTYP JMP EARTH EPOUT: JMP DCOUT EARTH: MOV #LIN+6,R1 MOV R1,LINPT EALB: MOVB (R1)+,R0 BEQ EARER ;NULL IS ERROR CMPB #50,R0 BNE .+10 ;'('??? INC PLEVEL BR EALB CMPB #51,R0 BNE .+10 ;')'??? DEC PLEVEL BR EALB TST PLEVEL ;PLEVEL=0??? BNE EALB ;DONT DO MORE WORK THAN NECESSARY CMPB #75,R0 ;'='???? BNE EALB ;NO JMP DCOUT ;YES IT IS ARITH EARER: MOV #$ERR,LINTYP ;SETT ERROR LINE TYPE MOV #"$$,VARTYP DCOUT: RTS PC .END