Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-07 - 43,50433/passcn.mac
There are 4 other files named passcn.mac in the archive. Click here to see a list.
	title PASREL - module for reading command string for pasrel.

;edit history

;2 - detect too many file spec's in command
;3 - relabel tops20 switch as oneseg, as it seems to work that way

ifndef oneseg,<oneseg==1>
ife oneseg,<if1,<printx TOPS-10 overlay version>>
ifn oneseg,<if1,<printx TOPS-10 one segment version>>

	search uuosym,macten,scnmac
	extern .swcor
	intern oldbfh
	twoseg
t1=1
t2=2
t3=3
t4=4
t5=5
p=17
filbfh==26
pdlen==100
lookl==6	;length of lookup block in inblk, etc.
openl==3	; " open
pathl==9	; " path
	reloc 0
oldbfh:	0	;save buffer header for alt file input here
PSAV:	0	;SAVE PDL HERE FOR RETURN AFTER COMPILE
SASAV:	0	;SAVE .JBSA HERE FOR RETURN AFTER COMPILE
STADR:	0
runnam:	sixbit /pascal/	;defaults for tops-20
runppn:	0
rundev:	sixbit /dsk/
out:	0	;pointer to scan block for output
rel:	0	;pointer to scan block for rel file
in:	0	;pointer to scan block for input file
nxtblk:	0	;place next scan block will begin
outblk::block lookl+openl+pathl	;lookup+open+path block for output
relblk::block lookl+openl+pathl	;lookup+open+path block for rel
inblk::block lookl+openl+pathl	;lookup+open+path block for input
	;THE FOLLOWING BLOCK OF STUFF WILL GET RETURNED TO PASCMP, AND
	;WILL BE INTERPRETED BY IT AS A RECORD OF TYPE RPGDATA.  THUS
	;ITS STRUCTURE MUST MATCH THAT DECLARED IN PASCMP.PAS.
relnam::byte (7)40,40,40,40,40
	byte (7)40,40,40,40,40
stkval:	block 1	;value for stack
heaval:	block 1	;value for heap
verval:	block 1	;value for version
RPGSW:	0	;NOTE THAT THEY ARE IN REVERSE ORDER FROM THE STRUCTURE
		;DECLARATION FOR RPGDATA.  THATs BECAUSE PASCAL REVERSES
		;THINGS IN PROCESSING MULTIPLE DECLARATIONS.
CRSW:	0	;CREF SWITCH
DSW:	0
CSW:	0
MSW:	0
TSW:	0
LSW:	0
zsw:	0
asw:	0

relfcb::0	;addr of file ctl block for rel file

ife oneseg,<
DOCAL:		;HERE TO CALL ANOTHER SEGMENT. ITS NAME IN T2, STADR IN T3
	move t1,rundev	;use place we were called from
	movem t1,cmpblk
	move t1,runppn
	movem t1,cmpblk+4
	movei t1,cmpblk
	MOVEM T2,CMPBLK+1	;NAME OF SEGMENT TO BE CALLED
	MOVEM T3,STADR
	getseg t1,
	  halt .
	JRST @STADR	;GO TO STARTING ADDRESS
> ;ife oneseg
ifn oneseg,<
docal:	jrst (t3)
> ;ifn oneseg

cmpblk:	sixbit /sys/
	sixbit /pascmp/
	exp 0,0,0,0

calcmp:	move t2,runnam		;thing to be called
	hrri t2,'CMP'		;make it compiler
	MOVEI T3,PASCMP##	;STARTING ADDR
	JRST DOCAL	;AND DO IT

	setzm rpgsw	;entry after SOS .JBSA by SCAN at exit
CALSCN::		;HERE TO RETURN TO SCAN
	move t2,runnam
	MOVEI T3,PASRST
	JRST DOCAL
PRLNAM:	SIXBIT /PASCAL/

	RELOC 400000
PASRST:	MOVE P,PSAV	;RESTORE STUFF FROM LAST TIME
	MOVE T1,SASAV
	MOVEM T1,.JBSA##
	RESET
	MOVEI T1,PDLEN
	ADDB T1,.JBFF##
	CAMG T1,.JBREL##
	JRST PASSCN	;core is there, go ahead
	CORE T1,
	  JRST [outstr [asciz /
? PASNCO No core for stack/]
		exit]
	JRST PASSCN	;ONLY VALID THING IS /RUN OR /EXIT ON RESTART

start:	tdza t1,t1	;normal entry
	movei t1,1	;rpg entry
ife oneseg,<
	skipe .sgnam
	movem .sgnam,runnam	;save entry parameters
	skipe .sgppn
	movem .sgppn,runppn
	skipe .sgdev
	movem .sgdev,rundev
