Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-07 - 43,50433/passrt.mac
There are 4 other files named passrt.mac in the archive. Click here to see a list.
TITLE	PASSRT - PASCAL INTERFACE TO STAND-ALONE SORT

;To use this, simply include the following declaration in your
;Pascal program:
;  procedure sort(s:string);extern;
;then call it, passing the same argument that you would pass to
;sort if you were using it standalone.  SORT plays with the
;interrupt system.  If you are doing interrupt handling, you
;should disable user interrupts during SORT.  While SORT is
;running, you do not have a valid Pascal context.
;SORT is now native-mode, so using this routine does not
;invoke the emulator.

;Although this code is modelled after the Fortran/SORT interface,
;it is independent of that interface, and does not invoke Fortran.

;FEATURE TEST SWITCHES
;FTOPS20		;TOPS-20 VERSION

;NOTE - Tops10 version is not yet supported.  (It will be if someone
;  will give me access to a Tops-10 system with SORT on it.)

IFNDEF FTOPS20,<FTOPS20==1>

IFN FTOPS20,<SEARCH	MACSYM,MONSYM,PASUNV>
IFE FTOPS20,<SEARCH	MACTEN,UUOSYM,PASUNV>

;ACCUMULATOR DEFINITIONS (SAME AS SRTPRM)

T1=1
T2=2
T3=3
T4=4
P1=5
L=16
P=17

ENTRY	SORT
SUBTTL	DEFINITIONS -- Typeout Macros


DEFINE TYPE(MESSAGE)<
  IFE FTOPS20,<
    OUTSTR [ASCIZ \MESSAGE\]
  >
  IFN FTOPS20,<
    HRROI T1,[ASCIZ \MESSAGE\]
;;*;[2] Replace in TYPE macro	DZN	9-Nov-78
    PSOUT%				;;[2]
  >
>

DEFINE TYPEC(ACC)<
  IFE FTOPS20,<
    OUTCHR ACC
  >
  IFN FTOPS20,<
    IFN <ACC>-T1,<
      HRRZ T1,ACC
    >
    PBOUT
  >
>

DEFINE $ERROR(Q,CODE,TEXT,MORE)<
E$$'CODE:
  IFB <MORE>,<
    TYPE <Q'SRT'CODE TEXT
>
  >
  IFNB <MORE>,<
    TYPE <Q'SRT'CODE TEXT>
  >
  IFIDN <Q'MORE><?>,<
    JRST DIE
  >
>
SUBTTL	TOPS-20 VERSION -- Data


IFN FTOPS20,<
ACS15:	BLOCK	1			;PLACE TO SAVE GLOBAL PASCAL AC
ACS16:	BLOCK	1
PASFF:	BLOCK	1			;place to save jbff
INTSAV:	BLOCK	1			;place to save interrupt status
ONCE:	BLOCK	1			;flag so we do DIC once only

SRTEXE:	ASCIZ	/SYS:SORT.EXE/		;[2] NAME TO DO A GET% JSYS ON

SAVEVC:	BLOCK	1			;SAVE USER'S ENTRY VECTOR

RFSBLK:	EXP	.RFSFL+1		;[4] ARG BLOCK FOR LONG FORM RFSTS% JSYS
	BLOCK	.RFSFL			;[4] SPACE FOR RETURNED ARGS

;arg to SORT
	XWD -1,0			;number of args
SRTARG:	EXP 17B12			;ASCIZ

ARGBLK:	EXP	SRTARG			;addr of arg to SORT
	JRST	FUNCT.			;PASS THESE PASCAL ROUTINES
	JRST	QUIT##			;  TO SORT
SUBTTL	TOPS-20 VERSION -- SORT/MERGE Entry Point

	'SORT  '			;SIXBIT NAME FOR TRACE.
SORT:	MOVEM	15,ACS15		;save Pascal global AC's
	MOVEM	16,ACS16
	MOVE	T1,.JBFF		;SAVE ORIGINAL .JBFF
	MOVEM	T1,PASFF
	HRRM	T1,SRTARG		;AND USE AS ARG TO SORT
	HRLI	T2,440700		;T2 - BYTE PTR TO STRING ARG
	MOVE	T4,.JBFF
	HRLI	T4,440700		;T4 - BYTE PTR TO COPY AT .JBFF
ARGCP1:	SOJL	T3,ARGCP2		;DONE IF COUNT EXHAUSTED
	ILDB	T1,T2			;COPY CHAR
	JUMPE	T1,ARGCP1		;IGNORE NULLS
	IDPB	T1,T4
	JRST	ARGCP1
