Trailing-Edge
-
PDP-10 Archives
-
bb-l014z-bm_tops20_v7_0_tsu03_1_of_3
-
cblsrc/srtcrf.mac
There are 22 other files named srtcrf.mac in the archive. Click here to see a list.
; UPD ID= 1637 on 6/26/84 at 4:50 PM by MCARLETON
TITLE SRTCRF FOR COBOL V13
SUBTTL SORT THE CREF DATA AL BLACKINGTON/CAM/KWS
SEARCH COPYRT
SALL
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
COPYRIGHT (C) 1974, 1983, 1984, 1985 BY DIGITAL EQUIPMENT CORPORATION
SEARCH P
%%P==:%%P
IFN TOPS20,<SEARCH MONSYM,MACSYM>
TWOSEG
.COPYRIGHT ;Put standard copyright statement in REL file
RELOC 400000
SALL
;EDITS
;V13*****************
;NAME DATE COMMENTS
;MJC 12-JAN-85 [1555] Flush buffers before closing tmp files
;KWS 16-NOV-84 [1552] Fix crash in sort by changing pushj to jrst
;MJC 18-JUN-84 [1540] Nativeize CORE UUO in sort setup.
;********************
ENTRY PSORT ;SET UP FOR SORT
ENTRY RELES ;GET A RECORD FROM CALLING PROGRAM
ENTRY RETRN ;GIVE A RECORD TO CALLING PROGRAM
ENTRY MERGE ;MERGE SCRATCH FILES
NUMFIL==3 ;NUMBER OF TEMP FILES
SZ.SR==6 ;SIZE OF SORT RECORD
SZ.BUF==203 ;SIZE OF ONE BUFFER
IFE TOPS20,<OPDEF TYPE [OUTSTR]>
IFN TOPS20,<OPDEF TYPE [HRROI T1,]>
PSORT: HRRZ TE,.JBFF## ;SET
IFE TOPS20,<
MOVEM TE,SF1BUF ; ASIDE
ADDI TE,SZ.BUF*2 ; AREA
MOVEM TE,SF2BUF ; FOR
ADDI TE,SZ.BUF*2 ; SCRATCH
MOVEM TE,SF3BUF ; BUFFERS
ADDI TE,SZ.BUF*2 ;SET UP
>
MOVEM TE,CRFTAB ; START OF ADDRESS TABLE
PSORT1: HRRZ TE,.JBREL## ;COMPUTE
ADDI TE,1 ; NUMBER
SUB TE,CRFTAB ; OF TABLE
IDIVI TE,SZ.SR+1 ; ENTRIES
CAIL TE,NUMFIL ;ENOUGH ROOM FOR THREE FILES?
JRST PSORT2 ;YES
HRRZ TE,.JBREL ;NO
ADDI TE,2000 ; GET
IFE TOPS20, <
CALLI TE,$CORE ; ANOTHER 1K OF CORE
>
IFN TOPS20, <
PUSHJ PP,GETCOR## ;[1540]CALL TO GET 1K OF CORE
>
JRST NOCORE ;COULDN'T--TOUGH
JRST PSORT1
PSORT2: MOVEM TE,CRFSIZ ;SAVE TABLE SIZE
MOVNS TE ;FORM
MOVSS TE ; <XWD -CRFSIZ,CRFTAB>
HRR TE,CRFTAB ; *
MOVE TD,CRFTAB ;COMPUTE
ADD TD,CRFSIZ ; FIRST FREE SLOT
PSORT3: MOVEM TD,(TE) ;FILL
ADDI TD,SZ.SR ; TABLE
AOBJN TE,PSORT3 ; WITH ADDRESSES
SWOFF FSRTIO ;TURN OFF 'FILES ARE READY'
SETZM CRFTEN ;START AT
SETZM CRFLOW ; TOP OF TABLE
MOVEI TE,NUMFIL-1
PSORT4: SETZM CRFTS(TE)
SETZM CRFSTA(TE)
SOJGE TE,PSORT4
MOVEI TE,1 ;SET 'POWER OF 2 THAT
MOVEM TE,CRFPWR ; IS > TABLE SIZE
POPJ PP,
RELES: TSWF FSRTIO ;ARE FILES SET UP?
JRST RELES6 ;YES
SKIPN TE,CRFTEN ;NO--IS TABLE EMPTY?
JRST RELS1A ;YES
CAMN TE,CRFSIZ ;NO--IS IT FULL?
JRST RELES4 ;YES
PUSHJ PP,BINSER ;NO--FIND PLACE FOR THE NEW RECORD
MOVE TD,CRFTEN ;SAVE VALUE OF 'CRFTEN'
MOVE TC,TD ;SAVE
ADD TC,CRFTAB ; ADDRESS TO WHICH
MOVE TA,(TC) ; 'CRFTEN' POINTS
AOS CRFTEN ;INCREMENT NUMBER OF ENTRIES IN TABLE
SUB TD,TE ;COMPUTE DISTANCE FROM TOP FOR NEW ITEM
JUMPE TD,RELES3 ;IF ZERO, NO NEED TO MOVE STUFF
RELES1: MOVE TB,-1(TC) ;MOVE ADDRESSES
MOVEM TB,(TC) ; UP IN CORE
SOJLE TD,RELES2 ; TO MAKE ROOM FOR NEW ADDRESS
SOJA TC,RELES1
RELS1A: MOVE TC,CRFTAB
MOVE TA,(TC)
AOSA CRFTEN
RELES2: MOVEM TA,-1(TC)
RELES3: MOVE TD,TA ;MOVE NEW RECORD TO
HRLI TD,GCREFN ; SCRATCH
BLT TD,SZ.SR-1(TA) ; AREA
MOVE TE,CRFLOW ;IF MORE
CAMGE TE,CRFTEN ; VISIBLE ENTRIES,
POPJ PP, ; LEAVE
SETZM CRFLOW ;RESET TO TOP OF TABLE
PUSHJ PP,RITEOS ;WRITE 'E-O-S' ON CURRENT FILE
SOS CRFSTA(TD) ;DEDUCT ONE FROM 'STRINGS TO ADD'
JRST GETNFL ;GET NEXT FILE READY, AND LEAVE
;TABLE IS FULL, BUT FILES HAVEN'T BEEN INITIALIZED
RELES4:
IFE TOPS20,<
MOVEI TE,NUMFIL-1
RELS4A: MOVE TD,INITS(TE) ;SET UP
MOVE TC,3(TD) ; AND
ADD TC,[OPEN (TD)] ; EXECUTE
XCT TC ; 'OPEN'
JRST CANTOP ;FAILURE--QUIT
CAIE TE,NUMFIL-1 ;DO
PUSHJ PP,OPENO ; 'ENTER'
MOVEI TC,1 ; FOR
MOVEM TC,CRFSTA(TE) ; ALL BUT
SOJGE TE,RELS4A ; LAST FILE
>
IFN TOPS20,<
PUSHJ PP,OPNSF## ;SET UP TEMP FILES
MOVEI TC,1 ;
MOVEM TC,CRFSTA ;
MOVEM TC,CRFSTA+1 ;
MOVEM TC,CRFSTA+2 ;
>
SETZM CRFCUR
SETZM CRFSTA+NUMFIL-1
SWON FSRTIO ;SET 'FILES ARE READY'
;FILES HAVE BEEN SET UP
RELES6: MOVE TE,CRFLOW ;WRITE OUT
PUSHJ PP,WRITE ; SMALLEST RECORD
PUSHJ PP,BINSER ;FIND PLACE FOR NEW RECORD
MOVE TC,CRFLOW
MOVE TD,TC ;SAVE
ADD TC,CRFTAB ; ADDRESS OF
MOVE TA,(TC) ; RECORD JUST WRITTEN
SUB TD,TE ;COMPUTE DISTANCE FROM NEW RECORD
JUMPL TD,RELES7 ;IF LESS, NEW ITEM IS NOT LESS THAN ONE WRITTEN
AOS CRFLOW ;NEW ITEM IS LESS THAN ONE WRITTEN
JUMPE TD,RELES3
JRST RELES1
;NEW ENTRY IS LARGER THAN, OR EQUAL TO, LAST ONE WRITTEN
RELES7: HRLI TC,1(TC) ;MOVE ADDRESSES
MOVE TD,TE ; ABOVE
ADD TD,CRFTAB ; CRFLOW
CAIE TD,-1(TC) ; UNITL
BLT TC,-2(TD) ; AT ADDRESS FOR NEW RECORD
MOVEM TA,-1(TD) ;STASH ADDRESS OF NEW RECORD
JRST RELES3
;MERGE THE SCRATCH FILES
MERGE: TSWT FSRTIO ;WERE ANY FILES INITIALIZED?
POPJ PP, ;NO--QUIT
MOVE TE,CRFLOW ;WRITE
PUSH PP,TE
MERGE1: PUSHJ PP,WRITE ; OUT
AOS TE,CRFLOW ; VISIBLE
CAME TE,CRFTEN ; RECORDS
JRST MERGE1 ; *
MOVE TE,(PP) ;IF NO INVISIBLE ONES,
JUMPE TE,MERGE3 ; NO NEW STRING NEEDED
PUSHJ PP,RITEOS ;CLOSE OUT STRING
SOS CRFSTA(TD) ;DEDUCT ONE FROM 'STRINGS NEEDED' COUNT
PUSHJ PP,GETNFL ;OPEN UP ANOTHER
SETZB TE,CRFLOW ;WRITE
MERGE2: PUSHJ PP,WRITE ; OUT
AOS TE,CRFLOW ; ALL
CAME TE,(PP) ; INVISIBLE
JRST MERGE2 ; RECORDS
MERGE3: POP PP,CRFLOW ;RESTORE ORIGINAL 'CRFLOW'
PUSHJ PP,RITEOS ;CLOSE OUT LAST STRING
SOS CRFSTA(TD) ;DEDUCT ONE FROM 'NUMBER OF STRINGS NEEDED'
IFN TOPS20,<
PUSHJ PP,RITSF1 ;[1555] FLUSH THE BUFFER FOR SF1
PUSHJ PP,RITSF2 ;[1555] FLUSH THE BUFFER FOR SF2
PUSHJ PP,CLSSF1 ;CLOSE SF1
PUSHJ PP,CLSSF2 ;CLOSE SF2
PUSHJ PP,SETSF1 ; OPEN FILE FOR INPUT
PUSHJ PP,SETSF2
>
MOVEI TE,NUMFIL-2
MERG3A:
IFE TOPS20,<
PUSHJ PP,CLOSER ;CLOSE OUTPUT FILE
PUSHJ PP,OPENI ;OPEN FILES AS INPUT
>
MOVE TD,CRFSTA(TE) ;ADD 'NUMBER OF STRINGS NEEDED' TO
ADDM TD,CRFTS(TE) ; 'TOTAL NUMBER OF STRINGS ON FILE'
SOJGE TE,MERG3A
MOVEI TD,NUMFIL-1 ;CURRENT OUTPUT
MOVEM TD,CRFCUR ; FILE IS LAST ONE
;STARTING A NEW OUTPUT FILE
MERGE4: MOVE TE,CRFCUR ;OPEN UP
IFE TOPS20,<
PUSHJ PP,OPENO ; NEW OUTPUT FILE
>
IFN TOPS20,<
PUSHJ PP,@OPNSFX(TE) ; OPEN FILE FOR OUTPUT
>
MOVEI TE,NUMFIL-1 ;ADD UP
MOVEI TD,0 ; STRINGS
MERG4A: CAME TE,CRFCUR ; ON ALL
ADD TD,CRFTS(TE) ; INPUT FILES
SOJGE TE,MERG4A
CAIG TD,NUMFIL-1 ;IF TOTAL OF STRINGS IS NO MORE THAN ONE PER FILE,
JRST MERG10 ; SET UP INPUT FILES AND LEAVE
;START NEW STRING OF OUTPUT
MERGE5: PUSHJ PP,MERG10 ;SET UP INPUT FILES
;MERGE INPUTS INTO OUTPUT
MERG5A: PUSHJ PP,MERG20 ;FIND THE SMALLEST RECORD
JRST MERGE6 ;ALL FILES AT END OF STRING
PUSH PP,TE ;SAVE TE
PUSHJ PP,WRITE ;WRITE OUT SMALLEST RECORD
POP PP,TE ;RESTORE TE
PUSHJ PP,READ ;GET ANOTHER RECORD FROM THAT FILE
JRST MERG5A ;LOOP
;ALL INPUT STRINGS ARE EMPTY
MERGE6: PUSHJ PP,RITEOS ;WRITE 'EOS' ON CURRENT OUTPUT
MOVEI TE,NUMFIL-1 ;IF
MERG6A: SKIPN CRFTS(TE) ; ANY FILES
JRST MERGE7 ; ARE EMPTY, WE NEED NEW OUTPUT
SOJGE TE,MERG6A
JRST MERGE5 ;LOOP BACK FOR MORE STRINGS
;ONE INPUT FILE IS EMPTY--IT BECOMES NEXT OUTPUT FILE
MERGE7:
IFE TOPS20,<
PUSHJ PP,CLOSER ;CLOSE INPUT FILE
>
IFN TOPS20,<
PUSHJ PP,@CLSSFX(TE) ;CLOSE FILE
>
EXCH TE,CRFCUR ;RESET 'CURRENT OUTPUT'
IFE TOPS20,<
PUSHJ PP,CLOSER ;CLOSE OLD OUTPUT FILE
PUSHJ PP,OPENI ;OPEN THAT FILE AS INPUT
>
IFN TOPS20,<
PUSHJ PP,@RITSFX(TE) ;[1555] FLUSH THE BUFFER
PUSHJ PP,@CLSSFX(TE) ;CLOSE INPUT FILE
PUSHJ PP,@SETSFX(TE) ;OPEN THAT FILE AS INPUT
>
JRST MERGE4
;SET UP ALL INPUT FILES BY GETTING ONE RECORD FROM EACH
MERG10: MOVEI TE,NUMFIL-1
SETZM CRFNE
MRG10A: CAMN TE,CRFCUR ;DON'T LOOK AT
JRST MRG10B ; OUTPUT FILE
SOS CRFTS(TE) ;DEDUCT ONE FROM NUMBER OF STRINGS
SKIPE CRFSTA(TE) ;IF ANY DUMMY STRINGS,
JRST MERG11 ; SPECIAL PROCESSING
SETZM CRFEOS(TE) ;FILE IS NOT AT 'EOS'
PUSHJ PP,READ ;READ ONE RECORD
MRG10B: SOJGE TE,MRG10A ;LOOP
MOVE TD,CRFNE ;IF NOT ALL
CAIE TD,NUMFIL-1 ; FILES HAD DUMMY STRINGS
POPJ PP, ; WE ARE DONE
MOVE TD,CRFCUR ;ACCOUNT FOR
AOS CRFSTA(TD) ; DUMMY STRING ON OUTPUT FILE
JRST MERG10 ;TRY AGAIN
MERG11: SOS CRFSTA(TE)
SETOM CRFEOS(TE)
AOS CRFNE
JRST MRG10B
;FIND SMALLEST RECORD ON INPUT FILES
MERG20: MOVEI TE,NUMFIL-1 ;START AT TOP
;LOAD TE WITH INDEX TO FIRST AVAILABLE REAL FILE (IF THERE IS ONE)
MERG21: CAME TE,CRFCUR ;IF THIS IS OUTPUT FILE OR
SKIPE CRFEOS(TE) ; THIS INPUT IS AT END-STRING
SOJGE TE,MERG21 ; TRY ANOTHER
JUMPL TE,MERG29 ;IF NO INPUT--QUIT
JUMPE TE,MERG28 ;IF ONLY ONE INPUT, IT IS SMALLEST
MOVEI TD,-1(TE) ;DROP DOWN ONE FILE
;NEXT LOAD TD WITH NEXT AVAILABLE REAL FILE (IF THERE IS ONE)
MERG22: CAME TD,CRFCUR ;IF THIS IS OUTPUT FILE OR
SKIPE CRFEOS(TD) ; THIS INPUT IS AT 'EOS',
SOJGE TD,MERG22 ; DROP DOWN ONE MORE
JUMPL TD,MERG28 ;IF NO MORE, 'TE' POINTS TO SMALLEST
;THERE ARE 2 REAL FILES, POINT TO THE ACTUAL RECORDS
MERG23: MOVE TA,TE
ADD TA,CRFTAB
MOVE TA,(TA)
MOVE TB,TD
ADD TB,CRFTAB
MOVE TB,(TB)
HRLI TA,-SZ.SR
;NOW DO THE COMPARISON
MERG24: MOVE TC,(TA)
CAME TC,(TB)
JRST MERG25
AOBJP TA,MERG26
AOJA TB,MERG24
MERG25: CAML TC,(TB)
MOVE TE,TD
;ALWAYS RETURN WITH TE POINTING TO SMALLEST RECORD
MERG26: SOJGE TD,MERG22
MERG28: AOS (PP)
MERG29: POPJ PP,
;RETURN A RECORD TO CALLING PROGRAM
RETRN: TSWF FSRTIO ;WERE ANY FILE INITIALIZED?
JRST RETRN2 ;YES
MOVE TE,CRFLOW ;NO--ARE THERE
CAMN TE,CRFTEN ; ANY MORE RECORDS?
POPJ PP, ;NO--RETURN
RETRN1: ADD TE,CRFTAB
MOVS TE,(TE)
HRRI TE,GCREFN
BLT TE,GCREFN+SZ.SR-1
AOS CRFLOW
AOS (PP)
POPJ PP,
RETRN2: PUSHJ PP,MERG20 ;GET SMALLEST RECORD
JRST RETRN3 ;NO MORE
MOVE TD,TE
ADD TD,CRFTAB
MOVS TD,(TD)
HRRI TD,GCREFN
BLT TD,GCREFN+SZ.SR-1
PUSHJ PP,READ
AOS (PP)
POPJ PP,
;THERE ARE NO MORE RECORDS--DELETE THE SCRATCH FILES
RETRN3:
IFN TOPS20,<
PJRST DELSF ;[1552]Delete the SF files
>
IFE TOPS20,<
MOVEI TE,NUMFIL-1
RTRN3A: MOVE CH,INITS(TE)
MOVE CH,3(CH)
TLO CH,(CLOSE)
XCT CH
SETZB TD,TC
SETZB TB,TA
TLZ CH,777000
ADD CH,[RENAME TD]
XCT CH
JFCL ;IGNORE ERRORS ON DELETE
AND CH,[Z 17,]
TLO CH,(RELEASE)
XCT CH
SOJGE TE,RTRN3A
POPJ PP,
>
;READ ONE RECORD
;ENTER WITH 'TE' HAVING FILE NUMBER
READ:
IFE TOPS20,<
MOVE TD,INITS(TE) ;GET ADDRESS OF I/O TABLE
MOVE TD,2(TD) ;PICK UP 'XXXBHI'
>
IFN TOPS20,<
MOVE TD,SFXBH(TE) ;GET BUFFER HEADER
>
MOVE TC,TE
ADD TC,CRFTAB
MOVE TC,(TC)
HRLI TC,-SZ.SR
MOVEI TB,1 ;Count words from one
READ1: SOSG 2(TD)
JRST READ3
READ2: ILDB TA,1(TD)
CAIE TB,SZ.SR ;If sixth word, skip else
JUMPE TA,READ4 ; ZERO MEANS END-OF-STRING (IT
; CAN HAPPEN ONLY ON FIRST WORD)
MOVEM TA,(TC)
AOS TB ;
AOBJN TC,READ1
POPJ PP,
READ3:
IFE TOPS20,<
MOVE TA,INITS(TE)
MOVE TA,3(TA)
TLO TA,(IN)
XCT TA
JRST READ2
OUTSTR [ASCIZ "%Input error on Cref Sort file
"]
JRST KILCRF
>
IFN TOPS20,<
PUSHJ PP,@GETSFX(TE)
JRST READ2
>
;END OF STRING
READ4: SETOM CRFEOS(TE)
POPJ PP,
;WRITE RECORD ONTO CURRENT FILE.
;ENTER WITH 'TE' POINTING TO TABLE ENTRY
WRITE: ADD TE,CRFTAB
MOVE TE,(TE)
HRLI TE,-SZ.SR
WRITE0: MOVE TD,CRFCUR
IFE TOPS20,<
MOVE TC,INITS(TD)
MOVS TC,2(TC)
>
IFN TOPS20,<
MOVE TC,SFXBH(TD) ;GET BUFFER HEADER
>
WRITE1: SOSG 2(TC)
JRST WRITE3
WRITE2: MOVE TA,(TE)
IDPB TA,1(TC)
AOBJN TE,WRITE1
POPJ PP,
WRITE3:
IFE TOPS20,<
MOVE TA,INITS(TD)
MOVE TA,3(TA)
TLO TA,(OUT)
XCT TA
JRST WRITE2
OUTSTR [ASCIZ "%Output error on Cref Sort file
"]
JRST KILCRF
>
IFN TOPS20,<
PUSHJ PP,@RITSFX(TD)
JRST WRITE2
>
;WRITE 'EOS' RECORD ON OUTPUT FILE
RITEOS: MOVEI TE,[0]
PUSHJ PP,WRITE0
AOS CRFTS(TD) ;INCREMENT 'TOTAL STRINGS ON FILE'
POPJ PP,
;FIND OUT WHICH FILE TO WRITE ON NEXT
GETNFL: MOVEI TB,NUMFIL-2
MOVE TE,CRFCUR
GETNF0: AOS TE
CAIL TE,NUMFIL-1 ;IF NOT LEGAL FILE NUMBER,
MOVEI TE,0 ; START AGAIN AT ZERO
SKIPN CRFSTA(TE) ;MAY ANY MORE STRINGS GO ON THIS FILE?
SOJGE TB,GETNF0 ;NO--TRY NEXT ONE
JUMPL TB,GETNF2 ;IF NO MORE FILES--RESET
MOVEM TE,CRFCUR ;THIS IS THE FILE WE WANT
POPJ PP,
GETNF2: MOVE TE,CRFCUR
MOVE TD,CRFTS(TE)
MOVEI TE,NUMFIL-2
GETNF3: CAME TE,CRFCUR
ADDM TD,CRFSTA(TE)
SOJGE TE,GETNF3
MOVEI TE,0
CAMN TE,CRFCUR
MOVEI TE,1
MOVEM TE,CRFCUR
POPJ PP,
IFE TOPS20,<
;OPEN OUTPUT FILE
OPENO: MOVE TD,INITS(TE)
MOVE TC,3(TD)
ADD TC,[OUTBUF 2]
MOVE TB,SF1BUF(TE)
HRRM TB,.JBFF
XCT TC
MOVE CH,3(TD)
ADD CH,[ENTER TD]
MOVSI TC,(SIXBIT 'TMP')
MOVS TD,4(TD)
HLL TD,GENHDR
SETZB TB,TA
XCT CH
JRST NOENTR
POPJ PP,
;OPEN INPUT FILE
OPENI: MOVE TD,INITS(TE)
MOVE TC,3(TD)
ADD TC,[INBUF 2]
MOVE TB,SF1BUF(TE)
HRRM TB,.JBFF
XCT TC
MOVE CH,3(TD)
ADD CH,[LOOKUP TD]
MOVSI TC,(SIXBIT 'TMP')
MOVS TD,4(TD)
HLL TD,GENHDR
SETZB TB,TA
XCT CH
JRST NOLOOK
POPJ PP,
;CLOSE FILE
CLOSER: MOVE TD,INITS(TE) ;FORM
MOVE TD,3(TD) ; 'CLOSE X,'
TLO TD,(CLOSE) ; *
XCT TD ; AND EXECUTE IT
POPJ PP,
>
;FIND FIRST RECORD IN CORE GREATER THAN INPUT ENTRY.
;EXIT WITH 'TE' POINTING TO THAT TABLE ENTRY.
BINSER: MOVNI TE,1 ;START AT ENTRY -1
MOVE TD,CRFPWR ;GET POWER OF TWO
CAMLE TD,CRFTEN ;IF GREATER THAN TABLE SIZE,
JRST BINSR1 ; ALL IS WELL
LSH TD,1 ;DOUBLE IT
MOVEM TD,CRFPWR ; AND SAVE VALUE
BINSR1: LSH TD,-1 ;CUT INCREMENT IN HALF
JUMPE TD,BINSR6 ;IF ZERO, WE ARE DONE
ADD TE,TD ;INCREMENT THE LOCATION
BINSR2: CAML TE,CRFTEN ;IF OUTSIDE TABLE,
JRST BINSR5 ; TRY ANOTHER
MOVE TB,TE ;POINT
ADD TB,CRFTAB ; 'TB' TO
MOVE TB,(TB) ; THE ITEM IN THE TABLE
MOVE TA,[XWD -SZ.SR,GCREFN]
BINSR3: MOVE TC,(TA) ;COMPARE ONE WORD OF
CAME TC,(TB) ; THE ITEMS
JRST BINSR4 ;NOT EQUAL
AOBJP TA,BINSR5 ;EQUAL--IF JUMP, ENTIRE ITEMS ARE EQUAL
AOJA TB,BINSR3 ;LOOP FOR NEXT WORD OF ITEMS
BINSR4: CAML TC,(TB) ;IS NEW ITEM LESS THAN TABLE ENTRY?
JRST BINSR1 ;NO--MUST BE GREATER
BINSR5: LSH TD,-1 ;CUT INCREMENT IN HALF
JUMPE TD,CPOPJ## ;IF ZERO, WE ARE DONE
SUB TE,TD ;DECREMENT THE LOCATION
JRST BINSR2 ;LOOP
BINSR6: AOJA TE,CPOPJ
;ERRORS DURING FILE INITIALIZATION
IFE TOPS20,<
CANTOP: OUTSTR [ASCIZ "%Cannot Open Cref scratch file
"]
JRST KILCRF
NOENTR: OUTSTR [ASCIZ "%Cannot Enter Cref scratch file
"]
JRST KILCRF
NOLOOK: OUTSTR [ASCIZ "%Cannot find Cref scratch file
"]
JRST KILCRF
>
;NOT ENOUGH CORE
NOCORE: TYPE [ASCIZ "%Not enough memory for Cref Sort
"]
IFE TOPS20,<
KILCRF: MOVEI TE,NUMFIL-1 ;RELEASE
KILL1: MOVE TD,INITS(TE) ; ALL
MOVE TD,3(TD) ; SCRATCH
TLO TD,(RELEASE) ; FILES
XCT TD ; *
SOJGE TE,KILL1 ; *
>
IFN TOPS20,<
PSOUT%
PUSHJ PP,DELSF## ;DELETE ALL SCRATCH FILES
>
TYPE [ASCIZ "%Compilation continuing without Cref
"]
IFN TOPS20,<PSOUT%>
MOVE PP,CRFERA ;WE WILL IGNORE THE ENTIRE CREF
POPJ PP,
;TABLE OF FILE DATA
IFN TOPS20,<
OPNSFX: EXP OPNSF1##
EXP OPNSF2##
EXP OPNSF3##
SETSFX: EXP SETSF1##
EXP SETSF2##
EXP SETSF3##
GETSFX: EXP GETSF1##
EXP GETSF2##
EXP GETSF3##
RITSFX: EXP RITSF1##
EXP RITSF2##
EXP RITSF3##
CLSSFX: EXP CLSSF1##
EXP CLSSF2##
EXP CLSSF3##
SFXBH: EXP SF1BH##
EXP SF2BH##
EXP SF3BH##
>
IFE TOPS20,<
INITS: EXP INSF1
EXP INSF2
EXP INSF3
INSF1: OCT 14
SIXBIT 'DSK'
XWD SF1BHO,SF1BHI
EXP SF1*1B12
SIXBIT 'SF1'
INSF2: OCT 14
SIXBIT 'DSK'
XWD SF2BHO,SF2BHI
EXP SF2*1B12
SIXBIT 'SF2'
INSF3: OCT 14
SIXBIT 'DSK'
XWD SF3BHO,SF3BHI
EXP SF3*1B12
SIXBIT 'SF3'
>
EXTERN CRFEOS,CRFLOW,CRFNE,CRFPWR,CRFTS,CRFSTA
EXTERN CRFTAB,CRFTEN,CRFCUR,CRFSIZ
EXTERN GCREFN,CRFERA
IFN TOPS20,<
EXTERN SF1BH,SF2BH,SF3BH
>
IFE TOPS20,<
EXTERN GENHDR
EXTERN SF1BUF,SF2BUF,SF3BUF,SF1BHO,SF1BHI,SF2BHO,SF2BHI,SF3BHO,SF3BHI
>
END