.TITLE .SYSLD /SYSTEM LOADER. / / EDIT #30 / / COPYRIGHT 1969,1970 DIGITAL EQUIPMENT CORP.,MAYNARD, MASS. / /PDP-15 ADVANCED SOFTWARE PACKAGE - SYSTEM LOADER (ANY MEMORY BANK) /JAMES J. MURPHY, JR. /4-24-70 / / CONDITIONAL PARAMETER ASSIGNMENT: / PDP9=0 FOR PDP-9 KEYBOARD MONITOR .SYSLD / / *********************************** / INTERFACE WITH NON-RESIDENT MONITOR / THE ADDRESS IN THE SYSTEM LOADER / TAGGED .SYSLD MUST BE MADE KNOWN / TO THE NON-RESIDENT MONITOR VIA A / PARAMETER ASSIGNMENT DURING ASSEMBLY / OF THE MONITOR. / *********************************** / .ABS .LOC 15400 .MED=3 .SCOM=100 /ABSOLUTE REFERENCES .IFUND PDP9 PDP15=0 .ENDC .IFUND SCOM20 SCOM20=.SCOM+20 .ENDC .IFUND COMTAB COMTAB=15000 .ENDC .DTBEG=17663 /REGISTERS .DTSRC=17644 /IN .DTBLK=17637 /SYSTEM .DTCA=17640 /BOOTSTRAP .DTWC=17641 DBA=707762 EBA=707764 IDX=ISZ / /BUFFERS AND TEMPORARY STORAGE. / LNBUFF=. /LINE BUFFER HEADER. LNBUF2=.+2 /LINE BUFFER BODY L2BUFF=.+62 /LINE BUFFER #2 / / / PROGRAM ENTRY / .SYSLD DAC SCOM5S /SAVE ADDR. OF JMP.T1 CAL+771 /.INIT -7 1 0 0 LAW -7 TAD* (.SCOM+23 DAC .DATM7 TAD (2 DAC .DATM5 TAD (1 DAC .DATM4 TAD (1 DAC .DATM3 TAD (2 DAC .DATM1 LAC* (.SCOM+2 /LOWEST FREE ADDRESS. DAC LPRES /PRESENT LOAD ADDRESS. DAC LPRES0 /LOWEST FREE ADDRESS IN 1ST PAGE(BANK). DAC* (10 LAC* (.SCOM+3 /HIGHEST FREE ADDRESS. DAC IOCONF /ADDRESS OF TOP OF IOC TABLE. LAW -1 TAD* IOCONF DAC MOVCNT /2'S COMP. OF SIZE OF IOC TABLE. TAD IOCONF DAC MOVADD ISZ MOVADD /BOTTOM OF IOC TABLE. DAC* (.SCOM+3 /NEW .SCOM+3 DAC LSMST /SYMBOL TABLE START DAC LSMEND /SYMBOL TABLE END DZM* 10 SAD* (10 SKP /ADJUST TO MEM. BANK. JMP .-3 /BANK RELOCATION AND (060000) DAC XBANK DAC XXBANK XOR BRATTV DAC LTEMP1 BRL LAC* LTEMP1 SPA JMP FPRGCD XOR XBANK DAC LTEMP2 LAC* LTEMP2 XOR XBANK DAC* LTEMP2 ISZ LTEMP1 JMP BRL / BRATBL CPXAD /BANK RELOCATION ADDRESS TABLE LNBUF LN2BUF XKMD01 XKMD02 XKMD04 LPRESS XCTTMP -1 /END OF TABLE / FPRGCD LAC* (.SCOM+5) /FETCH PROGRAM CODE SAD (13) /EXECUTE? SKP JMP SYSBCK /NO CAL+776 /YES -- SETUP ^P TRANSFER ADDRESS 1 CPXAD CPTED 0 LAC EXEFIL /CHANGE SEEK DATA DAC LLDDIR /FROM '.LOAD@BIN' TO LAC EXEFIL+1 /'EXECUTBIN'. DAC LLDDIR+1 LAC JMPEXC /DON'T MOVE IOC TABLE DAC MOVBCK /FOR EXECUTE. LAC* SCOM11 /IF .SCOM+11 CONTAINS SAD XCT6BT /.SIXBT 'XCS', EXECUTE JMP SYSBCK /AND .SYSLD WILL USE /THE SAME I/O DEVICE. / / .SCOM+11 CONTAINS 'XCS' -- TWO COPIES OF THE SYSTEM DEVICE / HANDLERS WILL BE LOADED. ONE IN HIGH CORE FOR .SYSLD'S USE / VIA .DAT-7, AND THE OTHER IN LOW CORE FOR EXECUTE'S USE VIA / .DAT-4. / NORMALLY, .DAT-7 IS RE-ASSIGNED TO EXECUTE'S DEVICE (FROM .DAT-4) / DURING THE READING OF THE 'XCT' FILE. HOWERVER, IN THIS CASE, BOTH / .DAT-4 & .DAT-7 POINT TO DIFFERENT COPIES OF HANDLERS FOR THE SAME / DEVICE. THEREFORE, THE "RE-ASSIGNMENT" OF .DAT-7 IS TO: .SYSLD'S / COPY OF THE HANDLER WITH EXECUTE'S UNIT NUMBER! / IDX* SCOM11 /CHANGE 'XCS' TO 'XCT' LAC* .DATM7 /SETUP A .DAT SLOT CONTENT WITH THE AND (077777) /ENTRY POINT FOR .SYSLD'S COPY OF THE DAC DM7XCT /SYSTEM DEV HANDLER FROM .DAT-7, AND THE LAC* .DATM4 /UNIT NUMBER FOR EXECUTE'S DEVICE FROM AND (700000) /.DAT-4. XOR DM7XCT DAC DM7XCT .IFUND PDP9 /IF PDP-15, NOP 'DBA' INSTRUCTIONS LAC (740000) /BECAUSE .SYSLD'S HANDLER, WHICH IS LOADED DAC EPM /FOR BANK MODE EXECUTION, WILL BE USED .ENDC /TO READ THE XCT FILE. JMP SYSBCK / EXEFIL .SIXBT /EXECUT/ JMPEXC JMP EXECUT /*LIT SCOM11 .SCOM+11 /*LIT BRATTV BRATBL /*LIT XCT6BT .SIXBT /XCT/ .IFPOZ LNBUFF+143-. .BLOCK LNBUFF+144-. .ENDC / ^^^^^^ END OF INPUT BUFFERS ^^^^^^ NOLOAD 0 /SELECTIVE LOADING FLAG RECDIN 0 /0=START OF NEW FILE LNBUF LNBUFF /ADDRESS OF LINE BUFFER #1 LN2BUF L2BUFF /ADDRESS OF LINE BUFFER #2 LNBUFP 0 /LINE BUFFER POINTER / WDCNT 0 /LINE BUFFER WORD COUNT. CODEWD 0 /BINARY CODE WORD (3 CODES). CWDTAL 0 /CODE WORD COUNT. LRELOC 0 /CURRENT RELOCATION FACTOR LPLA 0 /LOAD ADDRESS. LSYM1 0 /1ST WORD OF SYMBOL. LSYM2 0 /2ND WORD OF SYMBOL. LSMDEF 0 /SYMBOL TYPE AND DEF. LPRES 0 /LOWEST FREE ADDRESS. LSMST 0 /SYMBOL TABLE START. LSMEND 0 /SYMBOL TABLE END. LSMW1 0 /PRESENT STORE ADDRESS OF SYMBOL TABLE. LSMPT 0 /PRESENT WORD COUNTER IN SYMBOL ENTRY SYSPNT 0 /POINTER TO SYS. PROG. TABLE ENTRY. IODVCT 0 /.IODEV COUNTER. LDATA1 0 LDATA2 0 LDATA3 0 XBANK 0 /MEMORY BANK BITS. XXBANK 0 LSTRNG 0 /STRING CODE LLDDIR .SIXBT /.LOAD@BIN/ /CHANGED TO /EXECUTBIN/ /WHEN LOADING EXECUTE. SCOM5 0 /START ADDRESS OF SYSTEM PROG. SCOM5S 0 /SAVE JMP.T1 ADDR. LTEMP1 0 /GENERAL TEMP. STORAGE 1 LTEMP2 0 /GENERAL TEMP. STORAGE 2 LTEMP4 0 /GENERAL TEMP. STORAGE 4 LIBDIR .SIXBT /.LIBR@BIN/ 0 ERRFLG 0 /SELECTIVE LOADING LLPRES 0 /BACKUP CELLS. MOVCNT 0 /2'S COMP OF SIZE OF IOC TABLE. MOVADD 0 /BOTTOM ADDRESS OF IOC TABLE. / .EJECT /ROUTINE TO CLEAR MEMORY BANK POINTERS /OF MEMORY BANKS THAT DO NOT EXIST. SYSBCK LAC LPRESS DAC LPRESP LAC* (SCOM20) /.SCOM+20 BIT-0 IS SET RAL /LINK=1 IF XTRA 4K PRESENT. LAC* (.SCOM /PAGE MASK. AND (70000 /FIND PAGE THAT .SCOM POINTS TO. XOR (20 IDX LPRESP SAD* LPRESP SKP JMP .-3 .SBACK IDX LPRESP LAC* LPRESP SAD LPRESS JMP .SCONT /DONE SZL!CLL DAC LPRESX /XTRA 4K POINTER DZM* LPRESP /AND CLEAR JMP .SBACK /ALL OTHER POINTERS .SCONT LAC* (.SCOM+5 /SYS. PROG. CODE SAD (13 JMP MOD15 /EXECUTE SZA /LINKING LOADER JMP .SDONE /SET UP MASKS FOR 12-BIT RELOCATION. MOD15 DZM LPRESX /DON'T USE XTRA 4K .IFUND PDP9 /IF PDP-15, SETUP FOR PAGE ADDRESSING LAW 10000 DAC OVER LAC (7777) DAC MASK .ENDC .SDONE LAC* (.SCOM+5 SZA JMP NOTLL /DONT CHANCE .SCOM REGS UNLESS L.L. LAC* .DATM1 /SAVE LINK. LDR'S. DEVICE AND (77777 /MASK OFF UNIT NUMBER. DAC* (.SCOM+7 /NUMBERS TO AVOID DUPLICATE LAC* .DATM4 /LOADING IF USER REQUIRES AND (77777 DAC* (.SCOM+10 /SAME DEVICES. LAC* .DATM5 AND (77777 DAC* (.SCOM+11 NOTLL LAC (COMTAB XOR XBANK DAC SYSPNT TAD COMTAB TAD* (.SCOM+5 DAC COMTAB DAC IODVCT ISZ IODVCT LAC* COMTAB TAD SYSPNT DAC COMTAB LAC* IODVCT TAD SYSPNT DAC IODVCT SWITCH=. /THIS REGISTER IS USED AS A SWITCH -- ZEROED FOR /SECOND LIBR SEARCH WHEN LOADING EXECUTE'S HANDLERS. CHKMRE LAC COMTAB SAD IODVCT JMP SEEKLB /ALL.IODEV REQUESTS MADE LAC* COMTAB ISZ COMTAB SPA JMP IODALL /.IODEV ALL. JMS IOPROS /PROCESS .IODEV REQUEST. JMP CHKMRE SEEKLB CAL 771 /SEEK A SYSTEM LIBR ON .DAT-7 3 XKMD01 LIBDIR DZM RECDIN /NEW FILE OVRPRO ISZ NOLOAD /LOAD SELECTIVELY. / JMS SUGR /ARE THERE ANY UNRESOLVED GLOBALS? JMP IORES /NO -- END LIBRARY SEARCH READ JMS LL000 /YES -- SEE IF THIS PROGRAM HELPS / /CHECK FOR END OF LIBRARY FILE. SZL JMP EOFCHK /NO DATA...CHECK FOR EOF. LAC NOLOAD SZA JMP READ /NO VIRTUALS RESOLVED. JMP OVRPRO /VIRTUALS RESOLVED. EOFCHK LAC* LNBUFP AND (17 SAD (5 SKP /EOF. ALL GLOBALS NOT RESOLVED. JMP OVRPRO /KEEP TRYING. CAL 771 /.CLOSE .LIBR 6 /FILE JMP ERROR3 / IORES CAL 771 /.CLOSE .LIBR 6 LAC SWITCH /CHECK IF 2ND LIBBARY SNA /SEARCH DONE FOR EXECUT JMP GOTOEX LAC* (.SCOM+5 SAD (13) JMP FILELD SZA JMP NONLLD /NOT EXECUTE OR LINKING LDR / .EJECT / RELOCATE AND LOAD EXECUTE OR LINKING LOADER / FILELD CAL 771 /.SEEK .LOAD/EXECUTE FILE 3 / ON SYSTEM DEVICE XKMD02 LLDDIR DZM NOLOAD /NON-SELECTIVE LOADING. DZM RECDIN /NEW FILE. JMS LL000 /READ IN LINK. LOADER. OR EXECUTE DAC* (.SCOM+5 /STARTING ADDRESS. DAC SCOM5 CAL 771 /.CLOSE .LOAD/EXECUTE FILE 6 / REGISTER MOVBCK IS MODIFIED TO "JMP EXECUT" WHEN LOADING EXECUTE MOVBCK LAC* MOVADD /ROUTINE TO MOVE DAC* LPRES /IOC TABLE FROM ISZ MOVADD /SYSTEM LOADER AREA ISZ LPRES /TO LINKING LOADER ISZ MOVCNT /AREA . JMP MOVBCK GOTOEX LAC LPRES DAC* (.SCOM+2 /LOWEST FREE ADDRESS. LAC* (.SCOM DAC* (.SCOM+3 /HIGHEST FREE ADDRESS DZM* .DATM7 /CLEAR .DAT SLOT -7 .IFUND PDP9 /IF PDP-15, ENTER PAGE ADDRESSING MODE LAC (2000 XOR* (.SCOM+4 DAC* (.SCOM+4 DBA /BEFORE GOING TO LOADER OR EXECUTE. JMP* SCOM5&767777 .ENDC .IFDEF PDP9 JMP* SCOM5 .ENDC / / EXECUTE -- GET .IODEV INFORMATION FROM 'XCT' FILE / EXECUT LAC* .DATM7 /REASSIGN .DAT-7 TO READ DAC DM7BUF /THE 'XCT' FILE. (SPECIAL LAC DM7XCT /REASSIGNMENT WHEN EXECUTE SNA /AND .SYSLD USE THE SAME DEV. LAC* .DATM4 DAC* .DATM7 .IFUND PDP9 /IF PDP-15, ENTER PAGE MODE IF NECESSARY XCT EPM .ENDC CAL 771 /.INIT -7 FOR INPUT 1 0 0 CAL 771 /.SEEK -7 3 .SCOM+7 /FILENAME XCT .IFUND PDP9 /IF PDP-15, ENTER BANK MODE IF NECESSARY EBA .ENDC XREAD=. .IFUND PDP9 /IF PDP-15, ENTER PAGE MODE IF NECESSARY XCT EPM .ENDC CAL 771 /.READ -7 (IOPS BIN) 10 XKMD04 L2BUFF -62 CAL 771 /.WAIT -7 12 .IFUND PDP9 /IF PDP-15, ENTER BANK MODE IF NECESSARY EBA .ENDC LAC L2BUFF /GET HEADER AND (077) SNA JMP XCTROK /NORMAL READ -- EXAMINE RECORD /ABNORMAL READ -- TEST FOR /EOF, EOM, OR ERR SAD (005) JMP XREAD /EOF -- IGNORE, READ NEXT RECORD AND (057) SAD (006) JMP XCTEOM /EOM -- WAIT FOR ^P JMP ERROR2 /ERR -- TERMINATE XCTEOM LAW -1 /SET FLAG TO ACCEPT ^P TYPEIN DAC CPFLAG JMS TYPE /TYPE "LD & ^P" EOMMES JMP . /WAIT HERE FOR ^P TYPEIN CPFLAG 0 /FLAG -- ACCEPT ^P IFF FLAG=-1 CPTED ISZ CPFLAG /^P TYPED IN -- ACCEPT ^P ? JMP EXIT /NO -- EXIT JMS TYPE /YES -- RETURN CARRIAGE AND ATTEMPT CARRTN / ANOTHER READ JMP XREAD / XCTROK LAC L2BUFF+2 /GET SUBRECORD HEADER AND (700000) SAD (100000) /TYPE-ONE RECORD? SKP JMP XREAD /NO -- READ NEXT RECORD LAC L2BUFF+3 /YES -- .DAT INFO RECORD? SAD (377777) / (LINK #377777) SKP /YES -- LOAD I/O HANDLERS FOR THE / OVERLAY SYSTEM TO BE RUN JMP XREAD /NO -- READ NEXT RECORD BITCNT=. /THIS REGISTER IS ALSO USED AS BIT COUNTER FOR NEXT LOOP .IFUND PDP9 /IF PDP-15, ENTER PAGE MODE IF NECESSARY XCT EPM .ENDC CAL 771 /.CLOSE -7 6 .IFUND PDP9 /IF PDP-15, ENTER BANK MODE IF NECESSARY EBA .ENDC LAC DM7BUF /RESTORE .DAT-7 ASSIGNMENT DAC* .DATM7 / XCTLP1 IDX XCTTMP /SETUP TO EXAMINE A MAP-WORD REPRESENTING LAW -22 /18 .DAT SLOTS. (FOUR WORDS FOR SLOTS DAC BITCNT /.DAT-18 THRU .DAT+53) / XCTLP2 LAC* XCTTMP /MAKE A GLOBAL SYMBOL REFERENCE TO THE RCL /HANDLER ASSIGNED TO EACH .DAT SLOT WITH DAC* XCTTMP /ITS CORESPONDING MAP-WORD-BIT SET. SNL JMP WICK1 /BIT NOT SET LAC IODVNM /.IODEV SLOT # SNA JMP IODALL /.DAT+0 MEANS ALL POSITIVE JMS IOPROS /PROCESS .IODEV WICK1 ISZ IODVNM NOP ISZ BITCNT JMP XCTLP2 ISZ WRDCNT JMP XCTLP1 DZM SWITCH /ALL HANDLERS "REFERENCED" -- CLEAR SWITCH /TO INDICATE SECOND LIBRARY SEARCH (IF ANY) JMS SUGR /IS A SECOND LIBRARY SEARCH NECESSARY? JMP GOTOEX /NO -- GE TO EXECUTE JMP SEEKLB /YES -- START SECOND LIBRARY SEARCH / DM7BUF 0 /BUFFER FOR NORMAL .DAT-7 ASSIGNMENT WHILE READING 'XCT' FILE DM7XCT 0 /SPECIAL .DAT-7 ASSIGNMENT FOR READING THE 'XCT' FILE /IF ZERO, THE .DAT-4 ASSIGNMENT IS MADE FOR .DAT-7 TO /READ THE 'XCT' FILE. XCTTMP L2BUFF+12 /RECORD BUFFER POINTER WRDCNT -4 /4 .IODEV WORDS IODVNM -22 /START WITH .DAT-22 / NONLLD LAC* (SCOM20 /SET .SCOM+20 TO LOWEST XOR LPRESX /FREE ADDRESS IN DAC* (SCOM20 /XTRA 4K. LAC LPRES DAC* (.SCOM+2 /LOWEST FREE ADDRESS DZM* .DATM7 LAC* (.SCOM+5 /MULTIPLY BY 7 RCL TAD* (.SCOM+5 RCL TAD* (.SCOM+5 TAD SYSPNT TAD (3 DAC SYSPNT LAC* SYSPNT DAC .DTBLK IDX SYSPNT IDX SYSPNT LAC* SYSPNT /STARTING LOAD ADDRESS-1 TAD (-1 XOR XBANK /EX. MEM. BITS ISZ SYSPNT DAC* (.SCOM+3 /HIGHEST FREE ADDRESS. DAC .DTCA /SETUP FOR SYSTEM BOOTSTRAP. CMA TAD LPRES SMA JMP ERROR4 /MEMORY OVERFLOW LAC* SYSPNT /SIZE (2'S COMP.) ISZ SYSPNT TAD (-1 CMA DAC .DTWC /SETUP FOR SYS. BOOTSTRAP LAC SCOM5S DAC* (.SCOM+5 /SETUP TO TURN ON PIC&API IOF+10 /TURN OFF PIC ISA /AND API IN CASE OF SELECT ERR IN BOOTSTRAP LAC* SYSPNT /ENTRY POINT XOR XBANK /EX. MEM. BITS. DAC* (0 LAC (21000 /TALKING TO DAC .DTSRC /DECTAPE UNIT 0 LAC (.DTBEG XOR XXBANK /EX. MEM. BITS. DAC* (.MED JMP .DTBEG /GO TO SYSTEM BOOTSTRAP / .EJECT /PROCESS .IODEV ALL REQUEST. /ALL POSITIVE .DAT SLOTS THAT DO NOT /CONTAIN 0 ARE REQUESTED. / IODALL LAC (1 DAC LTEMP4 /.DAT SLOT NO. TAD* (.SCOM+23 DAC LTEMP2 /ADDRESS OF .DAT SLOT. LAW -11 TAD LTEMP4 SMA!CLA JMP SEE1 /END OF .DAT TABLE LAC* LTEMP2 SNA JMP NULDAT /BYPASS 0 SLOT. LAC LTEMP4 JMS IOPROS NULDAT LAC LTEMP4 TAD (1 JMP IODALL+1 SEE1 SAD IODVNM JMP WICK1 JMP CHKMRE .EJECT / SUGR -- SUBROUTINE TO SCAN (SYMBOL TABLE) FOR UNRESOLVED GLOBAL REFERENCES / / RETURN AT JMS+1 -- NO UNRESOLVED GLOBALS FOUND / RETURN AT JMS+2 -- AN UNRESOLVED GLOBAL REFERENCE HAS BEEN FOUND / SUGR 0 LAC LSMST SUGR1 DAC LSMPT DAC LSMW1 SAD LSMEND JMP* SUGR /RETURN AT JMS+1 LAC* LSMPT AND (700000) SAD (100000) JMP .+3 JMS NXCNT JMP SUGR1 ISZ SUGR /RETURN AT JMS+2 JMP* SUGR .EJECT /SUBROUTINE TO LOAD A PROGRAM UNIT. /RETURNS WITH STARTING ADDRESS IN AC. /IT IS DOUBLE BUFFERED. / LL000 0 LL002 LAC RECDIN /IS .READ IN PROGRESS. SZA JMP LL019 /YES LL018 LAC LNBUF /NO. SET POINTER DAC LNBUFP /TO BUFFER A. DAC LL010+2 LAC LN2BUF /SET UP 2ND .READ TO DAC LL016 /READ INTO L2BUFF. /.READ .-7,B,LNBUFF,50 /READ ONE LINE BUFFER. LL010 CAL 771 /OF BINARY WORDS 10 /INTO LNBUFF. LNBUFF -62 /.WAIT ,.-7 /WAIT FOR BINARY INPUT LL014 CAL 771 12 LL001 LAC* LNBUFP /CHECK BITS 12 AND (60 /AND 13 OF 1ST SZA /WORD OF L.B. HEADER JMP ERROR2 /FOR PARITY, CHECKSUM, BUF. OVERFLOW LAC* LNBUFP /PICK UP THE WORD AND (377000 /PAIR COUNT AND CLL!RAL /MULTIPLY BY 2 TAD (776000 /SUBTRACT 2 FOR HEADER DAC WDCNT SNA!CLL!CML /L=1,NO DATA WORDS. JMP* LL000 /POSSIBLY EOF LINE. / /.READ ,.-7,B,BUFFX,50 /NO LL015 CAL 771 /READ ONE LINE OF 10 /BINARY WORDS INTO LL016 XX /L2BUFF OR LNBUFF. -62 CLA!CMA /INDICATES READ DAC RECDIN /IS IN PROGRESS. / .EJECT /DATA CODE WORD FETCH ROUTINE /THIS ROUTINE SELECTS THE CODE WORD FROM THE LINE /BUFFER AND DETERMINES WHICH DATA WORD PROCESSING /ROUTINE TO ENTER / LL041 ISZ LNBUFP /SET LINE BUFFER POINTER TO ISZ LNBUFP /BEGINNING OF DATA LL005 LAW -4 /COUNT TO DETERMINE WHEN DAC CWDTAL /NEXT CODE WORD IS TO BE SELECTED JMS WRDCHK /PICK UP WORD MOVE BUFFER POINTER DAC CODEWD /STORE CODE WORD CODE1 ISZ CWDTAL /DECREASE CODE TALLY WORD SKP JMP LL005 /GO GET NEXT CODE WORD. LAC CODEWD /SHIFT CURRENT CODE RTL /TO BITS (12-17) OF AC RTL RTL DAC CODEWD RAL AND (77 DAC LTEMP1 /CODE IN BITS (12-17) LAC NOLOAD SNA JMP LL009 /NON-SELECTIVE LOADING LAC LTEMP1 /SELECTIVE LOADING. SAD (12 /INTERNAL GLOBAL DEF. (CODE 10) JMP LL009 SAD (1 /PROGRAM SIZE (CODE 1) JMP LL009 SAD (7 /1ST 3 CHARS. OF SYMBOL JMP LL009 / (CODE 7) SAD (10 /2ND 3 CHARS OF SYMBOL JMP LL009 / (CODE 8) SAD (27 /END OF PROGRAM UNIT (CODE23) JMP LL009 JMS WRDCHK /BYPASS DATA WORD. JMP CODE1 /FETCH NEXT CODE LL009 LAC LTEMP1 /CODE (BITS 12-17) TAD (-33 SMA JMP ERROR2 />32 LAC LTEMP1 TAD (JMP ENTRY /DISPATCH TO APPROPRIATE DAC .+2 /DATA WORD PROCESSOR JMS WRDCHK /LOAD DATA WORD. XX / .EJECT /TABLE OF DATA WORD PROCESSOR ADDRESSES ENTRY JMP ERROR2 /CODE 00 - ILLEGAL JMP LCD01 /CODE 01 JMP LCD02 /CODE 02 JMP LCD03 /CODE 03 JMP LCD04 /CODE 04 JMP LCD05 /CODE 05 JMP LCD06 /CODE 06 JMP LCD07 /CODE 07 JMP LCD08 /CODE 08 JMP LCD09 /CODE 09 JMP LCD10 /CODE 10 JMP CODE1 /CODE 11 IGNORED JMP CODE1 /CODE 12 IGNORED JMP CODE1 /CODE 13 IGNORED JMP CODE1 /CODE 14 IGNORED JMP LCD15 /CODE 15 JMP LCD16 /CODE 16 JMP LCD17 /CODE 17 JMP LCD18 /CODE 18 JMP CODE1 /CODE 19 IGNORED JMP CODE1 /CODE 20 IGNORED JMP CODE1 /CODE 21 IGNORED JMP CODE1 /CODE 22 IGNORED JMP LCD23 /CODE 23 JMP CODE1 /CODE 24 IGNORED - 18 BIT PAR. ASSIGNMENT JMP CODE1 /CODE 25 IGNORED JMP CODE1 /CODE 26 IGNORED / .EJECT /CODE 01 DATA WORD PROCESSOR-PROGRAM UNIT SIZE. / LCD01 SPA JMP LDABS /ABSOLUTE PROGRAM DZM ERRFLG /CLEAR MEM. OVERFLOW FLAG. DAC LTEMP1 /PROG. UNIT SIZE / (PROG UNIT SIZE TEST REMOVED -- ASSUME THAT NO LIBRARY / (ROUTINE WILL BE GREATER THAN 4K WORDS) /THIS MAY BE A SELECTIVE LOAD THAT DOES NOT /MAKE IT. LAC (70000 /4K BLOCK INITIALLY DAC ADDR /THE MAXIMUM. LAC LPRESS DAC LPRESP FITLP IDX LPRESP LAC* LPRESP SAD LPRESS JMP ERROR1 /NO ROOM IN CORE. SZA JMP LCD013 .SMOD LAW 10000 /THIS BANK NOT USABLE. SAD OVER JMP FITLP /PDP-15 MODE LAC (60000 /8K BLOCK NOW ALLOWABLE. DAC ADDR IDX LPRESP /CHECK 8K POINTERS ONLY. JMP FITLP LCD013 DAC LRELOC /RELOCATION FACTOR. DAC LPLA /PROGRAM LOAD ADDRESS TAD LTEMP1 /PROG UNIT SIZE DAC LLPRES /NEW LOWEST XOR LPLA /FREE ADDRESS. DOES PROG LIE ENTIRELY AND ADDR /IN THE CURRENT SZA!CMA /MEMORY BLOCK. JMP .SMOD /NO LCD012 TAD LPRESP SAD LPRESS SKP!CLA /IF XTRA 4K DO NOT CHECK FOR SYMBOL TABLE OVERFLOW. LAC LLPRES /NEW LOWEST FREE ADDRESS. JMS LCOMP /2'S COMP. TAD LSMEND SPA JMP ERROR1 /MEMORY OVERFLOW LAC NOLOAD SNA JMS AJUST /UPDATE ADDRESS TABLE AND LPRES. IF NON-CONDITIONAL LOAD. JMP CODE1 /FETCH NEXT DATA WORD. LDABS DZM LRELOC /ABSOLUTE LOAD JMP CODE1 / .EJECT WRDCHK 0 /CHECK IF BUFFER EXHAUSTED, LAC WDCNT /IF NOT RETURN WITH SNA /WORD IN AC. JMP LL002 /GO READ NEXT LINE. TAD (777000 /DECREMENT WORD COUNT DAC WDCNT /BY 1. LAC* LNBUFP /PICK UP WORD. ISZ LNBUFP /INDEX POINTER. JMP* WRDCHK LL019 LAC LL016 /SET UP TO PROCESS DAC LNBUFP /BUFFER JUST FILLED SAD LNBUF JMP LL020 /SET UP TO READ LAC LNBUF /INTO OTHER. LL021 DAC LL016 JMP LL014 /GO TO .WAIT LL020 LAC LN2BUF JMP LL021 / .EJECT /CODE 02 DATA WORD PROCESSOR - PROGRAM LOAD ADDRESS / /THE PROGRAM LOAD ADDRESS IS ABSOLUTE LCD02 TAD LRELOC /IF BIT 0 IS A ONE---LRELOC=0 DAC LPLA 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 ISZ 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 DAC LPLA /STORE ADJUSTED LOAD ADDRESS JMP CODE1 /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 / .EJECT /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 /SYMBOL HAS BEEN PREVIOUSLY ENTERED. GO SEE JMP CD092 /IF SYMBOL HAS BEEN DEFINED JMS LSMSTR /STORE DEFINITION AND SYMBOL IN JMP CODE1 /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 ERROR1 ISZ ERRFLG LAC NOLOAD /MAY NOT BE SZA /ERROR IF JMP CODE1 /SELECTIVE LOAD. ERROR4 LAW 1 /MEMORY OVERFLOW - SYSLD 01 JMP ERROUT ERROR3 LAW 3 /ALL GLOBALS NOT RESOLVED - .SYSLD 03 JMP ERROUT ERROR2 LAW 2 /DATA ERROR - .SYSLD 02 JMP ERROUT / .EJECT /CODE 10 DATA WORD PROCESSOR - INTERNAL GLOBAL SYMBOL DEFINITION / LCD10 TAD LRELOC /ADD RELOCATION FACTOR DAC LTEMP1 /SET SYMBOL DEFINITION TAD (500000 /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. LAC NOLOAD /UNREQUESTED INTERNAL GLOBALS ARE LOADED SNA /WHEN THEY FOLLOW REQUESTED GLOBALS OR /DURING UNCONDITIONAL LOADING. JMS LSMSTR /STORE DEFINITION AND SYMBOL IN SYMBOL JMP CODE1 /TABLE AS THIS SYMBOL HAS NOT BEEN PREV- / /IOUSLY ENTERED. CD102 DAC LTEMP2 /SAVE REFERENCE ADDRESS IF UNDEFINED LAC* LSMW1 SMA /CHECK TO SEE IF GLOBAL IS DEFINED JMP CD103 /IF DEFINED, IT HAS ALREADY BEEN LOADED LAC NOLOAD SZA JMP CODE1 ISZ NOLOAD /BACK UP POINTERS LAC AJUST1 /AS THIS ROUTINE IS DAC* LPRESP /NOT BEING LOADED LAC AJUST2 DAC LPRES /SO THE NO LOAD IS PUT INTO EFFECT AND JMP CODE1 /THIS PART IS IGNORED. CD103 LAC ERRFLG SZA JMP ERROR4 /ROUTINE DID NOT FIT. LAC NOLOAD SZA JMS AJUST /NOW MOVE POINTER DZM NOLOAD /CLEAR FOR LOADING LAC LSMDEF DAC* LSMW1 /DEFINE SYMBOL AS INTERNAL GLOBAL CD104 LAC* LTEMP2 AND (77777 /MASK OFF UNIT NO. DAC LSMDEF /FETCH AND SAVE NEXT REFERENCE ADDRESS LAC* LTEMP2 AND (700000 /PRESERVE UNIT NO. XOR LTEMP1 DAC* LTEMP2 /PUT SYMBOL DEF. IN CONTENTS OF REF. ADR. LAC LSMDEF SAD LTEMP2 /CHAIN IS COMPLETE WHEN NEXT CHAIN ADDR. JMP CODE1 /IS EQUAL TO SELF. DAC LTEMP2 JMP CD104 .EJECT /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 INITIALIZATION 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 / /ADD PRESENT RELOCATION FACTOR TO DATA LCD18 TAD LRELOC /WORD ADDRESS. STORE THE ADJUSTED ADDRESS CD182 DAC LTEMP1 /IN TEMPORARY STORAGE FOR FURTHER REFERENCE. LAC LDATA1 /STORE FIRST DATA INITIALIZATION CONSTANT. DAC* LTEMP1 ISZ 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. SAD (300000 /TEST IF BITS 1-2 OF DATA WORD EQUAL 11 JMP CODE1 /IF SO RETURN TO PROCESS NEXT DATA WORD. SNA JMP CODE1 LAC LDATA2 /STORE SECOND DATA WORD IN SPECIFIED ADDR. DAC* LTEMP1 ISZ 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 / .EJECT ADDR 60000 /70000 IF 4K MODE OVER 760000 /770000 IF 4K MODE MASK 17777 /7777 IF 4K MODE / .EJECT /SUBROUTINE TO PROCESS .IODEV REQUESTS. / .DATM7 0 .DATM5 0 .DATM4 0 .DATM3 0 .DATM1 0 SLOT1 0 IOPROS 0 AND (000777) /ACCEPT POSITIVE, 18-BIT 2'S COMPL TAD (777400) /NEGATIVE, OR 9-BIT 2'S COMPL .DAT XOR (777400) /SLOT REPRESENTATIONS. DAC SLOT1 TAD* (.SCOM+23 DAC LTEMP2 /ADDRESS OF .DAT SLOT. LAW -11 TAD SLOT1 SMA JMP IOERR2 /ILLEGAL .DAT SLOT. LAC (15 TAD SLOT1 SPA JMP IOERR2 /ILLEGAL .DAT SLOT. LAC* LTEMP2 AND (77777 SNA JMP* IOPROS /IGNORE .DAT SLOT WHEN 0 SAD (1 JMP IOTTY /TT1. TAD MOVCNT /2'S COMP OF SIZE OF IOC TABLE. SMA /NEG. JMP* IOPROS /.DAT SLOT ALREADY SET UP. TAD IOCONF /PICK UP 1ST 3 CHARS. OF SYMBOL. AND (17777 XOR (200000 /LAC DAC .+1 HLT /MODIFIED. 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 (700000 /STRING POINT TO XOR LTEMP2 /ITSELF TO TERMINATE DAC* LTEMP2 /RESOLUTION OF GLOBALS. JMP* IOPROS /EXIT. / .EJECT IOALIN DAC LTEMP1 /ADDRESS OF LAST T.V. IN CHAIN. /LTEMP1 CONTAINS THE SYMBOL DEFINITION (HANDLER /ENTRY POINT) IF HANDLER HAS ALREADY BEEN LOADED. /THIS CONDITION WILL OCCUR WHEN AN OVERLAY SUSTEM /USES EXECUTE'S I/O DEVICE. / LAC* LSMW1 /IF DEFINED, SET DEFINITION IN BITS 3-17 OF .DAT SPA /SLOT INSTEAD OF STRINGING REFERENCES. JMP IOPREU LAC LSMDEF DAC* LSMW1 JMP IOPREU IOERR2 LAW 4 /ILLEGAL .DAT SLOT - SYSLD JMP ERROUT IOTTY LAC* .DATM3 /ADDRESS OF TTY HANDLER. DAC* LTEMP2 JMP* IOPROS / IOPREU LAC* LTEMP2 /PRRESERVE UNIT NO. AND (700000 XOR LTEMP1 JMP IOTTY+1 IOCONF 0 /TOP ADDRESS OF IOC TABLE. PER50 127400 /(.) IN RADIX 50(OCTAL). / .EJECT / CODE 23 DATA WORD PROCESSOR - END OF PROGRAM UNIT / LCD23 TAD LRELOC / RETURN WITH START ADDRESS OF PGM. CLL JMP* LL000 / UNIT /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!CLA!CMA /IE. GLOBAL VS. GLOBAL JMP LSCN02 / COMMON BLOCK NAME VS. SAME TAD LSMPT DAC LSMPT LAC* LSMPT / THE SYMBOL IS FOUND WHEN THE NAME SAD LSYM1 / WORD(S) MATCH. JMP LSCN04 JMP LSCN02 LSCN04 SMA!CLA!CMA JMP LSCN05 TAD LSMPT DAC LSMPT LAC* LSMPT 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 (77777 / THE DEFINITION OF THE SYMBOL IS RETURNED JMP* LSMSCN / AS A SIGNAL DAT THE NAME WAS FOUND. LSCN01 CLA JMP* LSMSCN / ZERO INDICATES THE SYMBOL WAS NOT FOUND. / .EJECT /SUBROUTINE TO INCREMENT SYMBOL TABLE COUNTER /TO POINT TO NEXT ENTRY. NXCNT 0 LAC LSMW1 /ALL ENTRIES IN THE SYMBOL TAD (777777 /TABLE ARE EITHER 2 OR 3 DAC LSMPT /WORD LONG, DEPENDING ON LAC* LSMPT /THE NO. OF CHARS. IN SPA!CLA /THE SYMBOL. TAD (777777 TAD (777777 TAD LSMPT /RETURN WITH NEXT ENTRY DAC LSMPT /ADDRESS IN THE AC. JMP* NXCNT / /SUBROUTINE TO DECREASE STORE ADDRESS FOR /ENTERING A NEW SYMBOL IN SYMBOL TABLE AND /CHECKING FOR SYMBOL TABLE OVERFLOW. LPTCNT 0 LAC LSMEND TAD (777777 /DECREASE SYMBOL TABLE DAC LSMEND /END POINTER. CMA /1'S COMP. SUBROUTINE. TAD LPRES /COMPARE SYMBOL TABLE END SMA /POINTER TO END OF FREE JMP ERROR4 /STORAGE. --- OVERFLOW ERROR JMP* LPTCNT / .EJECT /SUBROUTINE TO STORE A SYMBOL AND ITS DEFINITION IN THE SYMBOL TABLE / LSMSTR CAL 0 LAC LSMDEF /STORE SYMBOL DEFINITION IN SYMBOL TABLE DAC* LSMEND JMS LPTCNT LAC LSYM1 / STORE FIRST THREE CHARACTERS OF SYMBOL IN DAC* LSMEND / SYMBOL TABLE. TEST SYMBOL WORD TO SEE IF SMA / SYMBOL IS MORE THAN THREE CHARACTERS. JMP SMSTR1 JMS LPTCNT LAC LSYM2 / STORE SECOND WORD OF SYMBOL IN TABLE. DAC* LSMEND SMSTR1 JMS LPTCNT JMP* LSMSTR / RETURN TO CALLING PROGRAM. / /ADD THIRTEEN BIT CURRENT RELOCATION FACTOR TO DATA WORD ADDRESS SUB- /ROUTINE. /CALLING SEQUENCE / JMS LMOD13 / LMOD13 CAL 0 DAC LTEMP1 / STORE DATA WORD IN TEMP. STORAGE LAC LRELOC // LOAD 15 BIT ADDRESS AND MASK / EXTRACT OUT BITS 14 AND 15 TAD LTEMP1 / ADD DATA WORD TO 13 BIT ADDRESS JMP* LMOD13 / RETURN TO CALLING PROGRAM / .EJECT /TWOS COMPLEMENT ACCUMULATOR SUBROUTINE /CALLING SEQUENCE / JMS LCOMP / LCOMP CAL 0 CMA / ONE COMP. ACCUMULATOR TAD (1 / ADD ONE TO BIT 17 JMP* LCOMP / RETURN TO CALLING PROGRAM / ERROUT CLL /SET ERR NUMBER (IN AC) IN RTR /ERROR MESSAGE RTR XOR (031400) /(CAR RTN) DAC ERRMES+3 JMS TYPE ERRMES EXIT .EXIT /EXIT / / TYPE -- SUBROUTINE TO TYPE THE MESSAGE WHOSE ADDRESS / FOLLOWS THE JMS TYPE / TYPE 0 LAW -2 TAD* TYPE XOR XXBANK DAC .+3 .WRITE -3,2,XX,0 .WAIT -3 ISZ TYPE JMP* TYPE / EOMMES .ASCII /LD [777] & ^P /<175> ERRMES .ASCII /.SYSLD 7/ CARRTN 064000 /CAR RTN / /LOWEST FREE ADDRESS IN EACH OF THE /EIGHT 4K MEMORY BANKS. / LPRESX 0 /EXTRA 4K BANK 0 /DUMMY ENTRY. LPRES0 XX /CONTENTS OF .SCOM+2 10020 LPRES1 20020 30020 LPRES2 40020 50020 LPRES3 60020 70020 LPRESS LPRESX-1 LPRESP 0 / /SUBROUTINE TO STORE NEW LOWEST FREE ADDRESS /IN PROPER ENTRY IN BANK POINTERS TABLE /AND UPDATE LPRES IF NEED BE. AJUST 0 LAC* LPRESP /IN CASE ROUTINE DAC AJUST1 /BY SAME NAME LAC LPRES /ALREADY LOADED DAC AJUST2 CLL!CLA!CMA!CML TAD LPRESP /0 TO LINK SAD LPRESS CML /XTRA 4K BANK. LAC LLPRES /UPDATE TABLE DAC* LPRESP /ENTRY. SZL!CMA JMP* AJUST TAD LPRES /NOT XTRA 4K. LAC LLPRES /KEEP HIGHER SNL /ADDRESS. DAC LPRES JMP* AJUST AJUST1 0 AJUST2 0 / .IFUND PDP9 EPM DBA /ENTER PAGE MODE INSTRUCTION /NOP WHEN XCT FILE IS READ USING /.SYSLD'S I/O HANDLER .ENDC .END