TITLE PALX11 V003 20-FEB-70 ; COPYRIGHT 1969,1970, DIGITAL EQUIPMENT CORPORATION. ; Edited to redefine the JOBDAT symbols from JOBxxx to .JBxxx ; by Paul T. Robinson, Wesleyan Univ. ; for DECUS conversion to DEC-20 library. ; Edits in lower case. LOC 137 003 RELOC TITLE: SIXBIT /PALX11/ SUBTTL: SIXBIT /V003 / ENTRY PALX11 ; EXTERNAL JOBREL, JOBFF, JOBDDT, JOBSYM, JOBAPR, JOBTPC external .jbrel, .jbff, .jbddt, .jbsym, .jbapr, .jbtpc jobrel==.jbrel jobff==.jbff jobddt==.jbddt jobsym==.jbsym jobapr==.jbapr jobtpc==.jbtpc INTERNAL PATCH SUBTTL VARIABLE PARAMETERS PAGSIZ= ^D54 ; NUMBER OF LINES ON A PAGE NUMBUF= 2 ; NUMBER OF BUFFERS PER DEVICE CORINC= 2000 ; CORE INCREMENT SPL= 4 ; SYMBOLS PER LINE (SYMBOL TABLE LISTING) SPLTTY= 3 ; SYMBOLS PER LINE (TTY) RADIX= ^D8 ; ASSEMBLER RADIX DATLEN= ^D350 ; DATA BLOCK LENGTH CPW= 6 ; CHARACTERS PER WORD WPB= 10 ; MACRO BLOCK SIZE CPL= ^D120 ; CHARACTERS PER LINE PDPLEN= 40 ; INITIAL PUSH-DOWN POINTER LENGTH PDPINC= 10 ; PUSH-DOWN POINTER INCREMENT SUBTTL ACCUMULATOR ASSIGNMENTS %00= 0 ; ACCUMULATION OF SIXBIT SYMBOL, SCRATCH %01= 1 ; SYMBOL VALUE AND FLAGS SET BY SRCH. SCRATCH %02= 2 ; SCRATCH %03= 3 ; SCRATCH %04= 4 ; CODE TO BE GENERATED. LH - TYPE, RH - VALUE %05= 5 ; LOCATION COUNTER %06= 6 ; SCRATCH %07= 7 ; SYMBOL TABLE SEARCH INDEX %10= 10 ; EXPRESSION OR TERM VALUE, SCRATCH %11= 11 ; SCRATCH %12= 12 ; MACRO STORAGE BYTE POINTER %13= 13 ; LINE BUFFER BYTE POINTER %14= 14 ; CURRENT CHARACTER (ASCII) %15= 15 ; LH - ASSEMBLER FLAGS, RH - ERROR FLAGS %16= 16 ; EXEC FLAGS %17= 17 ; PUSH-DOWN POINTER SUBTTL FLAG REGISTERS ; %16 - LH LSTBIT= 000001 ; 1- SUPRESS LISTING OUTPUT BINBIT= 000002 ; 1- SUPRESS BINARY OUTPUT CSWBIT= 000004 ; 1- SUPRESS CROSS REFERENCE ESWBIT= 000010 ; 1- LIST OCTAL MSWBIT= 000020 ; 1- SUPRESS MACRO LISTING NSWBIT= 000040 ; 1- SUPRESS ERRORS ON TTY RSWBIT= 000100 ; 1- REPRODUCE SOURCE TTYBIT= 000200 ; 1- LISTING IS ON TTY ; %16 - RH ARWBIT= 000001 ; 1- LEFT ARROW SEEN EXTBIT= 000002 ; 1- EXPLICIT EXTENSION SEEN SWTBIT= 000004 ; 1- ENTER SWITCH MODE INFBIT= 000010 ; 1- VALID INFORMATION SEEN FFBIT= 000020 ; 1- FORM-FEED SEEN ENDBIT= 000400 ; 1- END OF ALL INPUT FILES SLABIT= 001000 ; 1- SWITCH MODE ENTERED WITH A NULBIT= 010000 ; 1- NON-NULL COMMAND STRING HDRBIT= 040000 ; 1- TIME FOR NEW LISTING PAGE SEQBIT= 100000 ; 1- SEQUENCE NUMBER SEEN MODBIT= 200000 ; 1- USER MODE AC'S SET ; %15 - LH DECFLG= 000002 ; DECIMAL NUMBER SRCFLG= 000004 ; 1- SUPPRESS LISTING OF SOURCE TEXT LINFLG= 000010 ; 1- SUPPRESS LISTING OF LINE ENDFLG= 000020 ; 1- END OF SOURCE ENCOUNTERED RSWFLG= 000040 ; 1- LINE TO BE SUPPRESSED IN REDUCTION TTYFLG= 000100 ; 1- TTY MODE LISTING FORMAT CONFLG= 000200 ; 1- CONCATENATION CHARACTER SEEN LPTFLG= 000400 ; 1- NO LPT LISTING OF SOURCE ROKFLG= 001000 ; 1- REGISTER "OK" FLAG REGFLG= 002000 ; 1- REGISTER FLAG P1F= 400000 ; 1- PASS 1 IN PROGRESS SUBTTL MISCELLANEOUS PARAMETERS TTYDEV= 000010 ; 1- DEVICE IS A TTY PTRDEV= 000200 ; 1- DEVICE IS A PTR LPTDEV= 040000 ; 1- DEVICE IS A LPT CDRDEV= 100000 ; 1- DEVICE IS A CDR IODATA= 200000 ; 1- IO DATA ERROR IODEV= 100000 ; 1- IO PARITY ERROR IOWRLK= 400000 ; 1- IO WRITE LOCK ERROR IOBKTL= 040000 ; 1- IO BLOCK TOO LARGE IOEOF= 020000 ; 1- END OF FILE ON IO DEVICE ; DEVICE PARAMETERS TTO= 0 BIN= 1 LST= 2 SRC= 3 TTI= 4 ; CREF FLAG CHARACTERS CRFLIN= 35 CRFSYM= 36 CRFMAC= 34 CRFOPC= 33 ; OPDEFS OPDEF RESET [CALLI 0] OPDEF DEVCHR [CALLI 4] OPDEF CORE [CALLI 11] OPDEF DATE [CALLI 14] OPDEF APRENB [CALLI 16] OPDEF MSTIME [CALLI 23] OPDEF RUNTIM [CALLI 27] OPDEF ZBINK [CLOSE BIN,] SUBTTL EXEC PALX11: ;MAIN ENTRY POINT RESET ;RESET ALL I/O MOVEI %17,ARGLST-1 ;USE ARGLST AS TEMPORARY PDP MOVE %00,[XWD BZCOR,BZCOR+1] SETZB %01,BZCOR MOVE %02,JOBREL SKIPE JOBDDT MOVE %02,JOBSYM BLT %00,-1(%02) RUNTIM %01, MOVEM %01,RUNTIM DATE %00, MOVEM %00,DATE ;SAVE DATE MSTIME %00, MOVEM %00,MSTIME ; AND TIME MOVSI %16,BINBIT!LSTBIT!CSWBIT HRRI %16,HDRBIT SETZ %15, ;CLEAR ASSEMBLER FLAG REGISTER MOVE %00,[INIT TTI,1] MOVSI %01,(SIXBIT /TTY/) MOVEI %02,TTIBUF PUSHJ %17,INISET ;INITIALIZE TTY FOR INPUT INBUF TTI,1 ;GIVE IT AN INPUT BUFFER MOVE %00,[INIT TTO,1] MOVSI %02,TTOBUF PUSHJ %17,INISET OUTBUF TTO,4 MOVEI %00,EZCOR-TITLE+204*NUMBUF*3+PDPLEN+200 SKIPE JOBDDT ; UNLESS DDT IS LOADED JRST .+3 CORE %00, JRST ERRNC MOVEI %02,"*" ;TYPE AN ASTERISK AT THE USER PUSHJ %17,TTYDMP ;... OUTPUT TTO, ;REALLY OUTPUT IT INPUT TTI, ;GET A COMMAND STRING MOVSI %01,(SIXBIT /DSK/) PUSHJ %17,GETBIN ;INITIALIZE THE BINARY FILE MOVSI %01,(SIXBIT /DSK/) TRNN %16,ARWBIT ;GO ON TO SOURCE IF _ HAS BEEN SEEN PUSHJ %17,GETLST ;INITIALIZE THE LISTING FILE MOVE %05,JOBFF MOVEM %05,JOBFFI ;SAVE START OF SRC BUFFER MOVE %05,TTIPNT MOVEM %05,TTISAV ;SAVE TTI POINTER MOVSI %01,(SIXBIT /DSK/) PUSHJ %17,GETSRC ;INITIALIZE THE SOURCE FILE MOVEI %05,204 ;COMPUTE MAX BUFFER SIZE IMULI %05,NUMBUF ADD %05,JOBFFI TRNN %16,ENDBIT ;MULTI-FILE? MOVEM %05,JOBFF ; YES, SAVE LARGEST BUFFER SIZE PUSHJ %17,PDPSET ;SET EXPANDABLE PDP MOVEI %10,[ASCIZ ./R REQUIRES LISTING FILE.] TLNE %16,LSTBIT ;IF NO LISTING FILE TLNN %16,RSWBIT ; BUT /R SEEN, CAIA JRST ERROR ; ERROR PUSHJ %17,ACEXCH ;SAVE EXEC AC'S PUSHJ %17,ASSEMB ;CALL THE ASSEMBLER PUSHJ %17,LSTCR ;SKIP ONE LINE PUSHJ %17,ACEXCH ;SWAP AC'S TLZ %16,NSWBIT ;BE SURE TO TYPE FINAL MESSAGE PUSHJ %17,ERRCR ;SKIP A LINE MOVEI %02,"?" ;ASSUME ERROR SKIPE %11,ERRCNT ;TEST ERRORS, LOAD %11 PUSHJ %17,ERROUT MOVEI %10,[ASCIZ / ERRORS DETECTED: 5/] PUSHJ %17,LSTMSG PUSHJ %17,ERR2CR SETZ %11, RUNTIM %11, ;GET RUNTIM SUB %11,RUNTIM ;DEDUCT STARTING TIME IDIVI %11,^D1000 ;CONVERT TO SECONDS MOVEI %10,[ASCIZ / RUN-TIME: 5 SECONDS/] PUSHJ %17,LSTMSG PUSHJ %17,ERR2CR HRRZ %11,JOBREL ;GET TOP OF COR ASH %11,-^D10 ;CONVERT TO "K" ADDI %11,1 ;BE HONEST ABOUT IT MOVEI %10,[ASCIZ / 5K CORE USED/] PUSHJ %17,LSTMSG ;LIST MESSAGE PUSHJ %17,ERR2CR JRST EXIT ;CLOSE OUT SUBTTL FILE INITIALIZATION ;INITIALIZE A BINARY FILE ;COLLECTS A DEVICE NAME IN AC %01, A FILE NAME IN XE, AND ;AN OPTIONAL FILE NAME EXTENSION, THE DEVICE IS INITIALIZED IN ;BINARY MODE ON CHANNEL ONE, WITH EITHER ONE OR TWO BUFFERS. GETBIN: MOVSI %13,(Z BIN,) ;SET SWITCH AC PUSHJ %17,GETNAM ;GET A DEVICE NAME AND FILE NAME POPJ %17, ;NULL FILE EXIT MOVE %00,%01 ;GET AN EXTRA COPY OF THE DEVICE DEVCHR %00, ;TEST ITS CHARACTERISTICS TLNE %00,TTYDEV!PTRDEV!LPTDEV!CDRDEV JRST ERRTB ;ILLEGAL FOR BINARY MOVE %00,[INIT BIN,10] ;INIT IMAGE MODE MOVSI %02,BINBUF ;GET BUFFER HEADER ADDRESS PUSHJ %17,INISET ;INITIALIZE THE BINARY DEVICE OUTBUF BIN,NUMBUF TLNE %13,777000 ;IS THERE A SWITCH TO PROCESS? XCT %13 ;EXECUTE THE ASSEMBLED UUO TRZN %16,EXTBIT ;WAS THERE AN EXTENSION MOVSI %14,(SIXBIT/BIN/) ; NO, SET TO .BIN HLLZM %14,XE1 ENTER BIN,XE ;ENTER FILE NAME IN DIRECTORY JRST ERRNR ;DIRECTORY FULL TLZ %16,BINBIT ;INDICATE GOOD BINARY FILE POPJ %17, ;EXIT ;INITIALIZE A LISTING FILE ;COLLECTS A DEVICE NAME IN AC %01, A FILE NAME IN XE AND ;AN OPTIONAL FILENAME EXTENSION, THE DEVICE IS INITIALIZED IN ;ASCII LINE MODE ON CHANNEL 2, IF THE DEVICE IS A TTY, THE ;TTYLST FLAG IS SET TO 1, AND THE INBUF/OUTBUF INDEX IS INCREMENTED. GETLST: MOVSI %13,(Z LST,) ;SET SWITCH AC SETZM XE PUSHJ %17,GETNAM ;GET A DEVICE AND FILE NAME TLNN %16,CSWBIT CAIA POPJ %17, TLNE %16,CSWBIT JRST GETLS2 ;NORMAL MOVSI %04,(SIXBIT /CRF/) SKIPE XE JRST GETLS1 MOVE %03,[SIXBIT /CREF/] MOVEM %03,XE MOVSI %04,(SIXBIT /TMP/) GETLS1: TRON %16,EXTBIT MOVE %14,%04 GETLS2: MOVE %00,[INIT LST,1] MOVSI %02,LSTBUF ;GET BUFFER HEADER ADDRESS PUSHJ %17,INISET ;INITIALIZE LISTING FILE MOVE %00,%01 DEVCHR %00, ;GET DEVICE CHARACTERISTICS TLNE %00,TTYDEV ;IS IT A TTY? TLO %16,TTYBIT ;SET FLAG OUTBUF LST,NUMBUF TLNE %13,777000 ;IS THERE A SWITCH TO PROCESS? XCT %13 ;EXECUTE THE ASSEMBLED UUO TRZN %16,EXTBIT ;WAS THERE AN EXTENSION? MOVSI %14,(SIXBIT /LST/) ;NO HLLZM %14,XE1 ;SAVE EXTENSION IN LOOKUP BLOCK ENTER LST,XE ;ENTER FILE NAME IN DIR. JRST ERRNR ;DIRECTORY FULL TLZ %16,LSTBIT ;INDICATE A GOOD LISTING FILE POPJ %17, ;EXIT ;INITIALIZE A SOURCE FILE ;COLLECTS A DEVICE NAME IN AC %01, A FILE NAME IN XE AND ;AN OPTIONAL FILE NAME EXTENSION. THE DEVICE IS INITIALIZED ;IN ASCII LINE MODE ON CHANNEL 3, AND THE FILE NAME ASSOCIATED ;WITH THE SOURCE FILE IS USED AS THE TITLE ON THE LISTING. GETSRC: MOVSI %13,(Z SRC,) ;SET SWITCH AC SETZM XE PUSHJ %17,GETNAM ;GET A DEVICE NAME AND FILE NAME JRST ERRSE ;COMMAND ERROR IF A NULL MOVE %00,[INIT SRC,1] MOVEI %02,SRCBUF ;GET BUFFER HEADER ADDRESS PUSHJ %17,INISET ;INITIALIZE THE SOURCE DEVICE MOVE %05,JOBFFI MOVEM %05,JOBFF ;SET TO TOP OF INPUT BUFFER INBUF SRC,NUMBUF TLNE %13,777000 ;IS THERE A SWITCH TO PROCESS? XCT %13 ;EXECUTE THE ASSEMBLED UUO TRZE %16,EXTBIT ;WAS AN EXPLICIT EXTENSION SEEN? JRST SRC3A ;YES, LOOK FOR IT MOVSI %14,(SIXBIT /P11/) HLLZM %14,XE1 ;NO, TRY .SRC FIRST LOOKUP SRC,XE TDZA %14,%14 ;NOT FOUND, TRY BLANK POPJ %17, ;FOUND SRC3A: HLLZM %14,XE1 ;SAVE EXTENSION IN LOOKUP BLOCK HLLZM %14,EXTSAV ;SAVE EXTENSION FOR HEADER LOOKUP SRC,XE ;LOOKUP FILE NAME JRST ERRCF ;FILE NOT FOUND POPJ %17, ;EXIT SETP2: ;SET FOR PASS 2 PUSHJ %17,ACEXCH ;GET EXEC AC'S TRZ %16,ENDBIT!FFBIT MOVE %05,TTISAV MOVEM %05,TTIPNT ;RESTORE INPUT COMMANDS MOVSI %01,(SIXBIT /DSK/) PUSHJ %17,GETSRC ;GET A SOURCE FILE JRST ACEXCH ;SWAP AC'S AND EXIT SUBTTL COMMAND STRING DECODER ;EXEC COMMAND STRING DISPATCHING ;THIS ROUTINE PICKS UP CHARACTERS FROM THE EXEC TTY BUFFER AND ;DISPATCHES TO THE PROPER ROUTINE DEPENDING ON THE TYPE OF ;CHARACTER. A TABLE OF BYTES AND BYTE POINTERS ALLOWS EACH CHARAC- ;TER IN THE ASCII SET TO BE TREATED INDIVIDUALLY. GETNAM: SETZ %14, ;CLEAR SYMBOL WORD MOVE %06,[POINT 6,%14] GETCMN: PUSHJ %17,GETTTI ;GET NEXT CHARACTER CAIN %05,"[" ;PROJECT-PROGRAMMER PAIR? JRST LFTBRA ;YES CAIGE %10,4 ;MODIFY CODE IF .GE. 4 TRNN %16,SWTBIT ;MODIFY IF SWITCH IS ON ADDI %10,4 ;CHANGE DISPATCH BY ADDING 4 HRRZ %02,DSPTCH(%10) ;LOAD RIGHT HALF DISPATCH CAIL %10,10 ;SKIP IF CORRECT HLRZ %02,DSPTCH-10(%10);OTHERWISE, GET LEFT HALF DSPTCH JRST @%02 ;GO TO CORRECT ROUTINE GETTTI: ILDB %05,TTIPNT ;GET A CHARACTER FROM TTY BUFFER MOVE %10,%05 ;ANOTHER COPY OF IT IN AC %10 IDIVI %10,8 ;TRANSLATE TO 4-BIT CODE ADD %10,[POINT 4,BITE,] ;SET BYTE POINTER IBP %10 ;MOVE TO PROPER BYTE SOJGE %11,.-1 ;TEST FOR END LDB %10,%10 ;OK, FETCH BYTE CAIN %10,4 ;IS IT A NULL? JRST GETTTI ;YES, TRY AGAIN POPJ %17, ;NO, EXIT ;COMMAND DISPATCH TABLE AND BYTE POINTERS DSPTCH: XWD GETCMN, ERRBS ;IGNORED CHAR, BAD CHAR(SWITCH) XWD SWTCH, SWTCHA ;<(>, LETTER(SWITCH MODE) XWD COLON, ERRBS ;<:>, NUMBER(SWITCH MODE) XWD PERIOD, SWTCHE ;<.>,<)>ESCAPE SWITCH MODE XWD LFTARW, ERRIC ;<_> OR <=>, BAD CHAR (NORMAL MODE) XWD COMMA, STORE ;<,>,ALPHABETICH CHAR (NORMAL) XWD CARRTN, STORE ;,NUMERIC CHAR (NORMAL) XWD SLASH, ERRIC ;, <)> ILLEGAL ESCAPE ;BYTE TABLE FOR DISPATCHING ;CLASSIFICATION BYTE CODES ; BYTE DISP CLASSIFICATION ; 00 00 ILLEGAL CHARACTER, SWITCH MODE ; 01 01 ALPHABETIC CHARACTER, SWITCH MODE ; 02 02 NUMERIC CHARACTER, SWTICH MODE ; 03 03 SWITCH MODE ESCAPE, SWITCH MODE ; 00 04 ILLEGAL CHARACTER, NORMAL MODE ; 01 05 ALPHABETIC CHARACTER, NORMAL MODE ; 02 06 NUMERIC CHARACTER, NORMAL MODE ; 03 07 SWITCH MODE ESCAPE, NORMAL MODE ; 04 10 IGNORED CHARACTER ; 05 11 ENTER SWITCH MODE WITH A <(> ; 06 12 DEVICE DELIMITER, <:> ; 07 13 FILE EXTENSION DELIMITER, <.> ; 10 14 OUTPUT SPEC. DELIMITER, <_> OR <=> ; 11 15 FILE DELIMITER, <,> ; 12 16 COMMAND TERMINATOR, ; 13 17 ENTER SWITCH MODE WITH ;BYTE TABLE: BITE: BYTE (4) 4, , , , , , , BYTE (4) , 4,12, 4, 4,12, , BYTE (4) , , , , , , , BYTE (4) , ,12, , , , , BYTE (4) 11, , 4, , , , , BYTE (4) 5, 3, , ,11, , 7,13 BYTE (4) 2, 2, 2, 2, 2, 2, 2, 2 BYTE (4) 2, 2, 6, , ,10, , BYTE (4) , 1, 1, 1, 1, 1, 1, 1 BYTE (4) 1, 1, 1, 1, 1, 1, 1, 1 BYTE (4) 1, 1, 1, 1, 1, 1, 1, 1 BYTE (4) 1, 1, 1, , , , ,10 BYTE (4) , , , , , , , BYTE (4) , , , , , , , BYTE (4) , , , , , , , BYTE (4) , , , , ,12, , 4 ;LEFT ARROW PROCESSOR LFTARW: TRO %16,ARWBIT ;SET APPROPIATE FLAGS TRNN %16,EXTBIT ;IS THIS A FILE NAME EXTENSION? MOVEM %14,XE ;NO, ITS A FILE NAME TRZE %16,INFBIT ;IS THIS A NULL FILE? CPOPJ1: AOS (%17) ;GOOD EXIT CPOPJ: POPJ %17, ;... ;PERIOD PROCESSOR PERIOD: TRO %16,EXTBIT ;SET FLAG FOR EXPLICIT EXTENSION MOVEM %14,XE ;SAVE THE FILE NAME JRST GETNAM ;RE-ENTER THE GETNAM ROUTINE ;COLON PROCESSOR COLON: MOVE %01,%14 ;SET UP NEW DEVICE NAME JRST GETNAM ;RETURN FOR MORE COMMAND ;COMMA PROCESSOR COMMA: TRZN %16,INFBIT ;IS THIS A NULL FILE? TRNE %16,ARWBIT ;ONLY LOOK FOR THEM IF NO _ SKIPA ;NOT A NULL FILE POPJ %17, ;NULL FILE, EXIT COMMA1: TRNN %16,EXTBIT ;DO WE HAVE A FILE NAME EXTENSION? MOVEM %14,XE ;NO, IT WAS A FILE NAME JRST CPOPJ1 ;GOOD EXIT ;CARRIAGE RETURN PROCESSOR CARRTN: TRNN %16,NULBIT ;IS THIS JUST A RANDOM CR? JRST PALX11 ;YES, RESTART COMPLETELY TRO %16,ENDBIT ;IS THIS A NORMAL MODE COMMAND? TRNN %16,ARWBIT ;YES, HAS A LEFT ARROW BEEN SEEN? JRST ERRSE ;NO, SYNTAX ERROR JRST COMMA1 ;YES, TREAT IT LIKE A COMMA ;THE FOLLOWING TWO ROUTINES HANDLE ALPHANUMERIC CHARACTERS ;FOUND IN THE COMMAND STRING. IN NORMAL MODE, THE CHARACTER ;IS DEPOSITED TO FORM A SIXBIT SYMBOL. IN SWITCH MODE, THE ;PROPER INSTRUCTION IS EXECUTED WITH THE AID OF A DISPATCH ;TABLE. THEN, IF SWITCH MODE WAS ENTERED WITH A SLASH, THE ;EXEC EXITS FROM SWITCH MODE. STORE: TRO %16,INFBIT!NULBIT;TURN ON BITS FOR CR ROUTINE SUBI %05,40 ;CONVERT SIXBIT TO ASCII TLNE %06,770000 ;DON'T STORE IF NO ROOM FOR CHAR IDPB %05,%06 ;PLOP THE CHARACTER INTO AC %14 JRST GETCMN ;RETURN SWTCHA: MOVEI %11,-"A"(%05) MOVE %10,[POINT 4,BYTAB] IBP %10 SOJGE %11,.-1 LDB %11,%10 JUMPE %11,ERRBS CAIG %11,SWTABA-SWTAB;THIS SWITCH LEGAL FOR INPUT? TRNN %16,ARWBIT ; NO, ERROR IF "_" SEEN CAIA ;OK JRST ERRWF ; ERROR, SWITCH IN WRONG FIELD XCT SWTAB-1(%11) JRST ERRBS TRZE %16,SLABIT ;CALLED BY A SLASH? TRZ %16,SWTBIT ;YES, EXIT FROM SWITCH MODE JRST GETCMN ;NO, RETURN FOR MORE CHARACTERS ;THE FOLLOWING THREE ROUTINES HANDLE THE CONTROL CHARACTERS ;IN THE COMMAND STRING WHICH CAUSE THE EXEC TO ENTER INTO AND ;EXIT FROM SWITCH MODE. THERE ARE TWO TYPES OF SWITCH MODE, ;DEPENDING ON WHETHER IT IS ENTERED WITH A OR A <(>. SLASH: TRO %16,SLABIT ;TURN ON THE SPECIAL SWITCH MODE SWTCH: TROA %16,SWTBIT ;TURN ON NORMAL SWITCH MODE SWTCHE: TRZ %16,SWTBIT ;TURN OFF THE NORMAL SWITCH MODE JRST GETCMN ;RETURN FOR MORE CHARACTERS ;DISPATCH TABLE FOR SWITCHES DEFINE SETSW (LETTER, INSTRUCTION) < INSTRUCTION Y=<"LETTER"-"A">-^D9*/^D9> SETCOD \X,Y> DEFINE SETCOD (X,Y) B<4*Y+3>> BYTAB0= 0 BYTAB1= 0 BYTAB2= 0 SWTAB: SETSW C, SETSW R, SETSW E, SETSW T, SWTABA: SETSW W, SETSW M, SETSW N, BYTAB: +BYTAB0 +BYTAB1 +BYTAB2 IF2, LFTBRA: SETZM XE3 ;CLEAR NUMBER LFTBR1: HRLZS XE3 ;COMMA, MOVE TO LEFT HALF LFTBR2: PUSHJ %17,GETTTI ;GET NEXT CHAR CAIN %05,"]" ;TERMINAL? JRST GETCMN ;YES, EXIT CAIN %05,"," ;SEPARATOR? JRST LFTBR1 ;YES CAIL %05,"0" ;TEST FOR OCTAL NUMBER CAILE %05,"7" JRST ERRIC ;IMPROPER CHARACTER HRRZ %10,XE3 ;OK, GET PREVIOUS VALUE IMULI %10,8 ADDI %10,-"0"(%05) ;ACCUMULATE NEW NUMBER HRRM %10,XE3 JRST LFTBR2 SUBTTL I/O ROUTINES LSTCR: TDZA %02,%02 LSTTAB: MOVEI %02,11 LSTOUT: TLNE %16,LSTBIT!RSWBIT ;LISTING REQUESTED? POPJ %17, ; NO, EXIT TRZE %16,HDRBIT PUSHJ %17,HEADER LSTSRC: JUMPN %02,LSTDMP MOVEI %02,15 ;CARRIAGE RETURN PUSHJ %17,LSTDMP MOVEI %02,12 ;LINE FEED PUSHJ %17,LSTDMP TLNE %16,TTYBIT ;LISTING TO TTY? PUSHJ %17,LIST1 ;YES, DUMP THE LINE SOSG LINCNT TRO %16,HDRBIT POPJ %17, LSTDMP: SOSG LSTCNT ;DECREMENT ITEM COUNT PUSHJ %17,LIST1 ;EMPTY ENTIRE BUFFER IDPB %02,LSTPNT ;STORE THE CHARACTER POPJ %17, ;EXIT LIST1: OUTPUT LST, ;EMPTY A BUFFER LSTTST: STATO LST,IODATA!IODEV!IOWRLK ;CHECK FOR ERRORS POPJ %17, ;NO, EXIT MOVEI %10,[ASCIZ /LISTING OUTPUT ERROR/] JRST ERROR ;TYPE MESSAGE ERR2CR: PUSHJ %17,ERRCR ERRCR: TDZA %02,%02 ERRSP: MOVEI %02," " ERROUT: HRLM %02,0(%17) ;SAVE VIRGIN CHARACTER TLNN %15,LPTFLG ;SKIP LISTING OF SOURCE IF CONTINUATION PUSHJ %17,LSTOUT ;TRY THE LISTING FILE TLNE %16,NSWBIT!TTYBIT ;CHAR TO TTY ALSO? POPJ %17, ;NO, JUST EXIT HLRZ %02,0(%17) ;YES, RESTORE CHARACTER JRST TTYOUT ;TYPE AND EXIT HEADER: PUSHJ %17,ACEXCH ;YES, SAVE THE ACCUMULATORS PUSH %17,%16 ;SAVE CURRENT FLAGS TLO %16,NSWBIT ;DON'T OUTPUT TO TTY MOVEI %02,15 PUSHJ %17,LSTDMP MOVEI %02,14 ;GET A FORM FEED PUSHJ %17,LSTDMP ;OUTPUT IT MOVEI %10,PAGSIZ+3 ;RESET LINE COUNTER REGISTER MOVEM %10,LINCNT ;... PUSHJ %17,LSTTAB MOVE %00,TITLE PUSHJ %17,LSTSIX PUSHJ %17,LSTTAB MOVE %00,SUBTTL ;PRINT VERSION NO. PUSHJ %17,LSTSIX PUSHJ %17,LSTTAB ;THE FOLLOWING SECTION PRINTS THE DATE, WHICH IS FOUND IN ;REGISTER XDATE IN THE FORM ; ((Y-1964)*12 + (M-1))*31 + (D-1) MOVE %10,DATE ;GET THE DATE IN %10 IDIVI %10,^D31 ;DIVIDE BY 31 DECIMIAL ADDI %11,1 PUSHJ %17,DNC ;OUTPUT DAY IDIVI %10,^D12 ;DIVIDE BY 12 DECIMAL MOVE %00,MONTH(%11) PUSHJ %17,LSTSIX ;OUTPUT THE MONTH, (M-1) IS IN %12 MOVEI %11,^D64(%10) ;GET THE YEAR PUSHJ %17,DNC ;TYPE IT PUSHJ %17,LSTTAB ;OUTPUT TAB ;THE FOLLOWING SECTION OF CODE PRINTS THE TIME, WHICH IS ;PICKED UP FROM THE MONITOR AS THE NUMBER OF MILLISECONDS ;SINCE MIDNIGHT. THE FORMAT OF THE TIME PRINTOUT IS HH:MM MOVE %11,MSTIME ;GET THE CURRENT TIME IDIVI %11,^D60*^D1000 ;NUMBER OF MIN. SINCE MIDNITE IDIVI %11,^D60 ;NUMBER OF HOURS PUSH %17,%12 ;SAVE MINUTES PUSHJ %17,DNC ;OUTPUT THE HOURS MOVEI %02,":" ;OUTPUT A COLON AFTER THE HOURS PUSHJ %17,LSTDMP ;OUTPUT IT POP %17,%11 ;PUT MINUTES IN OUTPUT AC MOVEI %02,"0" ;GET AN ASCII ZERO CAIG %11,^D9 ;IS IT A ONE-DIGIT NUMBER? PUSHJ %17,LSTDMP ;YES, OUTPUT A ZERO PUSHJ %17,DNC ;OUTPUT THE MINUTES ;THE FINAL SECTION OF CODING PICKS UP THE WORD "PAGE " AND ;STORES IT IN THE PROPER PLACE IN THE TITLE BUFFER. PUSHJ %17,LSTTAB MOVE %00,[SIXBIT /PAGE/] PUSHJ %17,LSTSIX ;PRINT "PAGE" MOVEI %02," " PUSHJ %17,LSTDMP ;SPACE MOVE %11,PAGNUM ;GET PAGE NUMBER PUSHJ %17,DNC ;CONVERT TO DECIMAL AND PRINT MOVEI %10,[ASCIZ //] ;ASSUME NO EXTENSION AOSE %11,PAGEXT ;INCREMENT, PICK UP, AND TEST MOVEI %10,[ASCIZ /-5/] PUSHJ %17,LSTMSG ;LIST IT PUSHJ %17,ERR2CR POP %17,%16 ;RESTORE FLAGS JRST ACEXCH ;RESTORE F4 REGS AND EXIT DNC: IDIVI %11,^D10 ;RECURSIVE SUBROUTINE HRLM %12,0(%17) ;SAVE REMAINDER ON PUSHDOWN LIST SKIPE %11 ;ALL DONE? PUSHJ %17,DNC ;NO, CALL DNC AGAIN HLRZ %02,0(%17) ;RETRIEVE NUMBER FROM PD LIST ADDI %02,"0" ;MAKE IT ASCII JRST ERROUT ;GET NEXT NUMBER OR EXIT LSTSIX: MOVSI %06,(POINT 6,%00,) LSTSI1: ILDB %02,%06 JUMPE %02,CPOPJ ADDI %02," " PUSHJ %17,ERROUT TLNE %06,770000 JRST LSTSI1 POPJ %17, MONTH: SIXBIT /-JAN-/ SIXBIT /-FEB-/ SIXBIT /-MAR-/ SIXBIT /-APR-/ SIXBIT /-MAY-/ SIXBIT /-JUN-/ SIXBIT /-JUL-/ SIXBIT /-AUG-/ SIXBIT /-SEP-/ SIXBIT /-OCT-/ SIXBIT /-NOV-/ SIXBIT /-DEC-/ TTYOUT: JUMPN %02,TTYDMP TTYCR: MOVEI %02,15 PUSHJ %17,TTYDMP MOVEI %02,12 TTYDMP: SOSG TTOCNT ;IS THE BUFFER EMPTY? OUTPUT TTO, ;YES, GO EMPTY IT IDPB %02,TTOPNT ;STORE THE CHARACTER CAIN %02,12 ;WAS IT A LINE FEED? OUTPUT TTO, ;YES, OUTPUT THE LINE POPJ %17, ;EXIT INISET: MOVE %03,[JRST ERRNA];ERROR EXIT FOR INIT MOVSI %04,(POPJ %17,) JRST %00 CHARB: MOVEM %14,SEQNUM ;SAVE SEQUENCE NUMBER AOS SRCPNT ;INCREMENT POINTER PAST WORD MOVNI %14,5 ;GET -5 ADDM %14,SRCCNT ;SUBTRACT 5 FROM WORD COUNT TRO %16,SEQBIT CHAR: SOSGE SRCCNT ;DECREMENT ITEM COUNT JRST CHAR4 ;GET ANOTHER BUFFER IF NECESSARY IBP SRCPNT ;INCREMENT THE BYTE POINTER MOVE %14,@SRCPNT ;PICK UP AN ENTIRE WORD FROM BUFFER TRZE %14,1 ;IS THE SEQUENCE NUMBER BIT ON? JRST CHARB ;YES, SKIP AROUND IT LDB %14,SRCPNT ;NO, PICK UP A GOOD CHARACTER JUMPE %14,CHAR ;GET ANOTHER IF NULL CAIE %14,FF ;FORM FEED? JRST CPOPJ1 ; NO, EXIT AOS PAGNUM ;YES, INCREMENT PAGE SETOM PAGEXT ;INITIALIZE EXTENSION TRO %16,HDRBIT!FFBIT JRST CPOPJ1 CHAR4: INPUT SRC, ;CALL MONITIOR FOR A BUFFER STATZ SRC, IODATA+IODEV+IOBKTL+IOWRLK JRST ERRID ;INPUT TRANSMISSION ERROR STATO SRC, IOEOF ;WAS AN END OF FILE REACHED? JRST CHAR ;GET NEXT CHAR CLOSE SRC, TRNE %16,ENDBIT ;CRR SEEN BY COMMAND SCANNER? POPJ %17, PUSHJ %17,ACEXCH ;GET EXEC AC'S PUSHJ %17,GETSRC ;GET THE NEXT SOURCE FILE TRO %16,HDRBIT ;START NEW FILE PUSHJ %17,ACEXCH ;SAVE EXEC AC'S AND RETURN JRST CHAR ;ROUTINES TO SAVE AND RESTORE THE COMPILER ACCUMULATORS ACEXCH: ;SWAP AC'S TRC %16,MODBIT ;TOGGLE MODE BIT EXCH %00,AC00 EXCH %01,AC01 EXCH %02,AC02 EXCH %03,AC03 EXCH %04,AC04 EXCH %05,AC05 EXCH %06,AC06 EXCH %07,AC07 EXCH %10,AC10 EXCH %11,AC11 EXCH %12,AC12 EXCH %13,AC13 EXCH %14,AC14 POPJ %17, ;ROUTINE TO OUTPUT RELOCATABLE BINARY BINOUT: ;BINARY OUTPUT ANDI %02,377 ;MASK TO 8 BITS TLNN %16,ESWBIT ;EXPANDED LISTING (OCTAL) REQUESTED? JRST BINOU2 ; NO PUSH %17,%03 ; YES, STACK WORKING REGISTERS PUSH %17,%02 MOVSI %03,(POINT 3,0(%17),26) ;POINT TO STACKED CODE BINOU1: ILDB %02,%03 ;GET THE NEXT BYTE ADDI %02,"0" ;CONVERT TO ASCII PUSHJ %17,LSTOUT ;LIST IT TLNE %03,770000 ;END? JRST BINOU1 ; NO PUSHJ %17,LSTCR ;YES, LIST CR/LF POP %17,%02 ;RESTORE REGISTERS POP %17,%03 BINOU2: TLNE %16,BINBIT ;BINARY REQUESTED? POPJ %17, ; NO, EXIT SOSG BINCNT PUSHJ %17,BINDMP IDPB %02,BINPNT POPJ %17, BINDMP: OUTPUT BIN, BINTST: STATO BIN,IODATA!IODEV!IOWRLK POPJ %17, MOVEI %10,[ASCIZ /BINARY OUTPUT ERROR/] JRST ERROR ;TYPE ERROR MESSAGE SUBTTL EXEC ERROR ROUTINES ERRCF: MOVEI %10,[ASCIZ /CANNOT FIND 234/] JRST ERROR ERRID: MOVEI %10,[ASCIZ /INPUT DATA ERROR 234/] JRST ERROR ERRBS: MOVEI %10,[ASCIZ /1 IS A BAD SWITCH/] JRST ERROR ERRIC: MOVEI %10,[ASCIZ /1 IS AN ILLEGAL CHARACTER/] JRST ERROR ERRNA: MOVEI %10,[ASCIZ /2 IS NOT AVAILABLE/] JRST ERROR ERRNR: MOVEI %10,[ASCIZ /NO ROOM FOR 234/] JRST ERROR ERRSE: MOVEI %10,[ASCIZ /SYNTAX ERROR IN COMMAND STRING/] JRST ERROR ERRNC: MOVEI %10,[ASCIZ /INSUFFICIENT CORE/] JRST ERROR ERRWF: MOVEI %10,[ASCIZ /1 ILLEGAL SWITCH FOR INPUT/] JRST ERROR ERRTF: MOVEI %10,[ASCIZ /TOO MANY INPUT FILES/] JRST ERROR ERRTB: MOVEI %10,[ASCIZ /2 ILLEGAL FOR BINARY OUTPUT/] JRST ERROR ERROR: ;NON-RECOVERABLE ERROR MESSAGE PUSH %17,%10 ;STACK MESSAGE ADDRESS TRNE %16,MODBIT ;HAVE WE EXEC AC'S? PUSHJ %17,ACEXCH ; NO, GET THEM POP %17,%10 ;RESTORE MESSAGE POINTER MOVE %16,[XWD LSTBIT!BINBIT,ENDBIT] PUSHJ %17,ERRCR MOVEI %02,"?" PUSHJ %17,ERROUT PUSHJ %17,ERRSP ;TYPE SPACE PUSHJ %17,LSTMSG PUSHJ %17,ERR2CR JRST EXIT LSTMSG: TLOA %10,(POINT 7,,) ;SET BYTE POINTER AND SKIP LSTMS4: PUSHJ %17,ERROUT ;TYPE CHARACTER LSTMS5: ILDB %02,%10 ;GET CHARACTER JUMPE %02,CPOPJ ;TEST FOR END CAIL %02,"1" ;TEST FOR SWITCH CAILE %02,"5" JRST LSTMS4 ;NO, TYPE THE CHARACTER PUSHJ %17,@[EXP ERR1,ERR2,ERR3,ERR4,DNC]-"1"(%02) JRST LSTMS5 ;GET NEXT CHARACTER ERR1: MOVE %02,%05 ;GET IMPROPER CHARACTER JRST TTYDMP ;DUMP IT ERR2: MOVE %00,%01 ;GET DEVICE NAME PUSHJ %17,LSTSIX ;TYPE IT MOVEI %02,":" JRST TTYDMP ;TYPE ":" ERR3: MOVE %00,XE ;GET FILE NAME JRST LSTSIX ;TYPE IT ERR4: HLLZ %00,XE1 ;GET EXTENSION JUMPE %00,CPOPJ ;EXIT IF NULL MOVEI %02,"." PUSHJ %17,TTYDMP ;TYPE "." JRST LSTSIX EXIT: CLOSE SRC, ;CLOSE THE SOURCE DEVICE CLOSE LST, ;CLOSE THE LISTING FILE CLOSE BIN, ;CLOSE THE BINARY FILE TLON %16,LSTBIT ;WAS THERE A LISTING FILE? PUSHJ %17,LSTTST ;YES, TEST FOR FINAL ERROR TLON %16,BINBIT ;IS THERE A BINARY FILE? PUSHJ %17,BINTST ;YES, TEST FOR FINAL ERROR TRNN %16,ENDBIT ;END OF COMMAND STRING? JRST ERRTF ; NO, MARK ERROR CLOSE TTO, ;BE SURE MESSAGES ARE COMPLETE JRST PALX11 ;GET A NEW COMMAND STRING SUBTTL ASSEMBLER PROPER ; THESE ARE THE LISTING ERROR FLAGS. ERRA= 400000 ERRB= 200000 ERRD= 100000 ERRE= 040000 ERRI= 020000 ERRL= 010000 ERRM= 004000 ERRO= 002000 ERRP= 001000 ERRQ= 000400 ERRR= 000200 ERRT= 000100 ERRU= 000040 ERRN= 000020 ERRP1= 000001 LBLSYM= 001000 ;LABEL MDLSYM= 002000 ;MULTIPLY DEFINED LABEL FLAG REGSYM= 004000 ;REGISTER UNDSYM= 010000 ;UNDEFINED SYMBOL FLAG ASSEMB: ;ASSEMBLER PROPER TLO %15,P1F ;SET FOR PASS 1 TLNE %16,TTYBIT ;TELETYPE? TLC %15,TTYFLG ; YES, TOGGLE BIT FOR LISTING PUSHJ %17,INIPAS ;INITIALIZE PASS ONE PUSHJ %17,LINE ;GO DO PASS ONE. TLZ %15,P1F ;RESET TO PASS 2 PUSHJ %17,SETP2 ;RESET INPUT COMMAND STRING PUSHJ %17,INIPAS PUSHJ %17,BLKINI ;INITIALIZE BINARY BLOCK PUSHJ %17,LINE ;CALL THE ASSEMBLER (PASS TWO) TLNN %16,LSTBIT!MSWBIT!RSWBIT ;LISTING? PUSHJ %17,SYMTB ; YES, OUTPUT THE SYMBOL TABLE POPJ %17, INIPAS: SETZB %05,SEQNUM ;CLEAR LOCATION COUNTER SETZB %04,%12 MOVEI %00,1 MOVEM %00,PAGNUM ;INITIALIZE PAGE NUMBER SETOM PAGEXT ; AND EXTENSION TLZ %15,SRCFLG!LINFLG!RSWFLG POPJ %17, LINE: ;PROCESS ONE LINE PUSHJ %17,GETLIN ;GET A SOURCE LINE PUSHJ %17,STMNT ;PROCESS ONE STATEMENT TLZN %15,ENDFLG ;TEST FOR END STATEMENT JRST LINE ;GET THE NEXT LINE POPJ %17, ;END OF PASS GETLIN: ;GET THE NEXT SOURCE LINE MOVEI %06,CPL ;TEST FOR OVERFLOW SKIPA %13,LINPNT ;SET POINTER GETLI1: TRO %15,ERRL ;LINE OVERFLOW GETLI2: JUMPN %12,GETLI4 ;BRANCH IF READING FROM MACRO TREE PUSHJ %17,CHAR ;GET AN INPUT CHARACTER TDO %15,[XWD ENDFLG,ERRE] ;END OF FILE, NO END STATEMENT GETLI3: LDB %02,C7PNTR ;SET INDEX XCT GLTBL(%02) SOJL %06,GETLI1 ;DON'T STORE IF TOO MANY IDPB %14,%13 ;STORE IN BUFFER JUMPN %14,GETLI2 ;RECYCLE IF NOT END MOVE %13,LINPNT ;SET FOR READ JRST GETNB ;RETURN WITH FIRST NON-BLANK GETLI4: PUSHJ %17,READMC ;GET A CHARACTER FROM THE TREE JRST GETLI2 ; NOTHING WORTHWHILE, TRY AGAIN JRST GETLI3 ;OK, PROCESS GETLI5: TRO %15,ERRI ;ILLEGAL CHARACTER MOVEI %14,RUBOUT ;REPLACE WITH RUBOUT POPJ %17, GLTBL: ;GET LINE TABLE PHASE 0 PUSHJ %17,GETLI5 ;ILLEGAL QJNU: JRST GETLI2 ;NULL QJCR: TDZA %14,%14 ;CARRIAGE RETURN QJSP: JFCL QJPC: JFCL DEPHASE LINPNT: POINT 7,LINBUF, ;POINTER TO START OF LINE TYPPNT: POINT 9,%01,17 ;OP TYPE POINTER ENDLR: ;SUPPRESS IF /R TLO %15,RSWFLG ;SET LOCAL FLAG ENDL: ;END OF LINE PROCESSOR TLNE %15,P1F JRST ENDLF ;BYPASS IF PASS 1 LDB %02,C1PNTR ;MAP CHARACTER XCT ENDLT1(%02) ;EXECUTE TABLE JRST .-2 ;CYCLE IF BLANK TLNE %16,RSWBIT ;TEST FOR REPRODUCTION OF SOURCE LINE TLNE %15,RSWFLG JRST ENDLF ; NO MOVEI %02,FF TRZE %16,FFBIT ;FORM FEED SEEN? PUSHJ %17,LSTSRC ; YES, LIST ONE SKIPA %03,LINPNT ;SET TO LIST SOURCE PUSHJ %17,LSTSRC ;LIST A CHARACTER ILDB %02,%03 ;GET THE NEXT CHARACTER JUMPN %02,.-2 ;BRANCH IF NOT CR PUSHJ %17,LSTSRC ;CR, LIST IT ENDLF: ;ENDL FIN HLRZ %02,%04 ;GET TYPE XCT ENDLT2(%02) ;EVEN LOCATION TEST TRO %15,ERRB ;FAILED TRZN %15,ERRP1 ;PASS 1 ERROR? TLNN %15,P1F ; NO, ARE WE IN PASS2? CAIA ; YES, LIST THIS LINE JRST ENDL11 ;PASS 1, NO ERRORS, DON'T LIST MOVEI %01,LSTOUT TLNE %15,LINFLG ;LINE-SUPPRESS IN EFFECT? MOVEI %01,CPOPJ ; YES, CAUSE A NOP MOVEI %02,CRFLIN TLNN %16,CSWBIT ;SHOULD WE MARK? PUSHJ %17,0(%01) ; YES TRNN %15,-1 ;ANY ERRORS? JRST ENDL6 ; NO AOS ERRCNT ; YES, TALLY ERROR COUNT MOVE %00,XE ;GET FILE NAME TLNN %16,NSWBIT CAMN %00,XESAVE JRST ENDL4 JUMPE %00,ENDL4 MOVEM %00,XESAVE MOVSI %01,(POINT 6,%00,) ENDL2: ILDB %02,%01 JUMPE %02,ENDL3 ADDI %02,40 PUSHJ %17,TTYOUT TLNE %01,770000 JRST ENDL2 ENDL3: MOVEI %02,":" PUSHJ %17,TTYOUT PUSHJ %17,TTYCR ENDL4: HRLZ %00,%15 ;PUT FLAGS IN AC0 LEFT MOVE %01,[POINT 7,[ASCII /ABDEILMOPQRTUN/],] ENDL5: ILDB %02,%01 ;FETCH CHARACTER JUMPGE %00,.+3 ;THIS CHARACTER PUSHJ %17,ERROUT ; YES AOS ESPCNT ;MARK FOR LISTING LSH %00,1 JUMPN %00,ENDL5 ;TEST FOR END MOVEI %01,ERROUT ;END, SET TO ERROR-LIST ENDL6: MOVE %02,LINPNT ;TEST FOR NO MORE LISTING ILDB %02,%02 TDO %02,%04 TDO %02,SEQNUM JUMPE %02,ENDL10 ;BRANCH IF NOTHING TO LIST PUSHJ %17,PRNTA ;LIST THE OCTAL TRNN %15,-1 ;ANY ERRORS? JRST ENDL6A ; NO, BRANCH TLZE %15,SRCFLG ;YES, LIST SOURCE. HOW ABOUT LPT? TLO %15,LPTFLG ; NO, TELETYPE ONLY ENDL6A: TLNE %15,SRCFLG ;SHOULD WE BYPASS SOURCE? JRST ENDL10 ; YES TRNN %16,SEQBIT ;ANY SEQUENCE NUMBERS ENCOUNTERED? JRST ENDL8 ; NO PUSHJ %17,LOTAB ;OUTPUT A TAB MOVE %00,[POINT 7,SEQNUM,] ENDL7: ILDB %02,%00 ;GET A CHARACTER JUMPE %02,ENDL8 ;BYPASS IF NULL PUSHJ %17,0(%01) ;OUTPUT THE NUMBER TLNE %00,760000 ;END OF WORD? JRST ENDL7 ; NO, TRY FOR MORE ENDL8: PUSHJ %17,LOTAB SKIPA %03,LINPNT ;GET SET TO PRINT LINE ENDL9: PUSHJ %17,0(%01) ;LIST A CHARACTER ILDB %02,%03 ;GET ANOTHER CHARACTER CAIN %02,RUBOUT ;RUBOUT? MOVEI %02,"?" ; YES, REPLACE WITH QM JUMPN %02,ENDL9 ;TEST FOR END ENDL10: TLZ %15,LPTFLG ;BE SURE TO LIST CR ON LPT SETZB %02,SEQNUM PUSHJ %17,0(%01) ;END,LIST CR/LF PUSHJ %17,PRNTB ;LIST EXTENSION LINE, IF ANY ENDL11: HLRZ %02,%04 ;GET TYPE XCT ENDLT3(%02) ;UPDATE LOCATION COUNTER ANDI %05,177777 SETZB %04,CEXT1 ;ZERO ARGUMENT SETZM CEXT2 ; AND EXTENSIONS SETZM ESPCNT ;CLEAR ERROR FLAG COUNT TRZ %15,-1 TLZ %15,SRCFLG!LINFLG!RSWFLG!LPTFLG POPJ %17, ENDLT1: PHASE 0 TROA %15,ERRQ ; ILLEGAL TERMINATION OF LINE MASP: PUSHJ %17,GETCHR ; BLANK, GET NEXT CHARACTER MACM: TROA %15,ERRQ MASC: CAIA MACR: CAIA DEPHASE ENDLT2: PHASE 0 CAIA CL1: CAIA ; ASSIGNMENT CL2: CAIA ; .= CL3: TRNE %05,1 ; XXXXXX CL4: CAIA ; XXX CL5: CAIA ; .END CL6: TRNE %05,1 ; XXXXXX XXXXXX CL7: TRNE %05,1 ; XXXXXX XXXXXX XXXXXX DEPHASE ENDLT3: PHASE 0 JFCL CL1: JFCL ; ASSIGNMENT CL2: MOVEI %05,0(%04) ; .= CL3: PUSHJ %17,DUMP ; XXXXXX CL4: PUSHJ %17,DUMP ; XXX CL5: PUSHJ %17,DUMP ; .END CL6: PUSHJ %17,DUMP ; XXXXXX XXXXXX CL7: PUSHJ %17,DUMP ; XXXXXX XXXXXX XXXXXX DEPHASE STMNT: ;STATEMENT PROCESSOR SETZM OFFSET ;CLEAR ADDRESS OFFSET PUSHJ %17,GETSYM ;TRY FOR SYMBOL JRST STMNT2 ; NO CAIN %14,":" ;LABEL? JRST LABEL ; YES CAIN %14,"=" ;ASSIGNMENT? JRST ASGMT ; YES PUSHJ %17,MSRCH ;TEST FOR MACRO CAIA JRST CALLM ;YES TRZ %15,ERRD ;CLEAR ANY D ERROR RESULTING ; FROM MACRO SEARCH. PUSHJ %17,OSRCH ;NO, TRY OP TABLE JRST STMNT2 ;TREAT AS EXPRESSION LDB %02,TYPPNT ;FOUND, GET TYPE XCT STMNJT(%02) ;EXECUTE TABLE PUSH %17,%01 ;OP, STACK BASIC VALUE JRST 0(%10) ;BRANCH TO PROPER ROUTINE STMNJT: ;STATEMENT JUMP TABLE PHASE 0 0 ;SHOULD NEVER HAPPEN PSOP: JRST 0(%01) ;PSEUDO-OP, GO TO ROUTINE BGOP: MOVEI %10,PBGOP ;BASIC GROUP OPOP: MOVEI %10,POPOP ;OPERATE GROUP SCOP: MOVEI %10,PSCOP ;SUBROUTINE CALL UNOP: MOVEI %10,PUNOP ;UNARY OP SHOP: MOVEI %10,PUNOP ;SHIFT OP BCOP: MOVEI %10,PBCOP ;BRANCH ON CONDITION OP TROP: MOVEI %10,PTROP ;TRAP OP RTOP: MOVEI %10,PRTOP ;RETURN JUMP MAOP: JRST CALLM DEPHASE STMNT2: MOVE %13,SYMBEG ;NON-OP SYMBOL, RESET CHAR POINTER PUSHJ %17,SETCHR ;SET CURRENT CHAR CAIE %14,"." ;LOC TYPE STATEMENT? JRST STMNT4 ; NO PUSHJ %17,GETNB ;POSSIBLY, GET NEXT NON-BLANK CAIE %14,"=" JRST STMNT3 ; NO PUSHJ %17,GETCHR ;YES, BYPASS CHAR PUSHJ %17,EXPRF ;EVALUATE THE EXPRESSION TRO %15,ERRU ; ERROR, NULL TRNE %15,-1 ;ANY ERRORS? TRO %15,ERRP1 ; YES, LIST ON PASS 1 LDB %04,[POINT 16,%10,35] ;GET VALUE HRLI %04,CL2 ;SET CLASS JRST ENDL ;LIST AND EXIT STMNT3: MOVE %13,SYMBEG PUSHJ %17,SETCHR ;RESET CHARACTER STMNT4: PUSHJ %17,EXPRF ;GET AN EXPRESSION SKIPA ; NO SOAP JRST WORDF ; YES, EXIT THROUGH "WORD" CAIN %14,"," ;IS THERE A COMMA? JRST WORDD ;YES, PROCESS A WORD OF ZERO. TLNN %15,ENDFLG ;END OF EOF SEEN? JRST ENDL ;NO-EXIT NULL JRST END2 ;YES-FORCE AN END LABEL: ;LABEL PROCESSOR PUSHJ %17,SSRCH ;SEARCH USER TABLE JRST LABEL1 ;NOT FOUND TRZ %15,ERRD ;CLEAR POSSIBLE D ERROR. TLNN %01,REGSYM ;REGISTER ALREADY? JRST LABEL2 ; NO TRO %15,ERRR ; YES - SET R TLO %01,MDLSYM ; AND MULTIPLE DEF LABEL2: TLNN %15,P1F ;WHICH PASS? JRST LABEL3 ; NOT 1 ;PASS1 - IS IT A LABEL OR TLNE %01,LBLSYM!MDLSYM; MULT DEFINED? LABEL5: JRST LABEL8 ; YES - ERROR LABEL4: HRR %01,%05 ;GET CURRENT VALUE TLO %01,LBLSYM ;SET LABEL FLAG. TLZ %01,UNDSYM ;MAKE IT DEFINED. PUSHJ %17,INSRT ;INSERT IT. LABEL7: PUSHJ %17,GETCHR ;BYPASS ":" JRST STMNT ;EXIT. LABEL1: SETZ %01, ;CLEAR VAL AND FLAGS. TLNE %15,P1F ;PASS? JRST LABEL4 ; PASS1. LABEL6: TRO %15,ERRP ; PASS2 - PHASE ERROR. DON'T ENTER IT. JRST LABEL7 ; GET OUT LABEL3: TLNN %01,LBLSYM ;ALREADY A LABEL JRST LABEL6 ; NO - ERROR TLNE %01,MDLSYM ;IS IT MULTIPLY DEFINED? JRST LABEL5 ; YES - ERROR CAIE %05,0(%01) ;OUT OF PHASE? JRST LABEL6 ; YES, ERROR JRST LABEL7 ; NO, EXIT LABEL8: TRO %15,ERRM ;M ERROR TLO %01,MDLSYM ;MULT DEFINED. JRST LABEL4+1 ASGMT: ;ASSIGNMENT PROCESSOR PUSH %17,%00 ;STACK SYMBOL PUSHJ %17,GETCHR ;BYPASS "=" PUSHJ %17,EXPR ; EVAL EXPRESSION. TRO %15,ERRU!ERRQ ;ERROR IF NULL. LDB %04,[POINT 16,%10,35] ;GET EXPRESSION VALUE. HRLI %04,CL1 ;SET CLASS. POP %17,%00 ;GET SYMBOL PUSHJ %17,SSRCH ;SEARCH USER TABLE. SETZ %01, ;NOT THERE. VALUE IS 0. TLNN %15,REGFLG ; REGISTER? JRST ASGMT1 ; NO TLNN %01,LBLSYM ; LABEL? JRST ASGMT1 ; NO TLO %01,MDLSYM ; SET MUL DEF. TRO %15,ERRR ; SET R ERROR. ASGMT1: TLNN %01,MDLSYM ;MUL DEF? JRST ASGMT2 ; NO TRO %15,ERRM ; YES - SET M TLZ %01,UNDSYM ; AND MAKE IT DEFINED ASGMT4: PUSHJ %17,INSRT ;INSERT IT AND JRST ENDL ; EXIT. ASGMT2: TLNE %15,REGFLG ;REGISTER EXPRESSION? TLOA %01,REGSYM ;YES--FLAG AND TEST MAGNITUDE. TLZA %01,REGSYM ;NO--RESET AND SKIP TEST. CAIG %10,7 ;YES--OUT OF RANGE? JRST ASGMT3 ;NO. TRO %15,ERRR ;YES--R ERROR AND SETZ %10, ;CLEAR VALUE ASGMT3: TRNE %15,ERRU ;ANY UNDEFINED ERRORS? TLOA %01,UNDSYM ;YES, SET FLAG TLZ %01,UNDSYM ;NO-SET DEFINED HRR %01,%10 ;GET FAVLUE JRST ASGMT4 ;GO INSERT IT. PBGOP: ;PROCESS BASIC GROUP OPS PUSHJ %17,AEXP ;GET FIRST ARGUMENT LSH %00,6 ;ADJUST SOURCE ORM %00,0(%17) ;MERGE INTO BASIC SKIPE CEXT1 ;SKIP IF REGISTER TYPE AOS OFFSET ;FLAG SECOND FIELD PRADDR: CAIE %14,"," ;COMMA? TROA %15,ERRQ ; NO, FLAG ERROR AND SKIP PUSHJ %17,GETCHR ; YES, BYPASS PUNOP: ;PROCESS UNARY OP PUSHJ %17,AEXP ;GET SECOND ARGUMENT ORM %00,0(%17) ;MERGE INTO BASIC CODE POPOP: ;PROCESS OPERATE OP OPXIT: POP %17,%04 ;SET VALUE HRLI %04,CL3 ;ASSUME 1 WORD SKIPN CEXT1 ;TRUE? JRST ENDL ; YES, LIST AND EXIT HRLI %04,CL6 ;NO, ASSUME TWO SKIPE CEXT2 ;TRUE? HRLI %04,CL7 ;NO, SET FOR THREE JRST ENDL ;LIST AND EXIT PSCOP: ;PROCESS SUBROUTINE CALL OP PUSHJ %17,REGEXP ;PROCESS REGISTER EXPRESSION LSH %10,6 ;MOVE INTO PLACE ORM %10,0(%17) ;MERGE WITH BASIC JRST PRADDR ;PROCESS ADDRESS FIELD PTROP: ;PROCESS TRAP/EMT OPS PUSHJ %17,EXPRF ;GET EXPRESSION SETZ %10, ;NULL RETURN. ASSUME ZERO. TRZE %10,777400 ;VALUE TOO BIG? TRO %15,ERRA ;YES-SET ERROR. ORM %10,0(%17) ;MERGE WITH BASIC VALUE. JRST OPXIT ;EXIT THEM OP EXIT. PBCOP: ;PROCESS BRANCH ON CONDITION PUSHJ %17,EXPRF ;EVALUATE EXPRESSION JRST PBCOP2 ; NULL, ERROR SUBI %10,2(%05) ;COMPUTE E-.-2 ROT %10,-1 ;/2, ODD BIT TO SIGN TRNE %10,040000 ;WAS IT NEG? TRO %10,100000 ; YES-PROPOGATE SIGN. TRNE %10,000200 ;NEGATIVE? TRC %10,177400 ; YES, TOGGLE HIGH BITS TRNN %10,177400 ;ANY OVERFLOW? JUMPGE %10,PBCOP1 ; NO, BRANCH IF EVEN PBCOP2: MOVNI %10,1 ; YES, SET TO JMP . TRO %15,ERRA ;FLAG ERROR PBCOP1: ANDI %10,377 ;MASK ORM %10,0(%17) ;MERGE WITH BASIC JRST OPXIT ;EXIT THROUGH OP EXIT PRTOP: ;PROCESS RETURN JUMP PRTOP1: PUSHJ %17,REGEXP ;GET A REGISTER EXPRESSION ORM %10,0(%17) ;MERGE INTO BASIC JRST OPXIT ;EXIT SUBTTL EXPRESSION HANDLERS AEXP: ;"A" EXPRESSION EVALUATOR PUSH %17,[0] ;STACK INITIAL VALUE AEXP01: PUSHJ %17,SETNB ;GET A NON-BLANK CAIN %14,"#" JRST AEXP02 CAIN %14,"%" JRST AEXP04 CAIN %14,"(" JRST AEXP06 CAIN %14,"-" JRST AEXP07 CAIN %14,"@" JRST AEXP08 JRST AEXP10 ;NO UNARIES, PROCESS BASIC EXPRESSION AEXP02: ; # PUSHJ %17,GETCHR ;BYPASS UNARY OP PUSHJ %17,EXPRF ;EVALUATE EXPRESSION TRO %15,ERRQ ; NULL, ERROR POP %17,%00 ;RETRIEVE PRESET VALUE AEXP03: TRO %00,27 ;SET BITS MOVE %02,OFFSET ;GET OFFSET HRROM %10,CEXT(%02) ;STORE ADDRESS POPJ %17, ;EXIT AEXP04: ; % PUSHJ %17,REGEXP ;EVALUATE REG EXPRESSION POP %17,%00 ;RETRIEVE CODE AEXP05: CAILE %10,7 ;ANY OVERFLOW? TROA %15,ERRR ; YES, FLAG ERROR AND SKIP TRO %00,00(%10) ;SET BITS POPJ %17, ;EXIT AEXP06: ; ( PUSHJ %17,AEXP20 ;EVALUATE PARENTHESES SETZ %01, ;ZERO IN CASE OF INDEX CAIE %14,"+" ;FINAL "+" SEEN? JRST AEXP13 ; NO, GO SEE IF (R) OR @(R)? POP %17,%00 ;YES, RETRIEVE CODE TRO %00,20(%10) ;SET BITS JRST GETNB ;BYPASS DELIMITER AND EXIT AEXP13: POP %17,%00 ;GET CODE TRON %00,10 ;IS "@" SET? JRST AEXP05 ;NO-REGISTER MODE PUSH %17,%00 ;YES-INDEX MODE JRST AEXP12 AEXP07: ; -( MOVEM %13,SYMBEG ;SAVE POINTER IN CASE OF FAILURE PUSHJ %17,GETNB ;GET THE NEXT NON-BLANK CAIE %14,"(" ;PARENTHESIS? JRST AEXP09 ; NO, TREAT AS EXPRESSION PUSHJ %17,AEXP20 ;YES, EVALUATE POP %17,%00 ;RETRIEVE CODE TRO %00,40(%10) ;SET BITS POPJ %17, ;EXIT AEXP08: ; @ POP %17,%00 ;RETRIEVE BASIC CODE TROE %00,10 ;SET INDIRECT BIT, WAS IT BEFORE? TRO %15,ERRQ ; YES, FLAG ERROR PUSH %17,%00 ;RE-STACK CODE PUSHJ %17,GETCHR ;BYPASS CHARACTER JRST AEXP01 ;GO BACK TO BEGINNING AEXP09: ; -( FAILURE MOVE %13,SYMBEG ;GET POINTER TO "-" PUSHJ %17,SETCHR ;RESTORE CHARACTER AEXP10: ; NO UNARIES PUSHJ %17,EXPR ;EVALUATE EXPRESSION TRO %15,ERRQ ; NULL, ERROR CAIN %14,"(" ;ANOTHER EXPRESSION? JRST AEXP11 ; YES, BRANCH POP %17,%00 ;RETRIEVE CODE TLNE %15,REGFLG ;REGISTER EXPRESSION? JRST AEXP05 ; YES, TREAT AS % TRO %00,67 ;SET BITS FOR INDEXED BY PC. SUBI %10,0(%05) ;DECREMENT BY CLC HRROI %01,-4(%10) ;ASSUME FIRST ADDRESS FIELD SKIPE %02,OFFSET ;TRUE? HRROI %01,-6(%10) ; NO, TREAT AS SECOND FIELD MOVEM %01,CEXT(%02) ;SET VALUE POPJ %17, ;EXIT AEXP11: ; E1(E2) TLNE %15,REGFLG ;REGISTER EXPRESSION? TRO %15,ERRR ; YES, ERROR PUSH %17,%10 ;STACK E1 PUSHJ %17,AEXP20 ;PROCESS EXPRESSION POP %17,%01 ;RETRIEVE E1 AEXP12: MOVE %02,OFFSET HRROM %01,CEXT(%02) ;STORE ADDRESS POP %17,%00 ;RETRIEVE CODE BITS TRO %00,60(%10) ;COMPLETE CODE POPJ %17, ;EXIT AEXP20: ;() PUSHJ %17,GETCHR ;BYPASS PAREN PUSHJ %17,REGEXP ;EVALUATE REGISTER EXPRESSION CAIE %14,")" ;PROPER DELIMITER TROA %15,ERRQ ; NO, FLAG ERROR AND SKIP PUSHJ %17,GETCHR ; YES, BYPASS CHARACTER JRST SETNB ;RETURN WITH NON-BLANK DELIMITER REGEXP: ;EVALUATE REGISTER EXPRESSION PUSHJ %17,EXPR ;EVALUATE EXPRESSION TRO %15,ERRR ; NULL, ERROR CAIG %10,7 ;ARE WE WITHIN BOUNDS? POPJ %17, ; YES, EXIT TRO %15,ERRR ;NO, FLAG ERROR SETZ %10, ;SET VALUE TO ZERO POPJ %17, ;EXIT EXPR: ;EXPRESSION PROCESSOR, REGISTER ALLOWED TLOA %15,ROKFLG ;ALLOW REGISTER TYPE SYMBOLS EXPRF: ;EXPRESSION FIN, NO REGISTERS ALLOWED TLZ %15,ROKFLG ;PRECLUDE REGISTER TLZ %15,REGFLG ;RESET ACTUAL FLAG PUSHJ %17,EXPRT ;GET THE FIRST TERM POPJ %17, ; NULL, EXIT EXPRF1: LDB %02,C4PNTR ;MAP CHARACTER USING COLUMN 4 EXPRF2: XCT EXPRJT(%02) ;EXECUTE TABLE PUSHJ %17,GETNB ;GET THE NEXT NON-BLANK LDB %02,C4PNTR ;MAP JUMPE %02,EXPRF3 ;BRANCH IF NOT OPERATOR TRO %15,ERRQ ;OPERATOR, FLAG ERROR JRST EXPRF2 ;USE LAST OP EXPRF3: PUSH %17,%01 ;STACK INSTRUCTION PUSH %17,%10 ;STACK CURRENT VALUE PUSHJ %17,EXPRT ;GET THE NEXT EXPRESSION TERM TRO %15,ERRQ ; NULL, FLAG ERROR POP %17,%00 ;GET PREVIOUS VALUE POP %17,%01 ; AND OPERATOR XCT %01 ;EXECUTE INSTRUCTION LDB %10,[POINT 16,%00,35] ;RETURN TRIMMED RESULT IN %10 JRST EXPRF1 ;RECYCLE EXPRJT: ;EXPRESSION JUMP TABLE PHASE 0 JRST CPOPJ1 ; NOT AN OP, EXIT +1 EXPL: MOVSI %01,(ADDI %00,0(%10)) ; + EXMI: MOVSI %01,(SUBI %00,0(%10)) ; - EXOR: MOVSI %01,(IORI %00,0(%10)) ; ! EXAN: MOVSI %01,(ANDI %00,0(%10)) ; & DEPHASE EXPRT: ;EXPRESSION TERM PROCESSOR PUSHJ %17,TERM ;TRY FOR A NORMAL TERM POPJ %17, ; NOT FOUND, NORMAL EXIT JRST CPOPJ1 ; NUMERIC, SKIP-EXIT AOS 0(%17) ;SYMBOLIC, SET SKIP-EXIT PUSHJ %17,SSRCH ;SEARCH THE SYMBOL TABLE JRST EXPRT1 ; NOT FOUND TLNE %01,UNDSYM ;UNDEFINED? TRO %15,ERRU ; YES, FLAG ERROR LDB %10,[POINT 16,%01,35] ;TRIMMED VALUE TO %10 TLNE %01,REGSYM ;REGISTER SYMBOL? JRST ROKTST ; YES, EXIT THROUGH "OK" TEST POPJ %17, ;EXIT EXPRT1: PUSHJ %17,OSRCH ;PERHAPS AN OP JRST EXPRT2 ; NO LDB %02,TYPPNT ;YES, GET TYPE XCT EXPRTT(%02) ;DISPATCH ON TABLE LDB %10,[POINT 16,%01,35] ;OK, GET VALUE POPJ %17, ;EXIT EXPRT2: MOVSI %01,UNDSYM ;NOT IN SYMBOL TABLE, FLAG AS UNDEFINED TRO %15,ERRU ;FLAG FOR LISTING JRST INSRT ;INSERT IN TABLE AND EXIT EXPRTT: ;EXPRESSION TERM TABLE PHASE 0 0 ;SHOULD NEVER HAPPEN PSOP: JRST EXPRT2 ;PSEUDO-OPS ARE ILLEGAL BGOP: JFCL ;BASIC GROUP OPOP: JFCL ;OPERATE GROUP SCOP: JFCL UNOP: JFCL ;UNARY OP SHOP: JFCL ;SHIFT OP BCOP: JFCL ;BRANCH ON CONDITION OP TROP: JFCL ;TRAP OP RTOP: JFCL MAOP: JRST EXPRT2 DEPHASE ;PUSHJ %17,TERM ; NULL ; NUMERIC ; SYMBOLIC TERM: ;TERM PROCESSOR SETZB %10,%01 ;RETURN VALUE IN %10 SETZ %11, ;DECIMAL NUMBER ACCUM. TLZ %15,DECFLG ;NO DECIMAL NUM. PUSHJ %17,GETSYM ;TRY FOR SYMBOL JRST TERM1 ; NOT A SYMBOL AOS 0(%17) ;SYMBOL, SET DOUBLE-SKIP EXIT AOS 0(%17) POPJ %17, TERM1: CAIE %14,"+" ;IF UNARY PLUS CAIN %14,"-" ; OR UNARY MINUS, JRST NUMXIT ; EXIT NUMERIC CAIE %14,"&" ;IF LEADING .AND. CAIN %14,"!" ; OR INCLUSIVE .OR., JRST NUMXIT ; EXIT NUMERIC. CAIN %14,"." ;CURRENT LOCATION? JRST TERMPE ; YES CAIN %14,"'" ;QUOTE? JRST TERMQ ; YES CAIN %14,"""" ;DOUBLE QUOTE? JRST TERMDQ ; YES CAIN %14,"%" ;REGISTER EXPRESSION? JRST TERM3 ; YES CAIL %14,"0" ;IF NOT BETWEEN 0 CAIL %14,"0"+RADIX+2 ; AND 9 POPJ %17, ; EXIT NULL TERM2: CAIL %14,"0"+RADIX ;IS CHAR DECIMAL? TLO %15,DECFLG ;YES-SET FLAG. IMULI %10,RADIX ;ACCUMULATE OCTAL ADDI %10,-"0"(%14) ;ADD IN ABSOLUTE VALUE IMULI %11,RADIX+2 ;ACCUMULATE ADDI %11,-"0"(%14) ;DECIMAL PUSHJ %17,GETCHR ;GET NEXT CHARACTER CAIL %14,"0" ;IS IT IN CAIL %14,"0"+RADIX+2 ; RANGE? JRST NUMXA ;NO, TEST FOR END OF NUM. JRST TERM2 ;DO IT AGAIN. NUMXA: CAIE %14,"." ;IS CHAR A "."? JRST NUMXB ;NO, GO SEE IF DECIMAL. PUSHJ %17,GETCHR ;YES, GET PAST CHAR. JRST NUMXC ; TREAT AS DECIMAL NUMXB: TLZN %15,DECFLG ;8 OR 9 SEEN? JRST NUMXIT ; NO, EXIT. TRO %15,ERRN ;SET N ERROR NUMXC: MOVE %10,%11 ;GET DECIMAL NUMBER. TLZ %15,DECFLG ;CLEAR DEC FLAG. JRST NUMXIT TERM3: PUSHJ %17,GETNB ;BYPASS UNARY % PUSHJ %17,EXPRT ;EVALUATE TERM TRO %15,ERRR ; NULL, ERROR PUSHJ %17,ROKTST ;TEST MAGNITUDE NUMXIT: TDZE %10,[-1B19] ;MASK TO 16 BITS, ANY OVERFLOW? TRO %15,ERRT ; YES,FLAG IT AOS 0(%17) ;SET FOR SKIP-EXIT JRST SETNB ;RETURN NON-BLANK ROKTST: ;REGISTER "OK" TEST TLNN %15,ROKFLG ;REGISTER ALLOWED? TRO %15,ERRR ; NO, FLAG ERROR TLO %15,REGFLG ;SET FLAG POPJ %17, ;EXIT TERMPE: ;"." MOVE %10,%05 ;GET CURRENT LOCATION COUNTER PUSHJ %17,GETCHR ;MOVE PAST CHARACTER JRST NUMXIT ;EXIT NUMERIC TERMDQ: ; """ PUSHJ %17,GETCHR ;GET THE NEXT CHARACTER MOVE %10,%14 ;MOVE TO EXPRESSION AC CAIE %10,0 ;ERROR IF CR PUSHJ %17,GETCHR ;GET THE NEXT CHAR LSH %14,8 ;MOVE OVER ONE CAIA ;SKIP AND FALL THROUGH TERMQ: ;"'" PUSHJ %17,GETCHR ;GET THE NEXT CHARACTER TRO %10,0(%14) ;MERGE/PLACE CHARACTER IN 10 CAIN %10,0 ;PERCHANCE CARRIAGE RETURN? TROA %15,ERRQ ; YES, FLAG ERROR AND SKIP PUSHJ %17,GETCHR ; NO, BYPASS JRST NUMXIT ;EXIT NUMERIC SUBTTL SYMBOL/CHARACTER HANDLERS GETSYM: ;GET A SYMBOL MOVSI %03,(POINT 6,%00,) ;SET POINTER TDZA %00,%00 ;CLEAR AC AND SKIP GETSY1: PUSHJ %17,GETCHR ;GET NEXT CHARACTER MOVEM %13,SYMBEG ;SAVE START IN CASE OF FAIL LDB %02,ANPNTR ;MAP CHARACTER TYPE XCT GETSY3(%02) ;EXECUTE TABLE GETSY2: SUBI %14,40 ;VALID, CONVERT TO SIXBIT CAME %03,[POINT 6,%00,] ;ARE WE FULL? IDPB %14,%03 ; NO, STORE CHARACTER GETSY5: PUSHJ %17,GETCHR ;GET THE NEXT INPUT CHARACTER LDB %02,ANPNTR ;MAPE CHARACTER TYPE XCT GETSY4(%02) ;EXECUTE TABLE CAME %00,[SIXBIT /./];FINISHED, WAS IT A DOT? JRST CPOPJ1 ; NO, VALID. EXIT +1 MOVE %13,SYMBEG ; YES, RESET CHARACTER POINTER PUSHJ %17,SETCHR ; AND CHARACTER SETZ %00, ;CLEAR AC POPJ %17, ;EXIT NULL GETSY6: TRO %15,ERRI ;SET I ERROR JRST GETSY5 ;GET NEXT CHAR GETSY3: ;FIRST CHARACTER TABLE PHASE 0 POPJ %17, ;NOTHING CHARACTER, EXIT NULL .TAB: JRST GETSY1 ;SPACE OR TAB, BYPASS .ALP: JFCL ;ALPHA, FALL THROUGH .NUM: POPJ %17, ;NUMERIC, EXIT NULL .DOT: JFCL ;DOT, FALL THROUGH, TEST LATER .TRM: POPJ %17, ;TERMINATOR, EXIT NULL DEPHASE GETSY4: ;SUCCEEDING CHARACTERS PHASE 0 JRST GETSY6 ;NOTHING CHAR, SET I AND IGNORE .TAB: PUSHJ %17,GETNB ;SPACE OR TAB, BYPASS AND FALL THROUGH .ALP: JRST GETSY2 ;ALPHA, RECYCLE .NUM: JRST GETSY2 ;NUMERIC, DITTO .DOT: JRST GETSY2 ;DOT, DITTO .TRM: JFCL ;TERMINATOR, FALL THROUGH DEPHASE GETNB: ;GET NON-BLANK CHARACTER IBP %13 ;INDEX BYTE POINTER SETNB: ;SET TO NON-BLANK CHARACTER PUSHJ %17,SETCHR ;SET CHARACTER IN %14 CAIE %14,SPACE ;IF SPACE CAIN %14,TAB ; OR TAB; JRST GETNB ; BYPASS POPJ %17, ;OTHERWISE EXIT GETCHR: ;GET THE NEXT CHARACTER IBP %13 ;INDEX BYTE POINTER SETCHR: ;SET THE CURRENT CHAR IN %14 LDB %14,%13 ;PICK IT UP CAIN %14,RUBOUT ;RUBOUT (ILLEGAL CHAR)? JRST GETCHR ; YES, BYPASS POPJ %17, ;NO, EXIT SUBTTL PSEUDO-OPS END: ;"END" PSEUDO-OP TLO %15,ENDFLG ;FLAG "END SEEN" PUSHJ %17,EXPRF ;EVALUATE THE ADDRESS END2: MOVEI %10,1 ; NULL, FORCE ODD VECTOR MOVEM %10,CEXT1 ;STORE VECTOR MOVEI %04,6 ;SET INSTRUCTION (DUMMY. USED AS BYTE CT.) END1: HRLI %04,CL5 ;FLAG AS .END JRST ENDL ;LIST AND EXIT OPCERR: ;ILLEGAL OP CODE TRO %15,ERRO JRST ENDL ;FLAG ERROR, LIST, AND EXIT EVEN: ;"EVEN" PSEUDO OP MOVEI %10,2 MOVE %04,%05 ;GET CURRENT ADDRESS TRZE %04,-1(%10) ;CLEAR LOW BITS, ANY THERE? ADDI %04,0(%10) ; YES, INCREMENT HRLI %04,CL2 ;SET CLASS JRST ENDL ;LIST AND EXIT ASC: ;"ASC" PSEUDO-OP PUSHJ %17,SETNB ;GET FIRST NON-BLANK PUSH %17,%14 ;STACK TERMINATOR JUMPE %14,ASC3 ;ERROR IF CR ASC1: PUSHJ %17,GETCHR ;GET NEXT CHARACTER JUMPE %14,ASC3 ;ERROR IF CARRIAGE RETURN CAMN %14,0(%17) ;TERMINATOR? JRST ASC4 ; YES MOVEI %04,0(%14) ;PLACE IN AC4 HRLI %04,CL4 ;SET CLASS PUSHJ %17,ENDLF ;PRINT AND DUMP IT TLO %15,SRCFLG JRST ASC1 ;RECYCLE ASC3: TROA %15,ERRQ ;ERROR, FLAG AND SKIP ASC4: PUSHJ %17,GETCHR ;NORMAL TERMINATION, BYPASS TERMINATOR POP %17,%00 ;FLUSH TERMINATOR FROM STACK JRST ENDL ;EXIT BYT: ;"BYT" PSEUDO-OP PUSHJ %17,EXPRF ;EVALUATE EXPRESSION SETZ %10, ;NULL, ASSUME 0 TDCN %10,[177400] ;OVERFLOW? JRST .+3 ; NO. ;HIGH BITS ARE NOW COMPLEMENTED. TDZE %10,[-1B27] ;MASK TO 8 BITS. ;ANY OVERFLOW TRO %15,ERRT ;YES, FLAG IT LDB %04,[POINT 8,%10,35] ;SET CODE HRLI %04,CL4 ;SET CLASS CAIE %14,"," ;ANY MORE JRST ENDL ; NO, EXIT PUSHJ %17,ENDLF ;YES, DUMP THIS ITEM TLO %15,SRCFLG PUSHJ %17,GETCHR ;BYPASS COMMA JRST BYT ;GET ANOTHER ITEM WORD: ;"WORD" PSEUDO-OP PUSHJ %17,EXPRF ;EVALUATE EXPRESSION WORDD: SETZ %10, ; NULL, ASSUME 0 WORDF: MOVE %04,%10 ;GET VALUE HRLI %04,CL3 ;SET CLASS CAIE %14,"," ;END OF STRING? JRST ENDL ; YES, LIST AND EXIT PUSHJ %17,ENDLF ;NO, LIST THIS WORD TLO %15,SRCFLG ;DON'T RE-LIST SOURCE PUSHJ %17,GETCHR ;BYPASS COMMA JRST WORD ;RE-CYCLE SUBTTL REPEAT HANDLER REPEA0: ;"REPEAT" PSEUDO-OP PUSHJ %17,EXPRF ;EVALUATE EXPRESSION TRO %15,ERRU!ERRP1 ;PASS 1 ERROR IF NULL LDB %04,[POINT 16,%10,35] HRLI %04,CL1 ;LIST VALUE TRNN %10,1B20 CAIN %10,0 ;IF LESS THAN OR EQUAL TO ZERO, JRST UNSCON ; JUST LIST CAIN %10,1 ;IF SINGLE, JRST SATCON ; JUS@ PROCESS PUSH %17,%10 ;STACK EXPRESSION PUSHJ %17,ENDLR ;LIST LINE PUSHJ %17,GETBLK ;MULTIPLE, SDT FOR STORAGE PUSH %17,MWPNTR ;SAVE STARTING BLOCK ADDRESS MOVEI %11,3 ADDM %11,MWPNTR ;POINT PAST POINTER STORAGE SETZ %07, ;ZERO LEVEL COUNT REPEA1: PUSHJ %17,GETLIN ;GET THE NEXT SOURCE LINE PUSHJ %17,GETSYM ;TEST THE FIRST SYMBOL JRST REPEA2 ; NON-SYMBOLIC CAMN %00,.REPTX AOJA %07,REPEA2 ; INCREMENT AND BRANCH CAMN %00,.ENDRX SOJL %07,REPEA3 ; DECREMENT AND BRANCH IF END REPEA2: SKIPA %13,LINPNT ;POINT TO START OF LINE PUSHJ %17,WCIMT ;WRITE CHAR IN MACRO TREE PUSHJ %17,GETCHR ;GET THE NEXT CHARACTER JUMPN %14,.-2 ;TEST FOR CR MOVEI %14,CRR PUSHJ %17,WCIMT ;WRITE CR SETZ %14, PUSHJ %17,ENDLR ;LIST THE LINE TLNN %15,ENDFLG ;SKIP IF EOF SEEN JRST REPEA1 ;TRY THE NEXT LINE REPEA3: PUSHJ %17,ENDLR ;TERMINATION, LIST LINE MOVEI %14,QUEREP ;END, SET TO CLOSE PUSHJ %17,WTIMT ;WRITE FLAG AND "REPEAT END" POP %17,%11 ;RETRIEVE STARTING POINTER MOVEI %10,-1(%11) ;SET FOR PUSH PUSH %10,%12 ;STORE READ POINTER PUSH %10,REPPNT ; REPEAT POINTER PUSH %10,REPEXP ; AND REPEAT EXPRESSION MOVEM %11,REPPNT ;SET NEW REPEAT POINTER POP %17,REPEXP ; AND REPEAT COUNT ; JRST REPEND REPEND: ;REPEAT END MOVE %12,REPPNT ;ASSUME ANOTHER ITERATION ADDI %12,3 ;POINT PAST POINTERS SOSL REPEXP ;END? POPJ %17, ; NO MOVE %01,REPPNT ; YES, GET SET TO CLEAN UP HRROI %10,2(%01) ;POINT TO TOP POINTER POP %10,REPEXP ;REPLACE STORED ITEMS POP %10,REPPNT POP %10,%12 PUSHJ %17,REMMAC ;GARBAGE COLLECT POPJ %17, ;EXIT SUBTTL REPEAT/CONDITIONAL ROUTINES SATCON: PUSHJ %17,ENDLR ;LIST THE LINE SATCO1: PUSHJ %17,GETLIN ;GET THE NEXT LINE PUSHJ %17,GETSYM ;CHECK THE FIRST SYMBOL TLNN %15,ENDFLG ; NON-SYMBOLIC, TEST FOR EOF CAMN %00,.ENDRX ;"ENDR"? JRST ENDLR ; YES, LIST AND EXIT MOVE %13,SYMBEG ;NO, RESTORE LINE PUSHJ %17,SETCHR ; AND CHARACTER PUSHJ %17,STMNT ;PROCESS IT JRST SATCO1 ;TRY AGAIN UNSCON: PUSHJ %17,ENDLR ;LIST THE LINE UNSCO1: PUSHJ %17,GETLIN ;GET THE NEXT LINE PUSHJ %17,GETSYM ;CHECK THE FIRST SYMBOL JRST UNSCO2 ; NON-SYMBOLIC, LIST CAMN %00,.ENDRX ;"ENDR"? JRST ENDLR ; YES, LIST AND EXIT CAME %00,.REPTX ;NESTED? JRST UNSCO2 ; NO PUSHJ %17,UNSCO2 ;YES, RECURSE JRST UNSCO1 ;BACK TO NORMAL UNSCO2: SETZ %14, TLNE %15,ENDFLG ;EOF SEEN? JRST ENDL ; YES, EXIT PUSHJ %17,ENDLR ;NO, LIST THE LINE JRST UNSCO1 ;TRY AGAIN SUBTTL MACRO HANDLERS DEFIN0: ;"DEFINE" PSEUDO-OP PUSHJ %17,GETSYM ;GET ITS NAME JRST DEFERR ; ERROR, EXIT PUSHJ %17,GETBLK ;OK, GET A BLOCK FROM STORAGE PUSHJ %17,MSRCH ;SEE IF ALREADY DEFINED SETZ %01, ; NOT IN TABLE LDB %02,TYPPNT ;GET OP TYPE CAIN %02,MAOP ;MACRO? PUSHJ %17,DECMAC ; YES, DECREMENT REFERENCE HRRZ %01,MWPNTR ;GET POINTER TO START OF BLOCK HRLI %01,MAOP ;FLAG MACRO PUSHJ %17,INSRT ;INSERT/DELETE IN SYMBOL TABLE PUSH %17,MWPNTR ;STACK POINTER TO START OF BLOCK MOVEI %01,2 ADDM %01,MWPNTR ;MOVE PAST REFERENCE LEVEL AND ARG COUNT TDZA %07,%07 ;INIT ARG COUNT DEF01: PUSHJ %17,GETCHR ;MOVE PAST COMMA PUSHJ %17,GETSYM ;GET AN ARG JRST DEF02 ; NOT THERE MOVEM %00,ARGLST(%07) ;STORE IN LIST ADDI %07,1 ;BUMP POINTER CAIN %14,"," ;ANY MORE? JRST DEF01 ; YES DEF02: PUSH %17,%07 ;STACK ARG COUNT SETZM ARGLST(%07) ;MARK END PUSHJ %17,ENDLR ;LIST THE LINE SETZ %07, ;INIT LEVEL COUNT DEF03: PUSHJ %17,GETLIN ;GET THE NEXT LINE PUSHJ %17,GETSYM ;TEST THE FIRST SYMBOL JRST DEF04 ;NON-SYMBOLIC CAMN %00,.MACRX AOJA %07,DEF04 ;INCREMENT CAMN %00,.ENDMX SOJL %07,DEF13 ;END IF MINUS DEF04: MOVE %13,LINPNT ;SET TO START OF LINE DEF05: PUSHJ %17,GETCHR ;GET THE NEXT CHARACTER DEF06: CAIE %14,"'" ;CONCATENATION CHARACTER? JRST DEF06C ; NO, BRANCH AROUND DEF06A: PUSHJ %17,GETCHR ;YES, GET THE NEXT CHARACTER CAIE %14,"'" ;MULTIPLE? JRST DEF06B ; NO PUSHJ %17,WCIMT ;YES, SAVE ONLY ONE JRST DEF06A ;TEST FOR MORE DEF06B: TLO %15,CONFLG ;FLAG THE CONCATENATION CHARACTER DEF06C: LDB %02,ANPNTR ;MAP XCT DEFT1(%02) ;EXECUTE TABLE PUSHJ %17,WCIMT ;WRITE IN TREE JRST DEF05 ;TRY FOR ANOTHER DEF07: SETZ %00, ;POSSIBLE ARGUMENT MOVSI %03,(POINT 6,%00,) MOVEM %13,SYMBEG ;SAVE START JUST IN CASE DEF08: SUBI %14,40 ;CONVERT TO SIXBIT CAME %03,[POINT 6,%00,] ;ROOM TO STORE? IDPB %14,%03 ; YES, DO SO PUSHJ %17,GETCHR ;GET THE NEXT CHARACTER LDB %02,ANPNTR ;MAP XCT DEFT2(%02) ;EXECUTE TABLE SETZ %02, ;INIT SEARCH INDEX DEF09: SKIPN ARGLST(%02) ;TEST FOR END JRST DEF10 ; YES CAME %00,ARGLST(%02) ;NO, HAVE WE A MATCH? AOJA %02,DEF09 ; NO,TRY THE NEXT SLOT TLZ %15,CONFLG ;REMOVE POSSIBLE CONCATENATION CHARACTER MOVEI %14,101(%02) ;SET DUMMY SYMBOL POINTER PUSHJ %17,WTIMT ;WRITE IN TREE PUSHJ %17,SETCHR ;SET CHARACTER CAIN %14,"'" ;CONCATENATION CHARACTER? JRST DEF05 ; YES, BYPASS IT JRST DEF06 ; NO, PROCESS IT DEF10: MOVE %13,SYMBEG ;MISSED, RESET POINTER PUSHJ %17,SETCHR ;RESET CHARACTER DEF11: LDB %02,ANPNTR ;MAP XCT DEFT3(%02) ;EXECUTE TABLE PUSHJ %17,WCIMT ;OK, WRITE IN TREE PUSHJ %17,GETCHR ;GET NEXT CHAR JRST DEF11 ;TEST IT DEF12: MOVEI %14,CRR ;END OF LINE, SET CR PUSHJ %17,WCIMT ;WRITE IT OUT SETZ %14, PUSHJ %17,ENDLR ;LIST IT TLNN %15,ENDFLG ;SKIP IF EOF SEEN JRST DEF03 ;GET THE NEXT LINE DEF13: MOVEI %14,QUEMAC ;FINISHED, SET "END OF MACRO DEFINITION" PUSHJ %17,WTIMT ;WRITE IT, WITH QUE, IN TREE POP %17,%02 ;RETRIEVE COUNT POP %17,%01 ; AND POINTER TO START OF BLOCK SETZM 0(%01) ;ZERO LEVEL COUNT HRRZM %02,1(%01) ;STORE ARG COUNT IN SECOND RUNG PUSHJ %17,SETCHR ;RESTORE LAST CHARACTER JRST ENDLR ;LIST AND EXIT DEFERR: TRO %15,ERRQ SETZ %14, JRST ENDLR DEFT1: PHASE 0 JUMPE %14,DEF12 .TAB: JFCL .ALP: JRST DEF07 .NUM: JRST DEF07 .DOT: JRST DEF07 .TRM: JUMPE %14,DEF12 DEPHASE DEFT2: PHASE 0 JFCL .TAB: JFCL .ALP: JRST DEF08 .NUM: JRST DEF08 .DOT: JRST DEF08 .TRM: JFCL DEPHASE DEFT3: PHASE 0 JRST DEF06 .TAB: JRST DEF06 .ALP: JFCL .NUM: JFCL .DOT: JFCL .TRM: JRST DEF06 DEPHASE CALLM: PUSH %17,%01 ;SAVE POINTER PUSHJ %17,INCMAC ;INCREMENT THE REFERENCE COUNT MOVE %07,1(%01) ;GET ARGUMENT COUNT PUSHJ %17,GETBLK ;GET A BLOCK FROM FREE STORAGE PUSH %17,MWPNTR ;SAVE THE STARTING ADDRESS MOVEI %00,5 ADDM %00,MWPNTR ;MOVE BYTE POINTER PAST WORD STORAGE MOVEI %14,QUEARG PUSHJ %17,WTIMT ;INITIALIZE ARGUMENT LIST JUMPE %07,MAC50 ;TEST FOR NO ARGS PUSHJ %17,SETCHR ;RESTORE LAST CHARACTER MAC10: LDB %02,C1PNTR ;MAP USING COLUMN 1 XCT CALMT1(%02) PUSHJ %17,GETCHR ;IGNORE LEADING BLANKS JRST MAC10 MAC20: CAIN %14,"^" ;FIRST CHAR, TEST UNARY OPS JRST MAC60 ; DELIMITED STRING CAIN %14,"\" JRST MAC70 ;EXPRESSION TO ASCII CONVERSION MAC21: PUSHJ %17,WCIMT ;NOTHING SPECIAL, WRITE IN TREE PUSHJ %17,GETCHR ;GET THE NEXT CHARACTER LDB %02,C1PNTR ;MAP XCT CALMT2(%02) MAC30: PUSHJ %17,GETCHR ;TEST ARG DELIMITER MAC31: LDB %02,C1PNTR ;MAP XCT CALMT3(%02) JRST MAC30 ;NON-DELIMITER, TRY THE NEXT ONE MAC40: ;COMMA PROCESSOR MOVEI %14,QUEARG PUSHJ %17,WTIMT ;MARK END OR ARGUMENT PUSHJ %17,GETCHR ;BYPASS COMMA SOJG %07,MAC10 ;BRANCH IF MORE ARGS MAC50: ;END OF LINE PROCESSOR MOVEI %14,QUEARG PUSHJ %17,WTIMT ;PAD MISSING ARGS SOJGE %07,.-1 POP %17,%10 ;GET CALL BLOCK POINTER MOVEM %12,0(%10) ;SAVE CURRENT READ POINTER MOVE %01,CALPNT MOVEM %01,1(%10) ;SAVE CURRENT CALL BLOCK POINTER MOVEM %10,CALPNT ;SET NEW POINTER POP %17,%12 ;GET POINTER TO BASIC BLOCK HRLI %12,(POINT 7,,) ;FORM A BYTE POINTER MOVEM %12,2(%10) ;SAVE IT FOR DECMAC MOVEM %14,3(%10) ;SAVE LAST CHARACTER READ ADDI %12,2 ;POINT PAST WORD STORAGE AOS MACLVL PUSHJ %17,SETCHR ;RESTORE LAST CHARACTER JRST ENDLR ;LIST AND EXIT MAC60: ;"^" PROCESSOR PUSHJ %17,GETCHR ;BYPASS UNARY OP LDB %02,C1PNTR ;MAP XCT CALMT4(%02) MOVE %00,%14 ;SAVE ARBITRARY DELIMITER MAC61: PUSHJ %17,GETCHR ;PROCESS BODY LDB %02,C1PNTR ;MAP XCT CALMT5(%02) CAMN %14,%00 ;TEST FOR DELIMITER JRST MAC30 ; YES, TEST FOR COMMA PUSHJ %17,WCIMT ;NO, WRITE CHARACTER IN TREE JRST MAC61 ;TRY ANOTHER MAC62: TRO %15,ERRQ ;CARRIAGE RETURN IN TEXT, ERROR JRST MAC50 MAC70: ;"\" PUSHJ %17,GETCHR ;BYPASS UNARY OP PUSH %17,%07 ;PROTECT ARG COUNT PUSHJ %17,EXPRF ;EVALUATE THE EXPRESSION TRO %15,ERRQ ; NULL, ERROR PUSHJ %17,MAC71 ;CONVERT TO ASCII POP %17,%07 ;RESTORE ARG COUNT PUSHJ %17,SETCHR ; AND LAST CHARACTER JRST MAC31 ;TEST FOR COMMA MAC71: IDIVI %10,RADIX HRLM %11,0(%17) SKIPE %10 ;TEST FOR END PUSHJ %17,MAC71 HLRZ %14,0(%17) ADDI %14,"0" ;FORM TEXT JRST WCIMT ;WRITE INTO SKELETON CALMT1: PHASE 0 JRST MAC20 MASP: JFCL ; SPACE OR TAB MACM: JRST MAC40 ; COMMA MASC: JRST MAC50 ; SEMI-COLON MACR: JRST MAC50 ; CARRIAGE RETURN DEPHASE CALMT2: PHASE 0 JRST MAC21 MASP: JFCL ; SPACE OR TAB MACM: JRST MAC40 ; COMMA MASC: JRST MAC50 ; SEMI-COLON MACR: JRST MAC50 ; CARRIAGE RETURN DEPHASE CALMT3: PHASE 0 TRO %15,ERRQ MASP: JFCL ; SPACE OR TAB MACM: JRST MAC40 ; COMMA MASC: JRST MAC50 ; SEMI-COLON MACR: JRST MAC50 ; CARRIAGE RETURN DEPHASE CALMT4: PHASE 0 JFCL MASP: TRO %15,ERRQ ; SPACE OR TAB MACM: JFCL ; COMMA MASC: JFCL ; SEMI-COLON MACR: JRST MAC62 ; CARRIAGE RETURN DEPHASE CALMT5: PHASE 0 JFCL MASP: JFCL ; SPACE OR TAB MACM: JFCL ; COMMA MASC: JFCL ; SEMI-COLON MACR: JRST MAC62 ; CARRIAGE RETURN DEPHASE MACEND: ;END OF MACRO CALL MOVE %10,CALPNT ;IN CASE WE GOT WIPED MOVE %12,0(%10) ;RESET PREVIOUS READ POINTER MOVE %01,1(%10) MOVEM %01,CALPNT ;LIKEWISE MOVE %01,2(%10) ;GET POINTER TO BASIC BLOCK PUSHJ %17,DECMAC ;DECREMENT THE REFERENCE MOVE %14,3(%10) ;RESTORE LAST CHARACTER MOVE %01,%10 PUSHJ %17,REMMAC ;RETURN THIS BLOCK FOR DEPOSIT SOS MACLVL ;DECREMENT MACRO LEVEL COUNT POPJ %17, ;FINIS SUBTTL MACRO STORAGE HANDLERS WTIMT: ;WRITE TWO CHARACTERS IN MACRO TREE PUSH %17,%14 ;STACK CURRENT CHARACTER MOVEI %14,RUBOUT ;SET FLAG CHARACTER PUSHJ %17,WCIMT ;WRITE IT POP %17,%14 ;RESTORE CHARCTER AND FALL THROUGH WCIMT: ;WRITE CHARACTER IN MACRO TREE TLZE %15,CONFLG ;CONCATENATION CHARACTER PENDING? JRST WCIMT2 ; YES, WRITE IT OUT IBP MWPNTR ;POINT TO ACTUAL WORD SKIPN @MWPNTR ;END OF BLOCK? JRST WCIMT1 ; YES, GET ANOTHER DPB %14,MWPNTR ;NO, STORE BYTE POPJ %17, ;EXIT WCIMT1: PUSH %17,MWPNTR ;NEAD A NEW BLOCK, SAVE CURRENT POINTER PUSHJ %17,GETBLK ;GET IT HRRZ %11,MWPNTR ;GET START OF NEW BLOCK EXCH %11,0(%17) ;EXCHANGE WITH POINTER TO LAST POP %17,0(%11) ;STORE VECTOR JRST WCIMT ;TRY AGAIN WCIMT2: PUSH %17,%14 ;STACK CURRENT CHARACTER MOVEI %14,"'" PUSHJ %17,WCIMT ;WRITE CONCATENATION CHARACTER POP %17,%14 ;RESTORE CHARACTER JRST WCIMT ;CONTINUE GETBLK: ;GET A BLOCK FOR MACRO STORAGE SKIPE %11,NEXT ;ANY REMNANTS OF GARBAGE COLLECTION? JRST GETBL1 ; YES, RE-USE PUSH %17,%07 ; NO, SAVE REGISTER MOVEI %07,WPB ADDB %07,MACTOP ;UPDATE FREE LOCATION POINTER CAML %07,SYMBOT ;ANY ROOM? PUSHJ %17,GETCOR ; NO, GET MORE CORE MOVEI %11,-(%07) ;POINT TO START OF BLOCK POP %17,%07 ;RESTORE SETZM WPB-1(%11) ;CLEAR VECTOR GETBL1: HRLI %11,(POINT 7,,) ;FORM BYTE POINTER MOVEM %11,MWPNTR ;SET NEW BYTE POINTER HRLI %11,- ;GET SET TO INITIALIZE BLOCK SETOM 0(%11) ;CLEAR ENTRY AOBJN %11,.-1 ;SET ALL EXCEPT LAST TO -1 PUSH %17,0(%11) ;GET TOP POP %17,NEXT ;SET FOR NEXT BLOCK SETZM 0(%11) ;CLEAR LAST WORD POPJ %17, ;EXIT READMC: ;READ MACRO CHARACTER PUSHJ %17,READMB ;GET A MACRO BYTE CAIE %14,RUBOUT ;SPECIAL? JRST CPOPJ1 ; NO, JUST EXIT PUSHJ %17,READMB ;YES, GET TYPE TRZE %14,100 ;SYMBOLIC? JRST GETDS ; YES JRST .(%14) ; NO, TRANSFER ON TYPE PHASE 1 QUEMAC: JRST MACEND ;END OF MACRO QUEARG: JRST DSEND ;END OF MACRO ARGUMENT QUEREP: JRST REPEND ;END OF REPEAT DEPHASE READMB: ;READ MACRO BYTE ILDB %14,%12 ;GET CHARACTER JUMPN %14,CPOPJ ;EXIT IF NON-NULL MOVE %12,0(%12) ;END OF BLOCK, GET LINK HRLI %12,(POINT 7,,) ;SET ASCII BYTE POINTER JRST READMB ;TRY AGAIN GETDS: ;GET DUMMY SYMBOL MOVE %11,CALPNT ;GET POINTER TO CALL BLOCK MOVEM %12,4(%11) ;SAVE CURRENT READ POINTER MOVE %12,%11 ;SET NEW READ POINTER ADDI %12,5 ;MOVE PAST WORDS MOVE %11,%14 ;GET ARG NUMBER ANDI %11,37 GETDS1: PUSH %17,%11 ;STACK WORKING REGISTER GETDS2: PUSHJ %17,READMB ;GET A MACRO BYTE CAIE %14,RUBOUT ;FLAGGED? JRST GETDS2 ; NO, TRY AGAIN PUSHJ %17,READMB ;YES, BYPASS END CODE POP %17,%11 ;RESTORE WORKING REGISTER SOJG %11,GETDS1 ;TEST FOR COMPLETION POPJ %17, ; YES, EXIT DSEND: ;DUMMY SYMBOL END MOVE %12,CALPNT ;GET POINTER TO CALL BLOCK MOVE %12,4(%12) ;RESTORE PREVIOUS READ POINTER POPJ %17, ;EXIT INCMAC: ;INCREMENT MACRO STORAGE AOS 0(%01) POPJ %17, DECMAC: ;DECREMENT MACRO STORAGE SOSL 0(%01) ;TEST FOR END POPJ %17, ; NO, EXIT REMMAC: ;REMOVE MACRO STORAGE PUSH %17,%01 ;SAVE POINTER HRLS %01 ;SAVE CURRENT POINTER HRR %01,WPB-1(%01) ;GET NEXT LINK TRNE %01,-1 ;TEST FOR END (NULL) JRST .-3 ; NO HLRZS %01 ;YES, GET RETURN POINTER HRL %01,NEXT ;GET CURRENT START OF CHAIN HLRM %01,WPB-1(%01) ;STORE AT TOP POP %17,%01 ;RESTORE BORROWED REGISTER HRRZM %01,NEXT ;SET NEW START POPJ %17, ;EXIT SUBTTL LISTING ROUTINES PRNTA: ;PRINT BASIC LINE OCTAL HLRZ %06,%04 ;GET CLASS TYPE TLNE %15,TTYFLG ;TELETYPE (DOUBLE LINE)? JRST PRNTA1 ; YES, BRANCH PUSHJ %17,LOTAB ;LIST A TAB HLRZ %03,PRNTAT(%06) ;TEST FOR LEFT HALF PUSHJ %17,0(%03) ;PROCESS PUSHJ %17,LOTAB ;OUTPUT TAB HRRZ %03,PRNTAT(%06) ;GET RIGHT HALF PUSHJ %17,0(%03) ;PROCESS PUSHJ %17,LOTAB HLRZ %03,PRNTBT(%06) ;GET NEXT ITEM SKIPE %03 ;SKIP IF NULL PUSHJ %17,0(%03) PUSHJ %17,LOTAB HRRZ %03,PRNTBT(%06) SKIPE %03 ;SKIP IF NULL PUSHJ %17,0(%03) ;PROCESS POPJ %17, ;EXIT PRNTA1: ;TELETYPE LINE 1 SOSGE ESPCNT ;LIST TWO SPACES (LESS ERROR FLAGS) PUSHJ %17,LOSP SOSGE ESPCNT PUSHJ %17,LOSP HLRZ %03,PRNTAT(%06) PUSHJ %17,PRNTA2 PUSHJ %17,LOSP HRRZ %03,PRNTAT(%06) PRNTA2: CAIE %03,CPOPJ JRST 0(%03) MOVEI %03,6 PUSHJ %17,LOSP ;OUTPUT 6 SPACES SOJG %03,.-1 POPJ %17, PRNTAT: PHASE 0 XWD CPOPJ, CPOPJ CL1: XWD CPOPJ, LOBAS ; ASSIGNMENT CL2: XWD CPOPJ, LOBAS ; .= CL3: XWD LOLOC, LOBAS ; XXXXXX CL4: XWD LOLOC, LOLOB ; XXX CL5: XWD CPOPJ, LOHOW ; .END CL6: XWD LOLOC, LOBAS ; XXXXXX XXXXXX CL7: XWD LOLOC, LOBAS ; XXXXXX XXXXXX XXXXXX DEPHASE PRNTB: ;PRINT EXTENSION LINE OCTAL HLRZ %06,%04 ;GET CLASS TLNE %15,TTYFLG ;IF NON-TELETYPE SKIPN PRNTBT(%06) ; OR NON-MULTIPLE WORD POPJ %17, ; EXIT MOVEI %03,5 ;SET FOR 5 SPACES PUSHJ %17,LOSP ;LIST THEM SOJG %03,.-1 HLRZ %03,PRNTBT(%06) ;GET OP PUSHJ %17,0(%03) ;LIST FIRST WORD HRRZ %03,PRNTBT(%06) ;GET RIGHT HALF JUMPE %03,PRNTB1 ;BRANCH IF NULL PUSHJ %17,LOSP ;LIST ANOTHER SPACE PUSHJ %17,0(%03) ;PROCESS CODE PRNTB1: MOVEI %02,0 JRST 0(%01) ;LIST CR AND EXIT PRNTBT: PHASE 0 0 CL1: 0 ; ASSIGNMENT CL2: 0 ; .= CL3: 0 ; XXXXXX CL4: 0 ; XXX CL5: 0 ; .END CL6: XWD LOHOW, 0 ; XXXXXX XXXXXX CL7: XWD LOHOW, LOLOW ; XXXXXX XXXXXX XXXXXX DEPHASE LOTAB: MOVEI %02,TAB JRST 0(%01) LOSP: MOVEI %02,SPACE JRST 0(%01) LOLOC: LDB %10,[POINT 16,%05,35] JRST PRNTWD ;PRINT LOCATION LOBAS: LDB %10,[POINT 16,%04,35] JRST PRNTWD ;PRINT BASIC LOHOW: LDB %10,[POINT 16,CEXT1,35] JRST PRNTWD ;PRINT HIGH ORDER WORD LOHOB: LDB %10,[POINT 8,CEXT1,35] JRST PRNTBY ;PRINT HIGH ORDER BYTE LOLOW: LDB %10,[POINT 16,CEXT2,35] JRST PRNTWD ;PRINT LOW ORDER WORD LOLOB: LDB %10,[POINT 8,%04,35] JRST PRNTBY ;PRINT LOW ORDER BYTE PRNTBY: ;PRINT BYTE MOVEI %02,SPACE PUSHJ %17,0(%01) ;LIST THREE SPACES PUSHJ %17,0(%01) PUSHJ %17,0(%01) SKIPA %03,[POINT 3,%10,26] PRNTWD: MOVE %03,[POINT 3,%10,17] ILDB %02,%03 ADDI %02,"0" ;CONVERT TO ASCII PUSHJ %17,0(%01) ;LIST TLNE %03,770000 JRST PRNTWD+1 POPJ %17, SUBTTL OCTAL OUTPUT ROUTINES DUMP: ;DUMP A WORD OF CODE TLNE %15,ENDFLG ;"END" STATEMENT SEEN? JRST DUMP2 ; YES, BRANCH HLRZ %06,%04 ;NO, GET OP TYPE XCT DMPTBL(%06) ;EXECUTE THE TABLE DUMP1: HLLZS %06 ;NORMAL, CODES FOUND IN %06, LEFT-JUSTIFIED JUMPE %06,CPOPJ ;EXIT ON NULL ROT %06,3 ;BRING NEXT BYTE INTO RIGHT HALF LDB %02,DUMPT(%06) ;GET THE PROPER BYTE PUSHJ %17,BYTOUT ;OUTPUT IT JRST DUMP1 ;TRY FOR MORE DUMP2: TLNE %15,P1F ;"END", PASS 1? POPJ %17, ; YES, EXIT PUSHJ %17,BLKDMP ;NO, DUMP CURRENT BUFFER MOVEI %02,01 MOVEM %02,CHKSUM ;INIT CHKSUM PUSHJ %17,BINOUT ;OUTPUT BLOCK FLAG SETZ %02, ;PUNCH A ZERO PUSHJ %17,BINOUT MOVSI %06,-4 ;SET TO DUMP CODE LDB %02,DUMPT+1(%06) ;GET BYTE ADDM %02,CHKSUM ;UPDATE CHKSUM PUSHJ %17,BINOUT ;OUTPUT IT AOBJN %06,.-3 ;TEST FOR END MOVN %02,CHKSUM ;GET -CHKSUM PUSHJ %17,BINOUT ; PUNCH IT. ZBINK ;KEEP THE OPERATOR HAPPY POPJ %17, ; YES, EXIT DUMPT: 0 ;NOT USED POINT 8,%04,35 POINT 8,%04,27 POINT 8,CEXT1,35 POINT 8,CEXT1,27 POINT 8,CEXT2,35 POINT 8,CEXT2,27 DMPTBL: ;DUMP TABLE PHASE 0 POPJ %17, ;EXIT IF CLASS 0 CL1: POPJ %17, CL2: POPJ %17, CL3: MOVSI %06,(BYTE (3) 1, 2 ) CL4: MOVSI %06,(BYTE (3) 1 ) CL5: POPJ %17, CL6: MOVSI %06,(BYTE (3) 1, 2, 3, 4 ) CL7: MOVSI %06,(BYTE (3) 1, 2, 3, 4, 5, 6) DEPHASE BYTOUT: ;OUTPUT A BYTE OF CODE TLNE %15,P1F ;PASS 1 AOJA %05,CPOPJ ; YES, JUST INCREMENT AND EXIT PUSH %17,%01 ;GET A WORKING REGISTER MOVE %01,BYTCNT ;GET THE BYTE COUNT CAIGE %01,DATLEN ;IS THE BUFFER FULL? CAME %05,CURADR ; OR WAS THERE A PROGRAM BREAK? PUSHJ %17,BLKDMP ; YES, DUMP IT AOS %01,BYTCNT ;INCREMENT AND FETCH THE BYTE COUNT MOVEM %02,DATBLK-1(%01) ;STORE CURRENT BYTE IN BUFFER POP %17,%01 ;RESTORE REGISTER AOS CURADR ;UPDATE CURRENT ADDRESS AOJA %05,CPOPJ ;INCREMENT CLC AND EXIT BLKDMP: ;DUMP THE CURRENT BLOCK SKIPN BYTCNT ;IS IT EMPTY? JRST BLKINI ; YES, INITIALIZE FOR GOOD MEASURE PUSH %17,%01 ;GET A COUPLE OF SCRATCH REGISTERS PUSH %17,%02 MOVEI %02,01 ;BLOCK TYPE ONE MOVEM %02,CHKSUM PUSHJ %17,BINOUT SETZ %02, ;OUTPUT A ZERO PUSHJ %17,BINOUT MOVEI %01,6 ;FUDGE BYTE COUNT ADDM %01,BYTCNT MOVSI %01,-4 ;SET COUNT LDB %02,BLKDMT(%01) ;GET PROPER BYTE ADDM %02,CHKSUM ;UPDATE CHECKSUM PUSHJ %17,BINOUT ;DUMP IT. AOBJN %01,.-3 ;COUNT. MOVNI %02,6 ;UNFUDGE ADD %02,BYTCNT ; BYTE CT. MOVNS %02 ;NEGATE BYTE CT HRLZ %01,%02 ;PUT INTO %01,LH. MOVE %02,DATBLK(%01) ;GET AN ITEM FROM THE DATA BLOCK ADDM %02,CHKSUM ;UPDATE CHECKSUM. PUSHJ %17,BINOUT ;DUMP IT AOBJN %01,.-3 ;RECYCLE IF NOT DONE MOVN %02,CHKSUM ;GET NEG OF CHECKSUM. PUSHJ %17,BINOUT ;DUMP IT SETZ %02, ;FINISHED WITH BLOCK MOVEI %01,^D6 PUSHJ %17,BINOUT ;DUMP SOME BLANK TAPE SOJG %01,.-1 POP %17,%02 ;RESTORE REGISTERS POP %17,%01 ;FALL THROUGH TO BLKINI BLKINI: ;CODE BLOCK INITIALIZATION MOVEM %05,LODADR ;SET STARTING ADDRESS MOVEM %05,CURADR ;SAVE CURRENT ADDRESS SETZM BYTCNT ;CLEAR BYTE COUNT SETZM CHKSUM ; AND CHECK-SUM POPJ %17, ;EXIT BLKDMT: ;BLOCK DUMP TABLE POINT 8,BYTCNT,35 POINT 8,BYTCNT,27 POINT 8,LODADR,35 POINT 8,LODADR,27 SUBTTL MEMORY MANAGEMENT PDPSET: ;INIT PDP AND DYNAMIC MEMORY POP %17,%03 ;SAVE RETURN ADDRESS MOVEI %00,PDPOVF HRRM %00,JOBAPR ;SET TRAP LOCATION MOVEI %00,1B19 ;SET FOR PUSH-DOWN OVERFLOW APRENB %00, ;INFORM THE MONITOR HRRZ %00,JOBFF MOVEM %00,MACTOP ;ESTABLISH START OF GARBAGE PIT HRRZ %17,JOBREL ;GET TOP OF CORE SKIPE JOBDDT ;DDT LOADED? HRRZ %17,JOBSYM ; YES, DON'T CLOBBER ITS SYMBOL TABLE SUBI %17,PDPLEN+10 ;COMPUTE BASE OF PDP PLUS SLOP AREA HRLI %17,-PDPLEN ;SET INITIAL COUNT HRRZM %17,SYMTOP MOVEI %02,-2(%17) ;GET POINTER TO BOTTOM OF TABLE HRRZM %02,SYMBOT ;STORE IT MOVSI %00,(1B0) MOVEM %00,@SYMBOT ;STORE LOWER BUMPER SETCAM %00,@SYMTOP ; AND UPPER BUMPER PUSH %17,%03 ;STACK RETURN ADDRESS JRST SRCHI ;INITIALIZE THE SYMBOL TABLE AND RETURN PDPOVF: ;PDP OVERFLOW TRAP LOCATION HRLI %17,-PDPINC ;PREVENT FUTHER TRAPS FOR A WHILE PUSH %17,%01 ;GET A COUPLE OF WORKING CELLS PUSH %17,%02 PDPOV1: MOVE %01,SYMBOT ;GET BASE OF SYMBOL TABLE SUBI %01,PDPINC ;GET ITS DESTINATION ADDRESS CAMLE %01,MACTOP ;HAVE WE ROOM? JRST PDPOV2 ; YES PUSHJ %17,GETCOR ;NO, GET MORE CORE JRST PDPOV1 ;RE-ESTABLISH REGISTERS PDPOV2: HRL %01,SYMBOT ;SET UP BLT MOVE %02,JOBREL ;MOVE ALL OF UPPER CORE SKIPE JOBDDT MOVE %02,JOBSYM ; UNLESS DDT IS LOADED BLT %01,-PDPINC(%02) SUBI %17,PDPINC ;ADJUST FOR NEW BASE MOVNI %01,PDPINC ;UPDATE POINTERS ADDM %01,SYMBOT ADDM %01,SYMPNT ADDM %01,VALPNT ADDM %01,SYMTOP POP %17,%02 ;RESTORE REGISTERS MOVEI %01,1B19 APRENB %01, ;RE-ENABLE FOR NEW MONITORS POP %17,%01 JRST 2,@JOBTPC ;RETURN TO NORMAL GETCOR: ;GET CORE PUSH %17,%00 ;GET A COULPLE OF WORKING REGISTERS PUSH %17,%01 HRRO %01,JOBREL ;GET TOP OF CURRENT CORE MOVEI %00,CORINC(%01) ;COMPUTE NEXT K CORE %00, ;MAKE A REQUEST JRST ERRNC ;FORGET IT! MOVEI %00,1(%01) SUB %00,SYMBOT ;COMPUTE NUMBER OF ITEMS TO BE MOVED POP %01,CORINC(%01) ;POP ITEM UP ONE K SOJG %00,.-1 ;TEST FOR COMPLETION ADDI %17,CORINC ;ALL MOVED, UPDATE PDP MOVEI %01,CORINC ;UPDATE POINTERS ADDM %01,SYMBOT ADDM %01,SYMPNT ADDM %01,VALPNT ADDM %01,SYMTOP ADDM %01,JOBSYM POP %17,%01 ;RESTORE REGISTERS POP %17,%00 POPJ %17, ;EXIT SUBTTL SYMBOL TABLE HANDLERS MSRCH: ;MACRO SEARCH PUSHJ %17,SRCH ;SEARCH BASIC TABLE POPJ %17, ; NOT FOUND, EXIT LDB %02,TYPPNT CAIE %02,MAOP ;MACRO? POPJ %17, ; NO PUSHJ %17,CRFOUT ;YES, CREF IT JRST CPOPJ1 ;EXIT +1 SSRCH: ;NORMAL SYMBOL PUSHJ %17,SRCH ;SEARCH BASIC TABLE POPJ %17, ; NOT FOUND, EXIT LDB %02,TYPPNT CAIE %02,0 ;NORMAL TYPE? POPJ %17, ; NO PUSHJ %17,CRFOUT ;YES, CREF IT JRST CPOPJ1 ;EXIT +1 SRCH: ;SYMBOL SEARCH MOVE %07,DELTA ;SET OFFSET FOR INDEX MOVE %06,%07 ASH %06,-1 ;SET INCREMENT SRCH1: CAMGE %00,@SYMPNT ;ARE WE LOOKING ABOVE SYMBOL? JRST SRCH2 ; YES, MOVE DOWN CAMG %00,@SYMPNT ;NO, POSSIBLY AT IT? JRST SRCH3 ; YES TDOA %07,%06 ; NO, INCREMENT INDEX SRCH2: SUB %07,%06 ;DECREMENT INDEX ASH %06,-1 ;DECREMENT DELTA CAMG %07,SYMLEN ;ARE WE OUT OF BOUNDS? JUMPN %06,SRCH1 ; NO, BRANCH IF NOT THROUGH JUMPN %06,SRCH2 ; YES, MOVE DOWN IF NOT THROUGH SOJA %07,CPOPJ ;NOT FOUND, SET INDEX AND EXIT NORMAL SRCH3: MOVE %01,@VALPNT ;FOUND, FETCH VALUE TLNE %01,MDLSYM ;MULTIPLE DEFINITION LABEL? TRO %15,ERRD ; YES, FLAG ERROR JRST CPOPJ1 ;EXIT +1 CRFOUT: ;OUTPUT WORD TO CREF TLNN %15,P1F ;IF PASS 1 TLNE %16,CSWBIT!LSTBIT ; OR NOT REQUESTED, POPJ %17, ; EXIT LDB %02,TYPPNT XCT CRFTBL(%02) ;GET PROPER FLAG PUSHJ %17,LSTDMP ;LIST CREF TYPE MOVSI %03,(POINT 6,%00,) CRFOU1: ILDB %02,%03 ;GET A SIXBIT CHARACTER JUMPE %02,CRFOU2 ;BRANCH IF END ADDI %02,40 ;CONVERT TO SIXBIT PUSHJ %17,LSTDMP ;LIST IT TLNE %03,770000 ;END OF WORD? JRST CRFOU1 ; NO, GET ANOTHER CRFOU2: MOVEI %02,CRFSYM JRST LSTDMP ;FLAG END AND EXIT CRFTBL: PHASE 0 MOVEI %02,CRFSYM PSOP: MOVEI %02,CRFOPC BGOP: MOVEI %02,CRFOPC ;BASIC GROUP OPOP: MOVEI %02,CRFOPC ;OPERATE GROUP SCOP: MOVEI %02,CRFOPC UNOP: MOVEI %02,CRFOPC ;UNARY OP SHOP: MOVEI %02,CRFOPC ;SHIFT OP BCOP: MOVEI %02,CRFOPC ;BRANCH ON CONDITION OP TROP: MOVEI %02,CRFOPC ;TRAP OP RTOP: MOVEI %02,CRFOPC MAOP: MOVEI %02,CRFMAC DEPHASE INSRT: ;INSERT ITEM IN SYMBOL TABLE CAMN %00,@SYMPNT ;IS IT HERE ALREADY? JRST INSRT1 ; YES MOVNI %06,2 ;NO, PREPARE TI INSERT ADDB %06,SYMBOT ;DECREMENT POINTER TO BOTTOM OF TABLE CAMG %06,MACTOP ;ARE WE INTRUDING ON THE MACROS? PUSHJ %17,GETCOR ; YES, GET MORE CORE MOVE %06,SYMBOT HRLI %06,2(%06) ;SET UP BLT BLT %06,@SYMPNT ;MOVE LOWER SYMBOLS DOWN PUSHJ %17,SRCHI ;RE-INITIALIZE THE POINTERS ADDI %07,2 ;COMPENSATE FOR SHIFT MOVEM %00,@SYMPNT ;STORE SYMBOL INSRT1: MOVEM %01,@VALPNT ;STORE VALUE JRST CRFOUT ;CREF AND EXIT REPEAT 0, < REMOVE: ;REMOVE A SYMBOL FROM THE TABLE HRROI %06,@SYMPNT ;GET POINTER TO THE ENTRY SUBI %06,2 ;SET TO NEXT ENTRY DOWN POP %06,2(%06) ;MOVE A RUNG UP SOJG %07,.-1 ;TEST FOR END MOVEI %06,2 ADDM %06,SYMBOT ;UPDATE BASE JRST SRCHI ;INITIALIZE FOR SEARCH AND EXIT > SRCHI: ;INITIALIZE FOR SEARCH PUSH %17,%01 ;STACK WORKING REGISTERS PUSH %17,%02 MOVE %01,SYMTOP ;GET THE TOP LOCATION SUB %01,SYMBOT ;COMPUTE THE DIFFERENCE MOVEM %01,SYMLEN ;SAVE IT MOVEI %02,1 ;SET LOW BIT LSH %02,1 ;SHIFT OVER ONE TDZ %01,%02 ;CLEAR CORRESPONDING ONE JUMPN %01,.-2 ;TEST FOR ALL BITS CLEARED MOVEM %02,DELTA ;END, SAVE LEADING BIT FOR SEARCH OFFSET MOVE %01,SYMBOT ;GET THE BASE HRRM %01,SYMPNT ;SET SYMBOL POINTER SUBI %01,1 HRRM %01,VALPNT ;SET VALUE POINTER POP %17,%02 ;RESTORE REGISTERS POP %17,%01 POPJ %17, ;EXIT SYMTB: ;LIST THE SYMBOL TABLE SETZ %07, ;INITIALIZE POINTER SYMTB1: TRO %16,HDRBIT ;FLAG NEW PAGE MOVEI %03,PAGSIZ-2 ;SET LINE COUNT SYMTB2: MOVEI %06,2(%07) CAML %06,SYMLEN ;END REACHED? POPJ %17, ; YES, EXIT MOVE %06,%07 ;SAVE CURRENT POINTER MOVEI %10,SPL ;SET "SYMBOLS PER LINE" TLNE %16,TTYBIT ;TTY? MOVEI %10,SPLTTY ; YES, REDUCE SETZ %05, SYMTB3: PUSHJ %17,GETSTE ;GET THE NEXT SYMBOL TABLE ENTRY JRST SYMTB4 ;FINIS SOJG %05,SYMTB3 ;TEST FOR ITEMS TO SKIP PUSHJ %17,LSTSTE ;LIST SYMBOL TABLE ENTRY MOVEI %05,PAGSIZ-2 SOJG %10,SYMTB3 ;TEST FOR MORE ITEMS ON LINE SYMTB4: PUSHJ %17,LSTCR ;END OF LINE, LIST CR/LF SOJLE %03,SYMTB1 ;BRANCH IF END OF PAGE MOVE %07,%06 ;RETRIEVE POINTER PUSHJ %17,GETSTE ;MOVE ONE PAST POPJ %17, ;END, EXIT JRST SYMTB2 ;OK, PROCESS ANOTHER GETSTE: ;GET SYMBOL TABLE ENTRY ADDI %07,2 ;MOVE UP TWO CAML %07,SYMLEN ;TEST FOR END POPJ %17, ; YES, EXIT LDB %02,[POINT 9,@VALPNT,17] ;GET SYMBOL TYPE JUMPN %02,GETSTE ;BYPASS IF OP JRST CPOPJ1 ;OK, PERFORM SKIP-RETURN LSTSTE: ;LIST SYMBOL TABLE ENTRY PUSHJ %17,LSTTAB ;LEAD OFF WITH TAB MOVE %01,[POINT 6,@SYMPNT,] ;SIXBIT POINTER TO SYMBOL LSTST1: ILDB %02,%01 ;GET A CHARACTER JUMPE %02,LSTST2 ;DON'T LIST TRAILING BLANKS ADDI %02,40 ;CONVERT TO ASCII PUSHJ %17,LSTOUT ;LIST CHARACTER TLNE %01,770000 ;ANY MORE CHARACTERS? JRST LSTST1 ; YES LSTST2: PUSHJ %17,LSTTAB MOVE %01,[POINT 3,@VALPNT,17] ;SET HEX POINTER LSTST3: ILDB %02,%01 ;GET OCTAL CHARACTER ADDI %02,"0" ;CONVERT TO ASCII PUSHJ %17,LSTOUT ;LIST IT TLNE %01,770000 ;ANY MORE BYTES? JRST LSTST3 ; YES MOVE %01,@VALPNT ;PICK UP VALUE POINTER MOVEI %02,"R" TLNE %01,REGSYM ;REGISTER SYMBOL? PUSHJ %17,LSTOUT ;YES, LIST IT MOVEI %02,"U" TLNE %01,UNDSYM ;UNDEFINED? PUSHJ %17,LSTOUT ;YES, LIST IT JRST LSTTAB ;OUTPUT A TAB AND EXIT OSRCH: ;OP TABLE SEARCH MOVEI %02,1B^L ;SET UP OFFSET AND DELTA MOVEI %06,1B^L/2 OSRCH1: CAMN %00,OPTBOT-2(%02) ;ARE WE LOOKING AT IT? JRST OSRCH3 ; YES CAML %00,OPTBOT-2(%02) ;TEST FOR DIRECTION OF NEXT MOVE TDOA %02,%06 ;ADD OSRCH2: SUB %02,%06 ;SUBTRACT ASH %06,-1 ;HALVE DELTA JUMPE %06,CPOPJ ;EXIT IF END CAILE %02,OPTTOP-OPTBOT ;YES, ARE WE OUTOF BOUNDS? JRST OSRCH2 ;YES, MOVE DOWN JRST OSRCH1 ;NO, TRY AGAIN OSRCH3: MOVE %01,OPTBOT-1(%02) ;FOUND, PLACE VALUE IN %02 PUSHJ %17,CRFOUT ;CREF IT JRST CPOPJ1 ;EXIT +1 SUBTTL PERMANENT SYMBOL TABLE OPTBOT: ;OP TABLE BOTTOM SIXBIT /ADC/ XWD UNOP, 005500 SIXBIT /ADCB/ XWD UNOP, 105500 SIXBIT /ADD/ XWD BGOP, 060000 SIXBIT /ASL/ XWD SHOP, 006300 SIXBIT /ASLB/ XWD SHOP, 106300 SIXBIT /ASR/ XWD SHOP, 006200 SIXBIT /ASRB/ XWD SHOP, 106200 SIXBIT /BCC/ XWD BCOP, 103000 SIXBIT /BCS/ XWD BCOP, 103400 SIXBIT /BEQ/ XWD BCOP, 001400 SIXBIT /BGE/ XWD BCOP, 002000 SIXBIT /BGT/ XWD BCOP, 003000 SIXBIT /BHI/ XWD BCOP, 101000 SIXBIT /BHIS/ XWD BCOP, 103000 SIXBIT /BIC/ XWD BGOP, 040000 SIXBIT /BICB/ XWD BGOP, 140000 SIXBIT /BIS/ XWD BGOP, 050000 SIXBIT /BISB/ XWD BGOP, 150000 SIXBIT /BIT/ XWD BGOP, 030000 SIXBIT /BITB/ XWD BGOP, 130000 SIXBIT /BLE/ XWD BCOP, 003400 SIXBIT /BLO/ XWD BCOP, 103400 SIXBIT /BLOS/ XWD BCOP, 101400 SIXBIT /BLT/ XWD BCOP, 002400 SIXBIT /BMI/ XWD BCOP, 100400 SIXBIT /BNE/ XWD BCOP, 001000 SIXBIT /BPL/ XWD BCOP, 100000 SIXBIT /BR/ XWD BCOP, 000400 SIXBIT /BVC/ XWD BCOP, 102000 SIXBIT /BVS/ XWD BCOP, 102400 SIXBIT /CCC/ XWD OPOP, 000257 SIXBIT /CLC/ XWD OPOP, 000241 SIXBIT /CLN/ XWD OPOP, 000250 SIXBIT /CLR/ XWD UNOP, 005000 SIXBIT /CLRB/ XWD UNOP, 105000 SIXBIT /CLV/ XWD OPOP, 000242 SIXBIT /CLZ/ XWD OPOP, 000244 SIXBIT /CMP/ XWD BGOP, 020000 SIXBIT /CMPB/ XWD BGOP, 120000 SIXBIT /CNZ/ XWD OPOP, 000254 SIXBIT /COM/ XWD UNOP, 005100 SIXBIT /COMB/ XWD UNOP, 105100 SIXBIT /DEC/ XWD UNOP, 005300 SIXBIT /DECB/ XWD UNOP, 105300 SIXBIT /EMT/ XWD TROP, 104000 SIXBIT /HALT/ XWD OPOP, 000000 SIXBIT /INC/ XWD UNOP, 005200 SIXBIT /INCB/ XWD UNOP, 105200 SIXBIT /IOT/ XWD OPOP, 000004 SIXBIT /JMP/ XWD UNOP, 000100 SIXBIT /JSR/ XWD SCOP, 004000 SIXBIT /MOV/ XWD BGOP, 010000 SIXBIT /MOVB/ XWD BGOP, 110000 SIXBIT /NEG/ XWD UNOP, 005400 SIXBIT /NEGB/ XWD UNOP, 105400 SIXBIT /RESET/ XWD OPOP, 000005 SIXBIT /ROL/ XWD SHOP, 006100 SIXBIT /ROLB/ XWD SHOP, 106100 SIXBIT /ROR/ XWD SHOP, 006000 SIXBIT /RORB/ XWD SHOP, 106000 SIXBIT /RTI/ XWD OPOP, 000002 SIXBIT /RTS/ XWD RTOP, 000200 SIXBIT /SBC/ XWD UNOP, 005600 SIXBIT /SBCB/ XWD UNOP, 105600 SIXBIT /SCC/ XWD OPOP, 000277 SIXBIT /SEC/ XWD OPOP, 000261 SIXBIT /SEN/ XWD OPOP, 000270 SIXBIT /SEV/ XWD OPOP, 000262 SIXBIT /SEZ/ XWD OPOP, 000264 SIXBIT /SUB/ XWD BGOP, 160000 SIXBIT /SWAB/ XWD UNOP, 000300 SIXBIT /TRAP/ XWD TROP, 104400 SIXBIT /TST/ XWD UNOP, 005700 SIXBIT /TSTB/ XWD UNOP, 105700 SIXBIT /WAIT/ XWD OPOP, 000001 SIXBIT /.ASCII/ XWD PSOP, ASC SIXBIT /.BYTE/ XWD PSOP, BYT SIXBIT /.END/ XWD PSOP, END .ENDMX: SIXBIT /.ENDM/ XWD PSOP, OPCERR .ENDRX: SIXBIT /.ENDR/ XWD PSOP, OPCERR SIXBIT /.EOT/ XWD PSOP, ENDL SIXBIT /.EVEN/ XWD PSOP, EVEN .MACRX: SIXBIT /.MACR/ XWD PSOP, DEFIN0 .REPTX: SIXBIT /.REPT/ XWD PSOP, REPEA0 SIXBIT /.WORD/ XWD PSOP, WORD OPTTOP: -1B36 ;OP TABLE TOP SUBTTL CHARACTER DISPATCH ROUTINES C1PNTR: POINT 4,CHJTBL(%14), 3 C2PNTR: POINT 4,CHJTBL(%14), 7 C3PNTR: POINT 4,CHJTBL(%14),11 C4PNTR: POINT 4,CHJTBL(%14),15 C5PNTR: POINT 4,CHJTBL(%14),19 C6PNTR: POINT 4,CHJTBL(%14),23 C7PNTR: POINT 4,CHJTBL(%14),27 C8PNTR: POINT 4,CHJTBL(%14),31 C9PNTR: POINT 4,CHJTBL(%14),35 ANPNTR= C8PNTR CHJTBL: ;CHARACTER JUMP TABLE PHASE 0 BYTE (4) MACR, , , , , ,QJCR,.TRM, ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; TAB: BYTE (4) MASP, , , , , ,QJSP,.TAB, ; TAB BYTE (4) , , , , , ,QJNU, , ; LF BYTE (4) , , , , , ,QJNU, , ; FF: BYTE (4) , , , , , ,QJNU, , ; FF CRR: BYTE (4) , , , , , ,QJCR, , ; CR BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , ,QJNU, , ; EOF BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; SPACE: BYTE (4) MASP, , , , , ,QJSP,.TAB, ; SPACE BYTE (4) , , ,EXOR, , ,QJPC,.TRM, ; ! BYTE (4) , , , , , ,QJPC,.TRM, ; " BYTE (4) , , , , , ,QJPC,.TRM, ; # BYTE (4) , , , , , ,QJPC,.ALP, ; $ BYTE (4) , , , , , ,QJPC,.TRM, ; % BYTE (4) , , ,EXAN, , ,QJPC,.TRM, ; & BYTE (4) , , , , , ,QJPC,.TRM, ; ' BYTE (4) , , , , , ,QJPC,.TRM, ; ( BYTE (4) , , , , , ,QJPC,.TRM, ; ) BYTE (4) , , , , , ,QJPC, , ; * BYTE (4) , , ,EXPL, , ,QJPC,.TRM, ; + BYTE (4) MACM, , , , , ,QJPC,.TRM, ; , BYTE (4) , , ,EXMI, , ,QJPC,.TRM, ; - BYTE (4) , , , , , ,QJPC,.DOT, ; . BYTE (4) , , , , , ,QJPC, , ; / BYTE (4) , , , , , ,QJPC,.NUM, ; 0 BYTE (4) , , , , , ,QJPC,.NUM, ; 1 BYTE (4) , , , , , ,QJPC,.NUM, ; 2 BYTE (4) , , , , , ,QJPC,.NUM, ; 3 BYTE (4) , , , , , ,QJPC,.NUM, ; 4 BYTE (4) , , , , , ,QJPC,.NUM, ; 5 BYTE (4) , , , , , ,QJPC,.NUM, ; 6 BYTE (4) , , , , , ,QJPC,.NUM, ; 7 BYTE (4) , , , , , ,QJPC,.NUM, ; 8 BYTE (4) , , , , , ,QJPC,.NUM, ; 9 BYTE (4) , , , , , ,QJPC,.TRM, ; : BYTE (4) MASC, , , , , ,QJPC,.TRM, ; ; BYTE (4) , , , , , ,QJPC, , ; < BYTE (4) , , , , , ,QJPC,.TRM, ; = BYTE (4) , , , , , ,QJPC, , ; > BYTE (4) , , , , , ,QJPC, , ; ? INDBIT: BYTE (4) , , , , , ,QJPC,.TRM, ; @ BYTE (4) , , , , , ,QJPC,.ALP, ; A BYTE (4) , , , , , ,QJPC,.ALP, ; B BYTE (4) , , , , , ,QJPC,.ALP, ; C BYTE (4) , , , , , ,QJPC,.ALP, ; D BYTE (4) , , , , , ,QJPC,.ALP, ; E BYTE (4) , , , , , ,QJPC,.ALP, ; F BYTE (4) , , , , , ,QJPC,.ALP, ; G BYTE (4) , , , , , ,QJPC,.ALP, ; H BYTE (4) , , , , , ,QJPC,.ALP, ; I BYTE (4) , , , , , ,QJPC,.ALP, ; J BYTE (4) , , , , , ,QJPC,.ALP, ; K BYTE (4) , , , , , ,QJPC,.ALP, ; L BYTE (4) , , , , , ,QJPC,.ALP, ; M BYTE (4) , , , , , ,QJPC,.ALP, ; N BYTE (4) , , , , , ,QJPC,.ALP, ; O BYTE (4) , , , , , ,QJPC,.ALP, ; P BYTE (4) , , , , , ,QJPC,.ALP, ; Q BYTE (4) , , , , , ,QJPC,.ALP, ; R BYTE (4) , , , , , ,QJPC,.ALP, ; S BYTE (4) , , , , , ,QJPC,.ALP, ; T BYTE (4) , , , , , ,QJPC,.ALP, ; U BYTE (4) , , , , , ,QJPC,.ALP, ; V BYTE (4) , , , , , ,QJPC,.ALP, ; W BYTE (4) , , , , , ,QJPC,.ALP, ; X BYTE (4) , , , , , ,QJPC,.ALP, ; Y BYTE (4) , , , , , ,QJPC,.ALP, ; Z BYTE (4) , , , , , ,QJPC, , ; [ BYTE (4) , , , , , ,QJPC, , ; \ BYTE (4) , , , , , ,QJPC, , ; ] BYTE (4) , , , , , ,QJPC, , ; ^ BYTE (4) , , , , , ,QJPC, , ; _ BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; BYTE (4) , , , , , , , , ; RUBOUT: BYTE (4) , , , , , ,QJNU, , ; DEPHASE LIT ;REMOVE WHEN SEGMENTING SUBTTL IMPURE AREA PATCH: BLOCK 20 SYMPNT: Z -1(%07) ;POINTER TO SYMBOL TABLE MNEMONIC VALPNT: Z -1(%07) ;POINTER TO SYMBOL TABLE VALUE BZCOR: ;BEGINNING OF CORE TO BE INITIALIZED TO ZERO SYMBOT: BLOCK 1 ;BASE OF SYMBOL TABLE SYMTOP: BLOCK 1 ;TOP OF SYMBOL TABLE SYMLEN: BLOCK 1 ;LENGTH OF SYMBOL TABLE DELTA: BLOCK 1 ;BINARY SEARCH OFFSET MACTOP: BLOCK 1 ;TOP OF MACRO STORAGE MWPNTR: BLOCK 1 ;MACRO WRITE POINTER NEXT: BLOCK 1 ;GARBAGE COLLECTION CHAIN REPEXP: BLOCK 1 ;REPEAT EXPRESSION REPPNT: BLOCK 1 ;REPEAT POINTER SYMBEG: BLOCK 1 ;POINTER TO START OF SYMBOL FOR RESCAN PURPOSES RUNTIM: BLOCK 1 ;RUN TIME LINBUF: BLOCK CPL/5+1 ;SOURCE LINE BUFFER LODADR: BLOCK 1 ;LOAD ADDRESS CURADR: BLOCK 1 ;CURRENT DATA BLOCK ADDRESS BYTCNT: BLOCK 1 ;BYTE COUNT CHKSUM: BLOCK 1 ;CHECK SUM DATBLK: BLOCK DATLEN ;DATA BLOCK SEQNUM: BLOCK 1 ;SEQUENCE NUMBER AC00: BLOCK 1 ;AC EXCHANGE BLOCK AC01: BLOCK 1 AC02: BLOCK 1 AC03: BLOCK 1 AC04: BLOCK 1 AC05: BLOCK 1 AC06: BLOCK 1 AC07: BLOCK 1 AC10: BLOCK 1 AC11: BLOCK 1 AC12: BLOCK 1 AC13: BLOCK 1 AC14: BLOCK 1 DATE: BLOCK 1 ;DATE FOR HEADER MSTIME: BLOCK 1 ;CURRENT TIME IN MILLISECONDS PAGNUM: BLOCK 1 ;PAGE NUMBER PAGEXT: BLOCK 1 ;PAGE EXTENSION ERRCNT: BLOCK 1 ;ERROR COUNT EXTSAV: BLOCK 1 ;FILNAM EXTENSION FOR HEADER (EXEC) CALPNT: BLOCK 1 ;POINTER TO CURRENT MACRO CALL BLOCK MACLVL: BLOCK 1 ;MACRO NESTING LEVEL ARGLST: BLOCK ^D65 ;TEMP STORAGE FOR MACRO ARGUMENTS CEXT: ;CODE EXTENSION BLOCK CEXT1: BLOCK 1 ; BYTES 3&4 OF CODE CEXT2: BLOCK 1 ; BYTES 5&6 OF CODE OFFSET: BLOCK 1 ;0 OF 1, FOR CEXT1 OR CEXT2 ESPCNT: BLOCK 1 ;SPACE COUNT FOR LISTING JOBFFI: BLOCK 1 ;JOBFF SAVE TTISAV: BLOCK 1 ;TTI POINTER SAVE XESAVE: BLOCK 1 ;FILE NAME STORAGE FOR TTY ERROR MESSAGES XE: BLOCK 1 ;EXEC LOOKUP BLOCK XE1: BLOCK 1 XE2: BLOCK 1 XE3: BLOCK 1 ;BUFFER HEADER BLOCKS TTIBUF: BLOCK 1 TTIPNT: BLOCK 1 TTICNT: BLOCK 1 TTOBUF: BLOCK 1 TTOPNT: BLOCK 1 TTOCNT: BLOCK 1 BINBUF: BLOCK 1 BINPNT: BLOCK 1 BINCNT: BLOCK 1 LSTBUF: BLOCK 1 LSTPNT: BLOCK 1 LSTCNT: BLOCK 1 SRCBUF: BLOCK 1 SRCPNT: BLOCK 1 SRCCNT: BLOCK 1 LINCNT: BLOCK 1 ;EXEC LINE COUNTER EZCOR: END PALX11 ;....PALX11