/PAGE 17 /SYMBOL SORTING ROUTINE /LENGTH: 63 REGISTERS SORT, DCA INFO /INDICATOR TELLS IF ANY SYMBOLS WERE SORTED TAD IAM1 /POINTER TO BEGINNING OF SYMBOL TABLE DCA PNT1 /PUT IT IN ADDRESS POINTER CMA /SET HIGH SYMBOL TO 7777 7777 7777 DCA HIGH CMA DCA HIGH+1 CMA DCA HIGH+2 LCHK, TAD PNT1 /HAVE WE CHECKED ALL OF SYMBOL TABLE? CLL CMA IAC /COMPARE POINTER WITH ANOTHER POINTER TAD SPNT /TO THE END OF THE SYMBOL TABLE SNA CLA JMP AOUT /ALL THROUGH TAD LOWPNT /SET UP POINTERS FOR CYMBOL COMPARISON DCA SORT1 /TO SSEE IF SYM IS GREATER THAN LOW TAD PNT1 /GET ADDRESS OF CURRENT SYMBOL DCA SORT2 JMS I SYMCMI /GO TO SYMBOL COMPARISON ROUTINE JMP INC /SYM IS EQUAL TO LOW JMP INC /SYM IS LESS THAN LOW TAD HIPNT /SYM IS GREATER THAN LOW DCA SORT2 /NOW SET UP POINTERS FOR CHECK3 ROUTINE TAD PNT1 /TO SEE IF SYM IS LESS THAN HIGH DCA SORT1 JMS I SYMCMI /GO TO SYMBOL COMPARISON ROUTINE JMP INC /SYM IS EQUAL TO HIGH JMP INC /SYM IS GREATER THAN HIGH ISZ INFO /SYM IS LESS THAN HIGH TAD PNT1 /GET ADDRESS OF SYMBOL DCA SORT1 /IN AN INDEX REGISTER TAD I SORT1 /PUT THE SYMBOL IN HIGH AND MASK /GET RID OF THE UNDEFINED BIT DCA HIGH TAD SORT1 /PUT ADDRESS OF SYMBOL IN ADDR FOR DOLL DCA TEM3 TAD I SORT1 /FINISH PUTTING SYMBOL IN HIGH DCA HIGH+1 TAD I SORT1 DCA HIGH+2 /PAGE 18 INC, TAD C4 /INCREMENT POINTER TAD PNT1 /FOR NEXT COMPARE DCA PNT1 /PUT IT BACK IN PNT1 JMP LCHK /GO LOOK AT NEXT SYMBOL AOUT, TAD HIGH /ALL THROUGH, NOW PUT HIGH INTO LOW DCA LOW TAD HIGH+1 /HIGH+1 GOES INTO LOW+1 DCA LOW+1 TAD HIGH+2 /HIGH+2 GOES INTO LOW+2 DCA LOW+2 TAD INFO /WERE ANY SWITCHES MADE IN THIS PASS? SNA CLA JMP OUT1 /NO: ALL DONE JMP ELUP2 HIGH, 0 /STORAGE FOR HIGH SYMBOL 0 0 LOW, 0 /STORAGE FOR LOW SYMBOL 0 0 PNT1, 0 /STORAGE FOR ADDRESS OF CURRENT SYMBOL LOWPNT, LOW-1 /POINTER USED WITH AUTO INDEX REGISTER HIPNT, HIGH-1 /POINTER USED WITH AUTO INDEX REGISTER L06, /END OF PAGE /PAGE 19 *1000 /ROUTINE TO PROCESS SPECIAL CHARACTERS /CALLED BY ROUTINE NCHEK WHEN IT DISCOVERS A SPECIAL CHARACTER /SPSHUL ASSUMES THAT THE SPECIAL CHARACTER DELIMITS A SYMBOL OR OCTAL WORD /A SEARCH IS MADE THROUGH THE SYMBOL TABLE FOR THE SYMBOL, IF ANY /THE VALUE OF THE SYMBOL, OR OCTAL WORD, IS LEFT IN REGISTER SYMVAL /THE SYMBOL TYPE IS LEFT IN REGISTER TYPE /CODES FOR SYMBOL TYPES ARE AS FOLLOWS: /MEMORY REF INSTRUCTIONS 0 /USER SYMBOLS& MICRO OPS +1 /LENGTH: 85 REGISTERS /PAGE 20 SPSHUL, CLA /JUNK IN AC WHEN SPSHUL IS CALLED TAD SYM1 /SYMBOL TO HANDLE? SNA CLA JMP OCTALW /NO, GO PROCESS OCTAL WORD JMS I SMGETI /SEARCH FOR SYMBOL JMP PUTIN /NOT THERE, PUT IT IN THE SYMBOL TABLE CLL TAD OPCDP /IS IT A PSEUDO-CODE? SNL JMP PSEUDA /YES: PROCESS IT TAD MICRP /NO: IS IT A MICRO INSTR.? SNL CLA IAC /YES: CODE=+1 PUSHSP, DCA TYPE /STORE CODE IN REGISTER TYPE TAD CHAR /GET THE SPECIAL CHARACTER TAD M211 /IS IT A TAB? SNA JMP I SPACI /YES; TREAT AS A SPACE TAD M4 /IS IT A CARRIAGE RETURN? SNA JMP I CARRI /YES, PROCESS CARRIAGE RETURN TAD M23 /IS IT A SPACE (CODE 240)? SNA JMP I SPACI /YES: PROCESS SPACE TAD M4 /IS IT A DOLLAR SIGN (CODE 244)? SNA JMP I DOLLI /YES, PROCESS $ TAD M6 /IS IT A STAR (CODE 252)? SNA JMP I STARI /YES, PROCESS STAR TAD M1 /IS IT PLUS(CODE 253)? SNA JMP I ADDI /YES, PROCESS PLUS TAD M1 /IS IT A COMMA (CODE 254)? SNA JMP I SYMSTI /YES, PROCESS COMMA TAD M1 /IS IT A MINUS (CODE 255)? SNA JMP I SUBI /YES, PROCESS MINUS TAD M1 /IS IT A PERIOD (CODE 256)? SNA JMP I POINTI /YES, PROCESS PERIOD TAD M17 /IS IT AN = (CODE 275)? SNA JMP I EQUALI /YES, PROCESS EQUAL SIGN TAD C2 /IS IT A SEMI-COLON? SNA CLA JMP I CARRI /YES: TREAT AS CR /PAGE 21 ERRORN, TAD CHAR /NO, ILLEGAL CHARACTER PUSH /SAVE IT TAD C4 /CODE FOR IC IS 4 PUSHJ /CALL ERROR ERROR2 JMS I AAA /GET ANOTHER JMP I .+1 /RETURN TO NCHEK NCHEK+1 PSEUDA, CLA /CLEAR INFO FOR ALL PSEUDO-OPS DCA INFO TAD SYMVAL /GET ADDRESS OF ROUTINE DCA .+2 PUSHJ /CALL ROUTINE 0 JMP PUSHSP /HANDLE TERMINATOR PUTIN, TAD M1 /STORE SYMBOL WITH AUTO-INDEXC DCA AUTOA /ADDRESS-1 GOES INTO AUTOA TAD SYM1 /FIRST WORD OF SYMBOL TAD C4TH /PUT IN UNDEFINED BIT DCA I AUTOA TAD SYM2 /SECOND WORD OF SYMBOL DCA I AUTOA TAD SYM3 /THIRD WORD OF SYMBOL DCA I AUTOA TAD AACT /VALUE OF SYMBOL DCA I AUTOA TAD C4 /MOVE S.T. POINTER BACK 4 REGISTERS TAD SPNT DCA SPNT JMP PUSHSP-1 OCTALW, TAD OCWD /GET OCTAL WORD DCA SYMVAL /SAVE IT AS THE SYMBOL VALUE DCA OCWD JMP PUSHSP-1 /PROCESS AS USER SYMBOL MICRP, OPCD-MICR OPCDP, -OPCD SMGETI, SYMGET /PAGE 22 /SYMBOL COMPARISON ROUTINE /COMPARES SYMBOLS: ADDRESSES IN INDEX REGISTERS /SORT1 AND SORT2. /THE ROUTINE COMPARES A(I) WITH B(I) /EXITS TO CALLING ADDRESS+1 IF A=B /EXITS TO CALLING ADDRESS+2 IF A>B /EXITS TO CALLING ADDRESS+3 IF ASYMBOL2 C5OUT, JMP I SYMCOM /EXIT IF SYMBOL1=SYMBOL1 /PAGE 23 /PUSHJ ROUTINE TO RECURSIVELY CALL SUBROUTINES /CHECKS FOR PUSHDOWN OVERFLOW VIA THE /PUSH ROUTINE /LENGTH: 9 REGISTERS PUSHJM, 0 DCA ITEM /CARRY C(AC) TO SUBROUTINE TAD I PUSHJM /ADDRESS OF WHERE TO JUMP DCA POPTEM /SAVE IT TAD PUSHJM /GET RETURN IAC PUSH /PUSH DOWN TAD ITEM /RESTORE C(AC) JMP I POPTEM /CALL SUBROUTINE /SET INDIRECT BIT /LENGTH: 4 REGISTERS INDI, TAD C400 /"I"= 0400 DCA SYMVAL ISZ INFO /I= VALID INFORMATION POPJ /RETURN L10, /PAGE 24 /ALPHABETIC OUTPUT ROUTINE /CALLED BY JMS I EEE, WITH PACKED SIXBIT WORD IN AC /A CALL WITH 0 IN THE AC, WILL GENERATE TWO SPACES /LENGTH: 35 REGISTERS *1200 ALFO, 0 DCA ALFTEM /SAVE THE PACKED CHARACTER TAD M2 /PUT -2 IN THE COUNTER - 2 WORD TO DCA ALFTEM+1 /BE OUTPUTTED TAD ALFTEM /GET FIRST CHARACTER RTR /ROTATE INTO POSITION RTR RTR NXCL, AND SL6 /MASK OFF EXTRANEOUS BITS SNA /IS THE CHARACTER A ZERO? JMP ALFL-1 /YES, OUTPUT A SPACE TAD M43 /CHECK FOR LINE FEED -43 SNA JMP FLF /GO TO SPECIAL LINE FEED SECTION TAD M2 /CHECK FOR CARRIAGE RETURN -45 SNA JMP FCR /GO TO SPECIAL CR SECTION TAD C5 /CALCULATE CHAR -40 SPA /IF RESULT IS .GE. 0, ADD 240 TAD C100 /OTHERWISE, ADD 340 TAD C240 ALFL, JMS I DDD /GO TO TYPEOUT ROUTINE NEXL, TAD ALFTEM /PICK UP PACKED WORD ISZ ALFTEM+1 /ALL DONE? JMP NXCL /NO, GO PROCESS IT CLA /YES, EXIT WITH CLEARED AC JMP I ALFO /EXIT FLF, TAD M3 /GET LF CODE(212) FCR, TAD C215 /GET THE CODE FOR CARRIAGE RETURN JMP ALFL /GO OUTPUT IT M43, -0043 C100, 0100 C240, 0240 ALFTEM, 0 0 /PAGE 25 /OCTAL OUTPUT ROUTINE /CALLED WITH JMS I OCTI, OCTAL NUMBER IN THE ACCUMULATOR /LENGTH: 17 REGISTERS OCTO, 0 DCA ALFTEM /SAVE WORD TAD M4 /COUNTER FOR 4 CHARACTERS DCA ALFTEM+1 NEXT2, TAD ALFTEM /PICK UP OUTPUT WORD RAL /ROTATE THREE BITS LEFT RTL DCA ALFTEM /SAVE RESULTS TAD ALFTEM /PICK IT UP AGAIN RAL /GET LAST BIT FROM LINK AND SL3 /TRIM TO 3 BITS TAD C260 /CONVERT TO ASCII JMS I DDD /OUTPUT IT ISZ ALFTEM+1 /DONE 4? JMP NEXT2 /NO JMP I OCTO /YES, EXIT C260, 0260 /ROUTINE TO GENERATE LEADER-TRAILER /LENGTH: 9 REGISTERS LDTR, 0 TAD KONS /SET COUNTER FOR DCA TEM2 /# OF CODES LD1, TAD C200 JMS I BBB /PUNCH ONE FRAME OF LEADER TRAILER ISZ TEM2 /DONE? JMP LD1 /NO: CONTINUE JMP I LDTR /YES: EXIT ROUTINE KONS, -40 / L/T CONSTANT /PAGE 26 /BINARY PUNCH ROUTINE /LINK = 1 IF ORIGIN SETTING /CALLED WITH JMS I PUNI, BINARY WORD IN ACCUMULATOR /LENGTH: 22 REGISTERS BINP, 0 DCA TEM1 /SAVE WORD TO BE PUNCHED TAD TEM1 /LINK IS ONE IF ORIGIN RTR /PUT CHARACTER INTO POSITION RTR RTR AND SL7 /SAVE SEVEN BITS DCA TEM3 /SAVE IT TAD TEM3 /PICK IT UP JMS I BBB /AND GO TO PUNCH ROUTINE TAD CKSM /UPDATE CHECKSUM TAD TEM3 DCA CKSM TAD TEM1 /PICK UP ORIGINAL CHARACTER AGAIN AND SL6 /SAVE LOW ORDER SIX BITS DCA TEM3 /SAVE IT FOR CHECKSUM TAD TEM3 /PICK IT UP JMS I BBB /PUNCH IT TAD CKSM /UPDATE CHECKSUM TAD TEM3 DCA CKSM JMP I BINP /EXIT /PAGE 27 /ROUTINE TO PLACE ITEMS ON PUSHDOWN LIST /CHECKS FOR PUSHDOWN OVERFLOW /LENGTH: 17 REGISTERS PUSHIN, 0 DCA I PSHPN1 /SAVE AC ON PUSHDOWN LIST ISZ PSHPN1 /INCREMENT PUSHDOWN POINTER TAD P1END /CHECK FOR PUSHDOWN OVERFLOW TAD PSHPN1 /HAS POINTER PASSED P1END? SPA CLA JMP I PUSHIN /NO, POINTER IS OK, EXIT TAD PSHPN1 /GET ADDRESS OF PUSHDOWN LIST FOR ERROR DCA I PSHPN1 /SAVE IT ON LIST FOR ERROR PICKUP ISZ PSHPN1 /INCREMENT PUSHDOWN POINTER TAD PERR1 /GET RETURN ADDRESS FOR ERROR CALL DCA I PSHPN1 /THUS SIMULATING A PUSHJ JMP I PERR3 /HOP INTO THE ERROR ROUTINE PERR1, .+1 /ERROR RETURN ADDRESS HLT /HALT ON ERROR RETURN JMP .-1 /NO RECOVERY PERR3, MCRIP+1 /ERROR ADDRESS FOR SIMULATED PUSHJ /ROUTINE TO ASSEMBLE OCTAL AND DECIMAL /NUMBERS : SWITCH IS MADE BY OCTAL AND DECIMA /PSEUDO OPS /LENGTH: 22 REGISTERS NMBR, ISZ INFO /VALID INFORMATION NEXNUM, TAD OCWD /GET CURRENT WORD CLL RAL CLL RAL NSWTCH, NOP /SWITCH FOR OCTAL;DECIMA TAD OCWD CLL RAL DCA OCWD /STORE OCWD*8 OR OCWD*10 TAD CHAR TAD M60 /TURN INTO DIGIT TAD OCWD /ADD TO CURRENT DCA OCWD JMS I AAA /FETCH A CHARACTER JMS I NCHEKI /CHECK IT JMP NEXNUM /ALL VALID NUMBERS JMP I RONGI /LETTER IN WORD BEGUN WITH NUMBER CLA CMA TAD I NCHEKI /DECREASE RETURN ADDRESS IN NCHEK DCA I NCHEKI JMP .-4 M60, -60 RONGI, ERRORN /CALL ERROR-COMBINATION NOT LEGAL L12, /PAGE 28 /ASR 33 I/O ROUTINES /CALLED BY JMS I AAA /EXITS WITH LEGAL CHARACTER IN CHAR /LENGTH: 14 REGISTERS *1400 LOREAD, 0 KSF JMP .-1 KRB /READ THE CHARACTER SNA /BLANK TAPE? JMP LOREAD+1 /IGNORE TAD M200 /LEADER? SNA JMP LOREAD+1 /IGNORE TAD C200 DCA CHAR /SAVE CHAR JMS I CHEKI /IS IT LEGAL? JMP LOREAD+1 /NO, TRY AGAIN JMP I LOREAD /ROUTINE TO SET SIGN FOR /ADD OR SUBTRACT OR IOR /LENGTH: 8 REGISTERS SUB, TAD M2 /SIGN FOR SUBTRACT IS -1 ADD, IAC /SIGN FOR ADD IS +1 SPACE, DCA TEM2 /SIGN FOR IOR IS 0 PUSHJ /GO PROCESS THE INFORMATION SPAC /ADDRESS TAD TEM2 DCA SIGN /SET SIGN JMP I FFF /GO BACK TO CSYM /PAGE 29 /PAL 750 READ ROUTINE /CALLED BY JMS I AAA /EXITS WITH LEGAL CHARACTER IN CHAR /LENGTH: 48 REGISTERS HIREAD, 0 ISZ RCNT /IS BUFFER EMPTY? JMP GETCHR /NO, FETCH A CHARACTER ISZ SWITCH /DID TAPE END? SKP /NO JMP ENDBF /YES, GO HALT DCA SWITCH /SET SWITCH AGAIN TAD RBGN /POINTER TO BEGINNING OF BUFFER DCA AUTOA /IN AN AUTO-INDEX REGISTER TAD RKON /CONSTANT FOR SIZE OF BUFFER DCA RCNT /IN READ COUNTER READIN, RFC /FETCH A CHARACTER DCA TEM3 /START COUNTING ISZ TEM3 /OVERFLOW? JMS WAIT JMP FULL1 /YES, SET SWITCH, TAPE ENDED RSF /CHARACTER READY YET? JMP .-4 /NO, TRY AGAIN RRB SNA /IS IT BLANK TAPE? JMP READIN /IGNORE BLANK TAPE TAD M200 /IS IT LEADER-TRAILER? SNA JMP READIN /IGNORE LEADER-TRAILER TAD C200 /RESTORE ORIGINAL CODE DCA I AUTOA /SAVE IT ISZ RCNT /BUFFER FULL YET? JMP READIN /NO, GET SOME MORE JMP FULL /FULL FULL1, CLA CMA /SET TAPE SWITCH TO 7777 DCA SWITCH TAD RCNT /GET ALTERED COUNT FOR BUFFER CMA IAC FULL, TAD RKON SNA /WAS BUFFER COMPLETELY EMPTY? JMP ENDBF /YES DCA RCNT /NO, COUNT OF BUFFER SIZE TAD RBGN /RESET BUFFER POINTER DCA AUTOB GETCHR, TAD I AUTOB /GET A CHARACTER FROM BUFFER DCA CHAR JMS I CHEKI /IS IT LEGAL? JMP HIREAD+1 /NO JMP I HIREAD /YES ENDBF, CLA CMA /SET COUNT TO EMPTY DCA RCNT HLT /HALT JMP HIREAD+1 /TRY AGAIN /PAGE 30 /CHECK FOR SPECIAL CHARACTERS IN READ ROUTINES /EXIT TO CALLING ADDRESS+1 IF CHAR IS TO BE IGNORED /EXIT TO CALLING ADDRESS+2 IF CHAR IS LEGAL /THE FOLLOWING CHARACTERS ARE IGNORED: / 0 BLANK TAPE /200 LEADER-TRAILER /212 LINE FEED /214 FORM FEED /377 RUBOUT /LENGTH: 40 REGISTERS CHEK, 0 TAD CHAR AND SL7 /SET CHANNEL 8 TAD C200 /IN CASE OF PARITY DCA CHAR /INPUT TAD CHAR TAD M377 /IGNORE RUBOUT SNA CLA JMP I CHEK TAD PF /PASS 3? SMA CLA JMP .+3 TAD CHAR /GET CHARACTER DCA I AUTOC /STORE IN PASS3 BUFFER TAD CHAR /CHECK FOR A COMMENT TAD M215 /CARRIAGE RETURN? SNA CLA JMP ECMN /YES, END OF COMMENT TAD FLAG /NO, ARE WE PRESENTLY IN A COMENT? SZA CLA JMP I CHEK /YES, IGNORE THE CHARACTER TAD CHAR TAD M212 /LINE FEED? SNA JMP I CHEK /YES, IGNORE LINE FEED TAD M2 /FORM FEED? SNA JMP I CHEK /YES, IGNORE FORM FEED /PAGE 31 TAD M43A /IS IT A SLASH?? SNA CLA JMP COMMNT /YES: START OF COMMENT ISZ CHEK /NO, LEGAL CHARACTER JMP I CHEK /EXIT COMMNT, ISZ FLAG /BEGINNING OF COMMENT JMP I CHEK /SET FLAG TO ZERO, EXIT ECMN, DCA FLAG /END OF COMMENT ISZ CHEK /GET CHARACTER JMP I CHEK /EXIT M43A, -0043 M377, -0377 /THE EXPUNGE PSEUDO-OP /LENGTH: 13 REGISTERS EXPN, DCA INFO /NO PUNCHING TAD PF /WHICH PASS IS THIS? SZA CLA /IGNORE IT ON PASS 2 OR 3 POPJ /EXIT CMA /MOVE SYMBOL TABLE BACK TAD MCRI /TO PSEUDO-OPS DCA IAM1 TAD IAM1 DCA SPNT DCA I MCRIP POPJ /EXIT MCRI, OPCD MCRIP, MICRP TAD C6 /SET TABLE FOR ENTRY ISZ PSHPN1 /RESET POINTER FOR RETURN TO ERROR HALT JMP I .+1 ERROR2 L14, *1600 /PAGE 32 /ERROR ROUTINES FOR PAL III /LENGTH: 45 REGISTERS /THE ERROR ROUTINES ARE OF TWO TYPES / TYPE 1 CONSISTS OF / UA UNDEFINED ADDRESS / DT DOUBLE TAG / ST SYMBOL TABLE OVERFLOW / RD REDEFINITION BY PARAMETER ASSIGN. / TYPE 1 ERRORS ARE CALLED BY / PUSHJ / ERROR1 /WITH THE ADDRESS OF THE OFFFENDING SYMBOL ON THE PUSHDOWN LIST /AND WITH THE CODE FOR THE ERROR IN C(AC) /THE ERROR PRINTOUT IS / XX YYYYYY AT ZZZZ /WHERE XX REPRESENTS THE PARTICULAR ERROR CODE INVOLVED /YYYYYY REPRESENTS THE SYMBOL THAT CAUSED THE ERROR /ZZZZ REPRESENTS THE LOCATION IN THE USER'S PROGRAM AT WHICH THE /ERROR OCCURRED /TYPE 2 ERRORS CONSIST OF / IC ILLEGAL CHARACTER / IR ILLEGAL REFERENCE / PO PUSHDOWN OVERFLOW / PU PUSHDOWN UNDERFLOW /TYPE 2 ERRORS ARE CALLED BY / PUSHJ / ERROR2 /WITH THE VALUE OF THE ILLEGAL CHARACTER, LITERAL, OR ORIGIN ON THE /PUSHDOWN LIST AND THE CODE FOR THE ERROR IN THE ACCUMULATOR /THE ERROR PRINTOUT IS /XX YYYY AT ZZZZ /WHERE XX REPRESENTS THE PARTICULAR ERROR CODE INVOLVED /YYYY REPRESENTS THE VALUE OF THE ILLEGAL CHARACTER OR REFERENCE /ZZZZ REPRESENTS THE LOCATION IN THE USER'S PROGRAM AT WHICH THE ERROR / OCCURRED /NUMBER CODE FOR ERRORS /1 UA /2 DT /3 ST /4 IC /5 IR /6 PO /7 PU /10 RD