> ;ife oneseg
	movem t1,rpgsw	;save status of rpg entry
	RESET
	HRLI P,-PDLEN	;SET UP PDL PTR AT .JBFF
	HRR P,.JBFF##
	MOVEM P,PSAV	;FOR USE IN RESTART
	movei t1,calscn	;address for restarting
	hrrm t1,.jbsa##	;in case of ^C-start
	MOVE T1,.JBSA##
	MOVEM T1,SASAV	;FOR USE IN RESTART
	MOVEI T1,PDLEN
	ADDB T1,.JBFF##	;PUT PDL AT .JBFF
	camg t1,.jbrel##;core exist?
	jrst start1	;yes
	core t1,
	  jrst [outstr [asciz /
? PASNCO No core for stack/]
		exit]
; here would go routines getting current time
start1:	move t1,.isblk
	pushj p,.iscan##	;initialize scan
PASSCN:	move t1,.tsblk
	pushj p,.tscan##	;call scan to read command line
	move t1,.osblk
	pushj p,.oscan##	;call scan to read SWITCH.INI
	pushj p,deffil		;set up NUL: if no output spec
	move t1,out		;convert file spec for pascal
	movei t3,outblk
	pushj p,cnvfil
	move t1,rel		;rel file
	movei t3,relblk
	pushj p,cnvfil
	move t1,in
	movei t3,inblk
	pushj p,cnvfil
	move t1,relblk+.rbnam
	CAIN T1,0		;IF NO REL FILE NAME
	MOVE T1,INBLK+.RBNAM	;USE INPUT FILE NAME
	CAIN T1,0		;IF NONE THERE EITHER
	MOVE T1,OUTBLK+.RBNAM	;USE LISTING NAME
	CAIN T1,0		;IF NONE THERE EITHER
	MOVE T1,[SIXBIT /.MAIN/];THEN USE DEFAULT
	move t2,[point 7,relnam]	;put it here
	movei t3,6		;6 chars
	pushj p,sixasc
	move t3,[-1]
	move t1,rel
	move t2,.fxver(t1)	;version spec for output?
	move t1,in
	camn t2,t3
	move t2,.fxver(t1)	;no - use input's
	move t1,out
	camn t2,t3
	move t2,.fxver(t1)	;none there either - try this
	camn t2,t3
	movei t2,0
	movem t2,verval
	jrst calcmp		;call compiler

.isblk:	3,,.+1
	0
	rpgsw,,'pas'
	0

.tsblk:	9,,.+1
	iowd passwl,passwn
	passwd,,passwm
	0,,passwp
	-1
	clrans,,.clsns##
	allin,,allout
	0
	0,,fs.mot
	0

.osblk:	4,,.tsblk+1

dm stk,0,0,0
dm hea,0,0,0
define swtchs<
	sn *objectlist,lsw,fs.nue
	sn *main,msw,fs.nue
	SN *CREF,CRSW,FS.NUE
	sn check,csw,fs.nue
	sn *arithcheck,asw,fs.nue
	sn *debug,dsw,fs.nue
	sn zero,zsw,fs.nue
	sp stack,stkval,.swcor,stk,fs.nue!fs.vrq!fs.lrg
	sp heap,heaval,.swcor,hea,fs.nue!fs.vrq!fs.lrg
	>

doscan(passw)

deffil:		;here we set unused output spec's to NUL:
	SKIPN t1,out	;output area generated?
	pushj p,allout	;no - do so
	skipe .fxdev(t1)	;device specified?
	jrst outsp	;yes - OK
	hrlzi t2,(sixbit /nul/)	;no - use NUL
	movem t2,.fxdev(t1)
