.TITLE LINKING LOADER - V9A (EDIT #7:10-12-70) / COPYRIGHT 1970, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / PDP 9/15 ADVANCED SOFTWARE PACKAGE - LINKING LOADER /.DAT MUST BE DEFINED FOR ALL ASSEMBLIES /PDP9 DEFINED FOR BANK ASSEMBLY / CONDITIONALIZED FOR I/O MONITOR/ KM9 MONITOR. / TO ASSEMBLE FOR THE I/O MONITOR, START WITH FOLLOWING PARAMETER TAPE: / PTP=0 /DEFINE A SYMBOL 'PTP'. / BANK=0 /0,1,2, OR 3. / LDSTRT=XXXX /LOADER'S LOAD ADDRESS. /FUNCTION OF TOTAL SIZE OF /I/O MONITOR INCLUDING TTA. AND PRA. / .EOT /START ADDRESS=.LOAD / .IFUND PDP9 PDP15=0 .ENDC .IFDEF PTP .IFUND PDP15 .ABS .IFUND BANK BANK=0 .ENDC .ENDC .IFDEF PDP15 .ABSP .IFUND PAGE PAGE=1 .ENDC BANK=PAGE-1/2 .ENDC .LOC LDSTRT .ENDC / IDX=ISZ /USED WHEN NO SKIP INTENDED. .IFUND .DAT .IFDEF PTP .DAT=136 .ENDC .IFUND PTP .DAT=141 .ENDC .ENDC .SCOM=100 .IFUND SCOM20 SCOM20=.SCOM+20 .ENDC .DATBG=.DAT-15 /BEGINNING OF .DAT TABLE .DATND=.DAT+11 /END OF .DAT TABLE LDBEG=. /START OF LINK LOADER. LTEMP1=. SCOM2 .DSA 0 .IFDEF PTP LSMST .SIZE .ENDC .IFUND PTP LSMST .DSA 0 /START OF SYMBOL TABLE. .ENDC LSMEND .DSA 0 /END OF SYMBOL TABLE. TVSCM5 .SCOM+5 /.SCOM+5 TRANS. VECTOR. TVSCM2 .SCOM+2 /.SCOM+2 TRANS. VECTOR. /EXIT FROM LINKING LOADER. LOAD21 CAL 775 /.WAIT ON TTY TO COMPLETE 12 /MEMORY MAP OUTPUT. LAC* (.SCOM+1 /UPDATE .SCOM+2 TO REGISTER JUST ABOVE RESIDENT KM9 OR TO DAC* TVSCM2 /START OF THIS ROUTINE, LOWEST FREE ADDRESS. LAC LPRES DAC* (.SCOM+3 /HIGHEST FREE ADDR. LAC LP20 SNA JMP SCM20 LAC* LP20 XOR (400000 DAC* (SCOM20 SCM20=. DZM* (.DAT-1 /CLEAR LINKING DZM* (.DAT-4 /LOADER .DAT DZM* (.DAT-5 /SLOTS TO DETECT INADVERTENT USER USE. LAC* (.SCOM+6 DAC NOLOAD /USER START ADDRESS. SMA!RAL JMP LOAD30 /NOT $DDT LAC LSMST /START OF SYM. TAB. DAC* (.SCOM+11 /SAVED FOR DDT. LAC LSMEND /HIGH ADDR. DAC* TVSCM2 /SAVED FOR DDT. JMP* TVSCM5 /GO TO DDT. LOAD30 SPA JMP* NOLOAD /$GLOAD - GO TO USER. OUTBF3 IDX WRBFPT /CHANGE ^P TO ^S JMP PRTEOM LTEMP4 373720 /ASCII '>'<175> LTEMP3 0 LTEMP2 0 /GENERAL TEMP. STORAGE 2. LTEMP7 0 LTEMP8 0 WDCNT 0 /LINE BUFFER WORD COUNT. /ALSO USED AS TEMP. STORE. LIBDIR 561411 /.LI LIBDR1 022265 /BR5 021116 /BIN OUTBUF .ASCII 'LOADER V9A'<175> LOCNT=.-1 /LOCAL SYMBOL COUNT FOR COMMON OVERLAYS. / / /BUFFERS, TEMPORARY STORAGE / / NOLOAD .DSA 000000 / SELECTIVE LOADING FLAG LBDF .DSA 0 / BLOCK DATA SUBPROGRAM FLAG LN2BUF .DSA L2BUFF / ADDRESS LINE BUFFER---2 DDTMDE .DSA 0 / NEGATIVE DURING LOADING OF DDT. CWDTAL .DSA 000000 /NON-ZERO IF NO SYMBOLS LRELOC .DSA 0 / CURRENT RELOCATION FACTOR LMAIN .DSA 000000 / MAIN PROG. LOADING FLAG LPLA .DSA 000000 / ADDRESS GENERATED BY CODE 2 DATA WORD LSYM1 .DSA 000000 / FIRST WORD OF SYMBOL TEMPORARY STORAGE LSYM2 .DSA 000000 / SECOND WORD OF SYMBOL TEMPORARY STORAGE. TLSMST .DSA 0 / TEMP. START OF SYM. TAB. LSMW1 .DSA 000000 / PRESENT STORE ADDRESS OF SYMBOL TABLE. LSMPT .DSA 000000 / PRESENT WORD COUNTER IN SYMBOL ENTR. LSMDEF .DSA 000000 / SYMBOL TAPE AND DEFINITION LPRES .DSA 0 / HIGHEST FREE ADDRESS. .IFUND PDP15 / /HIGHEST FREE ADDRESS IN EACH OF THE /FOUR MEMORY BANKS. LPRES3 77777 LPRES2 57777 LPRES1 37777 LPRES0 17777 LPRESS LPRES3-1 LPRESP 0 LP20 0 / .ENDC .IFDEF PDP15 / /HIGHEST FREE ADDRESS IN EACH /OF THE EIGHT 4K MEMORY BANKS. / LPRES3 77777 67777 LPRES2 57777 47777 LPRES1 37777 27777 LPRES0 17777 07777 LPRESS LPRES3-1 LPRESP 0 LP20 0 /NONZERO (POINTS TO FIRST FREE /ODD PAGE)WHEN EXTRA 4 K IS PRESENT / .ENDC LSTRNG=STSYM2 / STRING CODE (FIRST HALF) LCMDEF=STSYM2+1 / ADDRESS OF COMMON BLOCK DEFINITION LCMCHN=STSYM2+2 / COMMON CHAIN ADDRESS (TEMP. STORAGE). LCHN1=STSYM2+3 / TRANSFER VECTOR ADDRESS (TEMP. STOR.). LCHN2=STSYM2+4 / RELATIVE ADDRESS, COMMON NAME (TEMP. STOR.) LDATA1=STSYM2+5 LDATA2=STSYM2+6 LDATA3=STSYM2+7 RECDIN=STSYM2+10 SIZE 0 /SELECTIVE LOADING PROG. SIZE RETAINER /LINE BUFFER #1 LNBUFF=. /LINE BUFFER 50 (DECIMAL) WORDS. DDTDIR 040424 / DDT 0 LNBUF2 021116 / BIN TLITRL XCT+CNTL.T /ADR. FOR ^T TRANFER+BIT0=1 /LINKING LOADER / INITIALIZATION / .IFUND PTP .LOAD LAC* TVSCM2 /FETCH .SCOM + 2 FOR... DAC TLSMST / SYMBOL TABLE START DAC LSMST DAC LSMEND / SYMBOL TABLE END TAD M1 /(-1 DAC IOCONF /IOC POINTER. .ENDC .IFDEF PTP .IFDEF NOPAT .LOAD LAC LSMST NOP .ENDC .IFUND NOPAT .LOAD LAC (LDSTRT DAC* (.SCOM+1 LAC LSMST .ENDC DAC TLSMST DAC* TVSCM2 DAC LSMEND TAD M1 .ENDC DAC* (10 /LOW ADDRESS TO AUTO INDEX 10. LAC* (.SCOM+3 / FETCH .SCOM + 3 FOR ... DAC LPRES / PRESENT LOAD ADDRESS DZM* 10 /ZERO FREE CORE. SAD* (10 SKP JMP .-3 /ROUTINE TO 0 MEMORY PAGE ADDRESSES OF MEMORY BANKS/PAGES THAT DO NOT EXIST. LAC LPRESS /ADDRESS -1 OF BLOCK OF ADDRESSES DAC LPRESP BANK1 IDX LPRESP LAC* LPRESP DAC* (10 /FOR CLEARING XTRA 4K IF PRESENT DZM* LPRESP XOR LPRES /.SCOM+3 .IFUND PDP9 AND (70000 /PAGE MASK .ENDC .IFDEF PDP9 AND (60000 .ENDC SZA JMP BANK1 /.SCOM+3 NOT POINTING TO THIS PAGE LAC LPRES DAC* LPRESP /AVOID BOOTSTRAP LAC* (SCOM20 SMA!CLA!CMA JMP BANK2 /NO XTRA 4K /XTRA 4K, CORRECT ADDRESS TABLE AND CLEAR CORE. TAD LPRESP /BACKUP POINTER. DAC LP20 .IFUND PTP LAW -10000 DAC LTEMP2 DZM* 10 /CLEAR XTRA 4K ISZ LTEMP2 JMP .-2 LAC* (10 DAC* LP20 /CORRECT ADDRESS TABLE ENTRY. .ENDC .IFDEF PTP LAC* (SCOM20 AND (77777 DAC* LP20 DZM* 10 SAD* (10 SKP JMP .-3 .ENDC BANK2 LAC* (.SCOM+6 SMA JMP LOAD02 / NOT A SYSTEM LOAD .IFUND PTP DAC DDTMDE / NEGATIVE DURING DDT LOAD. .ENDC .IFDEF PTP JMP .LOADT .ENDC / /THIS SPACE IS RESERVED FOR THE MEANS WHEREBY A PROGRAM IS /LOCATED AND POSITIONED FOR INPUT---.SEEK WITH DDT ENTRY BLOCK. / /.INIT -1 CAL 777 1 LLCTLP /CONTROL P RETURN. 0 /.SEEK -1, DDTDIR DATM1 CAL 777 3 DDTDIR LAC DATM1 /INITIALIZE READ MACRO TO INPUT FROM THE DAC LL010 / SYSTEM DEVICE (.DAT SLOT -1). LAC TLITRL /BIT0=1; ^T XFER ADR. DAC DDTCTL /^T INIT FOR ENTRY TO DDT. JMS LL000 / LOAD SYSTEM PROGRAM - DDT /BUFFER #1 ENDS HERE. LTEMP5=. .IFUND PTP DAC* TVSCM5 /PUT STARTING ADDRESS IN .SCOM+5 .ENDC .IFDEF PTP .LOADT LAC* TVSCM5 .ENDC LTEMP6 DAC TVSCM5 /.CLOSE -1 /BUFFER #2 BEGINS HERE. L2BUFF=. .IFUND PTP CAL 777 6 LAC DDTMDE /BIT 2=1 OF DDTNS, LOAD, OR GLOAD .ENDC .IFDEF PTP LAC TLITRL DAC DDTCTL LAC* (.SCOM+6 .ENDC LOAD02 AND (100000 DAC DDTMDE /NON-0 IF NO SYMBOLS LOADED /FETCH COMMAND INPUT FROM KEYBOARD OR BATCH DEVICE /RETURN TO 'RESTART' ON CONTROL P TO START FRESH COMMAND STRING RESTART LAC TLSMST /RESTART COMMAND STRING BY DAC LSMEND /RESETTING END OF SYM. TAB. POINTER DZM PSWCH DZM GSWCH DZM CSWCH DZM OPSWCH /.INIT -3 CAL 1775 /PRINT CAR. RET. LIN. FD. ON TTY. 1 RESTART /CONTROL P RESTART ADR. SYMFLG 0 /USED BELOW TO FLAG FULL SYMBOL /.WRITE -3,2,OUTBUF-2,6 CAL 2775 /IOPS ASCII TO TTY 11 OUTBUF-2 /PRINT 'LOADER V?A' L175 175 /ASCII FOR ALT MODE. /.INIT -3 CAL 1775 /PRINT CAR. RET. LIN. FD. ON TTY. 1 DDTCTL RESTART /IF DDT LOADED, THIS ADR WILL BE 0 /^T TRANSFER ADR. /.WRITE -3,3, OUTBF3,4 LOAD03 CAL 2775 /IOPS ASCII TO TTY. 11 OUTBF3 /PRINT '>' TO TELL USER BUFPTR LNBUF2 /TO TYPE IN COMMAND STRING /.READ -2,2 LNBUFF,50. CAL 2776 /IOPS ASCII FROM TTY OR BATCH DEVICE 10 LNBUFF /READ A LINE INTO BUFFER #1. -62 /.WAIT -2 CAL 776 /WAIT FOR LINE TO BE READ IN 12 LAC BUFPTR /INIT. LINE BUFFER PTR. DAC LTEMP1 LAW -1 /INIT. 5/7 CHAR. BYTE COUNT. DAC LTEMP2 LOAD04 DZM SYMFLG /SYMBOL FLAGGED "NOT FULL." DZM WDCNT /CLEAR WORD TERMINATOR. LAW -2 DAC LTEMP3 /INIT. 2-WORD SYMBOL COUNT. DZM LSYM2 /INIT. TEMP. SYM. AC. SET3 LAW -3 DAC LTEMP8 /INIT. 3 CHAR. PER WORD COUNT. SKP NAMEND DAC WDCNT /SAVE TERMINATOR. GETCHA CLA!CLL SAD WDCNT /SKIP IF WORD TERMINATED. JMP GETIT SAD SYMFLG /SKIP IF SYMBOL FULL. JMP JUSTFY /FILL REM. OF SYM. WITH 0'S JMP ENTERS /ENTER IN SYMBOL TABLE. GETIT ISZ LTEMP2 /SKIP IF BYTE COUNT RUNS OUT JMP GETNEX /BUFFER #2 ENDS HERE. LAW -5 DAC LTEMP2 /RESET BYTE COUNT TO 5. LAC* LTEMP1 /GET NEXT 5/7 WORD PAIR DAC LTEMP5 /WORD 1 IDX LTEMP1 LAC* LTEMP1 DAC LTEMP6 /WORD 2 IDX LTEMP1 GETNEX LAW -10 DAC LTEMP7 /SET COUNT TO DO 7+1/2 SHIFTS ROTMOR LAC LTEMP6 /SHIFT WORD 2 WITH LINK RAL ISZ LTEMP7 /SKIP IF CHAR IN POSITION JMP DOWRD1 AND OCT177 /MASK TO 7 BITS DAC LTEMP7 /SAVE FOR REFERENCE LAC OPSWCH SZA JMP NAMES LAC LTEMP7 SAD (103 /C DAC CSWCH SAD (107 /G DAC GSWCH SAD (120 /P DAC PSWCH SAD (137 /_ OPTION TERMINATION DAC OPSWCH SAD L175 /ALT. MODE JMP RESTART SAD PLUS15 /CR RET JMP LOAD03 JMP GETCHA NAMES LAC LTEMP7 SAD (54 /COMMA JMP NAMEND SAD L175 /ALT MODE JMP NAMEND SAD PLUS15 /CAR. RET. JMP NAMEND SAD PLUS12 /IGNORE LINE FEED JMP GETCHA SAD SPACE /IGNORE SPACE JMP GETCHA LAC SYMFLG /IGNORE IF SYMBOL FULL SZA!CLL JMP GETCHA LAC LTEMP7 /TRIM CHAR. TO SIXBIT AND (77 JUSTFY XOR LSYM2 /ADD IN ACCUMULATED SYMBOL. ISZ LTEMP8 /SKIP IF HAVE 3 CHARS JMP LDROTA ISZ LTEMP3 /SKIP IF SYM. FULL. JMP HAFFUL IDX SYMFLG /NON-ZERO TO FLAG MEANS FULL JMP STSYM2 HAFFUL DAC LSYM1 /SAVE FIRST HALF DZM LSYM2 JMP SET3 /RESET 3-CHAR. PER WORD COUNT LDROTA RTL /SHIFT PARTIAL SYMBOL WORD LEFT 6. RTL RTL STSYM2 DAC LSYM2 /THIS + NEXT 8 REGS. ARE USED JMP GETCHA /LATER ON FOR TEMP STORAGE DOWRD1 DAC LTEMP6 /WORD 2. LAC LTEMP5 /WORD 1. RAL DAC LTEMP5 JMP ROTMOR ENTERS LAC LSYM1 /ENTER FILENAME IN SYMTAB JMS LSTSYM LAC LSYM2 JMS LSTSYM LAC LIBDIR+2 /WITH EXTENSION NAME 'BIN'. JMS LSTSYM LAC WDCNT /COMMA, CAR. RET., OR ALT MODE. SAD (54 /COMMA? JMP LOAD04 SAD PLUS15 /CAR. RET.? JMP LOAD03 /COMMAND STRING ALL IN SYMBOL TABLE /.INIT -3 CAL 775 /PRINT CAR. RET. LIN. FD. ON TTY. 1 LLCTLP /CONTROL P TRANSFER ADDRESS FOR SPACE 40 /EOM RESTARTS ON INPUT. .WAIT -3 LAC LSMEND DAC LSMST / END OF FILE DIR. ENTRY BLOCKS. LOAD08 LAC TLSMST SAD LSMST JMP LOAD06 / COMMAND STRING IS EXHAUSTED DAC LOAD07 / SET .SEEK ADDRESS TAD (3 DAC TLSMST / UPDATE COMMAND STRING FILE BLOCK ADDR. DZM RECDIN / INDICATES NEW READ NECESSARY. /.INIT -4 CAL 774 1 DAT. .DAT LNBUFP 0 /LINE BUFFER POINTER / .SEEK -4,X / FILE ORIENTED SETUP. LODC20 CAL 000774 / DEVICE -4 .DSA 000003 / SEEK CODE LOAD07 .DSA 000000 / ADDRESS FILE DIRECTORY BLOCK LODM4 LAC LODC20 / DAT SLOT -4 DAC LL010 JMS LL000 / LOAD THE PROGRAM UNIT AND L77777 DAC LTEMP1 / SAVE START ADDRESS LAC LMAIN / 1ST PROGRAM LOADED IS MAIN PROGRAM SZA!CLA!CMA JMP LODM4 DAC LMAIN LAC* (.SCOM+6 /SET PROGRAM STARTING ADDRESS WHICH IS AND LFTSVN /THE STARTING ADDRESS OF THE MAIN XOR LTEMP1 / PROGRAM) IN .SCOM + 6 WITHOUT DAC* (.SCOM+6 / DISTURBING BITS 0-2 JMP LODM4 CLM4 .CLOSE -4 JMP LOAD08 /IF USER TYPES CONTROL T, TRANSFER HERE. CNTL.T CAL 775 /.CLOSE -3 TO PRINT 6 /CAR. RET. LIN. FD. / SELECTIVELY LOAD REQUESTED SUBPROGRAMS FROM THE LIBRARY (S) / WHEN COMMAND STRING IS EXHAUSTED. LOAD06 DZM LODSW JMS LOAD60 SAD (100000 JMP LOAD15 LAC (100000 DAC DDTMDE / INHIBIT DDT SYMBOL LOADING OF LIBRARY PROGRAMS LAC* (.DAT-5 /SET UP TO READ FROM EXTERNAL LIBRARY / BEFORE SYSTEM DEVICE IF ONE IS / AVAILABLE. SNA JMP MDCL21 LAC (-5&777 JMP LOAD81 / .CLOSE X MODCAL CAL / .CLOSE LIBRARY FILE. 6 /NOW ASSIGN COMMON / LOAD15 JMS LOAD60 / SCAN SYMBOL TABLE FOR COMMON BLOCK NAMES SAD LFTSVN JMP GLOBE / ALL DEFINED (OR NONE EXIST) JMS UFSMPT / ADDRESS OF COMMON BLOCK NAME DAC LSYM1 SPA JMS UFSMPT DAC LSYM2 LAC LSMPT TAD (1 DAC LCMCHN / ADDRESS OF CHAIN TAD (1 DAC LCMDEF / ADDRESS OF DEFINITION LAC* LCMDEF SZA JMP LOAD16 / BLOCK ALREADY DEFINED LAC* LSMW1 AND L77777 /BLOCK SIZE CMA / 2'S COMP. TAD (1 DAC SIZE LAC LSMEND DAC UFSMPT / TEMPORARY STORAGE LAC* (.SCOM+1 /LET LSMEND BE WHAT IT WOULD DAC LSMEND /BE AT EXECUTION TIME. IDX COMFLG /SET DEFINING-COMMON-FLAG. JMS FIT LAC LRELOC / SUBTRACT BLOCK SIZE FROM CURRENT LOAD DAC* LCMDEF / ADDRESS TO DETERMINE BLOCK DEFINITION JMS MEMAP1 LAC (103 /C LAC LRELOC LAC UFSMPT / ANNOUNCE AN ERROR IF MEMORY OVERFLOWS. DAC LSMEND /RESTORE END POINTER. JMS DEFCOM / DEFINE MEMBERS OF THE COMMON BLOCK LOAD16 LAC* LSMW1 / CHANGE BLOCK CODE TO 3 SO THAT IT WILL AND (377777 / NOT BE FOUND AGAIN. DAC* LSMW1 JMP LOAD15 /SEARCH FOR REMAINING UNDEFINED GLOBALS. IF ANY MATCH COMMON /BLOCK NAMES, DEFINE THEM TO BE THE ADDRESS OF THE COMMON BLOCK. GLOBE DZM NOLOAD JMS LOAD60 /ARE THERE ANY UNRESOLVED GLOBALS? GLOBRT SAD (100000 JMP ANYUND /NONE THAT CAN BE RESOLVED. LAC LSMPT /SAVE POINTER TO GLOBAL ENTRY. DAC LTEMP8 JMS UFSMPT /GET GLOBAL'S NAME. DAC LSYM1 JMS UFSMPT DAC LSYM2 LAW /SET MATCH CODE TO SEARCH FOR DAC LSMDEF /COMMON BLOCK NAME. JMS LSMSCN /IS THERE A COMMON BLOCK WITH SNA /THIS GLOBAL'S NAME? JMP REST /NO. LAC .-1 /YES. SETUP RETURN ADDRESS. DAC GLOBX IDX LSMPT /PICKUP ADDRESS OF COMMON BLOCK. JMS UFSMPT JMP LCD10E /GO DEFINE THE GLOBAL. REST LAC LTEMP8 /RESTORE THE SYMTAB PTR TO CONTINUE DAC LSMW1 /SEARCH FOR UNRESOLVED GLOBALS. LAC (GLOBRT DAC LOAD60 JMP CONTIN ANYUND JMS LOAD60 /ANY UNRESOLVED GLOBALS? SAD (100000 JMP LOAD21 /NO. PREPARE TO EXIT FROM LOADER. JMPER3 JMP ERROR3 /YES. /SUBROUTINE TO SEARCH SYMBOL TABLE FOR VIRTUALS OR BLOCK NAMES /CALLING SEQUENCE... / JMS LOAD60 / SAD (SYMBOL CODE / JMP NOT FOUND / XXX FOUND / LOAD60 CAL 0 LAC LSMST LOAD62 DAC LSMPT / CURRENT ENTRY ADDRESS DAC LSMW1 SAD LSMEND JMP LOAD61+1 / NOT FOUND LAC* LSMPT / FETCH SYMBOL CODE OF NEXT ENTRY AND LFTSVN XCT* LOAD60 / DOES SYMBOL CODE MATCH SEARCH CODE JMP LOAD61 / YES CONTIN JMS NXCNT / NO, UPDATE SEARCH ADDRESS TO NEXT ENTRY JMP LOAD62 LOAD61 IDX LOAD60 / SYMBOL FOUND IDX LOAD60 / SYMBOL NOT FOUND JMP* LOAD60 /SUBROUTINE TO RESOLVE VIRTUAL GLOBALS / LOAD81 DAC LL010 / SET PROPER READ CODE DAC MODCAL / SET UP DAC MDCAL2 / I/O DAC MDSEEK / CAL'S DAC MDINIT DZM RECDIN /SET NEW READ INDICATOR. /.INIT X MDINIT CAL 1 L77777 77777 CODEWD 0 /LOADER CODE WORD /.SEEK X,LIBDIR MDSEEK CAL / SEEK 3 / LIBR LIBDIR / FILE. LOAD82 IDX NOLOAD / LOAD SELECTIVELY JMS LOAD60 / SCAN SYMBOL TABLE TO SEE IF ANY SAD (100000 / UNRESOLVED GLOBALS EXIST JMP MODCAL /ALL GLOBALS RESOLVED READ JMS LL000 /SEE IF THIS PROGRAM HELPS LAC NOLOAD SZA JMP READ /NO VIRT. RESOLVED. JMP LOAD82 LODSW 5 LODSW1 SAD LODSW JMP CLM4 /.CLOSE X MDCAL2 CAL / .CLOSE .LIBR 6 / FILE MDCL21 LAC (022200 SAD LIBDR1 / SWITCH TO SYSTEM LIBRARY IF EXTERNAL IS JMP LOAD15 /EXHAUSTED. SYSTEM LIBRARY IS EXHAUSTED DAC LIBDR1 LAC (777 JMP LOAD81 / ONLY WHEN GLOBALS CANNOT BE RESOLVED. /SUBROUTINE TO LOAD A PROGRAM UNIT. /RETURNS WITH STARTING ADDRESS IN AC. /IT IS DOUBLE BUFFERED EXCEPT WHEN /IT IS LOADING DDT IN BULK STORAGE /SYSTEMS. LL000 0 LAC LL010 /PLACE .DAT SLOT # DAC LL014 /IN .WAIT CALL AND DAC LL015 /IN OTHER .READ CALL. LL002 LAC DDTMDE SMA /IS DDT BEING LOADED. JMP LL017 /NO. LL018 LAC LNBUF /YES.SET POINTER DAC LNBUFP /TO BUFFER A LAC LN2BUF /SET UP 2ND .READ TO DAC LL016 /READ INTO L2BUFF. /.READ X,0,LNBUFF,50 /READ ONE LINE BUFFER LL010 CAL 0 /OF BINARY WORDS 10 /INTO LNBUFF. LNBUF LNBUFF /ADDRESS LINE BUFFER 1 -62 /.WAIT X /WAIT FOR BINARY INPUT. LL014 CAL 0 12 LL001 LAC* LNBUFP AND L17 SAD PLUS6 JMP PRTEOM SAD (5 /EOF JMP LODSW1 LAC* LNBUFP /CHECK BITS 12 AND (60 /AND 13 OF 1ST SZA /WORD OF L.B. HEADER JMP ERROR2 /FOR PARITY, CHECKSUM, BUF. OVRFLOW 777000 /PICK UP THE WORD TAD* LNBUFP /PAIR COUNT AND AND .-2 /MULTIPLY BY 2 CLL!RAL /SUBTRACT 2 FOR HEADER. DAC WDCNT LAC DDTMDE SPA!CLA!CMA /IS DDT BEING LOADED JMP LL041 /YES DAC RECDIN /INDICATES .READ IN PROGRESS. /.READ X,0,BUFFX,50 LL015 CAL 0 /READ ONE LINE OF 10 /BINARY WORDS INTO LL016 XX /L2BUFF OR LNBUFF -62 /DATA CODE WORD FETCH ROUTINE. /THIS ROUTINE SELECTS THE CODE WORD FROM THE LINE BUFFER AND DETER- /MINES WHICH DATA WORD PROCESSING ROUTINE TO ENTER. / LL041 IDX LNBUFP /SET LINE BUFFER POINTER TO WORD THREE OF IDX LNBUFP /THE LINE BUFFER WHICH IS THE FIRST WORD /OF THIS DATA LINE. MIN4=. LL005 LAW -4 /STORE CODE WORD SHIFT TALLY TO DETERMINE DAC CWDTAL /WHEN NEXT CODE WORD IS TO BE SELECTED. JMS WRDCHK /STORE CODE WORD IN TEMP STORAGE FOR DAC CODEWD /FURTHUR USE. CODE1 LAC CODEWD ISZ CWDTAL /DECREASE CODE TALLY WORD. SKP!RTL JMP LL005 /GO GET NEXT CODE WORD RTL /SHIFT CODE WORD SO THAT PRESENT CODE IS RTL /IN LOW ORDER SIX BITS (12-17) ACC. DAC CODEWD RAL AND (77 /EXTRACT OUT EVERYTHING BUT 12-17 (CODE) DAC LTEMP1 /SAVE LOADING CODE LAC NOLOAD SNA /ONLY SELECTIVE LOADING CODES ARE JMP LL009 /EXAMINED WHEN NO-LOAD IS IN EFFECT. LAC LTEMP1 /SELECTIVE LOADING. SAD (1 JMP LL009 /PROGRAM SIZE SAD (7 JMP LL009 /SYMBOL SAD (10 JMP LL009 /SYMBOL SAD PLUS12 /INTERNAL GLOBAL DEFINITION-CODE10 JMP LL009 SAD (27 /END OF PROGRAM UNIT-CODE 23 JMP LL009 .IFDEF PDP15 SAD (31 /.EBREL JMP LL009 SAD (32 /.DBREL JMP LL009 .ENDC SAD (13 /BLOCK DATA SUBPROGRAM-CODE 11 JMP LL008 JMS WRDCHK /BYPASS DATA WORD. JMP CODE1 /FETCH NEXT CODE LL008 DZM NOLOAD /CLEAR FOR BLOCK DATA LOADING LL009 LAW -33 TAD LTEMP1 SMA JMP ERROR2 TAD LL007 /ADD START ADDRESS OF TRANSFER VECTOR TABLE DAC LL006 /STORE ADDRESS IN JMS TO PROPER DATA PROC. JMS WRDCHK /LOAD DATA WORD FOR THIS CODE LL006 JMP* ENTRY /JUMP TO PROPER DATA WORD PROCESSOR PROG. /END OF MEDIUM. / .WRITE -3,2,EOMBUF,4 PRTEOM CAL 2775 /PRINTS ^S AT END OF LOAD, IF $LOAD. 11 /NORMALLY IT PRINTS ^P AT AN EOM. WRBFPT EOMBUF /THIS LOC INDEXED WHEN DOING ^S. M3100 LAW -3100 /CONSTANT EOMBUF JMP . /NEW MEDIUM IN DEVICE MDATND -.DATND 572417 /.ASCII <136>'P'<175> 572477 /.ASCII <136>'S'<175> 500000 /END OF ALTMODE. LFTFVE=.-1 /TABLE OF DATA WORD PROCESSOR ADDRESSES / LL007 JMP* ENTRY .DSA ERROR2 /CODE 00 - ILLEGAL .DSA LCD01 /CODE 01 .DSA LCD02 /CODE 02 .DSA LCD03 /CODE 03 .DSA LCD04 /CODE 04 .DSA LCD05 /CODE 05 .DSA LCD06 /CODE 06 .DSA LCD07 /CODE 07 .DSA LCD08 /CODE 08 .DSA LCD09 /CODE 09 .DSA LCD10 /CODE 10 .DSA LCD11 /CODE 11 .DSA LCD12 /CODE 12 .DSA LCD08 /CODE 13 .DSA LCD14 /CODE 14 .DSA LCD15 /CODE 15 .DSA LCD16 /CODE 16 .DSA LCD17 /CODE 17 .DSA LCD18 /CODE 18 .DSA LCD19 /CODE 19 .DSA LCD20 /CODE 20 .DSA LCD21 /CODE 21 .DSA LCD22 /CODE 22 .DSA LCD23 /CODE 23 .DSA CODE1 /CODE 24 - 18 BIT PARAMETER ASSIGNMENT .IFDEF PDP15 .DSA LCD25 /CODE 25 .DSA LCD26 /CODE 26 .ENDC .IFUND PDP15 .DSA CODE1 .DSA CODE1 .ENDC ENTRY=. WRDCHK 0 /CHECK IF BUFFER EXHAUSTED, LAC WDCNT /IF NOT RETURN WITH SNA /WORD IN AC. JMP LL002 /GO READ NEXT LINE. TAD TH777 /DECREMENT WORD COUNT DAC WDCNT /BY 1. LAC* LNBUFP /PICK UP WORD. IDX LNBUFP /INDEX POINTER. JMP* WRDCHK /DDT NOT BEING LOADED---DOUBLE BUFFER. LL017 LAC RECDIN SNA /IS .READ IN PROGRESS. JMP LL018 /NO. LL019 LAC LL016 /SET UP TO PROCESS DAC LNBUFP /BUFFER JUST FILLED LAC LNBUF SAD LNBUFP LAC LN2BUF LL021 DAC LL016 /SET UP TO READ JMP LL014 /INTO OTHER /CODE 01 DATA WORD PROCESSOR -PROGRAM UNIT SIZE / LCD01 SPA!CMA JMP LDABS /ABSOLUTE PROG. TAD (1 /TWO'S COMP. PROGRAM UNIT SIZE DAC SIZE /STORE IN TEMP STORAGE LAC NOLOAD SZA JMP LDABS /SELECTIVE LOAD JMS FIT JMP CODE1 FIT 0 LAC LPRESS /START LOOKING AT HIGHEST CORE BANK. DAC LPRESP FITLP IDX LPRESP .IFUND PDP15 LAC LPRESP SAD (LPRESS JMP ERROR1 /NO MORE CORE. LAC* LPRESP .ENDC .IFDEF PDP15 LAC* LPRESP SAD LPRESS JMP ERROR1 .ENDC SNA JMP FITLP /NO ROOM IN THIS BANK. TAD SIZE /COMPUTE POSSIBLE LOAD ADDRESS TAD (1 DAC LRELOC /STORE RELOCATION FACTOR DAC LPLA /STORE PROGRAM LOAD ADDRESS SPA!CMA JMP ERROR1 /NO ROOM IN CORE. TAD LSMEND SMA!CLA JMP ERROR1 /OVERLAPPED THE SYMBOL TABLE. SAD COMFLG /DEFINING COMMON? JMP NONCOM /NO. LAC* LPRESP /YES. WILL IT FIT IN THIS BANK? XOR LPLA .IFUND PDP15 AND (60000 .ENDC .IFDEF PDP15 AND (70000 .ENDC SNA!CLC JMP ONEBNK /YES. LAC LPRESP /NO. REQUIRES BANK OVERLAPPING. DAC TEMP9 COMLP IDX TEMP9 /POINT TO NEXT LOWER BANK. LAC* TEMP9 /BANK MUST BE UNUSED, I.E. .IFUND PDP15 AND L17777 /POINTER MUST POINT TO SAD L17777 /HIGHEST REGISTER IN THE BANK. .ENDC .IFDEF PDP15 AND (7777 /POINTER MUST POINT TO SAD (7777 /HIGHEST REGISTER IN THE PAGE .ENDC SKP JMP FITLP /BANK IS IN USE. LAC* TEMP9 /IS THE LOAD ADDRESS IN THIS BANK? XOR LPLA .IFUND PDP15 AND (60000 .ENDC .IFDEF PDP15 AND (70000 .ENDC SZA!CLC JMP COMLP /NO. TAD LPLA DAC* TEMP9 /SET NEW FREE ADR. IN LOWEST USED BANK. ZLOOP LAW -1 /ZERO THE HIGHER POINTERS TAD TEMP9 /TO THE BANKS USED. DAC TEMP9 DZM* TEMP9 LAC TEMP9 SAD LPRESP JMP BITMOR JMP ZLOOP NONCOM LAC LPLA TAD (-20 /PREVENT LOADING INTO 0-17 OF UPPER MEM BNKS XOR* LPRESP .IFUND PDP15 AND (60000 /DOES PROGRAM LIE ENTIRELY IN THE .ENDC .IFDEF PDP15 AND (70000 .ENDC SZA!CLC /CURRENT MEMORY BLOCK JMP FITLP ONEBNK TAD LPLA DAC* LPRESP /SET NEW FREE ADR. PTR. FOR THIS BANK. .IFUND PDP15 AND L17777 SAD L17777 .ENDC .IFDEF PDP15 AND (7777 SAD (7777 /IN CASE LOAD ADDRESS IS 1ST LOCATION IN BANK .ENDC DZM* LPRESP BITMOR LAW -1 /CALCULATE THE HIGHEST REGISTER TAD LPLA /AVAILABLE FOR USE BY THE DAC TEMP9 /SYMBOL TABLE. CMA!CLL TAD LPRES LAC TEMP9 SZL DAC LPRES JMP* FIT TEMP9 0 COMFLG 0 .IFDEF PDP15 LCD25 LAC (17777 SKP LCD26 LAC (7777 DAC ADSWCH JMP CODE1 .ENDC / /ABSOLUTE PROGRAM. LDABS DZM LRELOC /NO RELOCATION. JMP CODE1 /CODE 02 DATA WORD PROCESSOR - PROGRAM LOAD ADDRESS / LCD02 TAD LRELOC /THE PROGRAM LOAD ADDRESS IS ABSOLUTE DAC LPLA /IF BIT 0 IS A ONE AND LRELOC CONTAINS 0. JMP CODE1 /CODE 03 DATA WORD PROCESSOR - RELOCATABLE INSTRUCTION / /CODE 04 DATA WORD PROCESSOR - ABSOLUTE INSTR/CONST/ADDRESS / LCD03 JMS LMOD13 /GO ADD CURRENT RELOCATION FACTOR[MOD 13] LCD04 DAC* LPLA /TO DATA WORD. STORE DATA WORD IN ADDRESS IDX LPLA /SPECIFIED BY PRESENT LOAD ADDRESS. RETURN JMP CODE1 /TO PROCESS NEXT DATA WORD. /CODE 05 DATA WORD PROCESSOR - RELOCATABLE VECTOR / LCD05 TAD LRELOC /ADD CURRENT RELOCATION FACTOR (MOD 15) JMP LCD04 /STORE DATA WORD. /CODE 06 DATA WORD PROCESSOR - NON COMMON STORAGE ALLOCATION / LCD06 TAD LPLA /ADD CURRENT PROGRAM LOAD ADDRESS JMP LCD02+1 /STORE ADJUSTED LOAD ADDRESS /RETURN TO PROCESS NEXT DATA WORD /CODE 07 DATA WORD PROCESSOR - SYMBOL-FIRST THREE CHARACTERS / - RADIX 50 (OCTAL) LCD07 DAC LSYM1 /STORE FIRST WORD OF SYMBOL IN TEMP. STORE. JMP CODE1 /RETURN TO PROCESS NEXT DATA WORD. / / /CODE 08 DATA WORD PROCESSOR - SYMBOL-SECOND THREE CHARACTERS / - RADIX 50 (OCTAL) LCD08 DAC LSYM2 /STORE SECOND WORD OF SYMBOL IN TEMMPORARY JMP CODE1 /STORAGE RETURN TO PROCESS NEXT DATA WORD /CODE 09 DATA WORD PROCESSOR - VIRTUAL GLOBAL SYMBOL DEFINITION / LCD09 TAD (100000 /ADD CODE FLAG FOR VIRTUAL SYMBOL DEF. TAD LRELOC /ADD RELOCATION FACTOR DAC LSMDEF /STORE IN TEMPORARY DEFINITION LOCATION. JMS LSMSCN /SCAN SYMBOL TABLE TO DETERMINE IF THIS SZA JMP CD092 LCD09A JMS LSMSTR JMP CODE1 / SNA /SYMBOL HAS BEEN PREVIOUSLY ENTERED. GO SEE / JMP CD106 /IF SYMBOL HAS BEEN DEFINED /STORE DEFINITION AND SYMBOL IN /SYMBOL TABLE AS THIS SYMBOL HAS NOT BEEN / /PREVIOUSLY ENTERED. CD092 DAC* LSMDEF /STORE DEFINITION IN TRANSFER VECTOR. LAC* LSMW1 SPA /IF GLOBAL IS STILL A VIRTUAL, GIVE IT JMP CODE1 /THE ADDRESS OF THIS TRANSFER VECTOR LAC LSMDEF /AS ITS NEW DEFINITION (EFFECTIVELY DAC* LSMW1 /STRINGING VIRTUAL VECTORS). JMP CODE1 /ALL GLOBALS NOT RESOLVED. ERROR3 LAC (107 /G DAC GSWCH JMS LOAD60 /PRINT NAMES SAD (100000 /OF UNRESOLVED JMP ERR3 /GLOBALS. DZM* LSMPT /AVOID REPETITION. JMS UFSMPT /1ST 3 CHARS DAC LSYM1 /OF NAME JMS UFSMPT /2ND OF 3 CHARS. DAC LSYM2 / OF NAME JMS MEMAP1 /OUTPUT NAME LAC (107 /G CLA JMP ERROR3 /KEEP GOING ERROR2 LAW 17544 /DATA ERROR. - ASCII 2 ERROUT DAC ERRNO /7-BIT ASCII ERROR NUMBER /.WRITE -3,2,ERRBUF,10 CAL 2775 11 ERRBUF M50 LAW -50 /.CLOSE -3 ERRCLS CAL 775 PLUS6 6 /.EXIT ERR1 CAL /RETURN TO MONITOR. 15 L17777=. ERRBUF 17777 M1 LAW -1 .ASCII ' .LOAD '<177> ERRNO=.-1 LFTSVN=ERRNO /USED AS A LITERAL. L17 17 LSYMBL SYMBOL+500000 ERR3 LAW 17546 /ASCII 3 JMP ERROUT /CODE 10 DATA WORD PROCESSOR - INTERNAL GLOBAL SYMBOL DEFINITION / LCD10 TAD LRELOC /ADD RELOC FACTOR - SET SYMBOL DEF. LCD10E DAC LTEMP1 /ENTRY POINT FOR GLOBE ROUTINE. TAD LFTFVE /ADD INTERNAL GLOBAL SYM. DEF. CODE TO DAC LSMDEF /TO ADDRESS. STORE IN TEMPORARY DEFINITION JMS LSMSCN /LOCATION TILL SYMBOL IS LOCATED. GO SEE IF SZA /SYMBOL HAS BEEN ENTERED IN SYMBOL TABLE. JMP CD102 /JUMP IF SYMBOL IS IN THE TABLE. SAD NOLOAD /UNREQUESTED INTERNAL GLOBALS ARE LOADED SKP JMP CODE1 /WHEN THEY FOLLOW REQUESTED GLOBALS OR /DURING UNCONDITIONAL LOADING. CD106 JMS LSMSTR /STORE DEFINITION AND SYMBOL IN SYMBOL JMS MEMAP1 LAC (107 /G LAC LTEMP1 GLOBX JMP CODE1 /TABLE AS THIS SYMBOL HAS NOT BEEN PREV- / /IOUSLY ENTERED. CD102 DAC LTEMP2 /SAVE REFERENCE ADDRESS IF UNDEFINED LAC* LSMW1 SPA!CLA /CHECK TO SEE IF GLOBAL IS DEFINED /IF DEFINED, IT HAS ALREADY BEEN LOADED JMP CODE1 /ALREADY DEFINED. SAD NOLOAD JMP CD107 /NON SELECTIVE LOAD JMS FIT DZM NOLOAD /CLEAR FOR LOADING LAC LRELOC TAD LTEMP1 DAC LTEMP1 TAD LFTFVE DAC LSMDEF CD107 LAC LSMDEF DAC* LSMW1 /DEFINE SYMBOL AS INTERNAL GLOBAL CD104 LAC* LTEMP2 AND L77777 /MASK OFF UNIT NO. DAC LSMDEF /FETCH AND SAVE NEXT REFERENCE ADDRESS LAC* LTEMP2 AND LFTSVN /PRESERVE UNIT NO. XOR LTEMP1 DAC* LTEMP2 /PUT SYMBOL DEF. IN CONTENTS OF REF. ADR. LAC LSMDEF SAD LTEMP2 /CHAIN COMPLETE WHEN NEXT CHAIN ADDR = SELF. JMP CD106+1 /GLOBE ROUTINE PUTS 'JMP REST' HERE. DAC LTEMP2 JMP CD104 /CODE 11 DATA WORD PROCESSOR - BLOCK DATA DECLARATION / LCD11 CMA /2'S COMP TAD (1 /SUBTRACT BLOCK SIZE FROM PRESENT LOAD DAC SIZE /ADDRESS TO DETERMINE NEW LOAD ADDRESS. IDX COMFLG /ALLOW BLOCKDATA TO OVERLAP BANKS. JMS FIT DZM COMFLG LAC LRELOC DAC LBDF /NEW LOAD ADDRESS ALSO DETERMINES START JMP CODE1 /RETURN TO PROCESS NEXT CODE WORD /CODE 12 DATA WORD PROCESSOR - COMMON BLOCK DEFINITION / LCD12 DAC LTEMP2 /STORE DATA WORD IN TEMPORARY STORAGE. TAD LFTSVN /ADD COMMON BLOCK CODE TO BLOCK SIZE AND DAC LSMDEF /SET IT UP AS THE DEFINITION. JMS LSMSCN /SCAN SYMBOL TABLE TO DETERMINE IF BLOCK SZA /NAME HAS BEEN PREVIOUSLY ENTERED. JMP CD123 /YES JMS LSMSTR /NO, ENTER BLOCK NAME FOR FIRST TIME LAC LSMEND DAC LCMCHN /SET ADDRESS OF COMMON CHAIN DZM* LCMCHN /INITIALIZE CHAIN TO SHOW NO MEMBERS JMS LPTCNT LAC LSMEND DAC LCMDEF /SET ADDRESS OF BLOCK DEFINITION JMS LPTCNT JMP CD126 CD123 DAC LTEMP1 /SAVE OLD BLOCK SIZE LAC LSMPT /INCREASE SYMBOL TABLE POINTER TO POINT TAD (1 /TO COMMON CHAIN WORD START OF COMMON DAC LCMCHN /BLOCK ENTRY. STORE POINTER TO POINT AT TAD (1 /BLOCK DEFINITION WORD. DAC LCMDEF CD124 LAC LTEMP1 /COMPARE BLOCK LENGTHS TO SEE WHICH IS CMA /GREATER. TAD LTEMP2 SPA JMP CD126 /NEW COMMON SIZE IS NOT GREATER THAN OLD. CD125 LAC* LCMDEF /IS THIS COMMON BLOCK DEFINED. IF YES, GO TO SZA /ERROR AS NEW BLOCK SIZE IS LARGER THAN JMP ERROR3 /THE DEFINED BLOCK SIZE. LAC LSMDEF /STORE NEW BLOCK SIZE INTO DEFINITIONS DAC* LSMW1 /BLOCK SIZE WORD. CD126 LAC LBDF /THE COMMON BLOCK IS DEFINED IF THIS IS DAC* LCMDEF /A BLOCK DATA SUBPROGRAM. SNA JMP CODE1 /NO, GET NEXT DATA WORD. JMS MEMAP1 LAC (103 LAC LBDF TAD LTEMP2 /YES, UPDATE BLOCK STARTING ADDRESS FOR DAC LBDF /NEXT COMMON BLOCK. JMS DEFCOM /DEFINE EXISTING COMMON MEMBERS JMP CODE1 /SUBROUTINE TO DEFINE COMMON BLOCK NUMBERS / DEFCOM CAL 0 LAC* LCMCHN /LOAD FIRST WORD OF COMMON BLOCK DEFINI- DZM* LCMCHN /TION (CHAIN START ADDRESS). IF THE CHAIN CD127 SNA /ADDRESS IS ZERO, RETURN TO PROCESS NEXT JMP* DEFCOM /DATA WORD. DAC LCMCHN TAD (1 /DETERMINE AND STORE ADDRESSES OF SECOND DAC LCHN1 /(TRANSFER VECTOR ADDRESS) AND THIRD TAD (1 /(RELATIVE ADDRESS) WORDS OF COMMON NAME DAC LCHN2 /ENTRY TO BE ASSIGNED. LAC* LCHN1 DAC LCHN1 /SET ADDRESS OF TRANSFER VECTOR LAC* LCHN2 /LOAD RELATIVE ADDRESS OF THIS ENTRY. TAD* LCMDEF /ADD STARTING LOCATION OF THIS BLOCK. DAC* LCHN1 /STORE ADDRESS IN LOCATION SPECIFIED BY LAC* LCMCHN /TRANSFER VECTOR ADDRESS. LOAD NEXT CHAIN AND L77777 /MASK OFF ID BITS JMP CD127 /REFERENCE AND RETURN. /CODE 13 DATA WORD PROCESSOR - COMMON SYMBOL DEFINITION (REL. ADDR.) /SAME AS CODE 08. / /CODE 14 DATA WORD PROCESSOR - COMMON SYMBOL REFERENCE DEFINITION /(ADDRESS OF TRANSFER VECTOR) / LCD14 TAD (400000 /ADD IN A ONE IN THE SIGN SO THIS ENTRY TAD LRELOC DAC LSYM1 /WILL LOOK LIKE A TWO WORD NAME IN THE LAC* LCMDEF /SYMBOL TABLE. CHECK IF THE COMMON BLOCK SZA /WHICH THIS ENTRY IS RELATED, IS ASSIGNED. JMP CD141 /IF IT IS, GO STORE THIS SYMBOL LOC. IN LAC* LCMCHN /THE TRANSFER VECTOR. IF NOT ASSIGNED, / /LINK SYMBOL TO THIS COMMON CHAIN. THIS IS TAD (400000 /DONE BY PLACING THE ADDRESS AN THE CHAIN DAC LSMDEF /LOC. OF THE COM. BLK. DEF. IN THE CHAIN LAC LSMEND /ADDRESS OF THE NEW ENTRY, AND THE START / /ADDRESS OF THE NEW ENTRY IN THE COM. DAC* LCMCHN /BLK. CHAIN. THIS ENTRY IS THEN STORED BY JMP LCD09A /THE NORMAL SYMBOL STORE SUBROUTINE. /RETURN TO PROCESS NEXT DATA WORD. /COMMON BLOCK WAS ASSIGNED, THEREFORE, CD141 TAD LSYM2 /ADD THE LOCATION TO RELOCATION FACTOR, DAC* LSYM1 /AND STORE IN TRANSFER VECTOR LOCATION. JMP CODE1 /RETURN TO PROCESS NEXT DATA WORD /CODE 15 DATA WORD PROCESSOR - DATA INITIALIZATION CONSTANT (1ST WORD) / LCD15 DAC LDATA1 /STORE DATA WORD FOR FUTURE USE. JMP CODE1 /RETURN TO PROCESS NEXT DATA WORD. / /CODE16 DATA WORD PROCESSOR - DATA INITIALIZATOOO'CONSTANT (2ND WORD) / LCD16 DAC LDATA2 /STORE DATA WORD FOR FUTURE USE. JMP CODE1 /RETURN TO PROCESS NEXT DATA WORD. / /CODE 17 DATA WORD PROCESSOR - DATA INITIALIZATION CONSTANT (3RD WORD). / LCD17 DAC LDATA3 /STORE DATA WORD FOR FUTURE USE. JMP CODE1 /RETURN TO PROCESS NEXT DATA WORD. / /CODE 18 DATA WORD PROCESSOR - DATA INITIALIZATION CONSTANT DEFINITION / LCD18 DAC LTEMP1 /STORE DATA WORD IN TEMPORARY STORAGE AND LAC LBDF /TEST IF BLOCK DATA FLAG IS SET. IF THE SNA /BDF IS SET ADD THE ADDRESS OF THE LAST JMP CD181 /COMMON BLOCK LOADED TO THE DATA WORD LOAD LAC* LCMDEF /ADDRESS, IF BDF NOT SET, ADD PRESENT RELO- /CATION FACTOR TO DATA WORD ADDRESS. STORE SKP /THE ADJUSTED ADDRESS IN TEMPORARY STORAGE CD181 LAC LRELOC /FOR FURTHUR REFERENCE. TAD LTEMP1 CD182 DAC LTEMP1 LAC LDATA1 /STORE FIRST DATA INITIALIZATION CONSTANT. DAC* LTEMP1 IDX LTEMP1 /INCREMENT STORAGE ADDRESS FOR NEXT CON- LAC LTEMP1 /STANT, IF ANY TO BE STORED, EXTRACT OUT ALL AND (300000 /BITS OF DEFINITION WORD EXCEPT BITS 1-2. SZA SAD (300000 /TEST IF BITS 1-2 OF DATA WORD EQUAL 11 JMP CODE1 /IF SO RETURN TO PROCESS NEXT DATA WORD. LAC LDATA2 /STORE SECOND DATA WORD IN SPECIFIED ADDR. DAC* LTEMP1 IDX LTEMP1 /INCREMENT STORE ADDRESS FOR NEXT DATA WD. LAC LTEMP1 /TEST BIT 1-2 OF DEFINITION WORD. IF EQUAL AND (300000 /TO 01 (REAL CONSTANT) RETURN TO PROCESS SAD (100000 /NEXT CODE WORD. IF NOT EQUAL TO 01, SELECT JMP CODE1 /AND STORE THIRD CONSTANT WORD AS CONSTANT LAC LDATA3 /MUST BE A DOUBLE PRECISION NUMBER DAC* LTEMP1 JMP CODE1 /RETURN TO PROCESS NEXT DATA WORD /CODE 19 DATA WORD PROCESSOR - INTERNAL SYMBOL DEFINITION/ PROGRAM NAME / LCD19 SPA /IF BIT ZERO OF THE DATA WORD IS A ONE, IN- TAD (200000 /DICATING PROGRAM NAME, SET CODE FLAG TO 6 TAD LRELOC /ADD CURRENT RELOCATION FACTOR TO ADDRESS. DAC LSMDEF /STORE SYMBOL DEFINITION. RAL /L=1, PROGRAM NAME. LAC DDTMDE SPA!CMA JMP CODE1 /DDT. SNL!RTL /OUTPUT PROG NAME IN LDR. MEM. MAP JMP LCD31 JMS MEMAP1 LAC (120 /P LAC LRELOC LAC* (.SCOM+6 LCD31 SPA JMS LSMSTR /GO TO STORE SYMBOL AND DEFINITION JMP CODE1 /NOT EVEN PROGRAM NAME IF NOT DDT LLCTLP CAL 775 /CR/LF AFTER ECHOING ^P 6 JMP LL018 OUTBF2 011000 PER50 127400 /(.) IN RADIX 50(OCTAL) CHRTP1 XX 40 /SPACE SYMBOL .BLOCK 6 40 /SPACE OCTAL5 .BLOCK 5 PLUS15 15 /C.R. PLUS12 12 /L.F. /PUT RADIX 50 SYMBOL IN LSYM1 AND LSYM2 /JMS MEMAP1 /LAC (120 /P - 120;C - 103;G - 107 /LAC VALUE /VALUE CONTAINS NUMBER TO BE OUTPUT GSWCH 0 CSWCH 0 PSWCH 0 OPSWCH 0 OCT177 177 MEMAP1 0 XCT* MEMAP1 SAD PSWCH JMP MEMAP2 SAD CSWCH JMP MEMAP2 SAD GSWCH SKP JMP* MEMAP1 MEMAP2 LAC LSYMBL DAC LTEMP6 CAL 775 12 /.WAIT -3 XCT* MEMAP1 DAC CHRTP1 ISZ MEMAP1 LAC LSYM1 AND (177777 JMS CONWRD LAC LSYM1 SPA!CLA LAC LSYM2 JMS CONWRD IDX LTEMP6 LAW -5 DAC LTEMP2 XCT* MEMAP1 RTL RTL LCD015 RTL RAL DAC LTEMP3 AND (7 TAD (60 DAC* LTEMP6 IDX LTEMP6 LAC LTEMP3 ISZ LTEMP2 JMP LCD015 CAL 3775 11 OUTBF2 FFTSIX 56 JMP* MEMAP1 /ENTER WITH RADIX 50(OCTAL) /WORD IN AC CONWRD 0 JMS DIVIDE TAD M3100 /50X50 LAC LTEMP7 /REMAINDER JMS DIVIDE TAD M50 LAC LTEMP7 /3RD CODE CHAR. JMS CONVER JMP* CONWRD /CALLING SEQUENCE: /RADIX 50 (OCTAL) WORD IN AC. /JMS DIVIDE /TAD (-3100 OR -50) /(RETURN) DIVIDE 0 DZM LTEMP5 /INITIALIZE COUNTER. DIV1 DAC LTEMP7 /SAVE BACKUP NUMBER. XCT* DIVIDE SPA JMP DIV2 /DIVIDE WAS NOT POSSIBLE IDX LTEMP5 /INDEX COUNTER JMP DIV1 DIV2 LAC LTEMP5 /OCTAL CODE JMS CONVER IDX DIVIDE JMP* DIVIDE /ROUTINE TO CONVERT OCTAL CODE (RADIX 50) /TO 7-BIT ASCII CHAR. /CALLING SEQUENCE: / OCTAL CODE IN AC / JMS CONVER / (RETURN) CONVER 0 SNA LAW -40 /SPACE. SAD (33 LAW -33 /%. SAD (34 LAC (33 /. SAD (47 LAW -35 /# TAD .-5 SPA TAD (55 /A-Z TAD FFTSIX /(56 FOR 0-9 DAC* LTEMP6 /SYMBOL BUFFER POINTER IDX LTEMP6 /INDEX POINTER JMP* CONVER /CODE 20 DATA WORD PROCESSOR - STRING CODE (FIRST HALF) / LCD20 TAD LRELOC /ADD CURRENT RELOCATION FACTOR TO ADDRESS. DAC LSTRNG /AND STORE FOR FURTHUR USE. JMP CODE1 /RETURN TO PROCESS NEXT DATA WORD. / /CODE 21 DATA WORD PROCESSOR - STRING CODE (SECOND HALF) / LCD21 JMS LMOD13 /ADD THE PRESENT RELOCATION FACTOR (MODULO DAC LTEMP1 /12/13 BITS) TO THE REPLACEMENT ADDRESS. .IFUND PDP15 LAW 0 /EXTRACT OUT THE LOW ORDER 12/13 BITTS OF THE .ENDC .IFDEF PDP15 LAW 10000 .ENDC AND* LSTRNG /WORD WHOSE ADDRESS IS TO BE REPLACED BY TAD LTEMP1 /THIS DATA WORD. ADD IN THIS DATA WORD AND DAC* LSTRNG /STORE ADJUSTED WORD BACK. JMP CODE1 /RETURN DO PROCESS NEXT DATA WORD. /CODE 22 DATA WORD PROCESSOR - .IODEV REQUEST. / LCD22 SPA JMP IODALL /.IODEV ALL. JMS IOPROS /PROCESS .IODEV REQUEST JMP CODE1 /SUBROUTINE TO PROCESS .IODEV REQUESTS. /.DAT SLOT NUMBER IN AC(9-17), 2'S COMP. WHEN NEG. IOPROS 0 DAC LTEMP1 /SAVE .DAT SLOT NUMBER. SNA JMP IOERR2 /0 ILLEGAL .DAT SLOT. AND (400 SZA!CLA TH777 LAW 17000 /NEGATIVE .DAT SLOT. XOR LTEMP1 TAD DAT. DAC LTEMP2 /ADDRESS OF .DAT SLOT. TAD MDATND /(-.DATND SMA JMP IOERR2 /ILLEGAL .DAT SLOT. -.DATBG /LAW -.DATBG TAD LTEMP2 SPA JMP IOERR2 /ILLEGAL .DAT SLOT. LAC* LTEMP2 AND L77777 SNA JMP IOERR2 /CONTENTS 0 - ILLEGAL .DAT SLOT. SAD (1 JMP IOTTY /TT1. SAD* (.SCOM+7 JMP IOSC07 SAD* (.SCOM+10 JMP IOSC10 SAD* (.SCOM+11 JMP IOSC11 .IFUND PTP TAD* IOCONF .ENDC .IFDEF PTP TAD IOCONF .ENDC SMA!SZA /NEG. OR ZERO JMP* IOPROS /.DAT SLOT ALREADY SET UP. .IFUND PTP TAD IOCONF /PICK UP 1ST 3 CHARS. OF SYM. TAD M1 DAC LSYM1 LAC* LSYM1 .ENDC .IFDEF PTP TAD (LAC IOCONF-1 DAC .+1 HLT /MODIFIED. .ENDC DAC LSYM1 /1ST 3 CHARS. OF SYMBOL. LAC PER50 /4TH CHAR OF SYMBOL (.). DAC LSYM2 /IN RADIX 50 (OCTAL). LAC LTEMP2 /ADDRESS OF .DAT SLOT. TAD (100000 /ADD CODE FLAG FOR VIRTUAL SYM. DEF. DAC LSMDEF /STORE IN TEMP. DEF. LOCATION. JMS LSMSCN /SCAN SYMBOL TABLE TO SZA /DETERMINE IF THIS SYMBOL JMP IOALIN /HAS BEEN PREVIOUSLY ENTERED. JMS LSMSTR /STORE IN SYMBOL TABLE. LAC* LTEMP2 /MAKE 1ST T.V. OF AND LFTSVN /STRING POINT TO XOR LTEMP2 /ITSELF TO TERMINATE IOPXIT DAC* LTEMP2 /RESOLUTION OF GLOBALS. JMP* IOPROS /EXIT. IOALIN DAC LTEMP1 /ADDRESS OF LAST T.V. IN CHAIN. LAC LSMDEF DAC* LSMW1 JMP IOPREU IOERR2 LAW 17550 /ILLEGAL .DAT SLOT. - ASCII 4 JMP ERROUT IOTTY LAC* (.DAT-3 /ADDRESS OF TTY HANDLER. JMP IOPXIT IOSC07 LAC* (.DAT-1 /.DAT-1 AND L77777 /MASK OFF UNIT NUMBER. DAC LTEMP1 LAC (LDBEG /START OF LOADER. DAC* (.SCOM+1 /PRESERVE LINK. LOADER HANDLERS FOR USER. IOPREU LAC* LTEMP2 /PRESERVE UNIT NUMBER. AND LFTSVN XOR LTEMP1 JMP IOPXIT IOSC10 LAC* (.DAT-4 /.DAT-4 JMP IOSC07+1 IOSC11 LAC* (.DAT-5 /.DAT-5 JMP IOSC07+1 .IFUND PTP IOCONF 0 /POINTER TO TOP OF IOC TABLE. .ENDC .IFDEF PTP / I/O CONFIGURATION TABLE. TABIOC 500041 /TTA (1) 463321 /PRA (2) 463322 /PRB (3) 463201 /PPA (4) 463202 /PPB (5) 463203 /PPC (6) 446601 /LPA (7) 411542 /CDB (10) 452141 /MTA (11) 452143 /MTC (12) 452146 /MTF (13) 506001 /VPA (14) .IFDEF PDP9 415721 /DRA (15) 415722 /DRB (16) 415723 /DRC (17) 415724 /DRD (20) .ENDC .IFUND PDP9 0 0 0 0 .ENDC IOCONF .-TABIOC /2'S COMPL. # OF ENTRIES. .ENDC /PROCESS .IODEV ALL REQUEST. /ALL POSITIVE .DAT SLOTS THAT DO NOT /CONTAIN 0 ARE REQUESTED. IODALL DZM LTEMP4 IDX LTEMP4 LAC LTEMP4 TAD DAT. DAC LTEMP2 /ADDRESS OF .DAT SLOT TAD MDATND /(-.DATND SMA!CLA JMP CODE1 /END OF .DAT TABLE. SAD* LTEMP2 JMP IODALL+1 /BYPASS 0 SLOT. LAC LTEMP4 JMS IOPROS JMP IODALL+1 / CODE 23 DATA WORD PROCESSOR - END OF PROGRAM UNIT / LCD23 DZM LBDF /RESET BLOCK DATA FLAG .IFDEF PDP15 DAC LTEMP1 /STORE TEMPORARILY LAC (7777 /RESTORE PAGE MODE RELOCATION DAC ADSWCH /IN CASE THIS PROGRAM UNIT DESTROYED IT LAC LTEMP1 /UFETCH START ADDRESS .ENDC TAD LRELOC /RETURN WITH START ADDRESS OF PROGRAM IN AC JMP* LL000 /SYMBOL TABLE SCAN ROUTINE - THIS SUBPROGRAM SCANS THE SYMBOL TABLE / FOR EQUAL SYMBOLS AND RETURNS WITH THE SYMBOL DEFINITION / ENTRY IN ACCUMULATOR OR ALL ZEROS IN ACCUM. IF NO MATCH FOUND. /CALLING SEQUENCE / JMS LSMSCN LSMSCN CAL 0 LAC LSMST / STORE SYMBOL TABLE STARTING ADDRESS IN LSCN03 DAC LSMW1 / TEMPORARY POINTERS. DAC LSMPT SAD LSMEND / THE SYMBOL IS NOT IN THE TABLE IF ALL JMP LSCN01 / HAS BEEN SCANNED. LAC* LSMW1 XOR LSMDEF / THE SYMBOL TO BE EXAMINED MUST BE THE AND (300000 / SAME TYPE AS THE SEARCH SYMBOL. SZA / I.E. GLOBAL VS. GLOBAL JMP LSCN02 / COMMON BLOCK NAME VS. SAME JMS UFSMPT /THE SYMBOL IS FOUND WHEN THE NAME SAD LSYM1 / WORK (S) MATCH. JMP LSCN04 JMP LSCN02 LSCN04 SMA JMP LSCN05 JMS UFSMPT SAD LSYM2 JMP LSCN05 / THEN A MATCH CANNOT BE MADE, THE SEARCH LSCN02 JMS NXCNT / ADDRESS IS UPDATED TO THE NEXT ENTRY IN JMP LSCN03 / THE TABLE. LSCN05 LAC* LSMW1 AND L77777 /THE DEFINITION OF THE SYMBOLL IS RETURNED JMP* LSMSCN / AS A SIGNAL DAT THE NAME WAS FOUND. LSCN01 CLA JMP* LSMSCN / ZERO INDICATES THE SYMBOL WAS NOT FOUND. /SUBROUTINE TO INCREMENT SYMBOL TABLE COUNTER / TO POINT TO NEXT ENTRY. NXCNT CAL 0 LAC LSMW1 /1ST WORD OF THIS ENTRY DAC LSMPT JMS UFSMPT / ALL ENTRIES IN THE SYMBOL TABLE ARE SPA / EITHER 2 OR 4 WORDS LONG (NOT COUNTING IDX LSMPT / THE SECOND NAME WORD). IDX LSMPT LAC* LSMW1 / ONLY ENTRIES FOR COMMON BLOCK NAMES AND (300000 / ARE 4 (5) WORDS IN LENGTH SAD (300000 / FOR CODES 7 AND 3 JMP NXCNT1 JMP NXCNT2 NXCNT1 IDX LSMPT IDX LSMPT / THE NEXT ENTRY ADDRESS IS RETURNED TO NXCNT2 LAC LSMPT / THE CALLING PROGRAM. JMP* NXCNT /SUBROUTINE TO STORE A SYMBOL AND ITS DEFINITION IN THE SYMBOL TABLE / LSMSTR CAL 0 LAC LSMDEF /STORE SYMBOL DEFINITION IN SYMBOL TABLE JMS LSTSYM LAC LSYM1 / STORE 1ST 3 CHARS OF SYM. IN SYMTAB SMA / TEST TO SEE IF SYM.> 3 CHARS. JMP SMSTR1 JMS LSTSYM LAC LSYM2 / STORE SECOND WORD OF SYMBOL IN TABLE. SMSTR1 JMS LSTSYM JMP* LSMSTR / RETURN TO CALLING PROGRAM. /SUBROUTINE TO INCREASE STORE ADDRESS FOR ENTERING A NEW SYMBOL IN /SYMBOL TABLE AND CHECKING FOR SYMBOL TABLE OVERFLOW / LPTCNT CAL 0 IDX LSMEND / INCREASE SYMBOL TABLE END POINTER LAC LPRES CMA TAD LSMEND / COMPARE SYMTAB END PTR TO END OF FREE STORAGE. SPA /IF STORAGE HAS BEEN EXCEEDED, ERROR. JMP* LPTCNT / RETURN TO CALLING PROGRAM /MEMORY OVERFLOW ERROR1=. ERROR4 LAW 17542 JMP ERROUT /ADD 12/13 BIT CURRENT RELOCATION FACTOR TO DATA WORD ADDRESS SUB- /ROUTINE. /CALLING SEQUENCE / JMS LMOD13 / .IFDEF PDP15 ADSWCH 7777 .ENDC LMOD13 CAL 0 DAC LTEMP1 / STORE DATA WORD IN TEMP. STORAGE LAC LRELOC / LOAD 15 BIT ADDRESS .IFUND PDP15 AND L17777 / EXTRACT OUT BITS (13) 14 AND 15 .ENDC .IFDEF PDP15 AND ADSWCH .ENDC TAD LTEMP1 / ADD DATA WORD TO 12/13 BIT ADDRESS JMP* LMOD13 / RETURN TO CALLING PROGRAM /SUBROUTINE TO UPDATE LSMPT AND FETCH UFSMPT 0 IDX LSMPT LAC* LSMPT JMP* UFSMPT /SUBR. TO STORE DATA IN SYMTAB AND UPDATE LSMEND. LSTSYM 0 DAC* LSMEND JMS LPTCNT JMP* LSTSYM .IFDEF PTP .END BANK*20000+17720 .ENDC .IFUND PTP .END .LOAD .ENDC