File SCAN.SN

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

/LIBRARY SCAN PROGRAM
/
/WRITTEN BY WILLIAM I.  NOWICKI
/NORTHWESTERN UNIVERSITY COMPUTER SCIENCE
/		RESEARCH LABORATORY
/
/JUNE, 1976
/
/UPDATED: DECMEBER 2, 1976
/
/+SCAN
/	THIS PROGRAM WILL PROCESS A SUBROUTINE
/LIBRARY FILE AND SELECT THE DESIRED ROUTINES.
/ANOTHER OPTION IS TO GENERATE PAGE ZERO LINKS
/AND GLOBAL VARIABLE LISTS SUITABLE FOR INPUT
/DIRECTLY INTO THE "PAL8" ASSEMBLER.
/THE SUBROUTINE LIBRARY FILES WILL USUALLY COMMON
/FILES SUPPLIED WITH THE PROGRAM. 
/HOWEVER, IF THE USER WISHES, A LIBRARY FILE
/CAN BE CREATED BY FOLLOWING THE SPECIFICATIONS
/FOR WORKING DOCUMENTATION.
/
/;LOGIC:
/	SETUP FILES
/	GET OPTIONS
/	PASS1 (OUTPUT PAGE ZERO)
/	PASS2 (OUTPUT THE ROUTINES)
/	END THE FILE
/
/:
	OUTPUT = "SUBROUTINE LIBRARY PROCESSING PROGRAM"
ASK,	OUTHOLD = "INPUT:"
	INFIL = INPUT :F(ASK)
	.LOOKUP  INFIL :F(ASK)
ASKO,	OUTHOLD = "OUTPUT:"
	.ENTER INPUT :F(ASKO)
/SET SOME CONSTANTS:
	CRLF = .A215 .A212
	SP = " "	/SPACE
	C = ","		/COMMA
	S = "/"		/COMMENT CHARACTER
/
/"EDIT" PUTS A RUBOUT AFTER EVERY TAB FOR SOME 
/OBSCURE REASON, SO THE DEFINITION
/MAY HAVE TO CHANGE IF YOU ARE USING AN OlD
/EDITER.
/
	T = .A211 
	AT = "@"	/ "AT" SIGN
	FF = .A214	/FORM FEED
	FP = "+"	/START MODULE
	FM = "-"	/END MODULE
	FU = "$"	/LOCATIONS USED
	FR = "#"	/ROUTINES CALLED
	FG = "*"	/GLOBAL VARIABLES
	FC = ":"	/COODE