outsp:	SKIPN t1,rel	;rel file area generated?
	pushj p,allout	;no - do so
	skipe .fxdev(t1)
	JRST .+3
	hrlzi t2,(sixbit /nul/)
	movem t2,.fxdev(t1)
	MOVE T1,IN	;PREPARE TO DEFAULT FILE NAME
	MOVE T2,OUT
	MOVE T3,REL
	MOVE T4,['PAS',,777777]
	SKIPN .FXEXT(T1)
	MOVEM T4,.FXEXT(T1)
	move t4,[sixbit /pascal/]
	skipe .fxnam(t1)
	jrst .+3
	movem t4,.fxnam(t1)
	setom .fxnmm(t1)
	MOVE T4,['LST',,777777]
	SKIPLE CRSW	;IF CREF SET, DIFFERENT DEFAULT
	MOVE T4,['CRF',,777777]
	SKIPN .FXEXT(T2)
	MOVEM T4,.FXEXT(T2)
	move t4,[sixbit /pascal/]
	skipe .fxnam(t2)
	jrst .+3
	movem t4,.fxnam(t2)
	setom .fxnmm(t2)
	MOVE T4,['REL',,777777]
	SKIPN .FXEXT(T3)
	MOVEM T4,.FXEXT(T3)
	move t4,[sixbit /pascal/]
	skipe .fxnam(t3)
	jrst .+3
	movem t4,.fxnam(t3)
	setom .fxnmm(t3)
	MOVEI T2,1	;SET UP DEFAULT SWITCHES - THIS IS YES
	SETO T1,	;THIS IS NO ANSWER YET
	CAMN T1,LSW	;ANSWER GIVEN?
	SETZM LSW	;NO - GIVE DEFAULT
	camn t1,zsw
	setzm zsw
	CAMN T1,TSW
	MOVEM T2,TSW
	CAMN T1,MSW
	MOVEM T2,MSW
	CAMN T1,CSW
	MOVEM T2,CSW
	CAMN T1,DSW
	movem t2,dsw
	CAMN T1,CRSW
	SETZM CRSW
	move t4,csw		;use csw as default for asw
	camn t1,asw
	movem t4,asw
	move t4,stkval		;look at /stack value
	caie t4,0		;if zero or default
	camn t4,t1
	jrst [setzm stkval	;then use zero
	      jrst .+5]
	trnn t4,777		;on even page?
	subi t4,1		;he really wants boundary
	tro t4,777		;put us on boundary
	movem t4,stkval
	move t4,heaval		;look at /heap value
	caie t4,0		;if zero or default
	camn t4,t1
	jrst [setzm heaval	;then use zero
	      jrst .+5]
	trnn t4,777		;on even page?
	subi t4,1		;he wants this
	tro t4,777		;otherwise round up
	movem t4,heaval
	popj p,

clrans:		;here to initialize defaults
	move t1,.jbff##
	movem t1,nxtblk
	addi t1,3*.fxlen	;this is what we are going to use
	movem t1,.jbff##
	SETZM out
	setzm rel
	setzm in
	SETOM lsw
	setom zsw
	SETOM dsw
	SETOM TSW
	SETOM  MSW
	SETOM CSW
	setom asw
	SETOM CRSW
	setom stkval
	setom heaval
	popj p,

allin:	move t1,nxtblk	;routine to allocate space for input scan blk
	pushj p,clrblk	
	MOVE T2,T1
	ADDI T2,.FXLEN
	MOVEM T2,NXTBLK
	movei t2,.fxlen	;length of block
	skipe in	;[2] be sure this is the first time
	jrst [outstr [asciz /
? PASMOI More than one input file is illegal/] ;[2] if more than one
	      exit]	;[2] it is fatal error
	MOVEM T1,IN
	popj p,

clrblk:	movei t2,.fxlen-1(t1)	;highest addr we are going to use
	camg t2,.jbrel##	;see if it exists
	jrst clrok		;yes - OK
	core t2,		;no - get it
	 jrst [outstr [asciz /
? PASNCO No core for Scan blocks/]
	       exit]
clrok:	setzm (t1)
	hrl t2,t1
	hrri t2,1(t1)
	blt t2,.fxlen-1(t1)
	popj p,

allout:	move t1,nxtblk
	pushj p,clrblk
	move t2,t1
	addi t2,.fxlen	;compute address of next scan blk
	movem t2,nxtblk
	movei t2,.fxlen	;length of block
	skipe REL	;if REL not done
	jrst .+3
	movem t1,REL	;this must be it
	popj p,
	skipe out	;[2] if OUT already done
	jrst [outstr [asciz /
? PASMTO More than two output files is illegal/] ;[2] 
	      exit]	;[2] it is fatal error
	MOVEM T1,OUT
	popj p,

cnvfil:		;this routine converts a scan block to lookup
		;and open blocks, and then to pascal's format
			;addr of lookup block in t3
	movei t2,lookl(t3)	;open block
	movei t4,openl(t2)	;path block
	pushj p,.stopb##	;converts block whose addr is in t1
	  jfcl		;in case has question marks in it, etc.
	popj p,
sixasc:		;routine to convert to ascii
	; t1 - sixbit thing
	; t2 - pointer to where first char goes
	; t3 - how many char's to do
	rot t1,6	;get next char
	ldb t4,[point 6,t1,35]	;get char only
	addi t4,40	;convert to ascii
	idpb t4,t2	;put it away
	sojg t3,sixasc	;and go on if need to
	popj p,

	end start