File LNKMAN.MA (MACREL macro assembler source file)

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

/LNKMAN - MAIN LINK ROUTINES
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1977,1978 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/

/LNKMAN PATCH="A /PATCH LEVEL VERS=2 /VERSION FIELD 0 / RBSPEK=2 /SPEC FOR .RB VERSION OF SPEC / OSDATE=7666 / AC2=CLA CLL CML RTL AC3=TAD 3 AC4=TAD 7 AC2000=CLL CLA STL RTR AC4000=CLL CLA STL RAR ACM2=CLL CLA CMA RAL ACM3=CLL CLA CMA RTL / /FIELD 0 BUFFERS LIBTB=6000 /USED TO KEEP TRACK OF LIB MODULES USED NULTAB=6200 /NULL TABLE SOCNTB=6400 /TABLE WITH CNT OF SECT IN OVERLAY CIMAGE=6600 /CORE IMAGE TABLE MBST=6200 /MAIN BINARY SECTION TABLE CCB=6500 /BUFFER FOR CORE CONTROL BLOCK STACK=6500 /START OF STACK BSTAK=STACK+74 /END OF STACK CIDAT=BSTAK /DATA FOR .SV IMAGE LIMITS /NOTE: 06600-07177 IS USED AS A BUFFER FOR .BN DATA /NOTE: A DEVICE HANDLER GOES INTO 07200-07577 / /FIELD 1 BUFFERS INBUF=0 /INPUT BUFFER ENDBUF=INBUF+2000 /END OF INPUT BUFFER LDBUFS=INBUF+2000 /INFO ABOUT BINARY OUTPUT BUFFERS PTRTAB=LDBUFS+60 /POINTER TABLE RELATES /SYM IN MODULE TO SYMBOLS IN GST MPFL=PTRTAB+400 /MAP FILE BLOCK INFO OTFL=MPFL+5 /OUTPUT FILE BLOCK INFO LHDR=OTFL+5 /LOADER INFORMATION QUSRLV=LHDR /USER OVERLAY LEVEL DATA TABLE MODTAB=LHDR+40 /MODULE TABLE STABLE=MODTAB+606 /START OF SECT TABLE FOR MORE THEN 8K MFILE=4000 /TEMP. MAP FILE INFO OFILE=MFILE+5 /TEMP. OUTPUT FILE INFO MTAB=OFILE+5 /TEMP. MODULE FILES INFO NLTAB=MTAB+600 /TEMP. NULL TABLE MAPBUF=INBUF /BUFFER FOR DATA FOR MAP FILE / SCRBLK=40 /SCRATCH BLOCK ON SYS / OSJSWD=7746 /JOB STATUS WORD DCB=7760 /TABLE IN MONITOR WITH DEVICE TYPES /
.ASECT PAGE0 / *0 0 /0 HLT /1 0 /2 3 /3 0 /4,5,6 FOR ODT 0 0 4 /7 /
/ *10 XR0, 0 /AUTO INDEX REGISTERS XR1, 0 / XR2, 0 / XR3, 0 / XR4, 0 / XR5, 0 / XR6, 0 / XR7, 0 / MXFLD, 0 /MAXIMUM FIELD FOR LINKER VCORE, 0 /VIRTUAL CORE SIZE GSTHI, 7570 /HIGHEST ADDRESS ALLOWED FOR GST TASK, 0 /TASK FLAG MODCNT, 0 /COUNT OF MODULES GSTCDF, 0 /FIELD OF GLOBAL SYMBOL TABLE (START) GSTADR, 0 /CURRENT ADDRESS OF GST SECTAB, 0 /ADDRESS OF SECT TABLE BOTCDF, 0 /BOTTOM FIELD OF GST GST, 0 /START OF GST GSTBOT, 0 /ADDRESS OF BOTTOM OF GST STRTFD, -1 /STARTING FIELD OF PROGRAM STRTAD, 0 /STARTING ADDRESS OF PROGRAM JSWRD, 0 /JOB STATUS WORD COUNT1, 0 /LOCAL COUNTER COUNT2, 0 /LOCAL COUNTER COUNT3, 0 TEMP1, 0 /LOCAL TEMP STORAGE TEMP2, 0 TEMP3, 0 TEMP4, 0 POINT1, 0 /LOCAL POINTER POINT2, 0 /LOCAL POINTER OPTAB, ZBLOCK 3 /OPTION TABLE OF SWITCHES FROM COMMAND DECODER GSTPTR, 0 /POINTER INTO GLOBAL SYMBOL TABLE MODPTR, 0 /POINTS TO CURRENT MODULE IN MODTAB PASS2, 0 /PASS INDICATOR - NON ZERO = PASS2 GINDEX, 0 /INDEX INTO GST PTPTR, 0 /POINTER TO POINTER TABLE WORD4, 0 INPTR, 0 /POINTER INTO LSD OVRLVL, 0 /OVERLAY LEVEL GCDF, 0 /CURRENT FIELD OF GST OVRL, 0 /OVERLAY AND LEVEL LSDSTR, 0 /START OF LSD TRNCNT, 0 /TRANSFER VECTOR COUNT SECCNT, 0 /TOTAL COUNT OF SECTS CFLD, 0 /CURRENT CORE FIELD CURBLK, 0 /POINTER TO CURRENT BLOCK IN BINARY BUFFER BP, LDBUFS /BINARY POINTER INTO BINARY OUTPUT BUFFER MAPFIL, ZBLOCK 5 /MAP FILE SPECIFIER OUTFIL, ZBLOCK 5 /.SV FILE SPECIFIER
SAOFF, 0 /STARTING ADDRESS OFFSET TOPLOC, 7600 /HIGHEST LOCATION ALLOWED TO BE USED TOPLC1, 760 /DIVIDED BY 10 TOPLC2, -760 /MINUS VERNUM, VERS+4060 /VERSION NUMBER PATCH&77^100+40 /PATCH LEVEL USR, 7700 /POINTS TO USR ENTRY CTTYHN, TTYHAN /POINTS TO TTY HANDLER COS8ER, OS8ER /OS8 ERROR CFERR, FERR /FATAL ERROR CIOHAN, IOHAN /I-O HANDLER CPUTG, PUTGST /PUT AC INTO GST CCGSTA, CGSTA /CALCULATE GST ADDRESS FROM CONTENTS OF AC CGGST, GETGST /GET A WORD FROM GST RETS, 0 /RETURN FROM SEARCH INPTR1, 0 /SAVED INPTR LIBLEN, 0 /LENGTH OF LIBRARY MODULE RELBLK, 0 /STARTING BLOCK OF LSD IF LIBRARY MODULE LIBFLG, 0 /WHICH LIBRARY MODULE IS BEING PROCESSED / ENDPG0=. / PPAGE, 0 /ADDRESS FROM SECTAB SFLG, 0 /SECT FLAG, CONTAINS TYPE OF SECT (FROM SEARCH SUBROUTINE) CURENT, CURTSK, 0 /CURRENT TASK NUMBER TYPE, 0 /SECT TYPE SECPTR, 0 /POINTER TO NEXT POSITION IN SECTAB HFICP, 0 /HIGHEST FIELD IN CORE PICTURE COUNT4, UNDCNT, 0 /COUNT OF UNDEFINED SYMBOLS FLGS, 0 /FLAG WORD FROM SECTAB SFLD, 0 /SECT FIELD SADR, 0 /SECT ADDRESS SLEN, 0 /SECT LENGTH CADR, 0 /CURRENT CORE ADDRESS CLEN, 0 /CURRENT CORE LENGTH MTLF, 0 /POINTER OF LIBRARY MODULES USED DEFFLG, 0 /FLAG TO INDICATE ANY DEFINITIONS THIS PASS THRU LIBRARY /ALSO USED TO SAVE CURRENT LENGTH OF SECTABLE SOCNT, 0 /COUNT OF SECTS IN OVERLAY SOLIST, 0 /START OF OVERLAY IN SECT TABLE HIAA, 0 /HI ADDRESS OF CURRENT PROGRAM AREA LOWAA, 0 /LOW ADDRESS OF CURRENT PROGRAM AREA UPLIM, 0 LOWLIM, 0 OVRCNT, 0 /COUNT OF NUMBER OF OVERLAYS IN A LEVEL RETRYC, 0 /NEG COUNT OF NUMBER OF RETRIES OF SECT ALLOCATION
ENTCNT, 0 /LENGTH OF SECT TABLE FOR ALLOCATION RECNT, 0 /COUNTER FOR RELATED SECT SCANNING TRYDAT, 0 /DATA FROM TRYLIM ROUTINE SAV2, 0 SAV3, 0 MFLD, -40 /FIRST FIELD WHERE 7600 IS ALLOWED TO BE ALLOCATED RFLD0, 0 /RESERVED FLD BITS 10 TO 23 RFLD1, 0 /RESERVED FLD BITS 24 TO 37 /NO HIGHER THAN 166
*ENDPG0 / RFLD=. /RETURNED FIELD OF SYMBOL BUFCNT=.+1 FLGWRD=.+2 /FLAG WORD FOR TEXT PROCESSING TXTPTR=.+3 TXTWRD=.+4 /TEXT WORD FOR TEXT PROCESSING LSDREF=.+5 CSECT=.+6 RVALUE=.+7 /RETURNED VALUE OF SYMBOL EPTR=.+10 EPT2=.+11 NEWLEN=.+12 BLKBEG=.+13 /BEGINNING ADDRESS FROM BINARY BUFFER TABLE BLKSIZ=.+14 /POINTER INTO BINARY BUFFER NEWBLK=.+15 MAXBLK=.+16 /HIGHEST BLOCK USED IN BINARY IMAGE INTCOR=.+17 /INITIAL CORE VALUE (0 OR 7402) TRNADR=.+20 /TRANSFER VECTOR TABLE ADDRESS TRNFLD=.+21 /TRANSFER VECTOR TABLE FIELD LIBPTR=.+22 /POINTER INTO LIBRARY TABLE BPPREV=.+23 /POINTER TO PREVIOUS BINARY OUTPUT BUFFER BSECTP=.+24 /BINARY SECTION TABLE POINTER (LDHR) FLGCNT=.+25 /COUNT FOR FLAG WORD PROCESSING OVRL1=.+26 /OVERLAY NUMBER FOR CURRENT MODULE CURLOC=.+27 /CURRENT LOCATION BEING LOADED CURLC1=.+30 /SAVED CURLOC TSKNUM=.+31 /TASK NUMBER (FROM .TASK DIRECTIVE) SWPADR=.+32 /ADDRESS OF SWAPPER AND TEMP STORAGE OF INPTR FOR SFOR MPTR=.+33 /POINTER INTO MBST MCTR=.+34 /COUNTER FOR MBST OUTINH=.+35 /FLAG TO INHIBIT OUTPUT, NON-ZERO=INHIBIT /NO HIGHER THAN 166
/ FORMAT OF THE GLOBAL SYMBOL TABLE / / ***************** / : S * Y * / ***************** / * M * B * / ***************** / * O * L * / ***************** / * TASK # * / ***************** / *A*B*C*D*E*TYPE * / ***************** / : FIELD * / ***************** / * ADDRESS * / ***************** / * LVL * OVRL * / ***************** / / A=ABS FLD FLAG / B=ABS ORG / C=FLD PTR BAD / D=ADR PTR BAD / E=UNDEFINE FLAG / / / FORMAT OF SECTAB / / ***************** / *A* GST INDEX # * / ***************** / *B*C* *D* / ***************** / * FIELD * / ***************** / * ADDRESS * / ***************** / *TYPE*LVL *OVRL * / ***************** / * LEN * / ***************** / / A=ALLOCATION FLAG / B=ABS FLD FLAG / C=ABS ORG " / D=FAILED TO LOAD FLAG /
.ASECT LNKMAN *1000 / / /TTYHAN- TTY HANDLER FOR OUTPUTING OF ANY MESAGE IN ANY FIELD / CAN BE CALLED FROM ANY FIELD WITH THE AC=0 / / / CALLING SEQUENCE: CDF X /X= FIELD OF CALLER / CIF 0 / JMS TTYHAN / CDF Y /Y=FIELD OF MES. BUFFER / BUFADR /BUFFER ADDRESS / / / TTYHAN, 0 TAD (CDF CIF RDF /SET FLD INSTR. FOR RETURN DCA CRLFF+1 TAD I TTYHAN /FLD OF MESG. BUFFER DCA TTYCDF ISZ TTYHAN CMA TAD I TTYHAN /BUFADR-1 DCA MESADR ISZ TTYHAN DCA MESADR+1 /0 "HALF" FLAG JMS CRLF TTYCDF, 0 /FLD OF MESG ISZ MESADR+1 /WHICH HALF? JMP .+3 /LEFT TAD I MESADR /RIGHT, GET IT JMP HAF /PROCESS IT ISZ MESADR /LEFT, BUMP POINTER CLA CMA /SET FLAG FOR LEFT HALF DCA MESADR+1 TAD I MESADR /GET NEXT WORD RTR /6 RIGHT RTR RTR HAF, AND [77 /MASK SNA /DONE? JMP CRLFF /YES
TAD [240 /NO, CONVERT TO 8 BIT AND [77 TAD [240 JMS TTYO /OUTPUT IT JMP TTYCDF /GET NEXT CHARACTER CRLFF, JMS CRLF /DONE, CR-LF 0 /RETURN CDF CIF JMP I TTYHAN /EXIT MESADR, 0 /MESSAGE POINTER 0 /"HALF" FLAG 0 /TEMP STORAGE 0 TYPINH, 0 /TYPE INHIBIT FLAG TTYINH=TYPINH / / TTYO, 0 DCA MESADR+2 /SAVE CHARACTER KSF JMP TTYO1 RAR DCA MESADR+3 /SAVE LINK JMS KEYBRD /PROCESS KEYBOARD FLAG TAD MESADR+3 RAL CLL /RESTORE LINK TTYO1, TAD TYPINH SZA CLA /INHIBIT OUTPUT? JMP TTYOX /YES TAD MESADR+2 /GET CHARACTER BATLOG, TLS /**CHANGED** CDF 0 TSF /**FOR** CIF N JMP .-1 /**BATCH** JMS I .+1 CLA /**LOG** 7400 TTYOX, JMP I TTYO /EXIT / / CRLF, 0 TAD (215 JMS TTYO TAD (212 JMS TTYO JMP I CRLF / /
/ EROUT, 0 /COME HERE ON PASS 1 FATAL ERROR DCA .+3 JMS I CTTYHN CDF 0 0 JMP I EROUT / FERR, 0 /FATAL ERROR CDF 0 CLA DCA TTYINH TAD I FERR JMS EROUT FEXIT, CDF NOP .IF REF SYSLP1 < *.-1 JMP SYSLP1 > / NFERR, 0 /NON-FATAL ERROR CDF 0 TAD I NFERR JMS EROUT ISZ NFERR JMP I NFERR /
/ / CALCULATE GST ADDRESS FROM INDEX IN AC / CGSTA, 0 /DIVIDE BY 760 OR 1000 AND (3777 TAD (-1 TAD TOPLC2 /-760 OR -1000 SPA /UNDERFLOW? JMP .+3 /YES ISZ FLDCNT /NO, BUMP COUNTER JMP .-4 /TRY AGAIN TAD TOPLC1 /UNDERFLOW, MAKE + AGAIN CLL RTL /MULTIPLY BY 10(OCT) RAL TAD GST /APPLY OFFSET TO POINTER DCA GSTADR SZL ISZ FLDCNT /CROSSED FIELD BOUNDARIES TAD TOPLOC SNA CLA /GST GO UP TO 7777? JMP CGSTA1 /YES CLL /NO TAD (200 TAD GSTADR SNL /DOES CALC. TAKE ABOVE 7577? JMP CGSTA1 /NO DCA GSTADR /YES, SAVE NEW ADDRESS ISZ FLDCNT /BUMP FIELD CGSTA1, CLA TAD FLDCNT /SHIFT FLD CNT TO BITS 6-8 CLL RTL RAL TAD GSTCDF /ADD START FLD OF GST DCA GCDF /SAVE DCA FLDCNT /ZERO CNT FOR NEXT TIME JMP I CGSTA FLDCNT, 0 / / PAGE
/ IOHAN - I/O HANDLER / 1)FETCHES AN OS/8 DEVICE HANDLER / 2)CHECKS FOR EOF / 3) ISSUES A CALL TO DEVICE HANDLER / / CAN BE CALLED FROM ANY FIELD / IF AC=0 ALL OF THE ABOVE IS DONE / AC=DEV. NUM., DO ONLY FETCH / / / CALLING SEQUENCE: CDF X / CIF Y / JMS IOHAN / ADDR /PTR TO UNIT,STRBLK,LEN OF FILE / ARG(1) /OS8 ARG-FCW / ARG(2) /" - TRAB BUF ADR / ARG(3) / " -REL STR BLK OF TRAN / / IOHAN, 0 DCA UNITSV /SAVE DEVICE NUM IF ONE RDF TAD (CDF DCA GETCDF+1 /SAVE FIELD OF CALL TAD P6203 /SETUP CIF&CDF FOR RDF /RTN JMP DCA RTNIO /FETCH A DEV HANDLER OR LOOKUP ENTRY PT /IF DESIRED DEVICE HANDLER IS IN CORE TAD UNITSV /GET DEV NUM IF ONE SNA CLA JMP .+3 JMS INQIRE /DO JUST A FETCH JMP RTNIO TAD I IOHAN /GET PTR TO UNIT DCA ULSADR CDF 10 TAD I ULSADR /GET DEV NUM AND [17 SNA E00==.; JMS I COS8ER /ERROR IF 0 DCA UNITSV /SAVE IN UNIT JMS INQIRE /FETCH HANDLER
/CHK FOR END OF FILE ISZ IOHAN /BUMP RETURN ADDRESS JMS GETCDF /SET DF TO CALLING FIELD TAD I IOHAN /GET FCW CLL RTL /NUM OF PAGES IS CONVERTED RTL /TO NUM BLKS& PUT RTL /IN BITS 8-11 AND [17 DCA TEMP1 /SAVE /SETUP FCN CTRL WRD ; TRANS BUF ADDR;&ABS STRBLK /OF TRANS FOR OS8 CALL TO HANDLER TAD I IOHAN /FCW DCA FCNWD /SAVE ISZ IOHAN /BUMP RETURN POINTER TAD I IOHAN /TRANS BUFFER ADDR DCA FCNWD+1 /INTO CALL CDF 10 TAD I ULSADR AND (7760 /LENGTH OF FILE CIA CLL RTR RTR DCA TEMP2 JMS GETCDF /SET DF TO CALLING FIELD ISZ IOHAN /BUMP RETURN ADDRESS TAD I IOHAN /REL STRT BLK TAD TEMP1 CIA CLL TAD TEMP2 /FILE LEN SNL SZA /EOF CONDITION? JMP .+3 /YES CLA /NO JMP SETSBN TAD TEMP1 /END OF FILE SMA SZA /ANY BLKS TO TRANSF? JMP IOH /YES CLA /NO /CHK IF FILE LEN=0; IF SO DO SEQ STUFF TAD TEMP2 SNA CLA /SEQ DEV JMP IOH+1 JMP RTNIO-1 /EXIT SUBROUTINE
IOH, DCA TEMP1 /THIS NUM OF BLKS /UPDATE FCN CTRL WRD IN OS8 CALL TAD FCNWD AND (4077 /REMOVE REQ NUM OF PAGES DCA FCNWD /AND PUT IN THE TAD TEMP1 /ALTERED NUM CLL RTR RTR RTR TAD FCNWD DCA FCNWD /INTO FUNCTION CONTROL WORD /SETUP STARTING BLK NUMBER / SETSBN, ISZ ULSADR /BUMP POINTER TO UNIT DATA CDF 10 TAD I ULSADR /GET ABS STRBLK JMS GETCDF /GETCDF TAD I IOHAN /UPDATE REL STRBLK DCA FCNWD+2 /STORE BLOCK NUMBER TAD I IOHAN /UPDATE LOCATION IN CALLING ROUTINE TAD TEMP1 DCA I IOHAN /CALL TO HANDLER P6203, CDF CIF 0 /IOHAN & OS8 DEV HAN IN FLD 0 KSF /CHK FOR CTRL C JMP .+6 KRS AND (177 TAD (-03 SNA CLA JMP I (7600 /CNTR C, EXIT JMS I IOENT /CALL DEVICE HANDLER FCNWD, 0 /FUNCTION CONTROL WORD 0 /BUFFER ADDRESS 0 /BLOCK NUMBER JMP HNDERR /ERROR RETURN OF CALL ISZ IOHAN /BUMP RETURN ADDRESS RTNIO, 0 /RETURN CDFCIF JMP I IOHAN /EXIT IOENT, 0 /DEVICE HANDLER ENTRY ADDRESS ULSADR, 0 /POINTER TO UNIT DATA UNITSV, 0 /UNIT FOR I/O / GETCDF, 0 0 /FIELD OF CALL (STORED AS CDF) JMP I GETCDF / / HNDERR, JMS I CFERR /HANDLER ERROR IOMSG
/ / / RETRIEVES GST ENTRY INDEX FROM PTRTAB / GETREF, 0 / CDF 10 AND (377 SNA /0? JMP .+4 /YES, RETURN 0 TAD (PTRTAB-1 /AC=REF PTR TO BE CHANGED DCA TEMP3 TAD I TEMP3 JMP I GETREF /GST PTR IN AC / /PROCESS BOTH LSD PREFACE AND LSD / PROBOT, 0 JMS PROHDR /BYPASS PREFACE JMS PROLSD /PROCESS LSD JMP I PROBOT / PAGE
/INQIRE- DETERMINE IF DESIRED DEV HANDLER IS IN CORE / AND IF SO, GET ENTRY POINT DVTBL=7647 INQIRE, 0 CDF 0 TAD UNITSV /GET UNIT # TAD (DVTBL-1 DCA IMTP /ADR OF ENTRY PT IN RESID TABLE CDF 10 TAD I IMTP /GET ENTRY PT IF ONE CDF 0 DCA IOENT /SAVE ENTRY POINT TAD IOENT SZA CLA /DEV HAN IN CORE? JMP I INQIRE /YES TAD (7201 /NO DCA P6201+4 /INITIALIZE I/O HNDLR BUFFER ADDRESS AND SIZE TAD UNITSV /GET DEV NUMBK P6201, CDF 0 CIF 10 JMS I USR 1 /FETCH 0 /2 PG HANDLER STARTING @ 7200 E01==.; JMS I COS8ER /ERROR TAD .-2 /SET UP REAL ENTRY ADDRESS DCA IOENT JMP I INQIRE /EXIT / /
/ / READ IN BLOCK FROM INPUT MODULE / REMOD, 0 / TAD MODPTR /POINTS TO CURRENT DCA FCW-1 /MODULE IN MODTAB CDF 0 JMS I CIOHAN /DO A READ 0 FCW, 1010 /OF 4 BLOCK INTO INBUF /INBUF RB, 0 /BLOCK # (RELATIVE) CDF 10 /ISZ RB? JMP I REMOD / / / INITIALIZE MODTAB POINTER / IMTP, 0 TAD MODCNT /SET UP COUNTER DCA MC TAD (MODTAB /AND POINTER DCA MODPTR DCA RB /0 RELATIVE BLOCK # JMP I IMTP / / / ADVANCE MODULE TABLE PTRS / ADVPTR, 0 CLA DCA RB /REINIT RELATIVE STARTING BLOCK AC3 /ADD 3 TO POINTER TAD MODPTR DCA MODPTR ISZ MC /BUMP COUNT OF MODULES SKP /NOT DONE ISZ ADVPTR /DONE, BUMP RETURN ADDRESS JMP I ADVPTR /EXIT / MC, 0 /COUNTER /
/ / / PUT CONTENTS OF AC INTO GST / AT THE LOC IN GSTADR AND FLD OF GCDF / PUTGST, 0 DCA NXTBLK RDF /SAVE RETURN CDF TAD (CDF DCA PRF TAD GCDF /AND THE FLD IN GCDF DCA .+1 /THEN INCREMENT GSTADR HLT TAD NXTBLK DCA I GSTADR ISZ GSTADR NOP PRF, CDF 10 /RETURN CDF JMP I PUTGST /SKIP OVER THE BLKS CONTAINING TEXT NXTBLK, 0 ISZ RELBLK /BUMP RELATIVE BLOCK NUMBER TAD INPTR AND (7400 /GET TO START OF NXT BLK TAD (400 NWBF, DCA INPTR JMS TSTEND /TEST FOR END OF FILE JMP I NXTBLK /WE FOUND END OF MODULE TAD INPTR /END OF INPUT BUFFER TAD (-ENDBUF SMINUS, SMA CLA JMP REMOR /YES READ IN NEW BUFFER FULL TAD I INPTR SINSTR, SPA CLA /TEXT FLAG SET ***THE CONTENTS OF THIS LOCATION CHANGES!!! JMP NXTBLK+1 /YES - LOOK AT NEXT BLK ISZ NXTBLK JMP I NXTBLK /NO - FOUND NXT LSD / REMOR, JMS REMOD /READ ANOTHER 4 BLKS TAD (INBUF JMP NWBF / TSTEND, 0 /TEST FOR END OF FILE TAD LIBLEN /NUM OF BLKS IN MOD TAD RELBLK /PLUS RELATIVE BLOCK # SPA CLA ISZ TSTEND /NOT END, BUMP POINTER JMP I TSTEND /EXIT /
/ /SKIP OVER A MODULE IN LIB SKPLIB, 0 TAD SMINUS /SMA CLA DCA SINSTR /CHANGE INSTR TO SKIP OVER LSD JMS NXTBLK /SKIP OVER BLOCKS CONTAINING LSD JMP I SKPLIB /FOUND END OF FILE-RETURN TAD KSPACLA /CHANGE INSTR BACK DCA SINSTR /TO SKIP TEXT AGAIN JMS NXTBLK KSPACLA, SPA CLA /FOUND EOF, THIS SKIPS BECAUSE /NXTBLK RETURNS 0 AC AND I NEED THE ROOM ISZ SKPLIB /NOT EOF, BUMP RETURN JMP I SKPLIB /EXIT / / / / INCREMENT GST POINTER / INCPTR, 0 TAD [10 TAD GSTPTR DCA GSTPTR TAD GSTPTR CIA TAD TOPLOC SZA CLA JMP I INCPTR /ADD 10 - NO OVERFLOW DON'T TAD [10 /HAVE TO WORRY ABOUT FIELD TAD GCDF /INCR. FIELD TOO DCA GCDF DCA GSTPTR /THEN ZERO POINTER JMP I INCPTR /EXIT PAGE
/ /OS8ER- USED WHEN AN OS/8 ERROR OCURS WHICH IS FATAL / OS8ER, 0 CDF 0 CLA CMA TAD OS8ER /GET CALLING ADDRESS NOP .IF REF SYSERR < *.-1 JMP SYSERR /TYPE OUT ERROR MESSAGE > / IOMSG, TEXT %LINKER I/O ERROR% / POINTER TABLE INITIALIZATION / / IPTRTB, 0 TAD (PTRTAB DCA PTPTR /START OF PTR TABLE TAD (PTRTAB-1 DCA XR1 TAD (-400 DCA COUNT1 DCA I XR1 /ZERO POINTER TABLE ISZ COUNT1 JMP .-2 JMP I IPTRTB / /
/ / / / PROCESS LSD / PROLSD, 0 NXTLSD, TAD I INPTR /END OF LSD ? SNA CLA JMP EOL /YES- ZERO ENTRY MEANS END OF LSD JMS I [SEARCH /NO -LOOK FOR SYMBOL IN GST NOP /PASS2 NEEDS AN ERROR EXIT FROM SEARCH JMS PUTPTR /PUT INDEX IN PTRTAB TAD PASS2 SZA CLA /IF NECESSARY, JMS ILSDP /MOVE TO NEXT LSD ENTRY JMP NXTLSD /GO DO NEXT LSD ENTRY EOL, TAD PASS2 SZA CLA /PASS 2? JMP I PROLSD /YES-DO NO MORE NOP .IF REF EOLSD< *.-1 JMS EOLSD /NO- GO MASSAGE THE GST SOME MORE > JMP I PROLSD /EXIT / /
/ GET WORD FROM LSD / GETLSD, 0 TAD I INPTR /GET WORD DCA GSTWRD /SAVE IT INCP, ISZ INPTR /INCR. PTR TO NXT LSD ENTRY TAD INPTR /AT A BLOCK BOUNDRY? AND (377 SZA CLA JMP EXTLSD /NO, TIME TO EXIT ISZ RELBLK /BUMP RELATIVE BLOCK NUMBER TAD INPTR /YES TAD (-ENDBUF /AT END OF INPUT BUFFER? SPA CLA JMP INCP /NO JMS REMOD /READ IN NEW BUFFER TAD (INBUF+1 /REINIT DCA INPTR /POINTER EXTLSD, TAD GSTWRD /PASS CONTENT BACK THRU AC JMP I GETLSD /EXIT GSTWRD=OS8ER / / / / / MOVE POINTER TO NEXT LSD ENTRY / ILSDP, 0 ACM3 DCA COUNT2 /SET UP COUNTER JMS GETLSD /PAST SYMBOL, GET TYPE AND [17 /MASK TO TYPE BITS TAD (-1 SPA SNA /GOT NEXT SYMBOL? JMP GOTNXT /NO, NONE LEFT TAD [-10 /IS IT A SECT? SPA SNA JMP .+3 /YES ISZ COUNT2 JMP .+5 /NO, SKIP OVER 1 LESS WORD CLA TAD GSTWRD /YES, GET TYPE WORD AND (40 /MASK TO O-L BIT SNA CLA /SET? ISZ COUNT2 /NO - THEN SKIP OVER 1 LESS WORD TAD (-4 SMA SZA CLA /IF A GLOBAL OR ENTRY JMP GOTNXT /SKIP OVER ONE LESS-OTHERWISE JMS GETLSD /NO MORE ISZ COUNT2 JMP .-2 GOTNXT, CLA JMP I ILSDP /EXIT
/ /PROCESS LSD HEADER (BYPASS NEW FORMAT LSD PREFACE) PROHDR, 0 CLA IAC /SET TO 2ND WORD IN HEADER TAD LSDSTR DCA INPTR JMS GETLSD /GET A WORD FROM THE LSD TAD (-2202 SZA CLA /"RB"? E02==.; JMS I COS8ER /NO PROHD0, JMS GETLSD /YES, GET ANOTHER SNA /0? JMP I PROHDR /YES, DONE, EXIT TAD (2 /NO, BUMP IT TWICE DCA PROLSD /SAVE COUNT JMS GETLSD /GET "TYPE" TAD (-4 SZA CLA /RB SPEC? JMP PROHD1-2 /NO JMS GETLSD /YES, GET COARSE SPEC TAD (-RBSPEK SZA CLA /OK? E03==.; JMS I COS8ER /NO SKP /SKIP ONE READ JMS GETLSD /READ A WORD TO BUMP LSD POINTER CLA /THROW AWAY DATA PROHD1, ISZ PROLSD /DONE THIS ENTRY? JMP .-3 /NO JMP PROHD0 /YES, TRY AGAIN / / / PAGE
/SEARCH FOR SYMBOL IN GST SEARCH, 0 TAD SEARCH /SAVE RETURN ADDR. CDF 0 DCA RETS SEARC4, CDF 10 /THIS CDF BECOMES "NOP" FROM "SFOR" JMS LOOK /LOOK FOR SYMBOL IN GST JMP FOUND /RETURN 1 - SYMBOL FOUND TAD PASS2 /RETURN2 - NOT FOUND SZA CLA /PASS 2? SHRXIT, JMP I SEARCH /YES, RETURN NOP .IF REF NFP1 < *.-1 JMP NFP1 /NOT FOUND & PASS1 > / / FOUND, TAD PASS2 /SYMBOL WAS FOUND SNA CLA /IS THIS PASS 2? NOP .IF REF FNDP1 < *.-1 JMP FNDP1 /FOUND AND PASS 1 > ISZ SEARCH JMP I SEARCH /YEP- JUST RETURN /
/ /LOOK FOR SYMBOL IN GST LOOK, 0 JMS GETLSD /GET 1ST 2 CHARACTERS DCA SYM1 /SAVE JMS GETLSD /GET 2ND 2 DCA SYM2 JMS GETLSD /GET 3RD 2 DCA SYM3 IAC DCA GINDEX /INDEX INTO GST TAD GST /START OF GST DCA GSTPTR TAD GSTCDF /FIELD OF START DCA GCDF CSERCH, TAD (SYM1 DCA INPTR1 /RESTORE PTR TO BEGINNING OF ENTRY CDF /FOR COMPARE WITH NEXT GST ENTRY JMS TSTBOT /BOTTOM OF THE GST? JMP .+3 /NO ISZ LOOK /YES JMP LOOKOT ACM3 /SET COUNT TO -3 DCA COUNT1 TAD GSTPTR /SAVE CURRENT POSITION IN GST DCA TEMP4 NXTSYM, TAD TEMP4 JMS I CGGST /GET A WORD FROM GST CIA /NEGATE TAD I INPTR1 /GET WORD WE'RE LOOKING FOR SZA CLA /DO THEY MATCH? JMP NOMAT /THEY DON'T MATCH ISZ TEMP4 /MATCH, BUMP POINTERS ISZ INPTR1 ISZ COUNT1 /DONE 3? JMP NXTSYM /NO, TRY NEXT PART OF SYMBOL LOOKOT, CDF 10 JMP I LOOK /MATCH NOMAT, JMS INCPTR /NO MATCH ISZ GINDEX /BUMP INDEX JMP CSERCH /CONT SEARCH // SYM1, 0 SYM2, 0 SYM3, 0 /
/ / TEST FOR BOTTOM OF GST / TSTBOT, 0 TAD GCDF /GET CURRENT FIELD OF GST AND (70 CIA TAD BOTCDF /TEST FLD FIRST SZA CLA JMP OKBOT /NOT BOTTOM FIELD TAD GSTPTR /GET CURRENT POINTER CLL CIA TAD GSTBOT /BOTTOM OF GST (ADDRESS) SNA CLA ISZ TSTBOT /BOTTOM OF GST, BUMP RETURN EXIT OKBOT, CLA JMP I TSTBOT /EXIT SUBROUTINE / / GET A WORD FROM GST / GETGST, 0 DCA GSTADR /AC=ADDRESS OF WORD TO GET RDF /FLD ALREADY IN GCDF TAD (CDF /SAVE DATA FLD OF CALLER DCA GRF TAD GCDF DCA .+1 /FLD OF LOC HLT TAD I GSTADR /RETURN WITH WORD IN AC GRF, CDF 10 JMP I GETGST / /
/PRINT CONTENTS OF AC IN OCTAL OPRINT, 0 RAL /LEFT 1 DCA TEMP1 /SAVE TAD (-4 DCA COUNT1 /4 DIGITS TAD TEMP1 /GET NUMBER RTL /3 LEFT RAL DCA TEMP1 TAD TEMP1 AND [7 /MASK TAD (260 /MAKE ASCII JMS TTYO /TYPE IT OUT ISZ COUNT1 /DONE ALL 4? JMP .-11 /NO JMS CRLF /YES JMP I OPRINT /DONE / /INSERT GST ENTRY INDEX INTO PTRTAB / PUTPTR, 0 TAD I PTPTR TAD GINDEX /GET THE INDEX DCA I PTPTR /STORE ISZ PTPTR /BUMP POINTER TAD PTPTR /GET NEW POINTER TAD (-PTRTAB-401 SZA CLA /OK? JMP I PUTPTR /YES E04==.; JMS I COS8ER /NO, FATAL ERROR / PAGE
/ /SEARCH SECTAB FOR WHAT'S IN AC SSEC, 0 CIA DCA SECENT TAD SECCNT /NO. OF SECTAB ENTRIES CIA DCA COUNT3 TAD SECTAB /START OF SECTAB JMP .+3 /BYPASS INCREMENT NXTTRY, TAD (6 TAD POINT2 DCA POINT2 /SAVE POINTER TAD I POINT2 /GET ENTRY AND (3777 /MASK TO 11 BITS TAD SECENT SNA CLA /DATA WE'RE LOOKING FOR? JMP RETSR /YES, HURRAH! TAKE FIRST EXIT ISZ COUNT3 /NO, ANY MORE ENTRIES? JMP NXTTRY /YES, TRY AGAIN ISZ SSEC /NO, TAKE 2ND EXIT RETSR, JMP I SSEC /EXIT SECENT, 0 /WHAT WE'RE LOOKING FOR /
/ /KEYBOARD HANDLER FOR TYPE ROUTINE (TTYO) KEYBRD, 0 KRS /GET CHARACTER AND (177 /MASK DCA SECENT /SAVE TAD SECENT TAD (-17 SZA CLA /^O? JMP KEYBR1-1 /NO CMA /YES DCA TYPINH /SET INHIBIT TYPING JMP KEYOUT /EXIT TAD SECENT /GET CHARACTER AGAIN KEYBR1, TAD (-3 SNA /^C? JMP I (7600 /YES TAD (-16 SNA /^Q? JMP KEYOUT /YES, EXIT TAD (-2 SZA CLA /^S? JMP KEYBR3 /NO KEYBR2, KCC /YES, CLEAR KEYBOARD FLAG KSF JMP .-1 /WAIT FOR NEXT KRS AND (177 /GET AND MASK JMP KEYBR1 /PROCESS IT KEYBR3, TAD SECENT /HERE IF NONE OF THE ABOVE TAD (-23 SNA CLA /WAS CHARACTER ^S? JMP KEYBR2 /YES, TRY AGAIN? KEYOUT, KCC /CLEAR DANGLING FLAG JMP I KEYBRD /GO HOME /
/ /SUBROUTINE TO FIX CHARACTERS FIXCHR, 0 AND (77 /MASK DCA SECENT /SAVE TAD SECENT TAD (-34 SZA / "\"? JMP .+3 /NO TAD (56 /YES, CHANGE TO "." JMP .+7 IAC SZA CLA / "["? JMP .+3 /NO TAD (44 /YES, CHANGE TO "$" SKP TAD SECENT /NONE OF THE ABOVE, GET BACK SNA /0? JMP .+3 /YES, MAKE SPACE TAD (240 /CONVERT TO 8 BIT AND (77 TAD (240 JMP I FIXCHR /DONE / /SEARCH FOR SOMETHING IN GST - WHAT SYMBOL TO LOOK FOR IS IN "CALL+1" SFOR, 0 CDF /SET DF=0 TAD (NOP DCA SEARC4 /SET UP SEARCH ROUTINE TAD INPTR DCA FIXCHR /SAVE INPTR TAD I SFOR /GET ADDRESS OF SYMBOL DCA INPTR /SET UP FOR SEARCH SUBROUTINE JMS SEARCH /FIND SYMBOL E05==.; JMS I COS8ER /ERROR, SYMBOL NOT FOUND TAD (5 /GET FIELD VALUE FROM GST TAD GSTPTR JMS I CGGST DCA TEMP4 /SAVE IAC TAD GSTADR /GET ADDRESS VALUE FROM GST JMS I CGGST DCA TEMP1 /SAVE TAD FIXCHR DCA INPTR /RESTORE INPTR CDF TAD .+4 DCA SEARC4 /RESTORE INSTRUCTION IN SEARCH SUBROUTINE ISZ SFOR /BUMP RETURN ADDRESS JMP I SFOR /EXIT CDF 10 /CONSTANT
PAGE .ASECT PAGE0



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