.TITLE RSXMAC - RSX11M FRONT-END FOR FLEX .IDENT /X08.01/ ;**- ; Module name: RSX - RSX11M FRONT-END FOR FLEX ; ; Version X08.01 Last edit: 16-JUL-80 08:34 ; Status: Development/Debugging ; ; PROGRAMMER: CHRIS MEYERS ; LOCATION: EUGENE REGISTER GUARD - EUGENE OREGON ; ; Revision history: ; ; (1) PROPER HANDLING OF BLANK LINES ; (2) PROPER HANDLING OF ( FOLLOWING TAB ; MFL -- ALTERED DEFAULT FILETYPES AND IMPLEMENTED EXIT-WITH-STATUS ; KJC01 -- CHANGED TO STANDARD "EXIT" FOR RSX-11M V3.1 ; KJC02 -- ADD /SP SWITCH ; KJC03 -- PAD FORTRAN LINES WITH TABS INSTEAD OF SPACES ; KJC04 -- TRY WRITING OVER EXISTING FORTRAN FILE BEFORE ; CREATING A NEW ONE ; KJC04A -- DELETE KJC03 ; KJC05 -- RESTORED EXIT WITH STATUS FOR V3.2 ; ; Version X05.01 19-MAR-80 08:16 - 27-JUN-80 15:58 ; Modified by: K.J. CROSS ; ADD ERROR MESSAGES TO ERRORS 1-4 ; ; Version X06.00 27-JUN-80 15:58 - 01-JUL-80 09:21 ; Modified by: K.J. CROSS ; HANDLE "INCLUDE" LINES ; ; Version X07.00 01-JUL-80 09:22 - 15-JUL-80 09:55 ; Modified by: K.J. CROSS ; ATTACH OUTPUT DEVICE IF IT IS A TERMINAL ; ; Version X08.00 15-JUL-80 09:56 - 16-JUL-80 08:34 ; Modified by: K.J. CROSS ; ADDED /LI AND /-LI SWITCH SUPPORT ; ; Version X08.01 16-JUL-80 08:34 - 16-JUL-80 08:34 ; Modified by: K.J. CROSS ; OUTPUT ERRORS/WARNINGS EVEN IF LISTING FILE IS OPEN ; ;**- ; ; MACRO SUPPORT SUBROUTINES FOR THE U OF O FLEX TRANSLATOR - FOR THE ; THE PDP 11 RSX-11D REAL TIME OPERATING SYSTEM ; DATE: OCT-25-74 ; NOTE * THE FOLLOWING ROUTINES ARE NOT IN THIS SET BUT RESIDE IN A ; SEPARATE FORTRAN FILE; CATNUM, PUTNUM, CATSTR, CPYSTR, CPYSUB ; HASH, NEWNO .MCALL GCML$,CSI$,CSI$1,CSI$2,GCMLB$,OPEN$W,OPEN$R,DIR$,CLOSE$ .MCALL QIOW$,QIOW$S,NMBLK$,FDBDF$,FDAT$A,FDRC$A,FDOP$A .MCALL OPEN$U ;KJC04 .MCALL GET$,PUT$ .MCALL CSI$SW,CSI$ND,PRINT$ ;KJC02 .MCALL EXST$ ; ; LOCAL DEFINITIONS ; SW.SPL = 1 ;/SP - SPOOL LISTING (.FLL) FILE ;KJC02 SW.LST = 2 ;/LI - FORCE LISTING OF INCLUDE FILES ;KJC08 ; *** LOGICAL FUNCTION STREQ(A,B) STREQ:: CLR R0 ; SET RETURN VALUE TO FALSE MOV 2(R5),R1 ; R1 POINTS TO STRING A MOV 4(R5),R2 ; R2 TO B MOV (R1),R3 ; GET LENGTH TO R3 CMP (R1)+,(R2)+ ; CHECK LENGTHS MATCH BNE 2$ 1$: CMPB (R1)+,(R2)+ ; COMPARE BYTE BY BYTE BNE 2$ SOB R3,1$ DEC R0 ; SET RETURN TRUE 2$: RTS PC ; *** LOGICAL FUNCTION STRLT(A,B) STRLT:: CLR R0 ; SET RETURN VALUE FALSE MOV 2(R5),R1 MOV 4(R5),R2 MOV (R1)+,R3 ; SET LENGTH TO MIN OF THE TWO STRINGS CMP R3,(R2)+ BLE 1$ MOV -2(R2),R3 1$: CMPB (R1)+,(R2)+ ; COMPARE BYTE BY BYTE BLT 2$ BGT 3$ SOB R3,1$ CMP @2(R5),@4(R5) ; IF EQUAL UP TO MIN LENGTH - BGE 3$ ; TRUE IF A SHORTER 2$: DEC R0 ; SET RETURN VALUE TRUE 3$: RTS PC ; *** SUBROUTINE GETCH(WORD,POS,VALUE) GETCH:: MOV 2(R5),R0 ; MOVE ADDR OF WORD TO R0 ADD @4(R5),R0 ; ADD POSITION-1 DEC R0 CLR @6(R5) ; CLEAR DESTINATION MOVB (R0),@6(R5) ; MOV BYTE TO PARM 3 RTS PC ; *** INTEGER FUNCTION CHTYP(CHAR) CHTYP:: MOV #1,R0 ; SET REUTRN VALUE TO 1 MOV @2(R5),R1 ; GET CHAR TO R1 CMP R1,#'A ; TYPE=1 IF A-Z BLT 1$ CMP R1,#'Z BLE 9$ 1$: CMP R1,#141 ; TYPE=1 IF LITTLE A-Z BLT 2$ CMP R1,#172 BLE 9$ 2$: INC R0 CMP R1,#'0 ; TYPE=2 IF 0-9 BLT 3$ CMP R1,#'9 BLE 9$ 3$: INC R0 ; TYPE=3 IF '-' CMP R1,#'- BEQ 9$ INC R0 CMP R1,#'( ; TYPE=4 IF '(' BEQ 9$ INC R0 CMP R1,#') ; TYPE=5 IF')' BEQ 9$ INC R0 ; TYPE=6 IF BLANK OR TAB CMP R1,#40 BEQ 9$ CMP R1,#11 BEQ 9$ INC R0 ; ALL ELSE TYPE=7 9$: RTS PC ; *** SUBROUTINE CATSUB(A,B,BSTART,LENGTH) CATSUB:: MOV 2(R5),R1 ; GET ADDR OF A AND B STRINGS MOV 4(R5),R2 MOV @10(R5),R3 ; GET LENGTH TO MOVE ADD (R1),R1 ; MOV R1 TO END OF STRING A ADD #2,R1 ADD R3,@2(R5) ; UPDATE LENGTH OF STRING A ADD @6(R5),R2 ; MOV R2 TO START CHAR OF B INC R2 1$: MOVB (R2)+,(R1)+ ; MOVE DATA SOB R3,1$ BIT #1,R1 ; IF ODD # OF CHARS PAD A BLANK BEQ 2$ MOVB #40,(R1) 2$: RTS PC ; *** SUBROUTINE OPENF(CALLNO,DONE,SVER) OPENF:: MOV 6(R5),R1 ; COPY OVER SVER TO HEADING MOV (R1)+,R3 MOV #SVER,R2 ; PICK UP HEADING ADDRESS 1$: MOVB (R1)+,(R2)+ ; MOVE DATA SOB R3,1$ MOV #TB,R5 ; GET TIME AND DATE TO HEADING JSR PC,TIME MOV #DB,R5 JSR PC,DATE SOPEN: MOV #PAGE,R0 ; RESET PAGE AND LINE COUNTS AND CLR (R0)+ ; FORT AND LIST FLAGS CLR (R0)+ CLR (R0)+ CLR (R0)+ MOVB #'1,ERNUM ; SET ERROR=1 MOV #ERMSG1,ERMSGA ; SET ERROR MESSAGE ADDRESS TST SFLAG BNE 1$ CLR ECOUNT ;SET ERROR COUNT =0 INC SFLAG 1$: GCML$ #GCBUF ; GET COMMAND BCC 2$ JMP EXIT 2$: MOV GCBUF+G.CMLD+2,CSIBLK+C.CMLD+2 MOV GCBUF+G.CMLD,CSIBLK+C.CMLD CSI$1 #CSIBLK BCC FTOPN TYPERV: JMP TYPERR FTOPN: MOVB #'2,ERNUM ; SET ERROR=2 MOV #ERMSG2,ERMSGA ; SET ERROR MESSAGE ADDRESS CSI$2 #CSIBLK,OUTPUT BCS TYPERV BITB #5,C.STAT(R0) ; IS EITHER FILNAME OR DEV SPECIFIED BEQ FLOPN ; IF NOT NO FORT I/O MOV (PC)+,@(PC)+ ; MOVE EXTENSION 'FTN' TO NAME BLOCK .RAD50 /FTN/ .WORD NAMBLK+14 OPEN$U #FTNFDB ;OPEN EXISTING FILE IF POSSIBLE ;KJC04 BCC 10$ ;IF CC, WE GOT IT ;KJC04 OPEN$W #FTNFDB BCS TYPERV 10$: QIOW$S #IO.ATT,F.LUN(R0) ;TRY TO ATTACH (FAILURE OK) ;KJC07 INC FTNFLG ; SET FORT FLAG ON SHOWING IT IS OPEN BITB #CS.MOR,C.STAT+CSIBLK ; MORE FOR OUTPUT ??? BEQ FXOPN FLOPN: MOVB #'3,ERNUM ; TRY TO PICK UP THE LISTING FILE MOV #ERMSG3,ERMSGA ; SET ERROR MESSAGE ADDRESS CSI$2 #CSIBLK,OUTPUT,#SWTBL1 BCS TYPERR BIT #SW.LST,C.MKW1(R0) ; /LI OR /-LI SPECIFIED? ;KJC08 BEQ 5$ ; IF EQ, NO ;KJC08 BIS #SW.LST,SWITCH ; SAVE THIS INDICATION ;KJC08 MOV C.MKW2(R0),SWMKW2 ; SAVE THE SWITCH POLARITY MASK ;KJC08 5$: ; REF LABEL ;KJC08 BITB #5,C.STAT(R0) ; IS EITHER FILNAME OR DEV SPECIFIED BEQ FXOPN ; IF NOT NO LIST I/O MOV (PC)+,@(PC)+ ; 'FLL' EXTENSION TO DEFAULT NAME BLOCK .RAD50 /FLL/ .WORD NAMBLK+14 OPEN$W #FLLFDB BCS TYPERV QIOW$S #IO.ATT,F.LUN(R0) ;TRY TO ATTACH (FAILURE OK) ;KJC07 INC FLLFLG FXOPN: MOVB #'4,ERNUM MOV #ERMSG4,ERMSGA ; SET ERROR MESSAGE ADDRESS CSI$2 #CSIBLK,INPUT BCS TYPERR MOV (PC)+,@(PC)+ ; SET DEFAULT TO 'FLE' .RAD50 /FLE/ .WORD NAMBLK+14 OPEN$R #FLXFDB BCS TYPERR RTS PC TYPERR: DIR$ #ERMESG ; GIVE ERROR MESSAGE TO TI: TYPER1: MOV ERMSGA,R0 ; GET ADDRESS OF ERROR MESSAGE PARAMETER LIST QIOW$S #IO.WLB,#2,#1,,,,<(R0),2(R0),#40> ; OUTPUT ERROR MESSAGE CLOSE$ #FTNFDB ; CLOSE FORT AND LIST FILES IF CLOSE$ #FLLFDB ; THEY WERE OPENED INC ECOUNT ; SET ERROR FLAG JMP SOPEN ; START OVER EXIT: CLOSE$ #GCBUF ; CLOSE OUT COMMAND INPUT TST ECOUNT BEQ EXITOK DIR$ #EXBLKS ;EXIT BADLY EXITOK: TST NERRS BEQ 1$ DIR$ #EXBLKE ;ERROR 1$: TST NWRN BEQ 2$ DIR$ #EXBLKW 2$: DIR$ #EXBLK ; AND EXIT ; *** SUBROUTINE GET(LINENO,STRING,ENDFIL) GET:: INC @2(R5) ; INCREMENT LINE NUMBER CLR @4(R5) ; SET LINE LEN=0 MOV #-1,@6(R5) ; SET ENDFIL=TRUE 1$: GET$ #FLXFDB CALL CHKINC ; CHECK FOR INCLUDE LINES ;KJC06 BCC 11$ ; ALL OK? ;KJC06 MOV R1,ERMSGA ; CHECK FOR FINAL EOF ;KJC06 BEQ 9$ ; IF EQ, WE'RE ALL DONE ;KJC06 CLOSE$ ; CLOSE THE INPUT/INCLUDE FILE ;KJC06 BR TYPER1 ; ERROR - GO TYPE IT OUT ;KJC06 11$: MOV R2,LSTLVL ; SAVE LIST FLAG AND LEVEL ;KJC06 TSTB INCLVL ; IS THIS AN INCLUDE FILE LISTING? ;KJC08 BEQ 20$ ; IF EQ, NO - PROCEED ;KJC08 BIT #SW.LST,SWITCH ; WAS /LI OR /-LI SPECIFIED? ;KJC08 BEQ 20$ ; IF EQ, NO ;KJC08 CLRB LSTLVL ; ASSUME /LI ;KJC08 BIT #SW.LST,SWMKW2 ; WAS IT /-LI? ;KJC08 BNE 20$ ; IF NE, NO - FORCE LISTING ;KJC08 MOVB #-1,LSTLVL ; TURN OFF LISTING OF INCLUDE FILES ;KJC08 20$: ; REF LABEL ;KJC08 ; MOV 24(R0),R3 ; GET STRING LENGTH ; BLE 1$ ; IF NULL LINE IGNORE ; MOV 4(R5),R1 ; PICK UP DESTINATION ADDRESS ; TST (R1)+ MOV 4(R5),R1 ; INIT STRING POINTER AND LEN TST (R1)+ ; ADVANCE TO DATA PART OF STRING MOV R1,@4(R5) MOV 24(R0),R3 ; GET STRING LENGTH BLE 7$ ; IF NULL LINE IGNORE MOV #FLXBUF,R0 CMP R3,#72. ; TRIM COLUMNS 73 AND BEYOND BLE 2$ MOV #72.,R3 2$: MOVB (R0)+,R2 CMP #11,R2 ; TAB ??? BNE 5$ MOV #40,R2 ; CHANGE TO BLANK MOV #6,R4 CMPB (R0),#'( ; IF ( FOLLOWS TAB GO TO COL 7 BEQ 10$ CMPB (R0),#'A ; IF CHAR FOLLOWING TAB IS A-Z BLT 3$ ; GO TO COL 7 ELSE COL 6 CMPB (R0),#'Z BGT 3$ ; INC R4 10$: INC R4 3$: ADD 4(R5),R4 ; ADD BASE SUB R1,R4 ; SUB CURRENT POSITION BLE 5$ ; IF BEYOND COL 7 REPLACE TAB WITH BLANK 4$: MOVB R2,(R1)+ SOB R4,4$ 5$: MOVB R2,(R1)+ ; MOVE CHAR CMP R2,#40 ; BLANK ??? BEQ 6$ MOV R1,@4(R5) ; NO, UPDATE LEN TO LAST NON-BLANK 6$: SOB R3,2$ BIT #1,R1 ; PAD BLANK IF ODD # OF CHARS BEQ 7$ MOVB #40,(R1) 7$: SUB 4(R5),@4(R5) ; ADJUST LENGTH TO ACTUAL # OF CHARS SUB #2,@4(R5) CLR @6(R5) 9$: RTS PC ; *** SUBROUTINE PUT(LINENO,STRING,IOCLAS) PUT:: MOV @2(R5),LINNUM ; PICK UP LINE NUMBER AND STRING ADDR MOV 4(R5),STRADR CMP #1,@6(R5) ; CHECK IOCLAS - IF 1 GO TO FORT BEQ 7$ TST FLLFLG ; CHECK LISTING OPEN - IF NOT IGNORE BEQ 6$ TSTB LSTLVL ; INCLUDE FILE LISTING DISABLED? ;KJC06 BNE 6$ ; IF NE, YES ;KJC06 TST LINCNT ; START NEW PAGE ??? BNE 3$ INC PAGE ; YES - INC PAGE # AND PUT IN HEADING MOV #HB,R5 JSR PC,PUTNUM PUT$ #FLLFDB,#HLINE,#TB-HLINE MOV #-50.,LINCNT 3$: MOV #FLLBUF,R1 ; BLANK FRONT OF LINE MOV #4,R2 MOV #" ,(R1)+ SOB R2,.-4 TST LINNUM BEQ 5$ ; IF LINENO = 0 LEAVE BLANK BGT 4$ ; IF GT 0 USE IT NEG LINNUM ; LESS USE IT WITH '*' IN FRONT MOVB #'*,FLLBUF+1 4$: MOVB INCLVL,R5 ; GET INCLUDE LEVEL ;KJC06 BEQ 45$ ; IF EQ, FORGET IT ;KJC06 ADD #'0,R5 ; OTHERWISE, PUT THE INCLUDE LEVEL ;KJC06 MOVB R5,FLLBUF ; AT THE BEGINNING OF THE LINE ;KJC06 45$: ; REF LABEL ;KJC06 MOV #JB,R5 ; GO PUT LINE NUMBER FRONT OF LINE JSR PC,PUTNUM 5$: MOV STRADR,R1 ; COPY STRING OVER MOV (R1)+,R3 MOV R3,R4 ADD #12,R4 MOV #FLLBUF+12,R2 MOVB (R1)+,(R2)+ ; MOVE STRING TO OUTPUT BUFFER SOB R3,.-2 PUT$ #FLLFDB,#FLLBUF,R4 INC LINCNT 6$: RTS PC 7$: TST FTNFLG ; FORT I/O ACTIVE??? BEQ 6$ ; NO - RETURN MOV STRADR,R1 MOV (R1)+,R3 ; GET LENGTH OF STRING TO R3 MOV R3,R4 MOV #FTNBUF,R2 MOVB (R1)+,(R2)+ ; COPY DATA OVER SOB R3,.-2 MOV #FTNBUF+72.,KB+2 ; SET DEFAULT LOCATION FOR LINE NUMBER MOV #74.,R3 ; LOCATION FOR LINE NUMBER SUB R4,R3 ; COMPUTE NO. OF SPACES TO PAD 80$: MOVB #40,(R2)+ ; MOVE THEM SOB R3,80$ MOV #KB,R5 ; MOVE LINE NUMBER TO COL 75-79 JSR PC,PUTNUM MOV KB+2,R2 ; GET START OF LINE NUMBER ADD #7,R2 ; ADD LENGTH OF LINE NUMBER STRING SUB #FTNBUF,R2 ; COMPUTE LENGTH OF LINE PUT$ #FTNFDB,,R2 RTS PC ; *** SUBROUTINE CLOSEF(WARN,ERROR) CLOSEF:: MOV @2(R5),R0 MOV @4(R5),R1 MOV R0,NERRS ; SAVE # ERRORS AND WARNINGS MOV R1,NWRN ADD R1,R0 ; IF NO ERRORS OR WARNINGS - SKIP IT BEQ 3$ MOV #LB,R5 ; USE PUTNUM ON EACH JSR PC,PUTNUM MOV #MB,R5 JSR PC,PUTNUM TST FLLFLG ; LISTING OPEN ??? BEQ 2$ TST R0 BEQ 1$ PUT$ #FLLFDB,#NER,#NERL-NER 1$: ADD #2,G.CMLD+GCBUF ; PUT THE COMMAND LINE TO LISTING PUT$ #FLLFDB,#CMDOUT,G.CMLD+GCBUF ;; BR 3$ ;KJC08.01 2$: TST R0 BEQ 3$ DIR$ #QIOE ; IF NOT - QIO IT TO 'CO' 3$: CLOSE$ #FTNFDB CLOSE$ #FLXFDB TST FLLFLG ; LISTING OPEN? ;KJC02 BEQ 99$ ; IF EQ, NO ;KJC02 BIT #SW.SPL,SWITCH ; SPOOL LISTING? ;KJC02 BEQ 10$ ; IF EQ, NO ;KJC02 PRINT$ #FLLFDB ; SPOOL THE LISTING ;KJC02 BR 99$ ; ALL DONE ;KJC02 10$: CLOSE$ #FLLFDB ; JUST CLOSE THE FILE ;KJC02 99$: RTS PC ; *** DATA *** .ENABL LC ;ENABLE LOWER CASE FOR MESSAGES SWITCH: .WORD SW.SPL ;VALUE OF SWITCHES ;KJC02 SWMKW2: .BLKW 1 ;SWITCH POLARITY (CSIBLK+C.MKW2) ;KJC08 SWTBL1: CSI$SW SP,SW.SPL,SWITCH,SET,NEG ;KJC02 CSI$SW LI,SW.LST,SWITCH,SET,NEG ;KJC08 CSI$ND SFLAG: .WORD 0 ECOUNT: .WORD 0 ;USED FOR ERROR COUNT PAGE: .WORD 0 LINCNT: .WORD 0 FTNFLG: .WORD 0 FLLFLG: .WORD 0 ERMSGA: .WORD 0 ;ADDRESS OF ERROR MESSAGE ERMSG1: .WORD EMSG1,EMSG1L ERMSG2: .WORD EMSG2,EMSG2L ERMSG3: .WORD EMSG3,EMSG3L ERMSG4: .WORD EMSG4,EMSG4L EMSG1: .ASCII /Syntax error in command line./ EMSG1L = .-EMSG1 EMSG2: .ASCII /Open failure on FORTRAN output file./ EMSG2L = .-EMSG2 EMSG3: .ASCII /Open failure on listing output file./ EMSG3L = .-EMSG3 EMSG4: .ASCII /Open failure on FLEX input file./ EMSG4L = .-EMSG4 ERBUF: .ASCII /Error / ERNUM: .ASCII / . - command ignored./ PSTR: .EVEN GCBUF: GCMLB$ 2,FLE,CMDBUF CMDOUT: .ASCII <15><12> CMDBUF: .BLKB 82. EXBLK: EXST$ EX$SUC EXBLKS: EXST$ EX$SEV EXBLKW: EXST$ EX$WAR EXBLKE: EXST$ EX$ERR ERMESG: QIOW$ IO.WLB,2,1,,,, CSI$ .EVEN CSIBLK: .BLKB C.SIZE NAMBLK: NMBLK$ RSXFLEX,FLX,,SY,0 FTNFDB: FDBDF$ FDAT$A R.VAR,FD.CR FDRC$A 0,FTNBUF,120. FDOP$A 3,CSIBLK+C.DSDS,NAMBLK FLLFDB: FDBDF$ FDAT$A R.VAR,FD.CR FDRC$A 0,FLLBUF,132. FDOP$A 4,CSIBLK+C.DSDS,NAMBLK FLXFDB:: FDBDF$ FDRC$A 0,FLXBUF,120. FDOP$A 5,CSIBLK+C.DSDS,NAMBLK FTNBUF: .BLKB 120. FLLBUF: .ASCII / / .BLKB 122. FLXBUF: .BLKB 120. LSTLVL: .BYTE 0 ;LIST FLAG (>0 MEANS DON'T LIST INCLUDE FILES) INCLVL: .BYTE 0 ;INCLUDE NESTING LEVEL NERRS: .WORD 0 NWRN: .WORD 0 LB: .WORD 2,NER+2,NERRS MB: .WORD 2,NWR-2,NWRN NER: .ASCII <15><12><40><40> TNER: .ASCII / Errors, / NWR: .ASCII / Warnings./ NERL: .EVEN QIOE: QIOW$ IO.WLB,2,1,,,, HLINE: .ASCII <15><14> SVER: .ASCII / / DSPOT: .ASCII / / TSPOT: .ASCII / / .ASCII /Page/ PSPOT: .ASCII / / .ASCII <15><12> TB: .WORD 1,TSPOT DB: .WORD 1,DSPOT HB: .WORD 2,PSPOT,PAGE KB: .WORD 2,FTNBUF+72.,LINNUM JB: .WORD 2,FLLBUF,LINNUM LINNUM: .WORD 0 STRADR: .WORD 0 .END