/PAL III SOURCE LISTING /DEC-08-LPALA-A-LA /COPYRIGHT 1970,1971,1972 DIGITAL EQUIPMENT CORPORATION / MAYNARD, MASSACHUSETTS 01754 /ASSEMBLY INSTRUCTIONS /.R PAL8 OR .R PAL10 /PAL3,PAL3_PAL3 /PAGE 1 /PAGE ZERO CONSTANTS AND STORAGE / TIME-OUT DELAY TO ACCOMODATE PHOTO-ELECTRIC READER *1 WAIT, 0 TAD M2 DCA 14 ISZ 14 JMP .-1 ISZ WAIT JMP I WAIT /INDIRECT REFERENCE TABLE *20 AAA, 0 /POINTER TO READ ROUTINE BBB, 0 /POINTER TO PUNCH ROUTINE DDD, 0 /POINTER TO TYPE ROUTINE SPECI, SPSHUL /SPECIAL CHARACTER HANDLER NCHEKI, NCHEK /CHARACTER TYPE PROCESSOR CHEKI, CHEK /CHECKS CHARACTER LEGALITY SYMCMI, SYMCOM /SYMBOL COMPARISON ROUTINE PUNI, BINP /BINARY PUNCH ROUTINE EEE, ALFO /ALPHA OUTPUT ROUTINE OCTI, OCTO /OCTAL OUTPUT ROUTINE NUMBI, NMBR /OCTAL NUMBER PROCESSOR SPACI, SPACE /SPACE HANDLER CARRI, CARR /CARRIAGE RETURN HANDLER DOLLI, DOLLAR /END-OF-PASS ROUTINE STARI, STAR /ORIGIN HANDLER ADDI, ADD /SET SIGN FOR ADD SYMSTI, SYMSTO /COMMA HANDLER SUBI, SUB /SET SIGN FOR SUBTRACT POINTI, POINT /PERIOD PROCESSOR EQUALI, EQUAL /PARAMETER ASSIGNMENTS FFF, CSYM /MAIN EXPRESSION HANDLER PUSHJI, PUSHJM /PUSHJ ROUTINE POPJMI, POPJMP /POPJ ROUTINE PUSHI, PUSHIN /PUSH ROUTINE POPMI, POPM /POP ROUTINE LDTI, LDTR /LEADER-TRAILER GENERATOR LOPUNI, LOPUN /ASR 33 PUNCH HIPUNI, HIPUN /75 A PUNCH LOREDI, LOREAD /ASR 33 READER HIREDI, HIREAD /750 READER IORIN, IOR /POINTER TO INCLUSIVE OR ROUTINE NEXI, NXPA /POINTER TO NEXT PASS /PAGE 2 /NUMERICAL CONSTANTS C2, 0002 C3, 0003 C4, 0004 C5, 0005 C6, 0006 C200, 0200 C211, 0211 C214, 0214 C215, 0215 C377, 0377 C4TH, 4000 M2, -0002 M3, -0003 M12, -0012 M23, -0023 M4, -0004 M17, -0017 M215, -0215 M200, -0200 M1, -0001 M6, -0006 M211, -0211 M212, -0212 /TEMPORARY REGISTERS ITEM, 0 /USED BY INCLUSIVE OR ROUTINE TEM5, 0 /USED BY EQUAL ROUTINE TEM1, 0 /AVAILABLE TO ALL ROUTINES TEM2, 0 /... TEM3, 0 /... POPTEM, 0 /USED BY PUSH,POP,ETC /PAGE 3 /SYMBOLIC CONSTANTS AND POINTERS IAM1, SYTA-1 /USED FOR AUTO-INDEX REGISTERS MPAGE, 7600 /MASK FOR PAGE BITS CRLF, 4543 /CONSTANT FOR CR,LF MASK, 3777 /MASKS OFF UNDEFINED BIT SL3, 0007 /MASK FOR THREE BIT OCTAL # SL7, 0177 /MASK FOR SEVEN BIT ADDRESS SL6, 0077 /MASK FOR 6-BIT ALPHA CHAR SF2, 6000 /MASK OFF PASS BITS RBGN, 0 /BEGINNING OF READER BUFFER RKON, -574 /SIZE OF READER BUFFER P1BGN, PSHLST /BEGINNING OF PUSHDOWN LIST P1END, -PSHLST-10 /CONSTANT FOR PDL OVERFLOW TBUF, 7450 /BEGINNING OF PASS 3 BUFFER GOREAD, 6650 /BUFFER WITH HIGH SPEED READER C400, 0400 /INDIRECT BIT /PAGE 4 /DATA REGISTERS PF, 0 /PASS FLAG SPNT, 0 /POINTER TO END OF SYMBOL TABLE CHAR, 0 /CURRENT CHARACTER BEING PROCESSED INFO, 0 /INFORMATION FLAG BINW, 0 /12 BINARY ASSEMBLED WORD OCWD, 0 /12 BIT OCTAL WORD AACT, 0 /ABSOLUTE ADDRESS COUNTER ADDR, 0 /12 BIT ASSEMBLED ADDRESS SYMVAL, 0 /OCTAL VALUE OF SYMBOL SYM1, 0 /FIRST TWO CHARACTERS OF 6-LETTER SYMBOL SYM2, 0 /2ND TWO CHARACTERS SYM3, 0 /3RD TWO CHARACTERS CKSM, 0 /CURRENT BINARY CHECKSUM INSF, 0 /INSTRUCTION FLAG; 1 IF INSTRUCTION ZFLG, 0 /Z FLAG; 1 IF PAGE ZERO REFERENCE FLAG, 0 /COMMENT FLAG; 1 IF IN A COMMENT SIGN, 0 /SIGN ASSOCIATED WITH PRESENT ATOM TYPE, 0 /SYMBOL TYPE SWITCH, 0 /END-OF-TAPE FLAG RCNT, 0 /NUMBER OF CHARACTERS LEFT IN BUFFER PSHPN1, 0 /PUSH DOWN POINTER /75A PUNCH ROUTINE /LENGTH: 6 REGISTERS HIPUN, 0 PSF JMP .-1 PLS CLA /EXIT WITH C(AC)=0 JMP I HIPUN /PAGE 5 /PARAMETER ASSIGNMENTS PUSHJ=JMS I PUSHJI POPJ=JMP I POPJMI AUTOA=10 AUTOB=11 AUTOC=13 SORT1=16 SORT2=17 POP=JMS I POPMI PUSH=JMS I PUSHI /DECIMAL AND OCTAL PSEUDO-OPS /TO SET CURRENT RADIX /LENGTH : 8 REGISTERS DECMA, TAD INST1 /NOP INSTRUCTION DCA I SWTCHN /STORE IN SWITCH POPJ OCTALP, TAD INST2 /SKP INSTRUCTION JMP .-3 /STORE AND EXIT INST1, NOP INST2, SKP SWTCHN, NSWTCH /LOCATION IN "NMBR" C204, 0204 L00, /END OF PAGE MARKER /PAGE 6 /BEGINNING OF PAL /DETERMINES TYPE OF I-O TO BE USED /CALCULATES PASS NUMBER FROM SWITCH SETTINGS /LENGTH: 34 REGISTERS *200 SPAL, DCA TEM1 /0 TO COUNTER PLS /SELECT PUNCH RFC /SELECT READER RSF /READER FLAG SET? JMS WAIT JMP HREAD /YES: HIGH READER INPUT ISZ TEM1 /WAITED ENOUGH? JMP .-4 /NO: TRY AGAIN TAD LOREDI /YES: LOW SPEED READER DCA AAA TAD TBUF /ALL OF CORE FOR SYMBOLS DCA RBGN TPUN, LAS /CHOOSE MAIN OUTPUT DEVICE RAR /BIT 11 TO LINK SZL CLA /HIGH SPEED PUNCH??? TAD HIPUNI /YES SNL TAD LOPUNI /NO DCA BBB PASS, KCC /INITIALIZE DEVICES TLS PLS CLA OSR AND SF2 /WAS PASS NUMBER SET? SNA JMP NXPA /NO, HALT RAL CLL /GET HIGH ORDER BIT SNL /WAS IT SET? JMP PASS1 /NO, PASS 1 SMA CLA /YES, WHAT ABOUT LOW ORDER? JMP PASS2 /NOT ON, PASS 2 JMP PASS3 /ON, PASS3 NXPA, HLT JMP TPUN /PAGE 7 /HREAD /ROUTINE TO SET POINTER FOR READ /LENGTH: 4 REGISTERS HREAD, TAD HIREDI DCA AAA TAD GOREAD JMP TPUN-1 /POPJ ROUTINE TO EXIT RECURSIVELY FROM SUBROUTINES /CHECKS FOR PUSHDOWN UNDERFLOW VIA POP ROUTINE /LENGTH: 3 REGISTERS POPJMP, POP /GET RETURN ADDRESS DCA POPTEM /STICK IT IN POPTEM JMP I POPTEM /EXIT /ROUTINES TO SET PASS FLAG AND APPROPRIATE POINTERS /LENGTH: 13 REGISTERS PASS1, CLA /SET PASS FLAG TO ZERO DCA PF TAD IAM1 /INITIALIZE SYMBOL TABLE POINTER DCA SPNT JMP INITAL /GO INITIALIZE FLAGS,STORAGE PASS2, IAC /SET PASS FLAG TO ONE DCA PF DCA CKSM /CLEAR THE CHECKSUM JMS I LDTI /PUNCH LEADER-TRAILER JMP INITAL /INITALIZE FLAGS AND STORAGE PASS3, CMA /SET PASS FLAG TO -1 DCA PF JMS I LDTI /PUNCH LEADER/TRAILER /PAGE 8 /INITIAL ROUTINE /ROUTINE TO INITIALIZE FLAGS, BUFFERS, AND STORAGE /LENGTH: 15 REGISTERS INITAL, DCA SWITCH /SET END OF TAPE SWITCH TAD TBUF /SET PASS3 BUFFER DCA AUTOC TAD P1BGN /SET PUSHJ,POPJ BUFFER DCA PSHPN1 CMA /SET HIGH SPEED READER BUFFER DCA RCNT TAD C200 /SET ORIGIN TO 200 PUSHJ /SET STAR+3 /AND PUNCH IF PASS 2 TAD LOPUNI /TYPE ON PASS 3 DCA DDD DCA FLAG /COMMENT SWITCH PUSHJ /SET RADIX TO OCTAL OCTALP /PAGE 9 /MAIN ROUTINE /MAIN CALLS CSYM TO ASSEMBLE A LINE OF CODE /AND DECIDES IF ANY PUNCHING OR PRINTING IS TO BE DONE /AND WHETHER THE AACT SHOULD BE INCREMENTED /LENGTH: 27 REGISTERS MAIN, DCA INSF /CLEAR INSTRUCTION FLAG DCA ADDR /CLEAR 12-BIT ADDRESS WORD DCA BINW /CLEAR BINARY WORD DCA OCWD /CLEAR OCTAL WORD DCA SYMVAL /CLEAR SYMBOL VALUE DCA ZFLG /CLEAR Z-BIT FLAG DCA INFO /CLEAR INFORMATION FLAG DCA SIGN /RESET SIGN TO "IOR" PUSHJ /RECURSIVE CALL TO "CSYM" CSYM /ADDRESS FOR PUSHJ HANDLER TAD PF /WHICH PASS? SNA /DON'T PUNCH ON PASS1 OR PASS3 JMP MOUT /PASS1, JUST RESET POINTERS SPA CLA /PASS 3? JMP I POUTI /YES: ASSEMBLY LISTING TAD INFO /NO,PASS 2, ANYTHING TO PUNCH? SNA CLA JMP MOUT /NO, RESET FLAGS CLL /CLEAR LINK FOR BINP ROUTINE TAD BINW /GET ASSEMBLED BINARY WORD JMS I PUNI /PUNCH IT MOUT, TAD INFO /WAS THERE VALID INFORMATION ON THIS LINE? SZA CLA ISZ AACT /YES,INCREMENT CURRENT LOCATION COUNTER NOP /PREPARE FOR ASSEMBLING INTO 7777 JMP MAIN /GO BACK TO MAIN LOOP POUTI, POUT /ADDRESS OF PASS 3 HANDLER /PAGE 10 /MAIN CHARACTER PROCESSOR /GATHERS SYMBOLS ON A LINE-BY-LINE BASIS /SYMBOLS MUST BEGIN WITH A LETTER /LENGTH: 17 REGISTERS CSYM, DCA SYM1 /CLEAR SYMBOL STORAGE WORDS DCA SYM2 DCA SYM3 JMS I AAA /GET A LEGAL CHARACTER JMS I NCHEKI /WHAT KIND OF CHARACTER IS IT? JMP I NUMBI /NUMBER - GO PROCESS ISZ INFO /LETTER, INDICATE VALID INFORMATION TAD M2 /GET UP COUNTERS - 2 CHARS PER WORD DCA TEM1 TAD M4 /AND 3 WORDS PER SYMBOL DCA TEM2 JMP I GETSP /GO PACK IT NXCH, JMS I AAA /GET A LEGAL CHARACTER JMS I NCHEKI /WHAT TYPE OF CHARACTER IS IT? JMP I GETSP /NUMBER LEGAL NOW JMP I GETSP /LETTER- GO PACK IT GETSP, GETS /PAL PUNCH AND TYPE ROUTINE /LENGTH: 6 REGISTERS LOPUN, 0 TSF JMP .-1 TLS CLA /EXIT WITH CLEARED AC JMP I LOPUN /THE PAUSE PSEUDO-OP /LENGTH: 5 REGISTERS STOP, HLT CLA /HALT DCA SWITCH /RESET END-OF-TAPE SWITCH CMA /EMPTY READER DCA RCNT /BUFFER POPJ /EXIT L02, /END OF PAGE /PAGE 11 /ROUTINE TO PACK SIX CHARACTERS IN SYM1, SYM2, SYM3 /LENGTH: 25 REGISTERS *400 GETS, ISZ TEM1 /SHOULD CHARACTER BE ROTATED? JMP ROTE /YES TAD M2 /RESET DCA TEM1 /ROTATION COUNTER PUT, TAD PNTR /WHICH WORD IS THIS? TAD TEM2 /ADDRESS IS FORMED FROM CNTR2 AND A DCA TEM3 /POINTER, TO GET RELEVANT SYMBOL WORD TAD CHAR /GET CHARACTER TAD I TEM3 /ADD IN PREVIOUS CHARACTER DCA I TEM3 /STORE IT JMP I NXCHP /GO GET NEXT CHARACTER ROTE, ISZ TEM2 /THE FOURTH? JMP .+5 /NO: ROTATE IT DCA TEM1 /YES: ARRANGE COUNTERS CMA /SO THAT ALL OTHERS ARE DCA TEM2 /IGNORED JMP I NXCHP /KEEP ACCEPTING CHARS. TAD CHAR CLL RTL /SIX BITS LEFT RTL RTL DCA CHAR /PUT IT BACK IN CHAR JMP PUT /GOT STORE CHARACTER PNTR, SYM3+1 /WORD POINTER NXCHP, NXCH /NEXT CHARACTER ROUTINE /PAGE 12 /PAL SPACE HANDLER /WHEN CALLED, THE SYMBOL TYPE IS IN TYPE /AND THE SIGN ASSOCIATED WITH THE SYMBOL IS IN SIGN /VALUE OF SYMBOL IS IN SYMVAL. /MEMORY REFERENCE INSTRUCTIONS ARE IORED INTO BINW /IF CALLED WITH A + OR -, THE ADDRESS IS ADDED OR SUBTRACTED FROM ADDR /LENGTH: 28 REGISTERS SPAC, TAD INFO /ANYTHING TO PROCESS? SNA CLA POPJ /NO: EXIT TAD TYPE /YES: GET SYMBOL TYPE SNA CLA /IS IT ZERO? JMP INST /YES, INSTRUCTION CMBN, TAD SIGN /GET SIGN SNA /IS IT ZERO? JMP IORC /COMBINE SYMVAL AND ADDR WITH AN IOR SPA CLA /WAS SIGN +? JMP SUBC /NO, SUBTRACT ADDC, TAD SYMVAL /ADD ROUTINE - ADD SYMVAL TAD ADDR /AND ADDR DCA ADDR /AND PUT RESULTS BACK IN ADDR POPJ /RECURSIVE EXIT SUBC, TAD SYMVAL /SUBTRACT ROUTINE - NEGATE CMA IAC /SYMVAL JMP ADDC+1 /JUMP INTO ADD ROUTINE IORC, TAD ADDR /IOR ADDR AND SYMVAL JMS I IORIN /GO TO IOR SUBROUTINE DCA ADDR /LEAVE RESULTS IN ADDR POPJ /RECURSIVE EXIT INST, CLA CMA /SET INSTRUCTION FLAG DCA INSF TAD BINW /IOR BINW AND SYMVAL JMS I IORIN DCA BINW /LEAVE RESULTS IN BINW POPJ /EXIT /PAGE 13 /ROUTINE TO HANDLE CARRIAGE RETURNS /LENGTH: 40 REGISTERS CARR, PUSHJ /RECURSIVE CALL TO SPACE HANDLER SPAC /ADDRESS OF SPACE HANDLER FOR PUSHJ TAD ADDR /GET 12 BIT ADDRESS ISZ INSF /WAS THERE AN INSTRUCTION? JMP DPST /NO AND MPAGE /LOOK AT PAGE BITS SZA /PAGE ZERO REFERENCE? JMP TPAGE /NO, CHECK ILLEGAL PAGE REFERENCE ISZ ZFLG /PUT UP PAGE ZERO FLAG IGO2, TAD ADDR /GET ADDRESS AND SL7 /SAVE SEVEN BITS DCA ADDR /SAVE IT TAD ZFLG /IS THIS A PAGE ZERO REFERENCE? SNA CLA TAD C200 /NO, PICK UP A 1 IN BIT 4 TAD ADDR /GET REST OF ADDRESS TAD BINW /GET INSTRUCTION PART DPST, DCA BINW /THIS IS THE ASSEMBLED WORD POPJ /RECURSIVE EXIT TPAGE, DCA TEM1 /TEST EQUALITY OF PAGE BITS TAD PF /BUT ONLY ON PASS2 OR PASS3 SNA CLA /SINCE REFERENCE MAY STILL BE JMP IGO2 /UNDEFINED ON PASS1 TAD AACT /LOOK AT PAGE BITS OF AACT AND MPAGE CMA IAC /NEGATE IT TAD TEM1 /COMPARE IT WITH CURRENT REFERENCE SNA CLA /ARE THEY EQUAL? JMP IGO2 /YES, RETURN TO PROCESSOR TAD PF /NO, CHANGE PF TO PASS1 PUSH /TO FAKE OUT THE ERROR ROUTINE DCA PF /SAVE PF ON PUSHDOWN, SET TO 0 TAD ADDR /PUT ADDR ON STACK, ALSO PUSH TAD C5 /CODE FOR IR IS 5 PUSHJ /GO TO ERROR ROUTINE ERROR2 POP /RESTORE PF DCA PF JMP IGO2 /RETURN TO PROCESSOR /HANDLER FOR Z PSEUDO-OP ZPAGE, POPJ /IGNORE Z /PAGE 14 /POP ROUTINE TO RECOVER ITEMS FROM THE /PUSHDOWN LIST /CHECKS FOR PUSHDOWN UNDERFLOW /LENGTH: 18 REGISTERS POPM, 0 TAD PSHPN1 /CHECK FOR PUSHDOWN UNDERFLOW CMA IAC TAD P1BGN /PSHPN1 SHOULD BE GREATER THAN SPA CLA /P1BGN JMP POPM2 /POINTER IS OK TAD PSHPN1 /UNDERFLOW PUSH /PUT POINTER ON LIST TAD SL3 /PDL CODE IS 7 PUSHJ /CALL ERROR ROUTINE ERROR2 HLT JMP .-1 /DEAD END POPM2, CMA /RESET POINTER TAD PSHPN1 /SET IT BACK 1 DCA PSHPN1 TAD I PSHPN1 /GET ITEM FROM LIST JMP I POPM /EXIT WITH ITEM IN AC /ROUTINE TO FIX ENTIRE SYMBOL TABLE /LENGTH: 7 REGISTERS FIXT, DCA INFO /NO PUNCHING IN MAIN TAD PF /ONLY ON PASS 1 SZA CLA POPJ /NOT PASS1: EXIT TAD SPNT /ADJUST POINTER DCA IAM1 POPJ /EXIT /ROUTINE TO HANDLE "." /LENGTH: 6 REGISTERS POINT, PUSHJ /REVISION TO TREAT . AS A TERMINATOR SPAC / EXAMPLE - JMP. = JMP . TAD AACT /VALUE OF . IS AACT DCA SYMVAL ISZ INFO /REPRESENTS VALID INFO CLA IAC /TREAT AS SYMBOL DCA TYPE JMP I SPACI L04, /PAGE 15 /DOLLAR ROUTINE /LENGTH: 65 REGISTERS *600 DOLLAR, TAD PF /WHICH PASS IS THIS? SZA SMA CLA /PASS 1 OR PASS3? JMP I EPASS2 /NOPE, IT'S PASS2 CLA OSR RTL SPA /TEST BIT 2 JMP I NEXI /SUPPRESS SYMBOL TABLE RTR RAR SNL CLA /LOOK AT BIT 11 JMP .+3 /IT IS 0; FORGET IT TAD BBB /IT IS 1; SET TO PUNCH DCA DDD TAD CRLF /CR,LF JMS I EEE JMS I LDTI /OUTPUT LEADER-TRAILER TAD C377 /OUTPUT A RUBOUT FOR DDT JMS I DDD DCA LOW /INITIALIZE SORT ROUTINE DCA LOW+1 DCA LOW+2 ELOOP, TAD CRLF /CARRIAGE RETURN, LINE FEED JMS I EEE JMP SORT /GET A SYMBOL FROM SORT ELUP2, TAD I TEM3 /GET FIRST WORD OF SYMBOL SPA /WAS IT DEFINED? JMP UASYM /NO, BIT0 IS 1, ERROR JMS I EEE /YES, OUTPUT FIRST WORD ISZ TEM3 /INCREMENT POINTER TO NEXT WORD TAD I TEM3 /PICK IT UP JMS I EEE /TYPE IT OUT ISZ TEM3 /POINTER TO THIRD WORD TAD I TEM3 /PICK IT UP JMS I EEE /TYPE IT JMS I EEE /TYPE TWO SPACES ISZ TEM3 /INCREMENT POINTER TO VALUE TAD I TEM3 /GET VALUE OF SYMBOL JMS I OCTI /GO TO OCTAL OUTPUT ROUTINE JMP ELOOP /RETURN FOR MORE SYMBOLS OUT1, TAD C204 /OUTPUT AN EOT FOR DDT JMS I DDD TAD CRLF /TYPE A CRLF FOR DDT JMS I EEE TAD C377 /TYPE A RUBOUT FOR DDT JMS I DDD JMS I LDTI /MORE LEADER-TRAILER JMP I NEXI /GO TO NEXT PASS /PAGE 16 UASYM, CLA TAD TEM3 /GET ADDRESS OF SYMBOL PUSH /ON PUSHDOWN LIST TAD TEM3 /GET CURRENT LOCATION TAD C3 /COUNTER WHEN THE SYMBOL DCA TEM3 /WAS LAST SEEN TAD I TEM3 /PUT INTO AACT DCA AACT IAC PUSHJ /GO TO ERROR ROUTINE ERROR1 /CODE FOR UA IS 1 ISZ TEM2 TAD I TEM2 /RESET VALUE TO HIGHEST AND MPAGE /ADDRESS ON PAGE TAD SL7 /SET LOW 7 BITS TO 1 DCA I TEM2 JMP ELOOP /RETURN FOR MORE SYMBOLS EPASS2, BINPUN /PUNCH BINARY TAPE