ARGCP2:	SETZ	T1,
	IDPB	T1,T4			;MAKE ASCIZ
	MOVEI	T4,1(T4)		;NEXT WORD IN DEST AREA
	MOVEM	T4,.JBFF		;NEW .JBFF
	MOVX	T1,.FHSLF		;SAVE OUR ENTRY VECTOR
	GEVEC%				;[2]   SINCE GET% JSYS DESTROYS IT
	MOVEM	T2,SAVEVC		;  ..
	MOVX	T1,.FHSLF		;GET OUR INTERRUPT STATUS
	RCM
	MOVEM	T1,INTSAV		;SAVE IT
	SETZM	ONCE			;SET FLAG SO WE CAN TELL FIRST TIME
	MOVX	T1,RF%LNG!.FHSLF	;[4] LONG FORM FOR THIS PROCESS
	MOVEI	T2,RFSBLK		;[4] ARG BLOCK
	SETZM	RFSBLK+.RFSFL		;[4] MAKE SURE ITS CLEAR INCASE REL 3
	RFSTS%				;[4] GET STATUS
	  ERJMP	SORT1			;[4] ASSUME NOT EXECUTE-ONLY
IFGE RF%EXO,<PRINTX ?ERROR - RF%EXO is not the sign bit>	;[4] INCASE IT CHANGES
	SKIPGE	RFSBLK+.RFSFL		;[4] RF%EXO IS SIGN BIT
	SKIPA	T1,[GJ%OLD!GJ%SHT!GJ%PHY]	;[4] PHYSICAL ONLY IF EXECUTE-ONLY
SORT1:	MOVX	T1,GJ%OLD!GJ%SHT	;[4] GET A JFN FOR SORT.EXE
	HRROI	T2,SRTEXE		;  ..
	GTJFN%				;[2]   ..
	  ERJMP	E$$CFS			;COMPLAIN IF WE CAN'T FIND SORT
	HRLI	T1,.FHSLF		;[2] DO A GET% ON SORT.EXE
	TXO	T1,GT%ADR		;CHECK ADDRESS LIMITS
	MOVE	T2,[600,,677]		;ALL OF HIGH SEGMENT
	GET%				;[2]
	MOVX	T1,.FHSLF		;GET SORT'S ENTRY VECTOR
	GEVEC%				;[2]   TO MAKE SURE IT'S THE NEW SORT
	MOVE	P1,T2			;PUT ENTRY VECTOR IN SAFE PLACE
	MOVE	T2,SAVEVC		;RESTORE USER'S ENTRY VECTOR
	SEVEC%				;[2]   ..
	HLRZ	T1,P1			;GET 'LENGTH' OF SORT'S ENTRY VECTOR
	CAIN	T1,<JRST>_<-^D18>	;LOOK LIKE A JRST (I.E., TOPS-10 STYLE)?
	JRST	E$$SV4			;[3] YES--MUST BE OLDER THAN RELEASE 4
	MOVE	P1,3(P1)		;GET USER ENTRY LIST IN SAFE PLACE
	MOVEI	L,ARGBLK		;POINT TO IT
	PUSHJ	P,0(P1)			;CALL SORT TO DO THE REAL WORK
	MOVE	T1,PASFF		;RESTORE .JBFF
	MOVEM	T1,.JBFF
	MOVX	T1,.FHSLF		;PAGE EVERYTHING OUT SO
	RWSET%				;[2]   SORT GETS REMOVED FROM WORKING SET
	MOVX	T1,.FHSLF		;RESET INTERRUPTS
	MOVE	T2,INTSAV
	AIC
	MOVE	15,ACS15		;RESTORE GLOBAL AC
	MOVE	16,ACS16
	POPJ	P,			;RETURN TO CALLER
SUBTTL	TOPS-20 VERSION -- Error Messages

E$$SV4:	$ERROR	(?,SV4,<SORT version 4 or later required.>)

E$$CFS:	SKIPL	RFSBLK+.RFSFL		;[4] EXECUTE-ONLY?
	JRST	E$CFS1			;[4] NO, USE OLD MESSAGE
	$ERROR	(?,XGF,<Execute-only GTJFN% failed for  >,+)	;[4]
	JRST	E$CFS2			;[4] REST OF MESSAGE

E$CFS1:	$ERROR	(?,GFS,<GTJFN% failed for  >,+)	;[4]
E$CFS2:	HRROI	T1,SRTEXE		;[4] TYPE WHAT WE COULDN'T FIND
	PSOUT%				;[2]   ..
	TYPE	<, >			;  FOLLOWED BY WHY (LAST PROCESS ERROR)