/ASK WHAT THE USER REALY WANTS / ASKM, DESIRE = SP /INITIALIZE OUTPUT = "ENTER NAMES OF DESIRED ROUTINES," OUTPUT = 'TERMINATE WITH "END"' AMLP, /LOOP UNTIL END IS REACHED OUTHOLD = "?" /PROMPT DESIRE = DESIRE INPUT SP :F(ASKM) DESIRE SP "END" = :S(AMDON) /END YET ? :(AMLP) AMDON, /DONE WITH LOOP / / / THE USER IS ASKED IF HE WANTS PAGE ZERO LINKS /TO EVERYTHING. ASKPZ, OUTHOLD = "PAGE ZERO LINKS (Y OR N) ?" PZFLG = INPUT :F(ASKPZ) PZFLG_ "Y"!"N" :F(ASKPZ) / /+PASS1 / /;LOGIC: / / / WHILE NO EOF(INPUT) DO / BEGIN / READ A LINE / IF BEGINING OF MODULE THEN / BEGIN / GET MODULE NAME / IF DESIRED THEN / BEGIN / IF PAGE ZERO LINKS THEN MAKE ONE / WHILE NO "/-" OR "/:" DO / READ LINE; CASE OF / GLOBAL:ADD TO LIST / LOCATIONS:ADD AFTER MODULE NAME / ROUTINES:ADD TO LIST / ENTRY POINT:GENERATE PAGE ZERO LINK / END / END / END /
/:CODE: PASS1, GLOBE = SP /RESET SOME LISTS HAVE = SP OTHER = SP NEED = DESIRE OUTPUT = "PASS ONE MODULES:" PZFLG_ "Y" :F(NOPZ1) /DO WE WANT PAGE ZERO STUFF ? WRITE = "/ PAGE ZERO POINTERS" CRLF "/" WRITE = T "*20" CRLF "/" NOPZ1, /END OF INITIALIZATION / /READ EACH LINE, LOOKING FOR THE START OF A MODULE / PAS1RD, LINE = READ :F(EOF1) LINE_ S FP = :F(PAS1RD) /MODULE ? SPZAPL, LINE_ SP!T = :S(SPZAPL) /ZAP SPACES,FFS, & TABS LINE_ *MOD* SP!T = :S(GOOD1M) /GET MODULE NAME MOD = LINE /IF NO DESCRIPTION GOOD1M, NEED SP MOD SP = SP :F(PAS1RD) /NEED IT ? HAVE = HAVE MOD SP /YES - ADD TO LIST OUTPUT = MOD /PRINT MODULE NAME PZFLG_ "Y" :F(NOPZ1A) /PAGE ZERO LINK ? WRITEH = MOD "=" T "JMS I .;X" ROT = MOD ROT *ROT/5* /TRIM TO 5 CHARS WRITE = ROT T "/ " LINE NOPZ1A, / P1MOD, LINE = READ :F(EOF1) /READ THE MODULE LINE_ S = :F(P1MOD) /WE ONLY WANT COMMENTS LINE_ FC :S(PAS1RD) /CODE ? LINE_ FU :S(LOC1) /LOCATION FLAG ? LINE = LINE SP /PUT A DELIMITER AT THE END OF THE LINE LINE_ FR :S(ROT1) /ROUTINES USED ? LINE_ FG :S(GLOB1) /GLOBAL VARIABLES ? LINE_ FM :S(PAS1RD) /END OF MODULE ? :(P1MOD) /KEEP READING / /LOCATIONS USED FLAG WAS DETECTED LOC1, LINE ":" *LOC* :F(P1MOD) /STRIP OFF NUMBER SPZAPC, LOC SP!T = :S(SPZAPC) /ZAP ALL SPACES HAVE SP MOD SP = SP MOD AT LOC SP /ADD TO LIST :(P1MOD) /CONTINUE / /ROUTINES USED FLAG WAS FOUND ROT1, LINE ":" *LINE* :F(P1MOD) /NAMES ARE AFTER THE COLON SPZAPR, LINE C!T!" " = SP :S(SPZAPR) /ZAP ALL DELIMITERS INTO SPACES LINE_ SP = ROT1G, LINE_ *ROT* SP = :F(P1MOD) /GET ONE OF THEM NEED SP ROT SP :S(ROT1G) /HAVE IT ALREADY ? HAVE SP ROT SP!AT :S(ROT1G) /PASSED IT UP ? NEED = NEED ROT SP /NO - ADD TO LIST OTHER SP ROT SP :S(ROT1G) /DON'T DUPLICATE OTHER = OTHER ROT SP :(ROT1G) /TRY AGAIN
/ /GLOBAL VRIABLES FLAG HERE GLOB1, LINE ":" *LINE* :F(P1MOD) SPZAPG, LINE T!C!" " = SP :S(SPZAPG) /ZAP SPACES AGAIN LINE_ SP = /ZAP LEADING SPACES GLO1G, LINE_ *VAR* SP = :F(P1MOD) GLOBE SP VAR SP :S(GLO1G) /HAVE IT ALREADY ? GLOBE = GLOBE VAR SP /NO - ADD TO THE LIST :(GLO1G) /CONTINUE / / /END OF PASS ONE EOF1, OUTPUT = "END OF PASS ONE" SP NEED :S(P1BAD) /ANY LEFT OVER ? OUTPUT = "MISSING MODULES:" OUTPUT = "**" NEED "**" P1BAD, OUTPUT = "SECONDARY MODULES:" OTHER WRITE = "/END OF POINTERS" CRLF S CRLF S SP GLOBE :S(EOGLP) /ANY GLOBALS ? OUTPUT = "GLOBAL VARIABLES:" GLOBE WRITE = S CRLF "/GLOBAL VARIABLES" CRLF T "ZERO=0" GLBLP, GLOBE_ SP *VAR* SP = SP :F(EOGLP) WRITE = VAR C T "ZERO" :(GLBLP) /CONTINUE EOGLP, WRITE = S CRLF "/END OF PAGE ZERO" CRLF / /-PASS1
/+PASS2 / HERE THE MODULES ARE ACTUALLY PUT OUT TO THE FILE / /;LOGIC: / WHILE NO EOF DO / BEGIN READ A LINE / IF BEGINING OF DESIRED MODULE THEN / BEGIN / PAGINATE IF NEEDED / WHILE NO "/-MODULE" DO / BEGIN / READ A LINE / CASE OF / ENTRY POINT ADD "X" FOR PAGE ZERO / REFERENCE TO ENTRY POINT: CHANGE AS ABOVE / WRITE LINE / END / WRITE THE LAST LINE / END / / END / /:CODE: .ICLOSE :F(CERROR) /CLOSE FOR PASS 2 .LOOKUP INFIL :F(IOBAD) NOW = "128" /INITIALIZE FOR PASS TWO NEED SP = HAVE OUTPUT = "PASS TWO MODULES:" PAS2RD, LINE = READ :F(EOF) LINE_ S FP = :F(PAS2RD) /MODULE YET ? LINE_ *MOD* SP!T :S(GOOD2M) /GET MODULE NAME MOD = LINE /IF NO DESCRIPTION GOOD2M, NEED SP MOD AT *LOC* SP /WANT IT ? :F(PZNOL) NOW = NOW + LOC :F(NEWPAG) / / THERE ARE REALLY MORE THAN 4 PAL LOCATIONS, / BUT SINCE PAGES ARE NEVER TIGHT, THIS GIVES US / SOME FREE LOCATIONS ON THIS PAGE. / .PAL 4 /***** PAL CODE ******* JMS I XASC /CONVERT TO NUMBER NOW TAD (-200 /PAGE CONSTANT SMA CLA JMP NEWPAG JMP PAGOK /GREAT- KEEP ON PRESENT PAGE ^.SNOBOL /****** BACK TO SNOBOL ******* /
PZNOL, NEED SP MOD SP :F(PAS2RD) /CHECK WITHOUT LOCS LOC = "128" /TO ALWAYS PAGINATE NEWPAG, WRITE = T "PAGE" CRLF FF /PAGINATE NOW = LOC /RESET LOCATIONS PAGOK, OUTPUT = MOD /PRINT THE MODULE NAME ROT = MOD /IN CASE WE NEVER SEE THE ENTRY POINT LINE = S CRLF S FP LINE /RESTORE LINE / P2WRT, WRITE = LINE :F(IOBAD) /OUTPUT THE LINE P2MOD, LINE = READ :F(EOF) /READ THE NEXT ONE LINE_ S :S(COM) /PASS ALL COMMENTS LINE_ MOD C :S(ENTZ) /ENTRY POINT FOUND LINE T MOD T!POSR = T ROT T /CHANGE ENTRY POINT REFERENCES LINE SP MOD T!POSR = SP ROT T LINE "JMS" T!SP *VAR* T!SP!POSR :S(P2CVT) /CHECK JMS'ES :(P2WRT) / COM, LINE_ S FM :S(EOMOD) /END OF MODULE ! :(P2WRT) / /HERE, IF GENERATING PAGE ZERO POINTERS, /WE CHANGE THE NAME OF A SUBROUTINE /CALLED BY A "JMS" IN THE PRESENT MODULE. / P2CVT, PZFLG_ "Y" :F(P2WRT) /MUST WE CHECK FOR OTHER MODULES ? HAVE SP VAR SP!AT :F(P2WRT) /CHECK FOR THE MOD NAME LINE "JMS" T!SP VAR = VAR T /CHANGE REFERENCES TO OTHER MODS :(P2WRT) / / ENTZ, PZFLG_ "Y" :F(P2WRT) /NEED WE CHANGE ENTRY POINT ? ROT = "X" MOD / YES - ADD X TO NAME ROT *ROT/6* /TRIM IF NEEDED LINE MOD = ROT :(P2WRT) / /END OF MODULE FOUND / EOMOD, WRITE = LINE :(PAS2RD) /CONTINUE SEARCH / / EOF, WRITE = "$" CRLF FF /WRITE THE ENDING JUNK .OCLOSE :F(CERROR) .ICLOSE .EXIT CERROR, OUTPUT = "CLOSING ERROR !" .EXIT IOBAD, OUTPUT = "OUTPUT ERROR !" .END /-SCAN



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