Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-04 - decus/20-0130/strsub.src
There are 2 other files named strsub.src in the archive. Click here to see a list.
\PROCESS
\KEY=STRSUB
SUBR(S)
=TITLE		^S^
SEARCH		STRMAC
.DIRECT		.XTABM
TWOSEG
RELOC		400000

^S^:		ENTRY ^S^
END=
NOSYM
PRGEND
%PAGE%
SAVE(NAM,AC1,AC2)=
%SUBR(^NAM^)%
N=^AC2^-^AC1^+1
K=0
REPEAT <N>,<PUSH		P,^AC1^+<K=K+1>-1>
PUSHJ		P,@-N(P)	; CALL CALLER BACK
CAIA				; NO SKIP RETURN, SKIP INCREMENT
AOS		-<N+1>(P)	; SKIP RETURN, INCREMENT RETURN ADDRESS
REPEAT <N>,<POP		P,^AC1^+<K=K-1>>
POP		P,(P)		; DISCARD ORIGINAL RETURN ADDRESS
RETURN
%END%
PAGE=\.CHR<12>\
\EOD
\.OUTF<STRSUB.MAC>\
\.TMPWRT<SVC><COM STRSUB/L>\
\.NEXT</RUN:SYS:COMPIL/RUNOFF:1>\
%SUBR(SKP.RT)%
AOS		(P)		; INCREMENT RETURN ADDRESS FOR SKIP RETURN
RETURN
%END%
%SUBR(RST.PC)%
.+1				; CALLED BY RETURN AFTER PUSH P,RST.PC
CAIA				; NO SKIP RETURN, SKIP INCREMENT
AOS		-1(P)		; SKIP RETURN, INCREMENT RETURN ADDRESS
POP		P,PC		; RESTORE SAVED PC
HLR		PC,PC		; GET ADDRESS OF CALLER'S SAVED PC
HRR		PC,(PC)		; RESTORE CALLER'S SAVED PC
RETURN
%END%
%SUBR(RST.LP)%
.+1				; CALLED BY RETURN AFTER PUSH P,RST.LP
CAIA				; NO SKIP RETURN, SKIP INCREMENT
AOS		(LP)		; SKIP RETURN, INCREMENT RETURN ADDRESS
MOVE		P,LP		; RESTORE PUSHDOWN POINTER
MOVE		LP,1(P)		; RESTORE PREVIOUS LOCAL STORAGE POINTER
RETURN
%END%
%SUBR(CAL.FS)%
F=		P1		; FIRST AC TO SAVE
N=		PC-F+1		; NUMBER OF AC'S TO SAVE
ADD		P,[N,,N]	; ALLOCATE SPACE ON PDL TO SAVE AC'S
JUMPG		P,[PUSHJ P,.]	; CAUSE PDL OVERFLOW IF OVERFLOWED
MOVEM		PC,(P)		; SAVE PC ON PDL
MOVSI		PC,F		; GET ADR OF FIRST AC FOR BLT POINTER
HRRI		PC,-<N-1>(P)	; GET ADR OF SAVE AREA ON PDL FOR BLT POINTER
BLT		PC,-1(P)	; SAVE AC'S F THRU PC-1 ON PDL
MOVE		PC,@-N(P)	; GET ARG LIST ADDRESS FROM CALLING PROGRAM
PUSHJ		P,@-1(PC)	; CALL FORTRAN SUBROUTINE
MOVSI		PC,-<N-1>(P)	; GET ADR OF SAVE AREA ON PDL FOR BLT POINTER
HRRI		PC,F		; GET ADR OF FIRST AC FOR BLT POINTER
BLT		PC,PC		; RESTORE AC'S F THRU PC FROM PDL
SUB		P,[N,,N]	; RESTORE PDL POINTER
AOS		(P)		; SKIP ARG LIST POINTER
RETURN
%END%
%SAVE(S.R0R0,R0,R0)%
%SAVE(S.T1T1,T1,T1)%
%SAVE(S.T1T2,T1,T2)%
%SAVE(S.T1T3,T1,T3)%
%SAVE(S.T1T4,T1,T4)%
%SAVE(S.P1P1,P1,P1)%
%SAVE(S.P1P2,P1,P2)%
%SAVE(S.P1P3,P1,P3)%
%SAVE(S.P1P4,P1,P4)%
%SAVE(S.P1R1,P1,R1)%
%SAVE(S.P1R2,P1,R2)%
%SAVE(S.P1R3,P1,R3)%
%SAVE(S.P1R4,P1,R4)%
%SAVE(S.R1R1,R1,R1)%
%SAVE(S.R1R2,R1,R2)%
%SAVE(S.R1R3,R1,R3)%
%SAVE(S.R1R4,R1,R4)%

END