PRCERR:	MOVX	T1,.PRIOU		;TYPE LAST PROCESS ERROR
	MOVX	T2,<.FHSLF,,-1>		;  ..
	SETZ	T3,			;  ..
	ERSTR%				;[2]   ..
	  ERJMP	.+2			;IGNORE ERRORS AT THIS POINT
	  ERJMP	.+1			;  ..
	TYPE	<.
>
DIE:	HALTF%				;[2] STOP THE JOB
	JRST	SORT			;IN CASE USER FIXED THINGS

funct.:	move t1,@(l)		;function code
	cail t1,0
	caile t1,maxfun
	jrst unimp
	jrst @fundsp(t1)	;go to routine

fundsp:	unimp			;ill
	unimp			;gad
	getcor			;cor
	retcor			;rad
	unimp			;gch
	unimp			;rch
	getcor			;got
	retcor			;rot
	unimp			;rnt
	unimp			;ifs
	retok			;cbc
	unimp			;rrs
	unimp			;wrs
maxfun=.-fundsp-1

unimp:	setom @2(l)		;status
	setzm @1(l)		;error code
	popj p,

getcor:	skipn once		;first time only
	pushj p,dodis
	move t1,@4(l)		;arg 2 = size
	move t2,.jbff##		;start at .jbff
	addb t1,.jbff		;update .jbff
	caml t1,lstnew##	;overlap heap?
	jrst errnec		;not enough core
	movem t2,@3(l)		;return address of block
retok:	setzm @2(l)		;ok status
	setzm @1(l)		;no error code
	popj p,

dodis:	setom once		;do this only once
	movei t1,.fhslf		;clear nxm interrupts
	movei t2,1B22
	dic
	popj p,

retcor:	move t1,@3(l)		;arg 1 = addr
	move t2,@4(l)		;arg 2 = size
	add t2,t1		;t2 - end of block
	camge t2,.jbff		;if anything after it
	jrst retok		;can't do anything - say we did it
	movem t1,.jbff		;return it - move .jbff 
	jrst retok		;that's all we have to do

;can't return core, error 1
errcrc:

;not enough core, error 1
errnec:	movei t1,1
	movem t1,@2(l)		;error 1
	setzm @1(l)		;no error codes for now
	popj p,
		


>;END IFN FTOPS20
SUBTTL	TOPS-10 VERSION - NOT SUPPORTED

IFE FTOPS20,<

;FORTRAN DATA TYPES

TP%UDF==0			;UNDEFINED TYPE
TP%LOG==1			;LOGICAL
TP%INT==2			;INTEGER
TP%REA==4			;REAL
TP%OCT==6			;OCTAL
TP%LBL==7			;LABEL OR ADDRESS
TP%DOR==10
TP%DOT==12
TP%COM==14
TP%LIT==17			;ASCIZ TEXT (LITERAL STRING)

;FUNCT. ARGUMENTS

F.GCH==4			;GET CHANNEL ARGUMENT
F.RCH==5			;RETURN CHANNEL NUMBER

;LOCAL DEFINITIONS

DIRLEN==5				;ALL WE SHOULD NEED OF .EXE DIRECTORY
PAGLEN==^D32				;MAX. PAGES NEEDED FOR HIGH SEG CODE
	'SORT  '			;NAME FOR TRACE.
