.TITLE CREF / .... EDIT #05 .... 05 OCT. '70 / COPYRIGHT 1970 DIGITAL EQUIPMENT CORP., MAYNARD, MASS. / PDP-9 OR PDP-15 / ADVANCED MONITOR OR BACKGROUND/FOREGROUND / CROSS REFERENCE PROGRAM FOR MACRO / SOURCE ELEMENTS. / THIRD PASS FOR MACRO ASSEMBLY. / ASSEMBLY PARAMETRS: / ADVANCED MONITOR: NONE / BACGROUND/FOREGROUND: '%BF15' / / MAX CANGIANO. / /THIS CODE MOVES UST TO TOP OF FREE CORE /THEN IT MOVES UST BACK TO LOW CORE WITH /EACH ENTRY INCREASED TO SIX WORDS /THE SYMBOL NAME IS CONVERTED FROM RADIX 50 /TO .SIXBT / /MOVE UST TO TOP OF FREE CORE / .ABS .LOC 15430 LTOPCR LTOPCR-1 JMS . /INITIALIZE BANK BITS LAC .-1 AND L60000 DAC TAGPRO LAW -T1SIZE DAC DIVIDE BBITS LAC LINBUF ISZ .-1 TAD TAGPRO DAC UNSQZE LAC* UNSQZE TAD TAGPRO DAC* UNSQZE ISZ DIVIDE JMP BBITS LAC MULTIN /MULTIPLE INPUT? SNA JMP .+3 /NO LAC SKIP /YES, FORCE ^P DAC CP-2 INIT1 .INIT -3,1,RSTRT .WRITE -3,2,ENDP2,8 .WAIT -3 .IFUND CREFI XCT EXPAGE /EXTRA PAGE? SKP /YES JMP STARTP /NO LAC PAGBOT /IF PAGBOT=PAGEND WE DON'T SAD PAGEND /WORRY ABOUT ENDUST JMP .+4 LAC* SCM102 DAC BEGUST DAC ENDUST LAC PAGBOT /MOVE PAGBOT-PAGTOP TAD ML1 DAC* L10 /TO (ENDUST)- LAC ENDUST /(ENDUST+PAGTOP-PAGBOT+1) TAD ML1 DAC* L11 LAC PAGTOP /COMPUTE: CMA / -(PAGTOP-PAGBOT+1) ADD PAGBOT TAD ML1 DAC TEMP LAC* 10 DAC* 11 ISZ TEMP JMP .-3 .ENDC STARTP LAC USTSZE DAC OVRL1 TAD OVRL1 TAD OVRL1 CMA /TOPCOR-USTSZE ADD LTOPCR /Y=TOPCORE-X DAC* L10 /SAVE Y IN AIR 10 DAC OVRL1 / LAC BEGUST /GET BEGINNING OF UST TAD ML1 / DAC* L11 /STORE IT IN AIR 11 LOOP1 LAC* 11 /GET WORD FORM UST DAC* 10 /STORE IT IN HIGH CORE LAC* L10 /ARE WE DONE? SAD LTOPCR /NO, CONTINUE JMP .+2 /YES, EXIT JMP LOOP1 / / /CONVERT SYMBOL NAMES FROM RADIX 50 TO SIXBT /THEN EXPAND EACH ENTRY IN UST TO SIX WORDS /AND MOVE THE EXPANDED ENTRY TO LOW CORE / LAC* SCM102 TAD ML1 / DAC* L11 /IN AIR 11 (LOW CORE) LAC OVRL1 /PUT BEGINNING OF MOVED UST DAC* L10 /IN AIR 10 (HIGH CORE) LOOP2 JMS UNSQZE / LAC* 10 /MOVE THREE WORDS DAC* 11 /DOWN TO LOW CORE LAC* 10 / DAC* 11 LAC* 10 / DAC* 11 / DZM* 11 /ZERO THE FOURTH WORD OF NEW ENTRY LAC CNTRL /GET CONTROL BITS DAC* 11 /DEPOSIT THEM IN THE FIFTH WORD OF THE DZM* 11 /NEW ENTRY, ZERO LAST WORD LAC* L10 /ARE WE DONE? SAD LTOPCR /NO, CONTINUE JMP ININPT /YES, INIT INPUT JMP LOOP2 / UNSQZE 0 /CONVERT FROM RADIX 50 TO .SIXBT LAW -2 /INTIALIZE WORD COUNTER DAC USQCTR / LAC* L10 /PICK UP ADDRESS OF FIRST TAD D1 DAC XR1 /WORD TO CONVERT LAC* XR1 /PICK UP FIRST WORD TO CONVERT AND L650S /MASK IN BITS 0 AND 1 JMP COMMON / HALF2 LAC* XR1 /PICK UP SECOND WORD TO CONVERT AND L650S /MASK IN BITS 0 AND 1 CLL /SHIFT TWO TO THE RIGHT RTR /AND STORE THEM WITH BITS 0 XOR CNTRL /AND 1 OF FIRST WORD TO COMMON DAC CNTRL /CONVERT LAC* XR1 /PICK UP WORD TO CONVERT AND L157S /AND MASK OUT BITS 0 AND 1 DAC OVRL1 / JMS DIVIDE /DIVIDE BY 3100 OCTAL TO LAC OVRL1 /ISOLATE LEFTMOST CHARACTER LAC L3100 / JMS SIXBIT JMS LFT12 /LEFTMOST BITS, THEN STORE DAC* XR1 /IT BACK IN UST ENTRY JMS DIVIDE /DIVIDE BY 50 OCTAL TO LAC OVRL1 /ISOLATE MIDDLE CHARACTER LAC L50 / JMS SIXBIT JMS LFT6 /MOVE CHAR TO MIDDLE OF WORD XOR* XR1 /COMBINE MIDDLE CHARACTER DAC* XR1 /WITH LEFT CHARACTER LAC OVRL1 /GET RIGHTMOST CHARACTER JMS SIXBIT XOR* XR1 /COMBINE RIGHT CHARACTER WITH DAC* XR1 /OTHER TWO ISZ XR1 /MOVE POINTER TO SECOND WORD ISZ USQCTR /OF SYMBOL NAME,IF WE HAVE ALREADY JMP HALF2 /PROCESSED 2 WORDS RETURN, OTHERWISE JMP* UNSQZE /GO TO PROCESS SECOND WORD SIXBIT 0 DAC QUO SNA JMP* SIXBIT TAD ML33 SMA JMP SIXBT2 LAC QUO JMP* SIXBIT SIXBT2 SZA JMP SIXBT3 LAC AND% JMP* SIXBIT SIXBT3 SAD D1 JMP SIXBT4 LAC QUO TAD L23 JMP* SIXBIT SIXBT4 LAC DOT JMP* SIXBIT L23 23 L650S 600000 L60000 60000 L157S 177777 L3100 3100 AVLSPC=OPACK LINENO=OWRITE OPPRO=ADRPRO FALPHA=ALPHA ENDP2 004002 0 .ASCII ' END OF PASS 2'<15> FRLAST FRLAST-1 /LAST AVAILABLE REGISTER CNTRLP 002002 0 .ASCII '^P'<175> /INITIALIZE NPUT ININPT LAC* L11 DAC ENDUST TAD D1 DAC AVLSPC LAC FSWTCH SNA /IS THERE A FILE ON DAT SLOT -14? JMP INIT2 /NO LAC CAL14 /YES, SET UP CALS TO -14. DAC INIT5-2 DAC INIT3-2 LAC INIT7 DAC DBL DAC INIT4-2 INIT7 .INIT -14,0,RSTRT LAC .-1 SAD L377 JMP RSTRT JMP CP CAL14 2764 INIT11 .CLOSE -14 DZM FSWTCH LAC CAL11 DAC INIT5-2 DAC INIT3-2 LAC CAL11P DAC DBL DAC INIT4-2 LAC FILE1% DAC INIT4 JMP INIT2 CAL11 2767 CAL11P 767 FILE1% FILENM INIT2 .INIT -11,0,RSTRT LAC .-1 SAD L377 JMP RSTRT CP .WRITE -3,2,CNTRLP,4 JMP . RSTRT CAL+767 3 INIT4 FIL2NM CAL+2767 /READ IN FIRST LINE 10 INIT5 SRCBUF -44 .EJECT / /GENERAL FLOW / /START BY READING IN THE NEXT LINE / NXTLIN JMS DBLBUF /GET NEXT LINE ISZ LINENO /UPDATE LINE NUMBER LAC D5 /INITIALIZE VALUES FOR GETCHR DAC GETPTR / LAC LINBF% /INITIALIZE POINTER TO NEXT DAC ADPCHR /WORD PAIR IN LINE BUFFER / /START ANALYZING THE LINE / START JMS GETCHR /GET NEXT CHARACTER JMS FALPHA /DO WE HAVE A TAG? JMS TAGPRO /YES STOPS SAD TAB /NO, DO WE HAVE A TAB? JMP STOP /YES, GO START OP-CODE SAD SPACE /NO, DO WE HAVE SPACES? JMP STOP /YES, GO START OP-CODE SAD SEMICL /NO, DO WE HAVE ;? JMP START /YES, SCAN NEW STATEMENT SAD CR /NO, DO WE HAVE A CR? JMP NXTLIN /YES, GET NEXT LINE SAD SLASH /NO, DO WE HAVE A /? JMP NXTLIN /YES, GET NEXT LINE JMS GETCHR /NO, GET NEXT CHARACTER JMP STOPS /CONTINUE STOP JMS GETCHR /GET NEXT CHARACTER SAD SPACE /PASS OVER BLANKS JMP .-2 / JMS FALPHA /DO WE HAVE AN OP CODE? JMS OPPRO /YES STADRS SAD TAB /NO, TAB? JMP STADR /YES, GO START ADDRESS FIELD SAD SPACE /NO, IS IT A SPACE? JMP STADR /YES, GO START ADDRESS FIELD SAD SEMICL /NO, IS IT A ;? JMP START /YES, SCAN NEW STATEMNET SAD CR /NO, IS IT A CR? JMP NXTLIN /YES, GET NEXT LINE SAD SLASH /NO, IS IT A /? JMP NXTLIN /YES, GET NEW LINE JMS GETCHR /NO, GET NEW CHARACTER JMP STADRS /CONTINUE STADR JMS GETCHR /GET NEXT CHARACTER SAD SPACE /PASS OVER BLANKS JMP .-2 / SAD PLUS /PLUS SIGN? JMP STCAL1 /YES SAD MINUS /NO, MINUS SIGN? JMP STCAL1 /YES SAD LPAREN /NO, LEFT PARENTHESIS? JMP STOP /YES SAD LESTHN /NO, 100? JMP NOALPH /NO TAD ML33 /YES SMA /IS CHAR.<133? JMP NOALPH /NO LAC CHRHLD /YES, RESTORE CHARACTER JMP* ALPHA /RETURN TO LOC+1 NOALPH ISZ ALPHA /RETURN TO LOC+2 JMP .-3 / / /SUBROUTINE NUMERC / /NUMERC LOOKS AT THE CHARACTER IN THE AC AND /RETURNS TO LOC+1 IF IT IS NUMERIC TO LOC+2 /OTHERWISE / NUMERC 0 / DAC CHRHLD /SAVE CHARACTER TAD ML60 / SPA /IS CHARACTER>57? JMP NONUM /NO TAD ML12 /YES SMA /IS CHAR.<71? JMP NONUM /NO LAC CHRHLD /YES, RESTORE CHAR JMP* NUMERC /RETURN TO LOC+1 NONUM ISZ NUMERC /RETURN TO LOC+2 JMP .-3 / .EJECT / /SUBROUTINE OUTPUT / /AT THE END OF THE SOURCE SCAN OUTPUT IS /CALLED TO GENERATE OUTPUT / OFLAG=DBLBUF /LINE FULL FLAG ERR1% ERRLIN-1 ERRLIN .ASCII 'CORE EXHAUSTED AT LINE ' / / ENTER HERE IN CASE WE EXHAUSTED CORE. / OUTPT1=. LAW -12 DAC TEMP LAC SRCBF% DAC* L11 LAC ERR1% DAC* L10 LAC* 10 DAC* 11 ISZ TEMP JMP .-3 JMS OINIT LAC SRCBF% TAD D2 TAD L10 DAC CHRCNT LAC LINENO JMS UNDEC JMS OWRITE / / NORMAL ENTRY TO OUTPUT ROUTINE. / OUTPT2=. JMS LINHDR JMS OINIT /INITIALIZE OUTPUT BUFFERS LAC* SCM102 / OUTST DAC PACKS+1 / DAC TEMP / LAC* TEMP /GET SYMBOL WORD 1 JMS UNSIX /CONVERT IT TO 5/7 ASCII ISZ TEMP / LAC* TEMP /GET SYMBOL WORD 2 JMS UNSIX /CONVERT IT TO 5-7 ASCII LAC SPACE /PACK-IN A SPACE JMS OPACK / LAC TEMP /ONLY 5 CHARACTERS IF NOT A TAD D3 /DIRECT ASSIGNMENT DAC UNOCTL LAC* UNOCTL SMA DZM OINIT ISZ TEMP LAC* TEMP JMS UNOCTL LAC TEMP / TAD D2 DAC TEMP / LAC* TEMP /GET FIRST LINE NUMBER AND L37777 / OLOOP JMS UNDEC /CONVERT LINE # AND PACK IT ISZ TEMP / LAC* TEMP /FETCH FORWARD POINTER SMA JMP OUTCE1 AND L77777 DAC* TEMP LAC STAR JMS OPACK LAC* TEMP OUTCE SNA /ARE WE DONE FOR THIS SYMBOL? JMP ONEXT /YES, LOOK AT NEXT SYMBOL DAC TEMP LAC SPACE JMS OPACK LAC* TEMP /GET LINE# ISZ OFLAG /IS LINE FULL? JMP OLOOP /NO JMS OWRITE /YES LAW -16 / DAC PACKS / LAC SPACE /PACK 7 SPACES AT BEGINNING JMS OPACK /OF NEW LINE ISZ PACKS / JMP .-3 / JMP OLOOP-2 / OUTCE1 DAC UNDEC LAC SPACE JMS OPACK LAC UNDEC JMP OUTCE ONEXT JMS OWRITE /WRITE LINE LAC PACKS+1 /MOVE POINTER TO NEXT SYMBOL TAD D5 / / SAD ENDUST /ARE WE AT END OF UST? JMP .+3 TAD D1 JMP OUTST /NO, CONTINUE .CLOSE -12 .CLOSE -11 LAC BATCH /DO WE HAVE TO CALL MACRO SZA /BACK IN? JMP .+3 /YES. .EXIT .IFUND %BF15 LAC FSTBLK DAC 17637 LAC MACSZE DAC 17641 LAC LDADDR DAC 17640 TAD D1 DAC* L0 JMP 17663 .ENDC .IFDEF %BF15 LAC FSTBLK DAC 17772 LAC MACSZE DAC 17774 LAC LDADDR TAD D1 DAC 17773 AND (17777 XOR (600000 DAC 17777 JMP 17770 .ENDC .EJECT / /SUBROUTINE UNSIX - / / CONVERTS CONTENTS OF AC FROM .SIXBT TO / .ASCII AND PACKS RESULT IN BUFFER. / UNSIX1=ININPT UNSIX 0 DAC UNSIX1 JMS LFT6 RAL JMS UNDO LAC UNSIX1 JMS RT6 JMS UNDO LAC UNSIX1 JMS UNDO JMP* UNSIX UNDO 0 AND L77 SNA LAC SPACE XOR L40 TAD L40 JMS OPACK JMP* UNDO / /SUBROUTINE UNDEC - / / CONVERTS CONTENTS OF AC FROM BINARY TO / DECIMAL AND PACKS RESULT IN BUFFER. / UNDEC 0 / DZM OINIT /FLAG LEADING ZEROS DAC OVRL1 / JMS DIVIDE LAC OVRL1 LAC D1000 JMS UNSEND JMS DIVIDE LAC OVRL1 LAC D100 JMS UNSEND JMS DIVIDE LAC OVRL1 LAC D10 JMS UNSEND LAC OVRL1 JMS UNSEND JMP* UNDEC UNSEND 0 TAD L60 SAD L60 JMP .+4 ISZ OINIT JMS OPACK JMP* UNSEND CLA SAD OINIT JMP .+3 LAC L60 JMP UNSEND+5 LAC SPACE JMP UNSEND+5 / / SUBROUTINE UNOCTAL / / CONVERTS CONTENTS OF AC FROM BINARY TO / OCTAL} / UNOCTL 0 DAC UNDEC LAC OINIT /OINIT=0 IF NOT SZA /DIRECT ASSIGNMENT JMP DIRASG /IN THIS CASE PRINT LAC UNDEC /ONLY 5 CHARACTERS JMS LFT4 /IS VARIABLE NAME A MACRO NAME? AND D1 SZA JMP MACRO /YES. TYPE 'MACRO.' LAC UNDEC /NO. AND L77777 DAC UNDEC DIRASG=. LAW -6 DAC DIVIDE LAC UNDEC SKP UNLOP DAC UNDEC AND L7%50S JMS LFT4 JMS UNSEND ISZ OINIT LAC UNDEC RTL RAL ISZ DIVIDE JMP UNLOP LAC SPACE JMS OPACK JMP* UNOCTL MACRO LAC MACR /PRINT 'MACRO' INSTEAD OF JMS UNSIX /OCTAL VALUE LAC MACR+1 JMS UNSIX JMP* UNOCTL MACR .SIXBT ' MACRO' / /SUBROUTINE OINIT - INITIALIZES OUTPUT BUFFERS / OINIT 0 LAW -5 DAC GETPTR LAC SRCBF% DAC CHRCNT LAW -11 DAC OFLAG JMP* OINIT / /SUBROUTINE OPACK - PACKS OUTPUT BUFFER / OPACK 0 / ISZ .+1 /STORE CHARACTER DAC GETWDS / ISZ GETPTR /DO WE HAVE 5 CHARS? JMP* OPACK /NO, RETURN LAW -5 /YES, PACK THEM DAC GETPTR /RESTORE GETPTR LAC I8 /RESTORE DAC GETWDS DAC OPACK+2 / ISZ CHRCNT / LAC GETWDS+1 /FETCH FIRST CHARACTER JMS RT8 /PACK IT DAC GETWDS+1 / LAC GETWDS+2 /FETCH SECOND CHAR JMS LFT4 /PACK IT XOR GETWDS+1 / DAC GETWDS+1 / LAC GETWDS+3 /FETCH THIRD CHAR. (LEFT HALF) JMS RT3 /PACK IT AND L17 / XOR GETWDS+1 / DAC* CHRCNT /FIRST 5/7 ASCII WORD LAC GETWDS+3 /FETCH THIRD CHAR. (RIGHT HALF) AND L7 JMS LFT15 DAC GETWDS+2 / LAC GETWDS+4 /GET FOURTH CHARACTER JMS LFT8 /PACK IT XOR GETWDS+2 / DAC GETWDS+2 / LAC GETWDS+5 /GET FIFTH CHARACTER RAL /PACK IT XOR GETWDS+2 / ISZ CHRCNT / DAC* CHRCNT /SECOND 5/7 ASCII WORD JMP* OPACK /RETURN / /SUBROUTINE OWRITE / / WRITES OUTPUT LINES / OWRITE 0 LAC HEADER /RESTORE HEADER WORD DAC SRCBUF CRFILL LAC CR /MAKE SURE THERE IS A 'CR' JMS OPACK /AT THE END OF THE LINE. LAW -5 /CLOSE OUT BUFFER SAD GETPTR SKP JMP CRFILL DZM SRCBUF+1 LAC LINCNT /ARE WE AT NEW PAGE? SNA /NO. JMS LINHDR /YES. CAL+2766 /WRITE 11 / INIT6 SRCBUF -44 / CAL+766 12 JMS OINIT /REINITIALIZE BUFFERS ISZ LINCNT JMP* OWRITE JMP* OWRITE /RETURN HEADER 022002 / / SUBROUTINE LINHDR / / PRINTS HEADER LINE WITH PAGE NUMBER / AT THE TOP OF EACH NEW PAGE. / LINHDR 0 ISZ LSTPGE JMS OINIT LAC HR% DAC CHRCNT LAC LSTPGE JMS UNDEC LAW -4 DAC ALPHA LAC SPACE JMS OPACK ISZ ALPHA JMP .-3 LAC INIT4 DAC ALPHA LAC* ALPHA JMS UNSIX ISZ ALPHA LAC* ALPHA JMS UNSIX LAC SPACE JMS OPACK CAL+2766 11 INIT12 HDRLIN -44 CAL+2766 11 INIT13 LNFEED -44 CAL+766 12 LAW -67 DAC LINCNT JMP* LINHDR HDRLIN 022002 0 .ASCII <14>'PAGE CROSS REFERENCE'<15> .LOC .-1 HR% HDRLIN+3 LNFEED 002002 0 .ASCII <12><15> .LOC .-1 .EJECT / /SUBROUTINE ADRPRO / /ADRPRO PROCESSES AN ADDRESS FIELD / ADRPRO 0 / ISZ FLDSW DZM CHRCNT /CLEAR CHARACTER COUNT ADRCE ISZ CHRCNT /INCREMENT CHARACTER COUNT DAC CHRHLD LAC CHRCNT / SAD L7 /DO WE HAVE SIX CHARACTERS? JMP ADRNEW /YES, FOUND SYMBOL, BUT LOOK FOR DEL JMS PACKER /NO, PACK CHARACTER JMS GETCHR /GET CHARACTER JMS FALPHA /IS IT ALPHABETIC? JMP ADRCE /YES JMS NUMERC /NO, IS IT NUMERIC? JMP ADRCE /YES SAD NOSIGN /NO, IS IT NUMBER SIGN? JMP .-6 /YES, IGNORE IT JMS ADRDEL /NO, IS IT +, -,*? JMP ADRMOR /HAVE SYMBOL BUT MAY HAVE MORE JMS TAGDEL /NO, IS IT SPACE,TAB,;,CR,/? JMP ADRLST /YES, LAST SYMBOL JMP ADRNEW /DON'T HAVE SYMB. BUT MAY HAVE MORE ADRLST DAC CHRHLD /SAVE CHARACTER JMS SYMBOL /MAKE ENTRY LAC CHRHLD /RESTORE CHARACTER JMP* ADRPRO /RETURN ADRMOR JMS SYMBOL /MAKE ENTRY JMS GETCHR /GET NEXT CHARACTER JMS FALPHA /IS IT ALPHABETIC? JMP ADRCE-1 /YES JMP .+3 /NO, LOOK FOR DELIMITER ADRNEW JMS SYMBOL /MAKE ENTRY JMS GETCHR /FETCH NEXT CHARACTER JMS TAGDEL /IS IT A DELIMITER? JMP* ADRPRO /YES, RETURN JMS ADRDEL /NO, IS IT AN OPERATOR? JMP ADRMOR+1 /YES, LOOK FOR SYMBOL JMP ADRNEW+1 /NO, CONTINUE .EJECT / /SUBROUTINE DBLBUF / / DOUBLE BUFFERED INPUT ROUTINE / DBLBUF 0 / DBL CAL+767 /WAIT FOR SOURCE 12 / LAC LINENO SAD LSTLIN JMP OUTPT2 LAC SRCBUF / AND L17 / SAD D6 /DID WE HIT AN EOT? JMP EOTEOM SAD D5 /NO, DID WE HIT AN EOF? JMP EOTEOM LAW -42 /NO, MOVE SRCBUF TO LINBUF DAC TEMP / LAC SRCBF% / DAC* L10 / LAC LINBF% / DAC* L11 / LAC* 10 / DAC* 11 / ISZ TEMP / JMP .-3 / CAL+2767 /READ A LINE 10 / INIT3 SRCBUF / -44 / LAC RDLST /FETCH LAST WORD OF SRCBUF AND IOTLIT /AND FORCE THE LAST CHARACTER XOR L6400 /TO BE A CR DAC RDLST / JMP* DBLBUF /RETURN ADPCHR 0 / EOTEOM LAC FSWTCH /COME HERE IF WE HIT SZA /AN EOT OR EOM JMP INIT11 LAC LINENO /HAVE WE PROCESSED ALL INPUT? SAD LSTLIN JMP OUTPT2 /YES. .CLOSE -11 /NO. CLOSE FILES AND JMP CP /GO TYPE ^P FOR MORE INPUT. .END