File LIBRA.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/LIBRA: F4 LIBRARIAN, V24A
/
/
/
/
/
/
/
//
/
/
/
/
/COPYRIGHT (C) 1974, 1975
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/
/
/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
/SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
/SION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE, OR ANT OTHER
/COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
/TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
/AGREES TO THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE
/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
/
/
/THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
/NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
/EQUIPMRNT COROPATION.
/
/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
/SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
/
/
/
/
/
/

/LIBRA: FORTRAN IV LIBRARIAN / / / BORN OF JUD LEONARD, UNDER THE / SIGN FOR WHICH IT IS NAMED. / / / CHANGES FOR V23 / .PRINT VERSION NUMBER / .ACCEPT INPUT FROM CONSOLES WITHOUT PARITY / / / CHANGES FOR OS/8 V3D BY PAULA TIRAK / .CHANGED VERSION NUMBER TO 24A / .PUT IN NEW DATE ALGORITHM / .NO LONGER MISNAMES THE SECOND OUTPUT FILE / / / OS/8 CONSTANTS: VERS=24 PATCH="A / FETCH=1 LOOKUP=2 ENTER=3 CLOSE=4 DECODE=5 CHAIN=6 ERROR=7 USRIN=10 USROUT=11 / OUTF1=7600 /LIBRARY OUTF2=7605 /CATALOG LISTING OUTF3=7612 /UNUSED INF=7617 / EQHI=7642 SWATOL=7643 SWMTOX=7644 SWYTO9=7645 EQLO=7646 DHRES=7647 /HANDLER RESIDENCY TABLE SYSDAT=7666 /SYSTEM DATE DCTLW=7760 /DEVICE CONTROL WORD TABLE / DEVICE CONTROL WORDS HAVE THE FORM: / BIT 0 FILE STRUCTURED / BIT 1 READ ONLY / BIT 2 WRITE ONLY / BITS 3-8 DEVICE TYPE / BITS 9-11 DIR BLOCK OF CURRENT TENTATIVE FILE / / INTERNAL DEFINITIONS: F0=00 F1=10 CATBUF=2000 /IN FIELD 1 CBUFS=1 /NUMBER OF BUFFERS FOR CATALOG MODBUF=2400 /LIKEWISE MBUFS=12 /BUFFERS FOR MODULE ODEVH=7200 /OUTPUT DEVICE HANDLER (ROOM FOR 2-PAGE) IDEVH=6600 /INPUT DEVICE HANDLER
/ / PAGE 0 FOR LIBRA / *1 TMP1, 0 TMP2, 0 /SOME TEMPS TMP3, 0 TMP4, 0 TMP5, 0 TMP6, 0 TMP7, 0 X0, 0 /AUTO-INDEX X1, 0 X2, 0 X3, 0 X4, 0 X5, 0 X6, 0 X7, 0 USR, 200 /CURRENT USR CALL ADDRESS /LIBRA ASSUMES USR ALWAYS PRESENT LIBDVH, ODEVH /ADDRESS OF LIBRARY DEVICE HANDLER LIBU, 1 /UNIT CONTAINING LIBRARY; INITIALLY SYS: CATLEN, 0 /LENGTH OF CATALOG CATBLK, 0 /CURRENT CATALOG BLOCK IN CORE LAVAIL, 0 /NEXT AVAILABLE LIBRARY BLOCK LIBNAM, TEXT "FORLIBRL" *.-1 INFP, INF /CURRENT PLACE IN INPUT FILE LIST MODU, 0 /UNIT CONTAINING CURRENT MODULE MODDVH, IDEVH /INPUT DEVICE HANDLER ADDRESS MODLEN, 0 /LENGTH OF THIS MODULE MODBLK, 0 /FIRST BLOCK OF MODULE INLSW, 0 /NON-ZERO IF IN LIBRARY INPUT INFST, 0 /FIRST BLOCK OF INPUT FILE INBLK, 0 /NEXT INPUT BLOCK NUMBER THSBLK, 0 /READIN CONTROL FULFLG, 0 /-1 IF CAT FULL
ENAM1, 0 ENAM2, 0 /HOLDER FOR ESD NAMES ENAM3, 0 0 /TEXT STOPPER FOR ENAME ESDCTR, 0 PCAT, CATBUF /POINTER TO CURRENT CATALOG BLOCK INCLUD, -1 /SW FOR NAME INCLUDED IN CATALOG CHANGD, 1 /0 IF CAT BLOCK MODIFIED PMOD, MODBUF /POINTER TO CURRENT MODULE BLOCK / TTFLAG, 0 /NON-ZERO WHEN TTY HAS INITIALIZED PCHR, TTO /OUTPUT ROUTINE TTPOS, 0 /TTY POSITION COUNTER CATCNT, 0 IOERR, 0 7421 /ERROR CODE TO MQ JMP I .+1 IOMES /LOG THE ERROR
/ LIBRA MAIN CONTROL / *177 /MAKES IT EASY TO CALL START START, CDF F0 JMS TTWAIT /ALLOW TTY TO COMPLETE CIF F1 JMS I USR DECODE TXTRL, 2214 /RL DEFAULT EXT TAD (INF /RESET INPUT FILE POINTER DCA INFP TAD (TTO /AND IO DEVICE DCA PCHR DCA FULFLG CDF F1 TAD I (OUTF1 SNA /NEW LIBRARY SPECIFIED? JMP LASTLB /NO, USE LAST ONE DCA LIBU /GET LIBRARY UNIT TAD (OUTF1 DCA X0 TAD I X0 DCA LIBNAM /MOVE TAD I X0 /IN DCA LIBNAM+1 /NEW TAD I X0 /NAME DCA LIBNAM+2 TAD I X0 SNA TAD TXTRL /IF NO EXT, FORCE .RL DCA LIBNAM+3 LASTLB, TAD LIBU /REGET UNIT AND (17 TAD (DCTLW-1 /ADDRESS DEV CTL TABLE DCA TMP1 TAD I TMP1 CDF F0 SMA CLA /IS DEVICE FILE-STRUCTURED? JMP NOTFS /NO, BOMB TAD (ODEVH!1 DCA OHADDR /ALLOW 2-PAGE HANDLER TAD LIBU AND (17 CIF F1 JMS I USR /GET THE HANDLER FETCH OHADDR, ODEVH!1 JMS IOERR /YOU'RE KIDDING TAD OHADDR /NOW THE REAL ADDRESS DCA LIBDVH JMP ZTEST
NOTFS, JMS TTOTXT FLSTR-1 JMS CRLF JMP START / IOMES, CLA TAD (TTO DCA PCHR /ENSURE IT COMES OUT ON TTY JMS TTOTXT IOMSG-1 JMS CRLF JMP START PAGE
ZTEST, CDF F1 /FIND OR CREATE LIB. TAD I (SWYTO9 /GET SWITCH WORD AND (2000 /TEST FOR /Z CDF F0 SZA CLA JMP NEWLIB /YES, ENTER NEW ONE OLDLIB, JMS FNDLIB /LOOKUP THE LIBRARY LOOKUP JMP NEWLIB /COULDN'T FIND IT / TAD LIBBLK /FIRST BLOCK OF LIBRARY DCA ZCATB TAD (CBUFS+MBUFS^200!F1 DCA ZCATC /READ ALL YOU CAN JMS ZCAT /DO THE READ CDF F1 TAD I (CATBUF /LOOK AT CONTROL WORD CLL RAR SZA CLA /IS IT A LIBRARY? JMP NOTLIB /NO, ERROR TAD I (CATBUF+3 CDF F0 DCA CATLEN /LENGTH IN BLOCKS TAD LIBBLK DCA LAVAIL /WILL BE UPDATED DURING SCAN TAD LAVAIL DCA CATBLK /CURRENT BLOCK IN BUFFER TAD CATLEN CIA DCA TMP2 /COUNTER CSLOOP, TAD (CBUFS+MBUFS TAD TMP2 SMA /WILL THE REST FIT IN BUFFER? JMP CSLAST /YES DCA TMP2 TAD (-CBUFS-MBUFS^100 DCA TMP1 /ENTRIES NOW IN CORE JMS SCAT /SCAN CATALOG TAD ZCATB /NEXT BLOCK WE'LL READ DCA CATBLK JMS ZCAT /READ SOME JMP CSLOOP
CSLAST, CIA /NO OF BLOCKS WE DON'T NEED TAD (CBUFS+MBUFS JMS R6L /NO OF ENTRIES WE CAN LOOK AT CIA DCA TMP1 JMS SCAT /LOOK FOR END FULCAT, JMS TTOTXT /RAN OFF THE END CATFUL-1 JMS CRLF /** JMP LCLOSE / SCAT, 0 TAD (CATBUF-1 DCA X0 SCLOOP, CDF F1 TAD I X0 CMA /TEST FOR END SNA CLA JMP GETINF /THAT'S IT ISZ X0 ISZ X0 /IGNORE REST OF NAME TAD I X0 /GET LENGTH TAD LAVAIL /ADD TO ST BLOCK OF FREE AREA DCA LAVAIL ISZ TMP1 JMP SCLOOP CDF F0 JMP I SCAT /GO FOR NEXT BUFFER LOAD / NOTLIB, JMS PRLBNM /PRINT LIBRARY NAME JMS TTOTXT UNLIB-1 JMS CRLF JMP START PAGE
NEWLIB, JMS FNDLIB ENTER JMS IOERR TAD LIBU AND (7760 CLL RTR RTR SNA /DID HE GIVE A LENGTH? STL RTL /NO, USE 2 DCA CATLEN CDF F1 TAD I (EQLO /HOW MANY EXTRA BLOCKS WANTED CDF F0 TAD CATLEN /PLUS CATALOG REQUIREMENT CLL TAD LIBLEN /MINUS AVAILABLE LENGTH SZL CLA /CHECK FOR ENUF ROOM JMP LSZERR /NO ROOM, GIVE MESSAGE / / WRITE EMPTY CATALOG / TAD (CATBUF-1 DCA X0 TAD (-MBUFS-CBUFS^400 DCA TMP1 CDF F1 DCA I X0 ISZ TMP1 JMP .-2 TAD (CATBUF-1 /RESET FOR LATER USE DCA X0 CLA CMA TAD CATLEN SPA SNA /MORE THAN ONE? JMP CATB0 /JUST ONE CIA ISZ ZCATB /START WITH SECOND CAT BLOCK ZCLOOP, CLL TAD (MBUFS+CBUFS DCA TMP1 SZL /FULL WRITE? TAD TMP1 /NO CIA TAD (MBUFS+CBUFS JMS R6R TAD (4000!F1 DCA ZCATC /SET CONTROL JMS ZCAT TAD TMP1 SPA JMP ZCLOOP /MORE TO GO CATB0, CDF F1 CLA IAC /1 IS LIBRARY CODE DCA I X0 TAD (VERS DCA I X0 /MARK LIBRA VERSION # TAD LIBLEN /JUST A GUESS CIA DCA I X0 TAD CATLEN DCA I X0 CLA CMA /END OF CAT INDICATOR DCA I X0 /MARKS FIRST AVAIL SLOT CDF F0 DCA CHANGD /FORCE A WRITE ON THIS ONE TAD ZCATB DCA LAVAIL TAD LIBBLK /LIBRARY START BLOCK DCA CATBLK /IS CURRENTLY IN BUFFER JMP GETINF /BEGIN / ZCAT, 0 CDF F0 JMS CCHK /LOOKOUT FOR CONTROL C JMS I LIBDVH ZCATC, F1 CATBUF ZCATB, 0 JMS IOERR TAD ZCATC JMS R6L AND (17 TAD ZCATB DCA ZCATB ISZ CHANGD /SET UNMODIFIED SW JMP I ZCAT JMP .-2 / FNDLIB, 0 TAD I FNDLIB DCA USRCOD ISZ FNDLIB TAD (LIBNAM DCA LIBBLK TAD LIBU AND (17 CIF F1 JMS I USR USRCOD, 0 LIBBLK, LIBNAM LIBLEN, 0 /NEG, REMEMBER JMP I FNDLIB /COULD'T DO IT TAD LIBBLK /FIRST BLOCK DCA ZCATB /OF CATALOG ISZ FNDLIB JMP I FNDLIB LSZERR, JMS TTOTXT SMALL-1 JMS CRLF JMP START /GO FOR MORE PAGE
/ / SETUP POINTERS AND THINGS FOR NEXT INPUT MODULE / GETINF, CLA CMA DCA INCLUD /SET NO-NAME-INCLUDED SW TAD INLSW /ARE WE GETTING INPUT FROM A LIBR? SZA CLA JMP INLIB /YES-GET NEXT MODULE THEREIN NXTINF, CDF F1 TAD I INFP /UNIT AND LEN OF NEXT IN FILE SZA /IS THERE ONE? JMP FTCHIN /YES TAD I (SWATOL AND (1000 /TEST FOR /C CDF F0 SNA CLA JMP LCLOSE /NO MORE JMS SAVRES /PRESERVE DEV HANDLER RESIDENCY JMS TTWAIT /FINISH ANY TYPING CIF F1 JMS I USR /NEW LINE CONTINUES OLD DECODE 2214 /RL DEFAULT EXT 0 /DO NOT DELETE TENTATIVE FILES JMS RSTRES /RESTORE RESIDENCY TABLE TAD (INF DCA INFP /RESET INPUT FILE POINTER JMP NXTINF /TRY AGAIN
FTCHIN, DCA MODU /UNIT CONTAINING INPUT MOD ISZ INFP TAD I INFP DCA INFST /START OF INPUT FILE ISZ INFP TAD INFST DCA MODBLK /IN THIS CASE, FILE=MODULE TAD MODU AND (7760 CIA CLL RTR RTR DCA MODLEN TAD (IDEVH!1 DCA INDVH /TENTATIVE HANDLER ADDR CDF F0 TAD MODU AND (17 CIF F1 JMS I USR FETCH INDVH, IDEVH!1 /TENTATIVE INPUT HANDLER ADDR JMS IOERR /DON'T GIVE ME THAT TAD INDVH DCA MODDVH /DEVICE HANDLER ADDRESS DCA THSBLK /FORCE READIN TO READ LUKMOD, TAD MODBLK /FIRST BLOCK OF MODULE DCA INBLK /INITIALIZE READIN JMS READIN /GET FIRST BLOCK CDF F1 CLA CMA /-1 TAD I PMOD /LOOK AT IDENTIFIER CDF F0 SNA JMP GOTLIB /ITS A LIBRARY CLL RTR SZA CLA /IS IT A MODULE JMP BADINF /BAD INPUT TAD LIBBLK /MAKE SURE CIA TAD LIBLEN /THAT MODULE TAD LAVAIL /FITS IN LIBRARY CLL SNA /CHECK FOR TOO LONG HERE TOO** JMP OVFLO /IT IS TOO LONG TAD MODLEN SNL CLA JMP NXTEBK /GO GETTUM OVFLO, JMS TTOTXT TOOBIG-1 JMS CRLF JMP GETINF
BADINF, JMS TTOTXT NOTMOD-1 JMS CRLF JMP GETINF / GOTLIB, TAD MODLEN SNA CLA JMP LB2BIG /CAN'T DO A LOOKUP IF G. T. 255 ISZ INLSW /SET IN-LIBRARY SWITCH JMP INLIB LB2BIG, JMS TTOTXT L2BMSG-1 JMS CRLF JMP START PAGE
/ GET NEXT MODULE FROM LIBRARY / INLIB, TAD INFST /START OF INPUT FILE DCA INBLK /IS WHAT WE WANT JMS READIN /BRING CATALOG INTO MODULE BUFFER TAD (3 TAD PMOD DCA TMP1 CDF F1 TAD I TMP1 /GET CATALOG LEN CIA DCA TMP1 /HOLD COUNTER IN CASE OF FULL CATALOG TAD INFST DCA INBLK /WE WANT THE SAME ONE AGAIN TAD INFST DCA TMP3 /INIT ACCUMULATED MODULE START BLOCK DCA MODLEN /INITAIL MOD LEN IS ZERO INLSC1, JMS READIN /GET CATALOG BLOCK TAD (-100 DCA TMP2 /COUNT ENTRIES IN CAT BLOCK INLSC2, CDF F1 TAD I PMOD /LOOK FOR END-OF-CATALOG WORD CMA SNA CLA JMP NDLSC /END OF SCAN TAD (3 TAD PMOD /POINT TO LENGTH DCA TMP5 TAD I TMP5 SNA CLA /FIRST ENTRY FOR A MODULE? JMP NOLEN /NO, DO NOT UPDATE TAD MODLEN TAD TMP3 /UPDATE MODULE STARTING BLOCK DCA TMP3 TAD I TMP5 /GET THIS LENGTH DCA MODLEN /FOR THIS MODULE NOLEN, TAD MODBLK /COMPARE LAST MODULE STARTING BLOCK CMA CLL TAD TMP3 /TO ACCUMULATED START BLOCK SNL CLA /INTERESTING? JMP NOTYET /NO TAD I PMOD /YES; WAS NAME DELETED? SZA CLA JMP GLMOD /NO, WE'VE GOT A GOOD MODULE NOTYET, TAD (4 TAD PMOD /POINT TO NEXT NAME DCA PMOD ISZ TMP2 /END OF CAT BLOCK? JMP INLSC2 /NO ISZ TMP1 /YES; END OF CATALOG? JMP INLSC1 /NO, GET NEW BLOCK NDLSC, DCA INLSW /YES, NO LONGER IN A LIBRARY JMP NXTINF /GET ANOTHER FILE
GLMOD, TAD TMP3 /GET STARTING BLOCK DCA MODBLK /OF MODULE JMP LUKMOD /AND GO GET THE MODULE L2BMSG, TEXT "INPUT LIBRARY TOO BIG";0 PAGE
/ PROCESS LOOP FOR ONE MODULE / NXTEBK, TAD (3 TAD PMOD /ADDR OF FIRST ESD-1 DCA X0 /RESET POINTER TO NAMES TAD (-52 /PER BLOCK COUNT DCA ESDCTR ESDLUP, CDF F1 TAD I X0 DCA ENAM1 TAD I X0 DCA ENAM2 TAD I X0 DCA ENAM3 TAD I X0 /TYPE CODE CDF F0 TAD (ESDTAB /DISPATCH FROM TBL DCA TMP1 JMP I TMP1 ESDTAB, JMP ESDEND /0=END OF ESD TABLE JMP DUPLUK /1=ENTRY=LOOK FOR /DUPLICATE NAME JMP ESDLND /2=EXTERN=IGNORE NAME JMP ESDLND /3=FORT COMMON=IGNORE JMP DUPLUK /4=PROG SECTION HLT /5=MUL ENTRY=DOESN'T /EXIST HLT /6=MUL SECTION=DITTO JMP DUPLUK /7=SECT8 JMP ESDLND /10=COMMZ JMP DUPLUK /11=FIELD1
/ / LOOK FOR DUPLICATION OF THIS ESD SYMBOL / DUPLUK, TAD CATLEN CIA DCA TMP1 /COUNT LENGTH OF CAT TAD CATBLK CIA TAD LIBBLK /ARE WE AT FIRST BLOCK? SZA CLA JMS CHGCHK /CHECK FOR BLOCK MODIFIED TAD LIBBLK DCA NXTCAT /SETUP FOR FIRST BLOCK OF CAT TAD CATLEN CIA DCA CATCNT GETCB, JMS GCATB /GET IT TAD (CATBUF-1 DCA X1 TAD (-100 /COUNT ENTRIES/BLOCK DCA TMP2 CDF F1 CBSRCH, TAD I X1 /LOOK AT NAME CMA SNA JMP CHKI /END OF CATALOG-LOOK FOR /I IAC /COMPLETE THE CIA TAD ENAM1 /COMPARE SZA CLA JMP NOMTCH TAD I X1 CIA TAD ENAM2 SZA CLA JMP NOMTCH TAD I X1 /LAST CHANCE CIA TAD ENAM3 SNA CLA JMP GOTMAT /EQUAL! NOMTCH, TAD X1 AND (-4 TAD (3 /BUMP TO NEXT DCA X1 ISZ TMP2 JMP CBSRCH JMS CHGCHK /CHECK FOR MODIFIED BLOCK ISZ TMP1 /END OF CATALOG? JMP GETCB /NO, GET NEXT JMS TTOTXT CATFUL-1 JMS CRLF CLA CMA DCA FULFLG JMP ESDEND /PUT THAT, IF POSSIBLE
GOTMAT, CDF F0 JMS TTOTXT ENAM1-1 /PRINT THE NAME JMS TTOTXT NDUP-1 /WHICH TO KEEP? CDF F1 TAD I (SWATOL CDF F0 AND (10 /TEST /I SNA CLA JMP CHKR /NO, LOOK FOR /R GMASK, JMS TTOTXT KEEP-1 JMS WAITOP JMP ESDLND /DEFAULT TO THE OLD ONE TAD (-"O SNA JMP ESDLND /KEEP OLD IAC /IS IT "N"? SZA CLA JMP GMASK /TRY AGAIN JMP DELTO /DELETE THE OLD PAGE
CHKR, JMS CRLF CDF F1 TAD I (SWMTOX AND (100 /TEST /R SNA CLA JMP ESDLND /DEFAULT:KEEP THE OLD ONE DELTO, CDF F1 TAD X1 AND (-4 CIA CMA /BACK UP POINTER DCA X1 DCA I X1 /CLEAR DCA I X1 /OLD DCA I X1 /NAME ISZ X1 /SKIP OVER LENGTH DCA CHANGD /BLOCK HAS BEEN MODIFIED JMP NXTE /ENTER AT END OF LOOP NDSCN, CDF F1 TAD I X1 /LOOK AT NEXT CMA SNA CLA JMP ENDCAT /NOW WE'RE THERE TAD X1 TAD (3 /BUMP TO NEXT NAME DCA X1 NXTE, ISZ TMP2 JMP NDSCN JMS CHGCHK /LOOK OUT FOR CHANGES ISZ CATCNT /END OF CAT ? SKP JMP FULCAT /NO MORE PUSSY JMS GCATB TAD (CATBUF-1 DCA X1 TAD (-100 DCA TMP2 JMP NDSCN
CHKI, TAD I (SWATOL /LOOK AT /I SW AND (10 SNA CLA JMP ENDCAT /NOT SET JMS TTOTXT ENAM1-1 /TYPE ESD NAME JMS TTOTXT NCLUD-1 /INCLUDE IT? IANS, JMS WAITOP JMP ENDCAT /DEFAULT TO INCLUDE TAD (-"Y SNA JMP ENDCAT /YES, INCLUDE TAD ("Y-"N SZA CLA /IS IT "N"? JMP IANS /NO, TRY AGAIN JMP ESDLND ENDCAT, TAD X1 /POINT TO EMPTY SLOT AND (-4 CIA CMA DCA X1 JMP INSERT PAGE
/ THIS ESD GOES IN THE CATALOG / INSERT, CDF F1 TAD ENAM1 /MOVE DCA I X1 /NAME TAD ENAM2 /TO DCA I X1 /LIBRARY TAD ENAM3 /CATALOG DCA I X1 ISZ INCLUD /IS THIS THE FIRST? SKP TAD MODLEN /YES, GET THE LENGTH DCA I X1 /AND STORE 4TH WORD DCA CHANGD /SET CAT MODIFIED SW CLA IAC TAD X1 /CHECK FOR END OF BLOCK AND (377 SZA CLA JMP MARKND /NO, MARK END OF CAT JMS CHGCHK /WRITE THIS BLOCK CDF F1 TAD (-400 DCA TMP1 /SET COUNT FOR BLOCK LEN TAD (CATBUF-1 DCA X1 /SET POINTER CLA CMA DCA I X1 ISZ TMP1 JMP .-2 /CLEAR THE BLOCK DCA CHANGD ISZ CATBLK JMP ESDLND MARKND, CLA CMA DCA I X1 /MARK NEW END OF CAT ESDLND, CDF F0 CLA STL RTL /TWO TO SKIP VALUE TAD X0 DCA X0 ISZ ESDCTR /DONE WITH BLOCK? JMP ESDLUP /NO, GET NEXT JMS READIN /GET NEXT BLOK JMP NXTEBK /RESET POINTERS AND CONTINUE ESDEND, ISZ INCLUD /CHECK FOR ANY NAMES OUT JMP CPYMOD /YES, COPY MODULE INTO LIBRARY JMS TTOTXT /SORRY, DIDN'T MAKE IT NONEIN-1 JMS CRLF ISZ FULFLG JMP GETINF /TRY NEXT JMP LCLOSE
CPYMOD, TAD MODBLK /GET IN FILE STRT BLOCK DCA INBLK TAD MODLEN CIA DCA TMP1 TAD LAVAIL /FIRST AVAILABLE BLOCK DCA NXTOBK CPYLUP, JMS READIN /READ BLOCK OF INPUT TAD PMOD DCA PNXTOB JMS I LIBDVH /CALL OUTPUT HANDLER 4200!F1 PNXTOB, MODBUF NXTOBK, 0 /NEXT OUTPUT BLOCK NUMBER JMS IOERR ISZ NXTOBK /BUMP BLOCK NUMBER ISZ TMP1 /CHECK LENGH JMP CPYLUP TAD NXTOBK DCA LAVAIL /UPDATE AVAILABLE POINTER JMP GETINF /GO FOR NEXT PAGE
CHGCHK, 0 CDF F0 /PRECAUTION TAD CHANGD /HAS BLOCK BEEN MODIFIED? SZA CLA JMP I CHGCHK /NO, NOTHING TO DO TAD CATBLK DCA ZCATB /WRITE THE BLOCK TAD (4200!F1 DCA ZCATC JMS ZCAT JMP I CHGCHK /OK / / GCATB, 0 CDF F0 TAD NXTCAT CIA TAD CATBLK /IS IT IN CORE? SNA CLA JMP SOEZ /YES, ITS EZ TAD NXTCAT CIA TAD LIBBLK TAD CATLEN SPA SNA CLA /CHECK FOR INTERNAL ERROR JMP FULCAT /** TAD NXTCAT DCA ZCATB TAD (200!F1 /SET FOR READ DCA ZCATC JMS ZCAT TAD NXTCAT /NEXT BLOCK DCA CATBLK /IS IN CORE SOEZ, ISZ NXTCAT JMP I GCATB NXTCAT, 0 PAGE
LCLOSE, JMS CHGCHK TAD USRCOD TAD (-ENTER /DID WE ENTER A NEW FILE? SZA CLA JMP CATLST /NO, GO LIST CATALOG TAD LIBBLK /GET LEN CIA CDF F1 TAD I (EQLO /GET USER EXTENSION REQUEST CDF F0 TAD LAVAIL /PLUS CURRENT END DCA TMP1 TAD TMP1 CLL TAD LIBLEN /CHECK FOR POSSIBLE SNL CLA JMP .+4 TAD LIBLEN /CAN'T GIVE ALL HE WANTS CIA SKP TAD TMP1 DCA LCLEN /SET CLOSE LENGTH TAD CATLEN CMA TAD LCLEN /COMPARE CAT LEN TO LIB LEN SPA SNA CLA JMP NOLIB /THERE'S NO POINT TAD LIBBLK /GET FIRST BLOCK DCA NXTCAT JMS GCATB CDF F1 TAD LCLEN /ACTUAL LIBRARY LENGTH DCA I (CATBUF+2 CDF F0 DCA CHANGD JMS CHGCHK /WRITE IT TAD LIBU AND (17 CIF F1 JMS I USR CLOSE LIBNAM LCLEN, 0 JMS IOERR JMP CATLST /GO LIST THE CATALOG / NOLIB, JMS TTOTXT WHYCLS-1 JMS CRLF JMP START PAGE
/ LIST THE CATALOG / CATLST, JMS OOPEN /OPEN LISTING FILE JMP START /NONE DESIRED TAD (OCHAR /SETUP FOR DEVICE-INDEPENDENT DCA PCHR /OUTPUT TAD (214 /AT TOP OF PAGE JMS I PCHR JMS CRLF JMS TTOTXT LBV-1 JMS TTOTXT CATOF-1 JMS PRLBNM /PRINT THE NAME CDF F1 TAD I (SYSDAT CDF F0 SNA JMP NODATE /DON'T KNOW THE DATE DCA TMP1 JMS TTOTXT ON-1 CLA /THE FOLLOWING CODE GETS THE DAY DCA TMP2 TAD TMP1 /GET THE DATE RTR /ROTATE THREE RIGHT AND MASK RAR /TO GET THE DAY IN OCTAL AND (37 JMS MAK8BT /MAKE IT 8-BIT AND PRINT DCA TMP2 TAD TMP1 /GET THE DATE BACK AND (7400 /MASK TO GET THE MONTH BITS JMS R6R /MONTH*4 (IN OCTAL) DCA TMP2 /PUT IN TEMP. VARIABLE TO SAVE IT TAD TMP2 /GET IT BACK
RTR /MONTH TAD TMP2 TAD (MONTHS-6 DCA .+2 /ADDRESS OF MONTH FROM TABLE JMS TTOTXT /PUT IT IN THE TEXT LINE 0 TAD TMP1 /GET THE DATE---TO FIND THE YEAR AND (7 /MASK TO GET THE YEAR OFFSET BITS DCA TMP4 /SAVE THEM DCA TMP2 TAD I (7777 /GET THE DATE EXTENSION BITS AND (600 CLL RTR /ROTATE TO GET THEM INTO BIT RTR /POSITIONS 7 AND 8 TAD (106 /ADD 70(ORIGINAL BASE YEAR) TAD TMP4 /ADD IN THE YEAR OFFSET BITS JMS MAK8BT /MAKE 8-BIT AND PRINT NODATE, JMS CRLF JMP PRCAT /TITLE IS DONE, PRINT CAT MAK8BT, 0 /ROUTINE TO CONVERT TO 8-BIT AND PRINT CLL /FIRST CONVERT TO DECIMAL CONVYR, TAD (-12 /KEEP SUBTRACTING 12 SPA /HAVE THE YEAR JMP GETDG1 ISZ TMP2 /HOLDS THE FIRST DIGIT OF YEAR JMP CONVYR GETDG1, TAD (12 /GET THE SECOND DIGIT DCA TMP3 /SAVE IT TAD TMP2 /GET THE FIRST DIGIT SNA /FIRST DIGIT IS A ZERO JMP PRDIG2 /PRINT THE SECOND DIGIT TAD (260 /MAKE FIRST DIGIT OF YEAR 8-BIT JMS I PCHR /PRINT IT PRDIG2, TAD TMP3 /GET THE SECOND DIGIT TAD (260 /MAKE SECOND DIGIT OF YEAR 8-BIT JMS I PCHR /PRINT IT JMP I MAK8BT /RETURN PAGE
/ LIST ALL ENTRIES IN THE CATALOG / PRCAT, TAD CATLEN CIA DCA TMP1 TAD LIBBLK DCA NXTCAT CLA CMA DCA TMP3 /SET LINE COUNTER CATLUP, JMS GCATB TAD (CATBUF-1 DCA X0 TAD (-100 DCA TMP2 CATLP2, CDF F1 TAD I X0 /GET FIRST WORD OF NAME SNA JMP EMPTY /NOT AN ESD NAME CMA SNA JMP NDCATL /END OF CATALOG CMA /RESTORE FIRST WORD JMS TTO2 /PRINT JMP NDNAM /A SHORT NAME CDF F1 TAD I X0 JMS TTO2 JMP NDNAM CDF F1 TAD I X0 JMS TTO2 NOP NDNAM, ISZ TMP3 /MORE ROOM ON THIS LINE? JMP SAMLIN /SURE JMS CRLF TAD (-10 /SETUP FOR 8 PER LINE DCA TMP3 JMP EMPTY SAMLIN, JMS TAB /SPACE OVER TO NEXT NAME EMPTY, TAD X0 AND (-4 TAD (3 DCA X0 /POINT TO NEXT ISZ TMP2 JMP CATLP2 /GO FOR NEXT ISZ TMP1 /MORE BLOCKS? JMP CATLUP /YES JMS CRLF JMS TTOTXT CATFUL-1 NDCATL, JMS CRLF TAD (214 /EJECT PAGE JMS I PCHR JMS OCLOSE /CLOSE THE FILE JMP START PAGE
/ USEFUL OUTPUT THINGS / TTO, 0 DCA TTOCHR JMS TTWAIT TAD (200 KRS TAD (-217 /CRTL/O CHECK SNA CLA KSF SKP JMP I TTO TAD TTOCHR TLS DCA TTFLAG JMP I TTO TTOCHR, 0 TTWAIT, 0 TAD TTFLAG SNA CLA JMP I TTWAIT JMS CCHK /BEWARE OF CTRL/C TSF JMP .-2 /WAIT TILL DONE DCA TTFLAG /CLEAR BUSY FLAG JMP I TTWAIT CCHK, 0 KSF JMP I CCHK /NOTHING TO WORRY ABOUT TAD (200 KRS TAD (-203 SNA CLA /WAS IT CONTROL C? JMP I (7600 /YES JMP I CCHK TTO2, 0 DCA TMP7 TAD TMP7 JMS R6R JMS TTO2A TAD TMP7 JMS TTO2A ISZ TTO2 JMP I TTO2 TTO2A, 0 AND (77 SNA JMP I TTO2 TAD (-40 SPA TAD (100 TAD (240 JMS I PCHR ISZ TTPOS /BUMP POSITION COUNT JMP I TTO2A
R6R, 0 CLL RTR RTR RTR JMP I R6R R6L, 0 CLL RTL RTL RTL JMP I R6L TTOTXT, 0 CDF F0 TAD I TTOTXT DCA X7 ISZ TTOTXT /BUMP PAST POINTER TAD I X7 JMS TTO2 JMP I TTOTXT JMP .-3 CRLF, 0 DCA TTPOS /RESET POSITION TAD (215 JMS I PCHR TAD (212 JMS I PCHR JMP I CRLF TAB, 0 /PSEUDO-TAB GENERATOR TAD (240 JMS I PCHR ISZ TTPOS TAD TTPOS AND (7 SNA CLA /IS POSITION A MULTIPLE OF 8 JMP I TAB JMP TAB+1 /NO, TRY MORE PAGE
WAITOP, 0 TAD (277 /QUESTION JMS TTO DCA RETCHR WREP, JMS TTI /WAIT FOR REPLY TAD (-215 SNA JMP DFALT TAD (215-240 /PRINTING? SPA JMP WREP /NO, TRY AGIAN TAD (240 DCA RETCHR TAD RETCHR ECHO, JMS TTO JMS TTI TAD (-215 SNA JMP GOTREP TAD (215-377 /LOOKOUT FOR RUBOUT! SNA JMP RUBOUT TAD (377 JMP ECHO RUBOUT, JMS CRLF JMP WAITOP+1 GOTREP, ISZ WAITOP /GOT A REAL ANSWER DFALT, JMS CRLF TAD RETCHR JMP I WAITOP RETCHR, 0 / TTI, 0 KSF /WAIT FOR A KEY JMP .-1 KRB AND (177 /TAKE CARE OF PARITY TAD (-3 /CTRL C? SNA JMP I (7600 /YES TAD (203 /GET ORGINIAL CHAR BACK JMP I TTI PAGE
/ / INPUT BUFFERRER AND STUFF / READIN, 0 CDF F0 TAD INBLK TAD THSBLK /-FIRST BLOCK FOLLOWING BUFFER CONTENTS CLL TAD (MBUFS SNL /IS IT IN CORE? JMP MUSTRD /NO, WE HAVE TO DO A READ CLL RTR RTR RAR /TIMES 400 SETP, TAD (MODBUF /PLUSS BUFFER ADDR DCA PMOD /POINTS TO BLOCK ISZ INBLK /READY FOR NEXT JMP I READIN MUSTRD, CLA /THIS ONE'S HARDER TAD INBLK DCA RDBLK TAD INBLK TAD (MBUFS CIA DCA THSBLK JMS I MODDVH MBUFS^200!F1 MODBUF RDBLK, 0 JMS IOERR JMP SETP /OK
/ ROUTINES TO SAVE AND RESTORE / DEVICE HANDLER RESIDENCY TABLE / SAVRES, 0 TAD (DHRES-1 DCA X0 TAD (SVRES-1 DCA X1 JMS MOVRES JMP I SAVRES RSTRES, 0 TAD (SVRES-1 DCA X0 TAD (DHRES-1 DCA X1 JMS MOVRES JMP I RSTRES MOVRES, 0 TAD (-17 DCA TMP1 CDF F1 TAD I X0 DCA I X1 ISZ TMP1 JMP .-3 CDF F0 JMP I MOVRES SVRES=7400
/ PRINT THE LIBRARY NAME / PRLBNM, 0 TAD LIBNAM JMS TTO2 /FIRST 2 CHARS JMP PREXT TAD LIBNAM+1 JMS TTO2 JMP PREXT TAD LIBNAM+2 JMS TTO2 NOP PREXT, TAD (". JMS I PCHR TAD LIBNAM+3 JMS TTO2 JMP I PRLBNM JMP I PRLBNM PAGE
/ OUTPUT HANDLERS STOLEN FROM PIP OUFLD=F1 OUCTL=MBUFS^200!4000!F1 OUBUF=MODBUF / / INITIALIZE FOR OUTPUT / OUSETP, 0 TAD (OUCTL&3700 /BUFFER SIZE IN DBL WORDS CIA /NEGATE IT (PAL10 BLOWS) DCA OUDWCT TAD (OUBUF DCA OUPTR /INITIALIZE WORD POINTER TAD OUJMPE DCA OUJMP /INITIALIZE 3-WAY CHARACTER SWITCH JMP I OUSETP / / STORE CHARACTERS IN OUTPUT BUFFER / IN PS8 FORMAT (YOU KNOW, 3 CHARS / IN 2 WORDS THE WRONG WAY) / OCHAR, 0 AND (377 DCA OUTEMP CDF OUFLD /SET DATA FIELD TO BUFFER'S FIELD ISZ OUJMP /BUMP THE CHARACTER SWITCH OUJMP, HLT /THREE WAY CHARACTER SWITCH JMP OCHAR1 JMP OCHAR2 TAD OUTEMP CLL RTL RTL AND (7400 TAD I OUPOLD DCA I OUPOLD /UPDATE FIRST WORD OF TWO WITH HIGH /ORDER 4 BITS OF THIRD CHAR TAD OUTEMP CLL RTR RTR RAR AND (7400 TAD I OUPTR DCA I OUPTR /UPDATE 2ND WORD FROM LO 4 BITS TAD OUJMPE DCA OUJMP /RESET SWITCH ISZ OUPTR ISZ OUDWCT /BUMP COUNTER EVERY 3 CHARS JMP OUCOMN TAD (OUCTL /LOAD CONTROL WORD FOR A FULL WRITE JMS I (OUTDMP /DUMP THE BUFFER JMS OUSETP /RE-INITIALIZE THE POINTERS JMP OUCOMN OCHAR2, TAD OUPTR DCA OUPOLD /SAVE POINTER TO FIRST WORD OF TWO ISZ OUPTR /BUMP WORD POINTER TO SECOND WORD OCHAR1, TAD OUTEMP DCA I OUPTR OUCOMN, CDF F0 JMP I OCHAR OUTEMP, 0 OUPOLD, 0 OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 / / MOVE OUTPUT FILE NAME TO FIELD 0 / OFNAME, 0 TAD (OUTF2 DCA X0 /NAME OF CAT LIST FILE CDF F1 TAD I X0 DCA OUFNAM /FIRST 2 CHARS TAD I X0 DCA OUFNAM+1 TAD I X0 DCA OUFNAM+2 TAD I X0 SNA TAD TXTCA /DEFAULT CAT EXT DCA OUFNAM+3 CDF F0 /RESTORE FIELD JMP I OFNAME OUFNAM, ZBLOCK 4 TXTCA, 301 PAGE
OOPEN, 0 CDF F1 TAD I (OUTF2 /GET DEVICE CODE, LEN DCA OUELEN /HOLD IT A MO JMS I (OFNAME /GET FILE NAME INTO FIELD 0 TAD OUELEN /CHECK FOR NULL FILE SNA CLA JMP I OOPEN /NOTHING TO OPEN TAD OUNAME /RESET ENTER CALL DCA OUBLK TAD (IDEVH!1 DCA OUHNDL TAD OUELEN /THE UNIT CIF F1 JMS I USR FETCH /ASSIGN, FETCH HANDLER OUHNDL, 0 /OUTPUT DEVICE HANDLER ENTRY JMS IOERR /HUH? TAD OUELEN /UNIT AGAIN CIF F1 JMS I USR ENTER /ENTER OUTPUT FILE OUBLK, OUFNAM /REPLACED WITH STARTING BLOCK OUELEN, 0 /REPLACED WITH LENGTH OF HOLE JMS IOERR /YOU BLEW IT!!! DCA OUCCNT JMS I (OUSETP ISZ OOPEN JMP I OOPEN
OUTDMP, 0 DCA OUCTLW /STORE THE CONTROL WORD TAD OUCCNT SNA ISZ OUCTLW TAD OUBLK DCA OUREC /COMPUTE STARTING BLOCK TAD OUCTLW JMS R6L AND (17 /COMPUTE THE NUMBER OF RECORDS TAD OUCCNT /UPDATE SIZE OF FILE DCA OUCCNT TAD OUCCNT CLL CML TAD OUELEN SNL SZA CLA /EXCEED GIVEN LENGTH ? JMS IOERR /YES - ERROR CDF F0 JMS I OUHNDL OUCTLW, 0 OUBUF OUREC, 0 JMS IOERR JMP I OUTDMP
OCLOSE, 0 TAD (232 /OUTPUT A CTRL/Z JMS I PCHR FILLLP, JMS I PCHR TAD (77 AND I (OUDWCT SZA CLA /UP TO THE BOUNDARY YET? JMP FILLLP /NO - FILL WITH ZEROS TAD I (OUDWCT /GET DOUBLEWORD COUNT LEFT TAD (OUCTL&3700 SNA /A FULL WRITE LEFT? JMP NODUMP /YES DON'T DO IT TAD (4000!OUFLD /PUT IN FIELD AND WRITE BITS JMS OUTDMP NODUMP, CIF CDF F1 TAD I (OUTF2 CDF F0 JMS I USR CLOSE /CLOSE THE OUTPUT FILE OUNAME, OUFNAM /POINTER TO OUTPUT FILE NAME OUCCNT, 0 JMS IOERR /ERROR WHILE CLOSING - BAD!! JMP I OCLOSE /ALL DONE PAGE
/ MESSAGES / LBV, TEXT "LIBRA V " *.-1 VMESG, VERS&70^7+VERS+6060 PATCH&77^100+40 4000 NONEIN, TEXT "MODULE NOT INCLUDED";0 FLSTR, TEXT "LIBRARY MUST BE ON A FILE-STRUCTURED DEVICE";0 SMALL, TEXT "INSUFFICIENT SPACE FOR LIBRARY";0 NOTMOD, TEXT "INPUT NOT A MODULE";0 TOOBIG, TEXT "INPUT TOO BIG FOR LIBRARY";0 UNLIB, TEXT " IS NOT A LIBRARY";0 NDUP, TEXT " IS DUPLICATE NAME";0 KEEP, TEXT "; KEEP OLD OR NEW";0 CATFUL, TEXT "CATALOG IS FULL";0 NCLUD, TEXT ": INCLUDE";0 WHYCLS, TEXT "LIBRARY TOO SMALL FOR USE; START OVER";0 IOMSG, TEXT "I/O ERROR";0 CATOF, TEXT "CATALOG OF ";0 ON, TEXT " ON ";0 CS197, TEXT ", 197";0 MONTHS, TEXT "-JAN-@@@@@-FEB-@@@@@-MAR-@@@@" TEXT "-APR-@@@@@-MAY-@@@@@-JUN-@@@@" TEXT "-JUL-@@@@@-AUG-@@@@@-SEP-@@@@" TEXT "-OCT-@@@@@-NOV-@@@@@-DEC-@@@@" $



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search