SORT:	MOVEM	L,SAVEL
	MOVEI	L,1+[-4,,0
		     Z TP%INT,[F.GCH]
		     Z TP%LIT,[ASCIZ /SRT/]
		     Z TP%INT,CHSTAT
		     Z TP%INT,SRTCHN]
	PUSHJ	P,FUNCT.##		;ASK FOROTS FOR A CHANNEL
	SKIPE	CHSTAT			;DID WE GET IT?
	JRST	E$$CAS			;NO
	MOVE	T1,SRTCHN
	DPB	T1,[POINT 4,SRTCHN,12]	;PUT IN ACC FIELD
	HLLZ	T1,SRTCHN
	IOR	T1,[OPEN OBLK]
	XCT	T1			;OPEN SYS
	 JRST	E$$OPN			;FAILED?
	HLLZ	T1,SRTCHN
	IOR	T1,[LOOKUP LBLK]
	XCT	T1			;LOOKUP SYS:SRTFOR.EXE
	  JRST	E$$LKP			;FAILED
	HLLZ	T1,SRTCHN
	IOR	T1,[IN	DIRIOW]
	XCT	T1
	  SKIPA	T1,SRTDIR		;OK, GET DIRECTORY HEADER
	JRST	E$$INP			;ERROR
	CAME	T1,[1776,,5]		;WHAT WE EXPECT
	JRST	E$$DUF			;NO
	HRRZ	T1,SRTDIR+3		;GET FILE PAGE
	LSH	T1,2			;4 BLOCKS PER PAGE
	ADDI	T1,1			;START AT 1
	HLL	T1,SRTCHN
	TLO	T1,(USETI)
	XCT	T1			;SET ON HIGH SEG PAGES
	LDB	T1,[POINT 9,SRTDIR+4,8]	;GET REPEAT COUNT
	CAILE	T1,PAGLEN		;TOO BIG
	JRST	E$$HTB			;YES
	MOVEM	T1,PAGARG		;LOAD UP ARG COUNT
	MOVN	T1,T1
	HRLZ	T1,T1			;AOBJN POINTER
	HRRZ	T2,SRTDIR+4		;CORE PAGE
	MOVEM	T2,PAGARG+1(T1)		;STORE PAGE #
	ADDI	T2,1
	AOBJN	T1,.-2			;FILL UP ARG BLOCK
	MOVE	T1,[.PAGCD,,PAGARG]
	PAGE.	T1,
	  JRST	E$$PCF			;FAILED
	HRRZ	T2,PAGARG+1		;GET FIRST PAGE
	LSH	T2,^D9			;INTO WORDS
	SUBI	T2,1
	MOVE	T3,PAGARG		;GET NUMBER OF PAGES
	LSH	T3,^D9
	MOVN	T3,T3
	HRL	T2,T3			;I/O WORD
	HLLZ	T1,SRTCHN
	IOR	T1,[IN T2]
	SETZ	T3,
	XCT	T1
	  SKIPA
	JRST	E$$INP
	PUSH	P,.JBHSA##+1(T2)	;GET START ADDRESS
	MOVEI	L,1+[-4,,0
		     Z TP%INT,[F.RCH]
		     Z TP%LIT,[ASCIZ /SRT/]
		     Z TP%INT,CHSTAT
		     Z TP%INT,SRTCHN]
	PUSHJ	P,FUNCT.		;RESTORE CHAN TO FOROTS
	POP	P,T1			;GET BACK START ADDRESS
	MOVE	L,SAVEL			;RESTORE STRING POINTER
	PUSHJ	P,(T1)			;START SORT

	MOVSI	T1,-PAGLEN
	MOVSI	T2,(1B0)
	IORM	T2,PAGARG+1(T1)		;SET DESTROY BIT
	AOBJN	T1,.-1			;FOR ALL OF SORT PAGES
	MOVE	T1,[.PAGCD,,PAGARG]
	PAGE.	T1,
	  JFCL				;TOO BAD
	POPJ	P,			;RETURN TO CALLER

OBLK:	EXP	.IODMP
	SIXBIT	/SYS/
		0

LBLK:	EXP	.RBEXT			;.RBCNT
		0			;.RBPPN
	SIXBIT	/SRTFOR/		;.RBNAM
	SIXBIT	/EXE/			;.RBEXT

DIRIOW:	IOWD	DIRLEN,SRTDIR
	0
	

E$$CAS:	$ERROR	(?,CAS,<Channel not available for FORTRAN SORT/MERGE.>)
E$$OPN:	$ERROR	(?,OPN,<OPEN failed for SYS:SRTFOR.EXE.>)
E$$LKP:	$ERROR	(?,LKP,<LOOKUP failed for SYS:SRTFOR.EXE.>)
E$$DUF:	$ERROR	(?,DUF,<SYS:SRTFOR.EXE directory not in expected format.>)
E$$HTB:	$ERROR	(?,HTB,<SYS:SRTFOR.EXE high segment too big.>)
E$$PCF:	$ERROR	(?,PCF,<PAGE. UUO failed for FORTRAN SORT/MERGE.>)
E$$INP:	$ERROR	(?,INP,<Input error for SYS:SRTFOR.EXE.>)

DIE:	EXIT

SAVEL:	BLOCK	1		;SAVE L
CHSTAT:	BLOCK	1		;STATUS OF FUNCT. CALL
SRTCHN:	BLOCK	1		;CHAN USED FOR I/O
SRTDIR:	BLOCK	DIRLEN
PAGARG:	BLOCK	PAGLEN

>;END IFE FTOPS20

	END