PSMC CSY/ SM1 P€1_%NAM SMC_*DECK-ID S01 SMC 1.0_.SUMMARY-108_^1*_$SORT-MERGE GETFILE PROCESSOR_^1*_$SORT/MERGE VERSION 1.0_^1*_$SMALL SYSTEMS DIVISION. LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976._^1_%ENT_"SMC_^1PRLVL EQU_"PRLVL(0)_^1AMONI EQU_"AMONI($F4)_^1ADISP EQU_"ADISP($EA)_^1ZERO_!EQU_"ZERO(2)_%(2)=0._^1SMC_"RTJ*_!INIT_)INITIALIZE LOAD._^1HERE_!EQU_"HERE(*)_%RELOCA€€TION REFERENCE POINT._^1* THE CALLING SEQUENCE IS_!(Q)ENTRY = FWA OF LOAD POINT._^1*_:(A)ENTRY = INDEX INTO FILENAME TABLE._^1*_:(SMC)ENTRY = PARAMETER TO PASS TO LOADEE._^1*_:RTJ LOAD_^1* THE MODULE INDICATED VIA (A)ENTRY IS LOADED AND GIVEN CONTROL,_^1* WITH (Q) = (I) = PARAMETER, E.G. FWA OF FIXED TABLES._^1* (1ST WORD OF LOADEE) = FWA OF NSI OF CALLER OF LOAD._^1* AS THE EXCEPT€€ION, DUE TO INIT, (SMCMON) = FWA OF LOAD._^1LOAD_!NUM_"0_^1LOADSS STQ*_!LOADS_(SET LOAD POINT INTO GTFILE REQUEST._^1_%ADD*_!LOADEL_"(A) = FWA FILENAME - FWA GTFILE PARAMS._^1_%STA*_!LOADI_#TELL GTFILE WHERE FILENAME IS._^1_%CLR_"A_^1_%STA*_!LOADLS_'IN CASE A PREVIOUS GTFILE SET LOADLS._^1_%STA* W2_^1LOADRQ RTJ-_!(AMONI)_^1LOADP VFD_"N1/0,N1/1,N5/13,N1/0,X4/PRLVL,X4/PRLVL_^1LOADC €€ ADC_"LOAD1-HERE_"COMPLETION._^1_%NUM_"0_,THREAD._^1_%VFD_"N3/0,N1/0,N2/2,N10/$C2_"V,M,A,L._^1_%NUM_"0_(W1._^1LOADS NUM_"0_(S._^1W2_#NUM 0_,W2._^1LOADI ADC_"0_(I._^1_%NUM_"0_(MSB._^1LOADLS NUM_"0_(LSB._^1LOADAC JMP-_!(ADISP)_!GIVE UP CPU WHILE AWAITING COMPLETION._^1LOAD1 SQP_"LOADOK_"SKIP IF NO ERROR._^1_%JMP*_!LOADRQ_"TRY AGAIN IF ERROR._^1LOADOK LDA*_!LOAD_)(A) = FWA OF NSI €€OF CALLER._^1_%LDQ*_!LOADS_((Q) = FWA OF LOADEE._^1_%STA-_!(ZERO),Q_$FAKE RTJ FROM LOAD CALLER TO LOADEE._^1LOAD2 LDQ*_!SMC_*(Q) = PARAMETER TO PASS TO LOADEE._^1_%STQ-_!I_,PASS PARAMETER IN I AS WELL._^1_%RAO*_!LOADS_(() = 1 + FWA OF LOADEE._^1_%JMP*_!(LOADS)_%JMP TO 2ND WORD OF LOADEE._^1LOADEL ADC_"LOADNM-LOADP_^1_%ALF_"3,SMCMON_^1LOADNM ALF_"3,SMCEDT_"EDIT._^1_%ALF_"3,SMCSRT_"€€COPY OR INTERNAL SORT._^1_%ALF_"3,SMCIMG_"INTERMEDIATE MERGE._^1_%ALF_"3,SMCFMG_"MERGE-ONLY OR FINAL-MERGE._^1INIT_!NUM_"0_^1_%LDA*_!INIT_)(A) = FWA OF LOAD._^1_%STA*_!LOAD_)INDIRECTLY MAKE (SMCMON) = FWA OF LOAD._^1_%STA*_!SMC_*INDIRECTLY TELL 1 + FWA OF SMC TO SMCMON._^1_%ADD*_!LOADC_((A) = RELOCATED (LOADC)._^1_%STA*_!LOADC_^1_%ENA_"-1*3_)SELECT SMCMON FOR LOADING._^1_%LDQ*_!INI€„T_)(Q) = RELOCATION FACTOR._^1_%ADQ_"=XINIT-HERE_!(Q) = FWA OF LOADPOINT FOR SMCMON._^1_%JMP*_!LOADSS_'LOAD SMCMON._^1_%END_"SMC_^__„PSMCMON CSY/ SM2 P€1_%NAM SMCMON_'DECK-ID S02 SMC 1.0_.SUMMARY-108_^1*_$SORT-MERGE MONITOR_^1*_$SORT/MERGE VERSION 1.0_^1*_$SMALL SYSTEMS DIVISION. LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976._^1_%EXT FLOT_^1_%EXT_"FSLIST_^1_%EXT_"DEFFIL_^1_%EXT_"STOSEQ_^1_%EXT_"RTVSEQ_^1_%EXT_"RELFIL_^1_%EXT IUP_*L0CN CONTAINING JOB CONTROL LU (IN PROG TRVEC)_^1_%ENT_"SMCMON_^1SGBKSZ EQU_"S€€GBKSZ(4)_#LENGTH OF SEG. LIST ENTRY MINUS LENGTH WORD._^1EDTSIZ EQU_"EDTSIZ($6C0) SIZE OF EDIT RESIDENT._^1SRTSIZ EQU SRTSIZ($1F5) SIZE OF INTERNAL SORT RESIDENT._^1IMGSIZ EQU IMGSIZ($18D) SIZE OF INTERMEDIATE-MERGE RESIDENT._^1FMGSIZ EQU FMGSIZ($1CC) SIZE OF FINAL-MERGE RESIDENT._^1PRLVL EQU_"PRLVL(0)_$RP AND CP TO USE IN MSOS REQUESTS._^1AMONI EQU_"AMONI($F4)_^1ADISP EQ€€U_"ADISP($EA)_^1_%EJT_]_^1* FILE TABLE STRUCTURE._^1LUN_"EQU_"LUN(2)_((2)=0._^1FILNUM EQU_"FILNUM(1)_^1RECLTH EQU_"RECLTH(FILNUM+1)_^1BUFLTH EQU_"BUFLTH(RECLTH+1)_^1SKIPCT EQU_"SKIPCT(BUFLTH+1)_^1DOCNT EQU_"DOCNT(SKIPCT+2)_^1BUFWA EQU_"BUFWA(DOCNT+2)_^1RECNT EQU_"RECNT(BUFWA+1)_^1ERRCNT EQU_"ERRCNT(RECNT+2)_^1BLKCNT EQU_"BLKCNT(ERRCNT+1)_^1RECFWA EQU_"RECFWA(BLKCNT+1)_^1XFRLTH E€€QU_"XFRLTH(RECFWA+1)_^1RECPTR EQU_"RECPTR(XFRLTH+1)_^1REQBUF EQU_"REQBUF(RECPTR+2)_^1REQIND EQU_"REQIND(REQBUF+12)_^1FTSIZE EQU_"FTSIZE(1+REQIND)_^1_%EJT_]_^1* OFTEN NEEDED CONSTANTS._^1ZERO_!EQU_"ZERO(2)_'(2)=0._^1HX0020 EQU_"HX0020($28)_"($28)=$0020._^1HX00FF EQU_"HX00FF($A)_"($A)=$00FF._^1HX01FF EQU_"HX01FF($B)_#($B)=$01FF._^1HX03FF EQU_"HX03FF($C)_#($C)=$03FF._^1HX0400 EQU_"HX0€€400($2D)_"($2D)=$0400._^1HX0800 EQU_"HX0800($2E)_"($2E)=$0800._^1HX1000 EQU_"HX1000($2F)_"($2F)=$1000._^1HX2000 EQU_"HX2000($30)_"($30)=$2000._^1HX4000 EQU_"HX4000($31)_"($31)=$4000._^1HX7FFF EQU_"HX7FFF($42)_"($42)=$7FFF._^1HX8000 EQU_"HX8000($32)_"($32)=$8000._^1HXDFFF EQU_"HXDFFF($40)_"($40)=$DFFF._^1HXEFFF EQU_"HXEFFF($3F)_"($3F)=$EFFF._^1HXF7FF EQU_"HXF7FF($3E)_"($3E)=$F7FF._^€€1HXF800 EQU_"HXF800($1D)_"($1D)=$F800._^1HXFBFF EQU_"HXFBFF($3D)_"($3D)=$FBFF._^1HXFC00 EQU_"HXFC00($1C)_"($1C)=$FC00._^1HXFFFE EQU_"HXFFFE($33)_"($33)=$FFFE._^1HXFFFF EQU_"HXFFFF($12)_"($12)=$FFFF._^1HXFF00 EQU_"HXFF00($1A)_"($1A)=$FF00._^1_%EJT_]_^1SMCMON NUM_"0_,() = FWA OF LOAD IN SMC._^1_%RTJ_"INIT_)INITIALIZE SMCMON._^1HERE_!EQU_"HERE(*)_%RELOC REFERENCE POINT._^1* AMONG OTHE€€R THINGS, INIT VERIFIED THAT THERE WAS ENOUGH CORE TO LOAD_^1* SMCEDT, AND INIT SET (A)EXIT = 0 TO SELECT SMCEDT, AND INIT SET_^1* (Q)EXIT = FWA OF LOAD POINT OF SMCEDT, PREPARING FOR THE LOAD BELOW._^1_%RTJ*_!(SMCMON)_$RUN EDIT._^1_%LDA_"YDM_*(A)15=1 IFF SORT RUN._^1_%SAM_"SMCSRT_'SKIP IF SORT RUN._^1* IT IS A MERGE-ONLY RUN OR A COPY RUN._^1_%LDA_"YKCT_)(A)=0 IF COPY RUN._^1_%SAZ€€_"SMCSRT_'SKIP IF COPY RUN._^1* IT IS A MERGE-ONLY RUN._^1_%JMP*_!SMCFMG_"RUN SMCFMG._^1SMCSRT ENA_"1*3_%SELECT SMCSRT._^1_%LDQ_"YEND_$(Q) = 1 + LWA OF VARIABLE TABLES._^1_%RTJ*_!(SMCMON)_$RUN SMCSRT._^1* SMCSRT TAKES A P+1 EXIT FOR A COPY RUN, AND A P+2 EXIT FOR A SORT RUN._^1_%JMP*_!SMCXIT_"JMP IF COPY RUN._^1* IT]S A SORT RUN._^1* LET]S SEE IF INTERMEDIATE MERGING CAN BE SKIPPED€€._^1_%LDA_"YFWAY_#(A) = MAXIMUM ORDER OF FINAL MERGE._^1_%SUB_"YSQ2MG_"SUBTRACT NO. OF STRINGS TO MERGE._^1_%SAP_"SMCFMG_"SKIP INTERMEDIATE MERGING IF POSSIBLE._^1* LET]S CONTINUE SORT RUN WITH INTERMEDIATE MERGING._^1_%ENA_"2*3_%SELECT SMCIMG._^1_%LDQ_"YEND_$(Q) = 1 + LWA OF VARIABLE TABLES._^1_%RTJ*_!(SMCMON)_$RUN SMCIMG._^1SMCFMG ENA_"3*3_%SELECT SMCFMG._^1_%LDQ_"YEND_$(Q) = 1 +€€ LWA OF VARIABLE TABLES._^1_%RTJ*_!(SMCMON)_$RUN SMCFMG._^1_%JMP*_!SMCXIT_'BYPASS RELFIL FOR MERGE-ONLY._^1* RELEASE THE SEG. LIST AND THE LAST SEGMENT OF THE SEQUENCE DIRECTORY._^1SMCREL LDA_"=XPTSQFT-HERE (A) = FWA OF PUTSEQ FILE-TABLE._^1_%STA-_!I_,TELL REL WHAT FILE-TABLE TO USE._^1_%RTJ_"REL_*RELEASE THE LAST SEGMENT OF THE SEQ. DIR._^1_%LDA FWASGF_'(A) = FWA OF SEGMENT LIST €€FILE TABLE._^1_%STA- I_,TELL REL WHAT FILE TABLE TO USE._^1_%RTJ_"REL_*RELEASE THE SEGMENT LIST._^1SMCXIT EQU_"SMCXIT(*)_^1SMCEND LDQ_"=XMSGEND-HERE (Q) = FWA OF MESSAGE._^1_%RTJ_"TYPOUT_'ANNOUNCE NORMAL END OF RUN._^1_%JMP-_!(ADISP)_%EXIT TO MSOS._^1_%ADC_"MNDEND-MSGEND_^1MSGEND ALF_"/,SMC ENDS/_^1MNDEND EQU_"MNDEND(*)_^1_%EJT_]_^1********_]_^1*CMPKEY*_]_^1********_]_^1* THE CALLI€€NG SEQUENCE IS_!(A)ENTRY = FWA OF 1ST RECORD._^1*_:(Q)ENTRY = FWA OF 2ND RECORD._^1*_:(KEYTBL)ENTRY = FWA OF THE KEY TABLE._^1*_:RTJ CMPKEY_^1*_:(I)EXIT = (I)ENTRY._^1*_:(KEYTBL)EXIT = (KEYTBL)ENTRY._^1*_:IF NO TIE, THEN_^1*_:(A)EXIT = FWA OF WINNER RECORD_^1*_:(Q)EXIT = FWA OF LOSER RECORD._^1*_:IF TIE, THEN_^1*_:(A),(Q) EXIT = (A),(Q) ENTRY._^1* THE SPEED OF CMPKEY IS CRITICAL DU€€E TO GREATER FREQUENCY OF USAGE_^1* THAN ANY OTHER ROUTINE._^1*_]_^1* CMPKEY COMPARES TWO LOGICAL RECORDS AS PER USER-DEFINED KEY FIELDS._^1* THE KEY FIELDS ARE DEFINED BY A TABLE WHOSE FWA = (KEYTBL)._^1*_]_^1* CMPKEY BUMPS KEYPTR ALONG AS IT PROGRESSES THROUGH THE KEY TABLE,_^1* COMPARING KEYS FROM THE MOST MAJOR TO THE MOST MINOR, AS PER THE_^1* GUIDANCE OF THE KEY TABLE._^1*_]_€€^1* THE KEY TABLE FORMAT WAS DESIGNED TO OPTIMIZE THE PERFORMANCE OF_^1* CMPKEY._]_^1*_]_^1* SAMPLE KEY STATEMENT AND CORRESPONDING KEY TABLE_^1*_]_^1*_#SAMPLE KEY STATEMENT_^1*_]_^1*_#KEYS=L,A,1,C,D,3,20,F,D,23,C,A,28,6,C,A,34,5,C,D,39,3,_^1*_)C,A,43,2,S,D,45_^1*_]_^1*_#SAMPLE KEY TABLE_^1*_]_^1*_#L,A,1 * WORD 00 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=0._^1*_** WORD 01 * ()=-1+FWA €€CMPLA._^1*_]_^1*_#C,D,3,20 * WORD 02 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=1._^1*_-* WORD 03 * ()=-1+FWA CMPWD._^1*_-* WORD 04 * ()=1+LWA KEY-FWA RECORD=11._^1*_]_^1*_#F,D,23 * WORD 05 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=11._^1*_+* WORD 06 * ()=-1+FWA CMPFD._^1*_]_^1*_#C,A,28,6 * WORD 07 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=13._^1*_-* WORD 08 * ()=-1+FWA CMPCLA._^1*_-* WORD 09 *€€ (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=14._^1*_-* WORD 10 * ()=-1+FWA CMPWA._^1*_-* WORD 11 * ()=1+LWA KEY-FWA RECORD=16._^1*_-* WORD 12 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=16._^1*_-* WORD 13 * ()=-1+FWA CMPCUA._^1*_]_^1*_#C,A,34,5 * WORD 14 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=16._^1*_-* WORD 15 * ()=-1+FWA CMPCUA._^1*_-* WORD 16 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=17._^1*_-* W€€ORD 17 * ()=-1+FWA CMPWA._^1*_-* WORD 18 * ()=1+LWA KEY-FWA RECORD=19._^1*_]_^1*_#C,D,39,3 * WORD 19 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=19._^1*_-* WORD 20 * ()=-1+FWA CMPLD._^1*_-* WORD 21 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=20._^1*_-* WORD 22 * ()=-1+FWA CMPCUD._^1*_]_^1*_#C,A,43,2 * WORD 23 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=21._^1*_-* WORD 24 * ()=-1+FWA CMPLA._^1*_]_^1*€€_#S,D,45 * WORD 25 * (]15)=0,(]14-]0)=FWA KEY-FWA RECORD=22._^1*_+* WORD 26 * ()=-1+FWA CMPSD._^1*_]_^1*_#TABLE TERMINATOR * WORD 27 * ()=-0._^1*_]_^1* AXIOMS DESCRIBING KEY TABLE GENERATION AND FORMAT_^1*_]_^1*_#F,A/D,(EVEN COLUMN) IS ILLEGAL._^1*_#F,A/D,(ODD COLUMN) USES CMPFA/CMPFD._^1*_]_^1*_#S,A/D,(EVEN COLUMN) IS ILLEGAL._^1*_#S,A/D,(ODD COLUMN) USES CMPSA/CMPSD._^1*_]_^1*_#L€€,A/D,(EVEN COLUMN) IS ILLEGAL._^1*_#L,A/D,(ODD COLUMN) USES CMPLA/CMPLD._^1*_]_^1*_#C,A/D,(EVEN COLUMN),1 USES CMPCLA/CMPCLD._^1*_#C,A/D,(ODD COLUMN),1 USES CMPCUA/CMPCUD._^1*_#C,A/D,(ODD COLUMN),2 USES CMPLA/CMPLD._^1*_#C,A/D,(ODD COLUMN),(4+2N FOR N=0,1,2...) USES CMPWA/CMPWD._^1*_]_^1*_#THE KEY TABLE ENDS WITH -0._^1*_]_^1* NOTICE HOW THE AXIOMS APPLY TO THE SAMPLE KEY TABLE._^1€€_%EJT_]_^1* ASCENDING FLOATING POINT._^1CMPFA LDA* CMPQ_)() = ADDR. OF QREC._^1_%STA* T1_^1_%LDA* CMPA_)() = ADDR. OF AREC._^1_%STA* T2_^1_%RTJ FLOT_^1_%NUM $FB86_(INDEX, FLOAT LOAD, FLOAT SUB., NO INDEX._^1_%NUM $00FF_(I-REGISTER._^1T1_#NUM 0_,ADDR. OF QREC._^1T2_#NUM 0_,ADDR. OF AREC._^1_%NUM $5D40_(CHANGE MODE, FLOAT STORE, FLOAT END._^1_%ADC TEMP-*_'TEMP. FLOAT RESULT._€€^1*_]_^1*_]_^1_%LDA* TEMP_^1_%INA 0_^1_%SAN 1_^1_%JMP* CMPTIE_'JUMP IF F(QREC) = F(AREC)._^1_%SAM 1_^1_%JMP* CPAWON_'JUMP IF F(QREC).GT.F(AREC)._^1_%JMP* CPQWON_'F(QREC) WINS._^1_%EJT_]_^1* DESCENDING FLOATING POINT._^1CMPFD LDA* CMPA_)() = ADDR. OF AREC._^1_%STA* T3_^1_%LDA* CMPQ_)() = ADDR. OF QREC._^1_%STA* T4_^1_%RTJ FLOT_^1_%NUM $FB86_(INDEX, FLOAT LOAD, FLOAT SUB., NO I€€NDEX._^1_%NUM $00FF_(I-REGISTER._^1T3_#NUM 0_,ADDR. OF AREC._^1T4_#NUM 0_,ADDR. OF QREC._^1_%NUM $5D40_(CHANGE MODE, FLOAT STORE, FLOAT END._^1_%ADC TEMP-*_'TEMP. FLOAT RESULT._^1*_]_^1*_]_^1_%LDA* TEMP_^1_%INA 0_^1_%SAN 1_^1_%JMP* CMPTIE_'JUMP IF F(QREC) = F(AREC)._^1_%SAM 1_^1_%JMP* CPAWON_'JUMP IF F(AREC).GT.F(QREC)._^1_%JMP* CPQWON_'F(QREC) WINS._^1TEMP_!NUM 0_^1_%NUM €€ 0_^1_%EJT_]_^1* ASCENDING SIGNED BINARY._^1CMPSA LDA*_!(CMPA),I_"(A) = 16] S KEY OF AREC._^1_%LDQ*_!(CMPQ),I_"(Q) = 16] S KEY OF QREC._^1_%TCQ_"Q_"(Q) = - QREC KEY._^1_%SAM_"CMPSA1_"SKIP IF AREC -._^1* AREC +._]_^1_%AAQ_"A_"AREC +, (A) = AREC - QREC._^1* INA 0 NOT NEEDED SINCE AREC +, SO (A) CAN]T = -0._^1_%SAN_"CMPSA2_"SKIP IF NO TIE._^1_%JMP*_!CMPTIE_"JMP IF TIE._^1* AREC +, NO€€ TIE._^1CMPSA2 SQP_"CMPSA3_"AREC +, NO TIE, SKIP IF QREC -._^1_%SAP_"CMPSA3_"AREC +, NO TIE, QREC +, SKIP IF AREC-QREC +._^1_%JMP*_!CPAWON_"AREC +, NO TIE, QREC +, AREC-QREC -._^1CMPSA3 JMP*_!CPQWON_'QREC WINS._^1* AREC -._]_^1CMPSA1 AAQ_"A_"AREC -, (A) = AREC - QREC._^1_%INA_"0_"MAKE ANY -0 BE +0._^1_%SAN_"CMPSA4_"SKIP IF NO TIE._^1_%JMP*_!CMPTIE_"JMP IF TIE._^1* NO TIE. AREC -._^€€1CMPSA4 SQM_"CMPSA5_"NO TIE. AREC -. SKIP IF QREC +._^1_%SAM_"CMPSA5_"AREC -. QREC -. SKIP IF AREC-QREC -._^1_%JMP*_!CPQWON_'QREC WINS._^1CMPSA5 JMP*_!CPAWON_"AREC WINS._^1_%EJT_]_^1* DESCENDING SIGNED BINARY._^1CMPSD LDA*_!(CMPA),I_"(A) = 16] S KEY OF AREC._^1_%LDQ*_!(CMPQ),I_"(Q) = 16] S KEY OF QREC._^1_%TCQ_"Q_"(Q) = - QREC KEY._^1_%SAM_"CMPSD1_"SKIP IF AREC -._^1* AREC +._]_^1€€_%AAQ_"A_"AREC +, (A) = AREC - QREC._^1* INA 0 NOT NEEDED SINCE AREC +, SO (A) CAN]T = -0._^1_%SAN_"CMPSD2_"AREC +, SKIP IF NO TIE._^1_%JMP*_!CMPTIE_"AREC +, JMP IF TIE._^1* AREC +, NO TIE._^1CMPSD2 SQP_"CMPSD3_"AREC +, NO TIE, SKIP IF QREC -._^1_%SAP_"CMPSD3_"AREC +, NO TIE, QREC +, SKIP IF AREC-QREC +._^1_%JMP*_!CPQWON_'QREC WINS._^1CMPSD3 JMP*_!CPAWON_"AREC WINS._^1* AREC -._]_^€€1CMPSD1 AAQ_"A_"AREC -, (A) = AREC - QREC._^1_%INA_"0_"MAKE ANY -0 BE +0._^1_%SAN_"CMPSD4_"AREC -, SKIP IF NO TIE._^1_%JMP*_!CMPTIE_"AREC -, JMP IF TIE._^1* AREC -, NO TIE._^1CMPSD4 SQM_"CMPSD5_"AREC -, NO TIE, SKIP IF QREC +._^1_%SAM_"CMPSD5_"AREC -, NO TIE, QREC -, SKIP IF AREC-QREC -._^1_%JMP*_!CPAWON_"AREC WINS._^1CMPSD5 JMP*_!CPQWON_'QREC WINS._^1_%EJT_]_^1* ASCENDING LOGICAL €€BINARY._^1CMPLA LDA*_!(CMPA),I_"(A) = 16] L KEY OF AREC._^1_%LDQ*_!(CMPQ),I_"(Q) = 16] L KEY OF QREC._^1_%SAM_"CMPLA1_"SKIP IF AREC -._^1* AREC +._]_^1_%SQP_"CMPLA2_"AREC +, SKIP IF QREC +._^1_%JMP*_!CPAWON_"AREC +, QREC -._^1* AREC -._]_^1CMPLA1 SQP_"CMPLA3_"AREC -, SKIP IF QREC +._^1* AREC AND QREC HAVE SAME SIGN._^1CMPLA2 SUB*_!(CMPQ),I_"(A) = AREC - QREC._^1* INA 0 NOT NEEDED €€SINCE -0 - +0 CAN]T HAPPEN HERE SINCE SAME SIGNS._^1_%SAN_"CMPLA4_"SKIP IF NO TIE._^1_%JMP*_!CMPTIE_"JMP IF TIE._^1* AREC AND QREC HAVE SAME SIGN, NO TIE._^1CMPLA4 SAP_"CMPLA3_"SAME SIGN, NO TIE, SKIP IF AREC-QREC +._^1_%JMP*_!CPAWON_"NO TIE, AREC-QREC -._^1CMPLA3 JMP*_!CPQWON_'QREC WINS._^1_%EJT_]_^1* DESCENDING LOGICAL BINARY._^1CMPLD LDA*_!(CMPA),I_"(A) = 16] L KEY OF AREC._^1_€€%LDQ*_!(CMPQ),I_"(Q) = 16] L KEY OF QREC._^1_%SAP_"CMPLD1_"SKIP IF AREC +._^1_%SQM_"CMPLD2_"AREC -, SKIP IF QREC -._^1_%JMP*_!CPAWON_"AREC -. QREC +. AREC WINS._^1* AREC +._]_^1CMPLD1 SQM_"CMPLD3_"AREC +. SKIP IF QREC -._^1* AREC AND QREC HAVE SAME SIGN._^1CMPLD2 SUB*_!(CMPQ),I_"(A) = AREC - QREC._^1* INA 0 NOT NEEDED SINCE -0 - +0 CAN]T HAPPEN HERE SINCE SAME SIGNS._^1_%SAN_"CMPLD€€4_"SKIP IF NO TIE._^1_%JMP*_!CMPTIE_"JMP IF TIE._^1* SAME SIGNS. NO TIE._^1CMPLD4 SAM_"CMPLD3_"SAME SIGNS. NO TIE. SKIP IF AREC-QREC -._^1_%JMP*_!CPAWON_"SAME SIGNS. NO TIE. AREC-QREC +. AREC WINS._^1CMPLD3 JMP*_!CPQWON_'QREC WINS._^1_%EJT_]_^1CMPA_!NUM_"0_"() = (A)ENTRY = FWA OF AREC._^1CMPQ_!NUM_"0_"() = (Q)ENTRY = FWA OF QREC._^1CMPI_!NUM_"0_,() = (I)ENTRY._^1KEYTBL NUM_"0_"() =€€ FWA OF THE KEY TABLE._^1CMPTIE RAO*_!KEYPTR_"POINT TO NEXT ENTRY IN KEY TABLE._^1CMPNXT LDA*_!(KEYPTR)_"(A) = (1ST WD OF CURRENT ENTRY IN KEY TBL)._^1_%SAM_"CPAWON_"SKIP IF END-OF-KEY-TABLE._^1_%STA-_!I_"(I) = FWA OF KEY - FWA OF RECORD._^1_%RAO*_!KEYPTR_"POINT TO ADDRESS OF TAILORED LOGIC._^1_%LDQ*_!(KEYPTR)_$(Q) = -1 + FWA OF TAILORED LOGIC._^1_%JMP-_!1,Q_*JMP TO TAILORED LOGIC.€€_^1KEYPTR NUM_"0_,() = FWA OF CURRENT WORD IN KEY TABLE._^1* AREC WINS._^1CPAWON LDA*_!CMPA_"(A) = (A)ENTRY = FWA OF AREC._^1_%LDQ*_!CMPI_)(Q) = (I)ENTRY._^1_%STQ-_!I_,RESTORE (I)ENTRY._^1_%LDQ*_!CMPQ_"(Q) = (Q)ENTRY = FWA OF QREC._^1_%JMP*_!(CMPKEY)_$EXIT._^1* QREC WINS._^1CPQWON LDA*_!CMPQ_)(A) = (Q)ENTRY = FWA OF QREC._^1_%LDQ*_!CMPI_)(Q) = (I)ENTRY._^1_%STQ-_!I_,RESTORE (I)ENTR€€Y._^1_%LDQ*_!CMPA_)(Q) = (A)ENTRY = FWA OF AREC._^1_%JMP*_!(CMPKEY)_$EXIT._^1***ENTRY TO COMPARE LOGIC***_^1CMPKEY NUM_"0_^1_%STA*_!CMPA_"SAVE (A)ENTRY._^1_%STQ*_!CMPQ_"SAVE (Q)ENTRY._^1_%LDQ-_!I_,(Q) = (I)ENTRY._^1_%STQ*_!CMPI_)SAVE (I)ENTRY._^1_%LDQ*_!KEYTBL_"(Q) = FWA OF THE KEY TABLE._^1_%STQ*_!KEYPTR_"POINT TO 1ST ENTRY OF KEY TABLE._^1_%JMP*_!CMPNXT_"DO THE NEXT (I.E. 1ST) KE€€Y._^1_%EJT_]_^1* ASCENDING SINGLE CHAR, EVEN COLUMN._^1CMPCLA LDA* (CMPQ),I_^1_%AND- HX00FF_'(A)7-0 = 1ST 8' OF QREC KEY._^1_%TCA_"Q_"(Q) = - 1ST 8] OF QREC KEY._^1_%LDA* (CMPA),I_^1_%AND- HX00FF_'(A)7-0 = 1ST 8' OF AREC KEY._^1_%AAQ_"A_"(A) = AREC - QREC._^1* INA 0 NOT NEEDED SINCE -0 - +0 CAN]T HAPPEN HERE SINCE BOTH ARE +._^1_%SAN_"1_"SKIP IF NO TIE._^1_%JMP*_!CMPTIE_"JMP IF TIE€€._^1* NO TIE._]_^1_%SAP_"1_"NO TIE. SKIP IF AREC-QREC +._^1_%JMP*_!CPAWON_"NO TIE. AREC-QREC -._^1* NO TIE. AREC-QREC +. QREC WINS._^1_%JMP*_!CPQWON_^1_%EJT_]_^1* DESCENDING SINGLE CHAR, EVEN COLUMN._^1CMPCLD LDA* (CMPQ),I_^1_%AND- HX00FF_'(A)7-0 = 1ST 8' OF QREC KEY._^1_%TCA_"Q_"(Q) = - 1ST 8] OF QREC KEY._^1_%LDA* (CMPA),I_^1_%AND- HX00FF_'(A)7-0 = 1ST 8' OF AREC KEY._^1_%AAQ_"A_€€"(A) = AREC - QREC._^1* INA 0 NOT NEEDED SINCE -0 - +0 CAN]T HAPPEN SINCE BOTH ARE +._^1_%SAN_"1_"SKIP IF NO TIE._^1_%JMP*_!CMPTIE_"JMP IF TIE._^1* NO TIE._]_^1_%SAM_"1_"NO TIE. SKIP IF AREC-QREC -._^1_%JMP*_!CPAWON_"NO TIE. AREC-QREC +._^1* NO TIE. AREC-QREC -. QREC WINS._^1_%JMP*_!CPQWON_^1_%EJT_]_^1* ASCENDING SINGLE CHAR, ODD COLUMN._^1CMPCUA LDA* (CMPQ),I_^1_%AND- HXFF00_'(A)7€€-0 = 1ST 8' OF QREC KEY._^1_%ALS 8_^1_%TCA_"Q_"(Q) = - 1ST 8] OF QREC KEY._^1_%LDA* (CMPA),I_^1_%AND- HXFF00_'(A)7-0 = 1ST 8' OF AREC KEY._^1_%ALS 8_^1_%AAQ_"A_"(A) = AREC - QREC._^1* INA 0 NOT NEEDED SINCE -0 - +0 CAN]T HAPPEN SINCE BOTH ARE +._^1_%SAN_"1_"SKIP IF NO TIE._^1_%JMP*_!CMPTIE_"JMP IF TIE._^1* NO TIE._]_^1_%SAP_"1_"NO TIE. SKIP IF AREC-QREC +._^1_%JMP*_!CPAWON_"NO TI€€E. AREC-QREC -._^1* NO TIE. AREC-QREC +. QREC WINS._^1_%JMP*_!CPQWON_^1_%EJT_]_^1* DESCENDING SINGLE CHAR, ODD COLUMN._^1CMPCUD LDA* (CMPQ),I_^1_%AND- HXFF00_'(A)7-0 = 1ST 8' OF QREC KEY._^1_%ALS 8_^1_%TCA_"Q_"(Q) = - 1ST 8] OF QREC KEY._^1_%LDA* (CMPA),I_^1_%AND- HXFF00_'(A)7-0 = 1ST 8' OF AREC KEY._^1_%ALS 8_^1_%AAQ_"A_"(A) = AREC - QREC._^1* INA 0 NOT NEEDED SINCE -0 - +0 CAN]€€T HAPPEN SINCE BOTH ARE +._^1_%SAN_"1_"SKIP IF NO TIE._^1_%JMP*_!CMPTIE_"JMP IF TIE._^1* NO TIE._]_^1_%SAM_"1_"NO TIE. SKIP IF AREC-QREC -._^1_%JMP*_!CPAWON_"NO TIE. AREC-QREC +._^1* NO TIE. AREC-QREC -. QREC WINS._^1_%JMP*_!CPQWON_^1_%EJT_]_^1* ASCENDING MULTIPLE WORD LOGICAL BINARY KEY._^1CMPWA5 RAO-_!I_"(I) = FWA OF NEXT WORD OF KEY - FWA OF RECORD._^1_%LDQ*_!KEYPTR_"(Q) = FWA O€€F 2ND WORD OF KEY TABLE ENTRY._^1_%LDA-_!1,Q_!(A) = (3RD WORD) = 1 + LWA OF KEY - FWA OF RECORD._^1_%EOR-_!I_"(A)=0 IF DONE WITH KEY._^1_%SAN_"CMPWA_"SKIP IF NOT DONE._^1* WE ARE DONE WITH KEY AND DIDN]T BREAK TIE._^1_%RAO*_!KEYPTR_"(KEYPTR) = LWA OF ENTRY FOR CURRENT KEY._^1_%JMP*_!CMPTIE_"DO NEXT KEY._^1CMPWA LDA*_!(CMPA),I_"(A) = NEXT WORD OF AREC KEY._^1_%LDQ*_!(CMPQ),I_"(Q) =€€ NEXT WORD OF QREC KEY._^1_%SAM_"CMPWA1_"SKIP IF AREC -._^1* AREC +._]_^1_%SQP_"CMPWA2_"AREC +. SKIP IF QREC +._^1_%JMP*_!CPAWON_"AREC +. QREC -. AREC WINS._^1* AREC -._]_^1CMPWA1 SQP_"CMPWA3_"AREC -. SKIP IF QREC +._^1* AREC AND QREC HAVE SAME SIGN._^1CMPWA2 SUB*_!(CMPQ),I_"(A) = AREC - QREC._^1* INA 0 NOT NEEDED SINCE -0 - +0 CAN]T HAPPEN HERE SINCE SAME SIGNS._^1_%SAN_"CMPWA4_"S€€KIP IF NO TIE._^1_%JMP*_!CMPWA5_"JMP IF TIE._^1* NO TIE. AREC AND QREC HAVE SAME SIGN._^1CMPWA4 SAP_"CMPWA3_"NO TIE. SKIP IF AREC-QREC +._^1_%JMP*_!CPAWON_"NO TIE. AREC-QREC -._^1CMPWA3 JMP*_!CPQWON_'QREC WINS._^1_%EJT_]_^1* DESCENDING MULTIPLE-WORD LOGICAL BINARY KEY._^1CMPWD5 RAO-_!I_"(I) = FWA OF NEXT WORD OF KEY - FWA OF RECORD._^1_%LDQ*_!KEYPTR_"(Q) = FWA OF 2ND WORD OF KEY TA€€BLE ENTRY._^1_%LDA-_!1,Q_"(A) = (3RD WORD) = 1 + LWA OF KEY - FWA OF RECORD._^1_%EOR-_!I_"(A)=0 IF DONE WITH KEY._^1_%SAN_"CMPWD_"SKIP IF NOT DONE._^1* WE ARE DONE WITH KEY AND DIDN]T BREAK TIE._^1_%RAO*_!KEYPTR_"(KEYPTR) = LWA OF ENTRY FOR CURRENT KEY._^1_%JMP*_!CMPTIE_"DO NEXT KEY._^1CMPWD LDA*_!(CMPA),I_"(A) = NEXT WORD OF AREC KEY._^1_%LDQ*_!(CMPQ),I_"(Q) = NEXT WORD OF QREC K€€EY._^1_%SAP_"CMPWD1_"SKIP IF AREC +._^1* AREC -._]_^1_%SQM_"CMPWD2_"AREC -. SKIP IF QREC -._^1_%JMP*_!CPAWON_"AREC -. QREC +._^1* AREC +._]_^1CMPWD1 SQM_"CMPWD3_"AREC +. SKIP IF QREC -._^1* AREC AND QREC HAVE SAME SIGN._^1CMPWD2 SUB*_!(CMPQ),I_"(A) = AREC - QREC._^1* INA 0 NOT NEEDED SINCE -0 - +0 CAN]T HAPPEN HERE SINCE SAME SIGNS._^1_%SAN_"CMPWD4_"SKIP IF NO TIE._^1_%JMP*_!CMPWD5€€_"JMP IF TIE._^1* NO TIE. AREC AND QREC HAVE SAME SIGN._^1CMPWD4 SAM_"CMPWD3_"NO TIE. SKIP IF AREC-QREC -._^1_%JMP*_!CPAWON_"NO TIE. AREC-QREC +._^1CMPWD3 JMP*_!CPQWON_'QREC WINS._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(A) = FWA OF AREA TO ZERO._^1*_:(Q) = NO. OF WORDS TO ZERO._^1*_:RTJ CLR_"ZERO AREA FROM RIGHT TO LEFT._^1*_:(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1CLR_"NUM_"0_^1_%€€STA*_!CLRA_)SAVE (A)ENTRY AND SET FWA FOR ZEROING._^1_%STQ*_!CLRQ_)SAVE (Q)ENTRY._^1_%CLR_"A_^1CLRINQ INQ_"-1_+(Q) = RELATIVE LWA OF AREA NOT YET ZEROED._^1_%SQP_"CLRSTA_'SKIP IF NOT YET DONE._^1_%LDA*_!CLRA_)RESTORE (A)ENTRY._^1_%LDQ*_!CLRQ_)RESTORE (Q)ENTRY._^1_%JMP*_!(CLR)_(EXIT._^1CLRSTA STA+_!0,Q_*ZERO A WORD._^1CLRA_!EQU_"CLRA(*-1)_^1_%JMP*_!CLRINQ_'SEE IF WE ARE DONE YET._^1€€CLRQ_!NUM_"0_,() = (Q)ENTRY._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(Q)ENTRY = -1 + FWA OF 2 WORD COUNTER._^1*_:RTJ BIGCNT_^1*_:(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1* BIGCNT COUNTS UP TO 9999 IN THE 2ND WORD._^1* WHEN THE 2ND WORD REACHES 10000, IT IS ZEROED,_^1* AND 1 IS ADDED TO THE 1ST WORD._^1BIGCNT NUM_"0_^1_%STA*_!BIGCTA_'SAVE (A)ENTRY._^1_%RAO-_!2,Q_*INCREMENT 2ND WORD OF€€ COUNT._^1_%LDA-_!2,Q_*(A) = TENTATIVE (2ND WORD OF COUNT)._^1_%SUB_"=N10000_%(A).GE.0 IF OVERFLOW OF 2ND WORD OF COUNT._^1_%SAM_"BIGCTX_'SKIP IF NO OVERFLOW._^1_%STA-_!2,Q_*ZERO 2ND WORD OF COUNT._^1_%RAO-_!1,Q_*INCREMENT 1ST WORD OF COUNT._^1BIGCTX LDA*_!BIGCTA_'RESTORE (A)ENTRY._^1_%JMP*_!(BIGCNT)_$EXIT._^1BIGCTA NUM_"0_,() = (A)ENTRY._^1_%EJT_]_^1* 2-WORD-AUGEND + 2-WORD-ADDEND€€ = 2-WORD-SUM._^1*...,$270F270F,...,$00010000,$0000270F,...,$00000000,$FFFE270F,..._^1* = ...99999999,...,10000,9999,...,0,-1,... RESPECTIVELY._^1* THE CALLING SEQUENCE IS_!(Q)ENTRY = -1 + FWA OF 2-WORD-AUGEND._^1* (A)ENTRY=0 MEANS 2-WORD-ADDEND IS (YBIGQ),(YBIGA), ELSE_^1*_:(A)ENTRY = FWA OF 2-WORD-ADDEND._^1*_:RTJ BIGADD_^1*_:(Q)EXIT = (YBIGQ)EXIT = 1ST HALF OF SUM._^1*_:(A)EXIT €€= (YBIGA)EXIT = 2ND HALF OF SUM._^1BIGADD NUM_"0_^1_%SAN_"BGADSA_'SKIP IF (A) = FWA OF 2-WORD-ADDEND._^1BGADLA LDA_"=XYBIGQ-HERE USE (YBIGQ),(YBIGA) AS A-OPERAND._^1BGADSA STA*_!BIGFWA_'() = FWA OF 1ST HALF OF ADDEND._^1_%LDA-_!1,Q_*(A) = 1ST HALF OF AUGEND._^1_%ADD*_!(BIGFWA)_$(A) = SUM OF 1ST HALVES OF AUGEND AND ADDEND_^1_%STA_"YBIGQ_(SAVE TENTATIVE 1ST HALF OF SUM._^1_%RAO*_!B€€IGFWA_'() = FWA OF 2ND HALF OF ADDEND._^1_%LDA-_!2,Q_*(A) = 1ST HALF OF AUGEND._^1_%ADD*_!(BIGFWA)_$(A) = SUM OF 2ND HALVES OF AUGEND AND ADDEND_^1* NOW TO CHECK FOR AND HANDLE CARRY FROM 2ND HALF TO 1ST HALF._^1_%SUB*_!D10000_'(A)15=0 IF THERE IS A CARRY._^1_%SAP_"BGADDC_'SKIP IF THERE IS A CARRY._^1_%ADD*_!D10000_'UNDO THE ABOVE SUBTRACT IN CHECK FOR CARRY._^1BGADDX STA_"YBIGA_((€€A) = 2ND HALF OF SUM._^1_%LDQ_"YBIGQ_((Q) = 1ST HALF OF SUM._^1_%JMP*_!(BIGADD)_$EXIT._^1BGADDC RAO_"YBIGQ_(ADD THE CARRY TO 1ST HALF OF SUM._^1_%JMP*_!BGADDX_'PREPARE TO EXIT._^1BIGFWA NUM_"0_,()EXIT = 1 + FWA OF 2ND OPERAND._^1D10000 NUM_"10000_^1_%EJT_]_^1* 2-WORD-MINUEND - 2-WORD-SUBTRAHEND = 2-WORD-DIFFERENCE._^1*...,$270F270F,...,$00010000,$0000270F,...,$00000000,$FFFE270F,..€€._^1* = ...99999999,...,10000,9999,...,0,-1,... RESPECTIVELY._^1* THE CALLING SEQUENCE IS_!(Q)ENTRY = -1 + FWA OF 2-WORD-MINUEND._^1*_:(A)ENTRY = FWA OF 2-WORD-SUBTRAHEND._^1*_:RTJ BIGSUB_^1*_:(Q)EXIT = (YBIGQ)EXIT = 1ST HALF OF DIFF._^1*_:(A)EXIT = (YBIGA)EXIT = 2ND HALF OF DIFF._^1BIGSUB NUM_"0_^1_%STA*_!BIGFWA_'(A) = FWA OF 1ST HALF OF SUBTRAHEND._^1_%LDA-_!1,Q_*(A) = 1ST HALF O€€F MINUEND._^1_%SUB*_!(BIGFWA)_$(A) = DIFF OF 1ST HALVES OF MINUEND AND SUB._^1_%INA_"-1_+A]PRIORI BORROW OF 10000 JUST IN CASE._^1_%STA_"YBIGQ_((A) = DIFF OF 1ST HALVES - 10000._^1_%RAO*_!BIGFWA_'() = FWA OF 2ND HALF OF SUBTRAHEND._^1_%LDA-_!2,Q_*(A) = 2ND HALF OF MINUEND._^1_%SUB*_!(BIGFWA)_$(A) = DIFF OF 2ND HALVES OF MINUEND AND SUB._^1_%SAM_"BGSUBB_'SKIP IF A]PRIORI BORROW IS N€€EEDED._^1_%RAO_"YBIGQ_(UNDO A]PRIORI BORROW._^1BGSUBX STA_"YBIGA_((A) = 2ND HALF OF DIFFERENCE._^1_%LDQ_"YBIGQ_((Q) = 1ST HALF OF DIFFERENCE._^1_%JMP*_!(BIGSUB)_$EXIT._^1BGSUBB ADD*_!D10000_'ADD THE A]PRIORI BORROW OF 10000._^1_%JMP*_!BGSUBX_'PREPARE TO EXIT._^1_%EJT_]_^1* TYRCT SHOULD BE CALLED AT THE END OF EACH FILE HANDLED BY GETU OR CLSU_^1* TYRCT COMPUTES AND PUBLISHES THE NU€€MBER OF RECORDS PASSED AND INCLUDED_^1* TYRCT ADDS THE INCLUDED COUNT TO THE 2-WORD ACCUMULATOR_^1* WHOSE FWA = (P+1)._^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_:P_!RTJ TYRCT_^1*_:P+1 -1 + FWA OF 2-WORD INCLUDED-ACCUMULATOR._^1*_:P+2 EXIT._^1*_:(YBIGQ),(YBIGA) EXIT_^1*_>= NEW (INCLUDED-ACCUMULATOR)._^1*_:(I)EXIT = (I)ENTRY._^1_%ADC_"MNDPAS-MSGPAS_^1MSGPAS ALF_"€€/,PASSED/_^1MNDPAS EQU_"MNDPAS(*)_^1_%ADC_"MNDDUN-MSGDUN_^1MSGDUN ALF_"/,DONE/_^1MNDDUN EQU_"MNDDUN(*)_^1TYRCT0 ADC_"YBIGQ-HERE_"() = FWA OF YBIGQ._^1TYRCT1 ADC_"BTDEC-HERE_"() = FWA OF BTDEC._^1TYRCT NUM_"0_^1_%RTJ_"LUFNO_(IDENTIFY THE FILE._^1_%LDQ-_!RECNT,I_%(Q) = UPPER HALF OF RECNT._^1_%LDA-_!RECNT+1,I_#(A) = LOWER HALF OF RECNT._^1_%RTJ*_!TYRCTY_'SET AND PUBLISH (YBIGQ),(YBI€€GA)._^1TYRCT2 ADC_"MSGPAS-HERE_!() = FWA OF PREFIX._^1_%LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%ALS_"2_,(A)15=1 IF SKIPCT IS SELECTED._^1_%SAP_"TYRCTX_'EXIT IF SKIPCT IS NOT SELECTED._^1_%LDQ_"=XRECNT-1,I_!TELL MINUEND TO BIGSUB._^1_%LDA_"=XSKIPCT,I_"TELL SUBTRAHEND TO BIGSUB._^1_%RTJ*_!BIGSUB_'(Q),(A) = RECNT - SKIPCT._^1_%SQP_"TYRCT3_'USE (Q),(A) AS INCLUD€€ED COUNT IF POSITIVE._^1_%CLR_"Q,A_*INCLUDED COUNT CAN NOT BE .LT. 0._^1TYRCT3 RTJ*_!TYRCTY_'SET AND PUBLISH (YBIGQ),(YBIGA)._^1TYRCT4 ADC_"MSGDUN-HERE_!() = FWA OF PREFIX._^1TYRCTX CLR_"A_,SELECT YBIGQ,YBIGA AS TWO-WORD ADDEND._^1_%LDQ*_!(TYRCT)_%(Q) = -1 + FWA OF TWO-WORD AUGEND._^1_%RTJ*_!BIGADD_'ACCUMULATE INCLUDED COUNTS._^1_%LDQ*_!(TYRCT)_%(Q) = -1 + FWA OF ACCUMULATOR._^1_%S€€TA-_!2,Q_*SET 2ND WORD OF ACCUMULATOR._^1_%LDA*_!(TYRCT0)_$(A) = UPPER HALF OF ACCUMULATED-INCLUDED CNT_^1_%STA-_!1,Q_*SET 1ST WORD OF ACCUMULATOR._^1_%RAO*_!TYRCT_(SET UP P+2 EXIT._^1_%JMP*_!(TYRCT)_%EXIT._^1_%EJT_]_^1* TYRCTY SETS (YBIGQ),(YBIGA) EXIT = (Q),(A) ENTRY, AND PUBLISHES_^1* (Q),(A) ENTRY VIA BTDEC AS THE 4-WORD SUFFIX OF THE PREFIX_^1* WHOSE FWA = (P+1)._^1* THE CALLI€€NG SEQUENCE IS_!(Q),(A) ENTRY EACH ARE .GE. 0 AND .LE. 9999._^1*_:P_!RTJ TYRCTY_^1*_:P+1 FWA OF PREFIX._^1*_:P+2 RETURN._^1TYRCTY NUM_"0_^1_%STQ*_!(TYRCT0)_$SET (YBIGQ) = (Q)ENTRY._^1_%LDQ*_!TYRCT0_'(Q) = FWA OF YBIGQ._^1_%STA-_!1,Q_*SET (YBIGA) = (A)ENTRY._^1_%TRQ_"A_,TELL BTDEC TO CONVERT (YBIGQ),(YBIGA)._^1_%LDQ*_!(TYRCTY)_$(Q) = FWA OF PREFIX._^1_%RTJ*_!(TYRCT1)_$CALL BTDEC._^1€€_%RAO*_!TYRCTY_'SET UP P+2 EXIT._^1_%JMP*_!(TYRCTY)_$TAKE P+2 EXIT._^1_%EJT_]_^1* GORQT TYPES ]TYPE GO/QT/BY], WHICH REPEATS FOR AN INVALID REPLY._^1* THE ABOVE MESSAGE IS OPTIONALLY PRECEDED BY A CALLER-DESIGNATED_^1* MESSAGE, MADE UP OF A PREFIX WITH FWA = (Q)ENTRY AND A SUFFIX, HEX OR_^1* BCD, OBTAINED BY CONVERTING (A)ENTRY._^1* (Q)ENTRY=-0 IMPLIES NO PREFIX. (A)ENTRY=-0 IMPLIE€€S NO SUFFIX._^1* (P+1)ENTRY=0 MEANS BYPASS OF OPERATOR IS SET FOR THIS CALL._^1* THE CALLING SEQUENCE IS_!P_!RTJ GORQT_^1*_:P+1 REPLY IS ]QT]._^1*_:P+2 BYPASS WAS SET, OR REPLY IS ]GO] OR ]BY]_^1* IF REPLY = ]BY], THEN (P+1) IS SET = 0, I.E. BYPASS IS SET._^1GORQT NUM_"0_^1_%RTJ_"HADOUT_'OUTPUT OPTIONAL MESSAGE DEPENDING ON PARAMS._^1_%LDA*_!(GORQT)_%(A)=0 IF BYPASS IS SET IN CALL€€._^1_%SAZ_"GORQT2_'SKIP IF BYPASS IS SET IN CALL._^1GORQT1 LDQ*_!GORQTM_'ASK OP TO TYPE ]GO] OR ]QT]._^1_%RTJ_"ACCEPT_"REQUEST REPLY AND ACCEPT IT._^1_%EOR*_!GORQTQ_'(A) = 0 IF WE SHOULD QUIT._^1_%SAZ_"GORQT3_"SKIP TO TAKE P+1 (I.E. QUIT) EXIT._^1_%EOR*_!GORQTG_'(A)=0 IF ]GO]._^1_%SAZ_"GORQT2_"SKIP TO TAKE P+2(I.E. GO) EXIT._^1_%EOR*_!GORQTB_'(A)=0 IF ]BY]._^1_%SAZ_"GORQT4_'SKIP TO€€ SET BYPASS IN CALL._^1_%JMP*_!GORQT1_"INVALID REPLY. ASK AGAIN._^1GORQT4 STA*_!(GORQT)_%SET BYPASS IN CALL._^1GORQT2 RAO*_!GORQT_#SET UP P+2 EXIT._^1GORQT3 JMP*_!(GORQT)_!EXIT._^1GORQTM ADC_"MSGGOQ-HERE_!() = FWA OF MESSAGE._^1GORQTQ ALF_"/,QT/_^1GORQTG NUM_"$161B_($161B = ]QT] .EOR. ]GO]_^1GORQTB NUM_"$0516_($0516 = ]BY] .EOR. GORQTQ .EOR. GORQTG._^1_%ADC_"MNDGOQ-MSGGOQ_^1MSGGOQ €€ALF_"$,TYPE GO/QT/BY$_^1MNDGOQ EQU_"MNDGOQ(*)_^1_%EJT_]_^1* GETU08 ET AL ASSUMES THAT (RECNT) = NO. OF LAST FULL-LENGTH RECORD_^1* DEBLOCKED, THAT (SKIPCT) = NO. OF LAST RECORD TO BE SKIPPED, AND THAT_^1* (DOCNT) = NO. OF LAST RECORD TO BE DEBLOCKED,_^1* WHERE 1 DENOTES THE 1ST RECORD IN EACH OF THE THREE ABOVE CASES._^1* UNLESS IT IS SKIPPED, A DEBLOCKED RECORD WILL BE PASSED_^1* €€TO THE CALLER OF GETU._^1* PRESUMABLY, THE EDIT PHASE SETS UP SKIPCT AND DOCNT PROPERLY._^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_:P_!RTJ GETU_^1*_:P+1 EOF OR ERROR EXIT._^1*_:P+2 NORMAL EXIT. (A)EXIT = FWA OF RECORD._^1*_K(Q)EXIT = NO. WORDS IN REC._^1*_:(I)EXIT = (I)ENTRY._^1GETU03 NUM_"0_(() = FWA OF RECORD._^1GETU14 NUM_"0_(() = LENGTH OF RECORD._^1GETU_!N€€UM_"0_^1GETU08 LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%ALS_"4_,(A)15=1 IF DOCNT SELECTED._^1_%SAP_"GETU00_'SKIP IF DOCNT NOT SELECTED._^1_%LDA-_!RECNT,I_%(A) = TOP HALF OF RECNT._^1_%SUB-_!DOCNT,I_%(A) = (RECNT,I) - (DOCNT,I)._^1_%SAM_"GETU00_'DEBLOCK IF RECNT .LT. DOCNT._^1* (RECNT,I) = (DOCNT,I) SINCE RECNT CAN]T EXCEED DOCNT._^1* TRY TO BREAK THE TIE VIA €€BOTTOM HALVES OF RECNT AND DOCNT._^1_%LDA-_!RECNT+1,I_#(A) = BOTTOM HALF OF RECNT._^1_%SUB-_!DOCNT+1,I_#(A) = (RECNT+1,I) - (DOCNT+1,I)._^1_%SAM_"GETU00_'DEBLOCK IF RECNT .LT. DOCNT._^1* END THE FILE._^1GETUEF RTJ*_!TYRCT_(PUBLISH AND PASS RECORD COUNTS._^1GETU06 ADC_"YIRCNT-1-HERE () = -1 + FWA OF ACCUMULATOR._^1_%JMP*_!(GETU)_'TAKE P+1(EOF OR ERROR) EXIT._^1GETU00 LDA-_!XFRLTH,I_€€$(A) = NO. OF WORDS TO BE DEBLOCKED._^1_%SUB-_!RECLTH,I_$ALLOW FOR CURRENT RECORD._^1_%STA-_!XFRLTH,I_$UPDATE NO. OF WORDS TO BE DEBLOCKED._^1_%SAP_"GETU01_"SKIP IF .GE. RECLTH TO BE DEBLOCKED._^1_%JMP*_!GETU04_'JMP IF .LT. RECLTH TO BE DEBLOCKED._^1GETU01 LDQ_"=XRECNT-1,I_!(Q) = -1 + FWA OF RECNT._^1_%RTJ_"BIGCNT_"COUNT EACH RECORD._^1_%LDQ-_!RECLTH,I_$(Q) = RECORD LENGTH IN WORDS€€._^1_%LDA-_!RECFWA,I (A) = FWA OF CURRENT RECORD._^1_%STA*_!GETU03_"SAVE FWA OF CURRENT RECORD._^1_%AAQ_"A_((A) = FWA OF NEXT RECORD._^1_%STA-_!RECFWA,I SAVE FWA OF NEXT RECORD._^1_%LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%ALS_"2_,(A)15=1 IF SKIPCT SELECTED._^1_%SAP_"GETU13_'INCLUDE RECORD IF SKIPCT NOT SELECTED._^1_%LDA-_!SKIPCT,I_$(A) = TOP HALF OF SKIPCT€€._^1_%SUB-_!RECNT,I_%(A) = (SKIPCT,I) - (RECNT,I)._^1_%SAM_"GETU13_'INCLUDE RECORD IF SKIPCT .LT. RECNT._^1_%SAN_"GETU09_'SKIP RECORD IF SKIPCT .GT. RECNT._^1* TRY TO BREAK TIE VIA BOTTOM HALVES OF SKIPCT AND RECNT._^1_%LDA-_!SKIPCT+1,I_"(A) = BOTTOM HALF OF SKIPCT._^1_%SUB-_!RECNT+1,I_#(A) = (SKIPCT+1,I) - (RECNT+1,I)._^1_%SAM_"GETU13_'INCLUDE RECORD IF SKIPCT .LT. RECNT._^1GETU09€€ JMP*_!GETU08_'SKIP THE RECORD._^1GETU13 LDA*_!GETU03_"(A) = FWA OF CURRENT RECORD._^1_%RAO*_!GETU_$SET UP P+2 EXIT._^1_%JMP*_!(GETU)_"P+2 EXIT._^1GETU04 LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%ENQ_"0_^1_%LLS_"2_,(Q) = 0/1/2/3 FOR D/W/T/P._^1_%LDQ*_!GETU05,Q (Q) = FWA OF CORRECT READ ROUTINE._^1_%RTJ+_!0,Q_%READ NEXT BLOCK._^1_%JMP*_!GETUEF_'END THE FILE IF€€ EOF OR ERROR._^1_%CLR_"Q_,PREPARE TO DIVIDE._^1_%LDA-_!XFRLTH,I_$(Q,A) = NUMERATOR._^1_%DVI-_!RECLTH,I_$(Q) = REMAINDER. (A) = QUOTIENT._^1_%SQN_"GETU02_'SKIP IF NON-INTEGER BLOCKING FACTOR._^1_%SAZ_"GETU02_'SKIP IF ZERO BLOCKING FACTOR._^1_%JMP*_!GETU07_'JMP IF BLOCKING FACTOR = 1,2,3.._^1GETU02 LDQ_"=XMSGBDR-HERE (Q) = FWA OF PREFIX._^1_%SET_"A_,DELETE SUFFIX._^1_%RTJ_"BADBLK_'D€€ISPLAY ERROR AND BLOCK, AND ACCEPT OPTION._^1_%JMP*_!GETUEF_'END THE FILE IF ]QT]._^1_%JMP*_!GETU04_'READ NEXT BLOCK IF ]GO] OR ]BY]._^1_%ADC_"MNDBDR-MSGBDR_^1MSGBDR ALF_"$,BLKSIZ/RECLTH .NE. 1,2,3...$_^1MNDBDR EQU_"MNDBDR(*)_^1GETU07 LDA-_!BUFWA,I_%(A) = FWA OF 1ST RECORD IN BUFFER._^1_%STA-_!RECFWA,I_$MAKE GETU GET 1ST RECORD AFTER READ._^1_%JMP*_!GETU00_'GET THE 1ST RECORD OF TH€€E BLOCK._^1GETU05 ADC_"RDD-HERE_$FWA OF DISK READ ROUTINE._^1_%ADC_"RDD-HERE_$FWA OF DISK READ ROUTINE._^1_%ADC_"RDT-HERE_$FWA OF MAG. TAPE READ ROUTINE._^1_%ADC_"RDP-HERE_$FWA OF PAPER TAPE READ ROUTINE._^1_%EJT_]_^1* BADBLK TYPES AN ERROR MESSAGE, DUMPS THE DATA PORTION OF A BUFFER,_^1* AND PROVIDES GO(P+2 EXIT)/QT(P+1 EXIT) OPTIONS TO THE OPERATOR._^1* THE CALLING SEQUENCE IS_!(€€A)ENTRY = BINARY TO CONVERT TO SUFFIX._^1*_8(Q)ENTRY = FWA OF PREFIX._^1*_:(I)ENTRY = FWA OF THE FILE TABLE._^1*_:P_!RTJ BADBLK_^1*_:P+1 REPLY IS ]QT]._^1*_:P+2 BYPASS WAS SET, OR REPLY IS ]GO] OR ]BY]_^1BADBLK NUM_"0_^1_%RTJ_"HADOUT_'TYPE THE ERROR MESSAGE._^1_%RTJ_"LUFNO_(PUBLISH LUN AND THEN FILNUM._^1_%LDA-_!BUFWA,I_%(A) = FWA OF BUFFER DATA._^1_%LDQ-_!BUFLTH,I_$(Q) = SIZE OF D€€ATA AREA OF BUFFER._^1_%RTJ_"HEXDMP_'DUMP THE DATA AREA._^1_%SET_"A,Q_*DISABLE GORQT OPTIONAL MESSAGE._^1_%RTJ_"GORQT_(ASK OPERATOR WHAT TO DO._^1_%JMP*_!(BADBLK)_$TAKE P+1(]QT]) EXIT._^1_%RAO*_!BADBLK_'SET UP P+2 EXIT._^1_%JMP*_!(BADBLK)_$TAKE P+2(]GO] OR ]BY]) EXIT._^1_%EJT_]_^1* LUFNO ANNOUNCES THE LUN AND THE FILNUM OF A FILE MANAGER FILE._^1* THE CALLING SEQUENCE IS_!(I)ENTRY €€= FWA OF THE FILE TABLE._^1*_:RTJ LUFNO_^1*_:(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1LUFNO NUM_"0_^1_%STA*_!LUFNOA_'SAVE (A)ENTRY._^1_%STQ*_!LUFNOQ_'SAVE (Q)ENTRY._^1_%LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%AND-_!HX03FF_'(A) = LUN = VALUE OF SUFFIX._^1LUFNO1 LDQ_"=XMSGLUN-HERE (Q) = FWA OF PREFIX._^1_%RTJ_"TPDEC_(ANNOUNCE THE LUN._^1_%LDA-_!FILNUM,I_$(A) =€€ FILNUM = VALUE OF SUFFIX._^1LUFNO2 LDQ_"=XMSGFNO-HERE (Q) = FWA OF SUFFIX._^1_%RTJ_"TPDEC_(ANNOUNCE THE FILNUM._^1_%LDA*_!LUFNOA_'RESTORE (A)ENTRY._^1_%LDQ*_!LUFNOQ_'RESTORE (Q)ENTRY._^1_%JMP*_!(LUFNO)_%EXIT._^1LUFNOA NUM_"0_,() = (A)ENTRY._^1LUFNOQ NUM_"0_,() = (Q)ENTRY._^1_%ADC_"MNDLUN-MSGLUN_^1MSGLUN ALF_"/,LUN/_^1MNDLUN EQU_"MNDLUN(*)_^1_%ADC_"MNDFNO-MSGFNO_^1MSGFNO ALF_"/,FIL€€NUM/_^1MNDFNO EQU_"MNDFNO(*)_^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(A)ENTRY = FWA OF LOGICAL RECORD TO BE PUT._^1*_:(I)ENTRY = FWA OF FILE TABLE._^1*_:RTJ PUTU_^1*_:(I)EXIT = FWA OF FILE TABLE._^1* PUTU CALLS WRTD OR WRTT IF THE LOGICAL RECORD WON]T FIT IN THE BUFFER._^1PUTUA NUM_"0_(() = FWA OF MOVE SOURCE._^1PUTU_!NUM_"0_^1PUTUCK STA_"MVSRCE_"TELL MOVE WHERE TO GET LOGICAL RECO€€RD._^1_%LDA-_!RECFWA,I (A) = FWA OF AVAILABLE BUFFER SPACE._^1_%STA_"MVDEST_"TELL MOVE WHERE TO SEND LOGICAL RECORD._^1_%STA_"YLAPUT_'SAVE DESTINATION OF LAST RECORD PUT._^1_%LDQ-_!RECLTH,I (Q) = RECORD LENGTH._^1_%AAQ_"A_((A) = FWA DESTINATION OF NEXT RECORD._^1_%STA-_!RECFWA,I REMEMBER DESTINATION FOR NEXT TIME._^1_%SUB-_!BUFWA,I_!(A) = NO. WORDS ALREADY IN BUFFER._^1_%SUB-_!B€€UFLTH,I SUBTRACT MAX. BLOCK LENGTH._^1_%SAM_"PUTUMV_"SKIP IF RECORD FITS._^1_%SAZ_"PUTUMV_"SKIP IF RECORD FITS._^1_%JMP*_!PUTUIO_"JMP IF RECORD DOESN]T FIT._^1PUTUMV ADD-_!BUFLTH,I_$(A) = BLOCK LENGTH AFTER THE BELOW MOVE._^1_%STA-_!XFRLTH,I_$REMEMBER BLOCK LENGTH._^1_%RTJ_"MOVE_#MOVE RECORD TO BUFFER TO ACCOMPLISH XFRLTH VALUE._^1_%LDQ_"=XRECNT-1,I_!(Q) = -1 + FWA OF RECNT._^1_%R€€TJ_"BIGCNT_'COUNT EACH RECORD._^1_%JMP*_!(PUTU)_'EXIT._^1PUTUIO LDA_"MVSRCE_"(A) = FWA OF MOVE SOURCE._^1_%STA*_!PUTUA_#SAVE MOVE SOURCE._^1_%LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%ENQ_"0_^1_%LLS_"2_,(Q) = 0/1/2/3 FOR D/W/T/P._^1_%LDQ*_!PUTUWT,Q (Q) = FWA OF CORRECT WRITE ROUTINE._^1_%RTJ+_!0,Q_%WRITE CURRENT BLOCK._^1_%LDA-_!BUFWA,I_!(A) = FWA OF BUFFER._€€^1_%STA-_!RECFWA,I SET RECORD DESTINATION._^1_%LDA*_!PUTUA_#(A) = FWA OF MOVE SOURCE._^1_%JMP*_!PUTUCK_"CHECK AGAIN WHETHER RECORD FITS._^1PUTUWT ADC_"WRTD-HERE_#FWA OF DISK WRITE ROUTINE._^1_%ADC_"WRTD-HERE_#FWA OF DISK WRITE ROUTINE._^1_%ADC_"WRTT-HERE_#FWA OF MAG. TAPE WRITE ROUTINE._^1_%ADC_"WRTP-HERE_#FWA OF PAPER TAPE WRITE ROUTINE._^1_%EJT_]_^1* CLSU WRITES A PARTIALLY FILL€€ED OUTPUT BUFFER._^1* THE CALLING SEQUENCE IS_!(I) = FWA OF FILE TABLE._^1*_:RTJ CLSU_^1*_:(I)EXIT = (I)ENTRY._^1CLSU_!NUM_"0_^1_%LDA-_!XFRLTH,I_$(A) = NO. OF WORDS TO WRITE FROM BUFFER._^1_%SAZ_"CLSUXT_'EXIT IF BUFFER IS EMPTY._^1_%LDA-_!(LUN),I_%(A)15-14 = 0/1/2/3 FOR D/W/T/P._^1_%CLR_"Q_^1_%LLS_"2_,(Q) = 0/1/2/3 FOR D/W/T/P._^1_%LDQ*_!PUTUWT,Q_$(Q) = FWA OF CORRECT WRITE ROUTINE€€._^1_%RTJ+_!0,Q_*WRITE A PARTIALLY FILLED BLOCK._^1_%RTJ_"TYRCT_(PUBLISH RECORD COUNT._^1CLSU01 ADC_"YORCNT-1-HERE () = -1 + FWA OF ACCUMULATOR._^1CLSUXT JMP*_!(CLSU)_'EXIT._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_:RTJ REL_"RELEASE THE FILE._^1*_:(I)EXIT = (I)ENTRY._^1REL_"NUM_"0_^1_%RTJ_"SAVAQI_'SAVE (A),(Q),(I) ENTRY._^1RELA_!NUM_"0,0,0_(() = (A),€€(Q),(I) ENTRY._^1* SEE IF THERE IS A FILNUM TO RELEASE._^1_%LDA-_!FILNUM,I_$(A) = THE FILNUM._^1_%SAN_"RELNZF_'SKIP IF NONZERO FILNUM._^1_%JMP*_!RELXIT_'BYPASS RELFIL IF ZERO FILNUM._^1* THERE IS A FILNUM TO RELEASE._^1RELNZF LDA_"=XFILNUM,I_"(A) = FWA OF FILNUM._^1_%STA*_!REL01_(TELL FWA OF FILNUM TO RELFIL._^1_%LDA_"=XREQBUF,I_"(A) = FWA OF REQBUF._^1_%STA*_!REL02_(TELL FWA OF RE€€QBUF TO RELFIL._^1_%LDA_"=XREQIND,I_"(A) = FWA OF REQIND._^1_%STA*_!REL03_(TELL FWA OF REQIND TO RELFIL._^1RELRQ RTJ RELFIL_'RELEASE THE FILE._^1REL01 NUM_"0_,FILNUM._^1REL02 NUM_"0_,REQBUF._^1REL03 NUM_"0_,REQIND._^1_%LDA*_!(REL03)_%(A) = REQIND._^1_%SAN REL05_(SKIP IF ERROR ON RELFIL._^1_%JMP* RELDUL_'JMP IF NO ERROR ON RELFIL._^1REL05 EQU REL05(*)_^1_%LDQ_"=N$7F7F_%$7F7F€€ = 0111 1111 0111 1111._^1_%LAQ_"Q_,ISOLATE BITS 14-8 AND 6-0 OF REQIND._^1_%SQZ_"RELERR_'SKIP IF NONE OF THOSE BITS ARE SET._^1_%RTJ WIERD_(ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM 1_,ANNOUNCE ERROR NO.1 AND CONTINUE._^1RELERR LDQ_"=XMSGREL-HERE_"(Q) = FWA OF ERROR MESSAGE._^1_%RTJ HADOUT_'ANNOUNCE RELFIL REQIND._^1_%RTJ LUFNO_)ANNOUNCE LUN AND FILNUM._^1_%SET A,Q_*DESELE€€CT OPTINAL GORQT MESSAGE._^1_%RTJ_"GORQT_(ASK OPERATOR WHAT TO DO._^1_%JMP* RELRQ_(RETRY RELFIL SINCE 'QT' WAS REPLY._^1_%JMP* RELXIT_'DON'T CAL DULU SINCE NO SPACE WAS RELEASED._^1RELDUL RTJ DULU_)UP THE LUN IN YFMLUN._^1_%NUM_"0_,TELL DULU TO UP THE LUN, NOT DOWN IT._^1RELXIT RTJ RESAQI_'RESTORE (A),(Q),(I) ENTRY._^1REL04 ADC_"RELA-HERE_#() = FWA OF (A),(Q),(I) SAVE AREA._^1_%€€JMP*_!(REL)_(EXIT._^1*_72 CARDS DELETED._^1_%ADC_"MNDREL-MSGREL_^1MSGREL ALF_"/,RELFIL REQIND /_^1MNDREL EQU_"MNDREL(*)_^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF SEQ.(NOT DIR.) FILE TABLE._^1*_:RTJ GETSEQ_^1*_:(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1* THE LUN AND FILNUM OF THE 1ST SEGMENT OF THE SEQ. ARE SET INTO_^1* THE FILE TABLE FOR THE SEQ._^1* THE RUN IS STOPPED€€ IF AN ERROR OCCURS IN USE OF THE SEQ. DIRECTORY._^1GTSQCT NUM_"0_,()ENTRY = NO. OF LAST SEQ. GOTTEN._^1GETSEQ NUM_"0_^1_%RTJ_"SAVAQI_%SAVE (A)ENTRY,(Q)ENTRY,(I)ENTRY._^1GTSQA NUM_"0,0,0_^1_%RAO*_!GTSQCT_%MAINTAIN SEQ. CT. IN CORE TO CK. SEQ. DIR._^1GTSQ01 LDA_"=XGTSQFT-HERE (A) = FWA SEQ. DIR. FILE TABLE._^1_%STA-_!I_+TELL RDD THE FWA OF SEQ. DIR. FILE TABLE._^1* IT IS ESSENTIAL €€THAT GETSEQ KNOW WHETHER THE SEQ. DIR. IS_^1* SEGMENTED IN ORDER TO HANDLE EOF PROPERLY._^1* THE LUNS MAY DIFFER FOR GETSEQ AND PUTSEQ SINCE THE SEQ. DIR. MAY BE_^1* SEGMENTED, BUT ALL THAT GETSEQ NEEDS FROM PUTSEQ IS THE EXTENDED_^1* BIT, WHICH, IF SET, WAS SET DUE TO THE ACTIONS OF PUTSEQ,_^1* SO PUTSEQ KNOWS ABOUT THE EXTENDED BIT 1ST, AND PUTSEQ LEAVES THAT_^1* BIT SET ACROSS A€€LL SUBSEQUENT LUNS OF THE SEQ. DIR._^1_%LDA_"PTSQFT_'(A) = (LUN WORD FOR PUTSEQ)._^1_%LDQ-_!(LUN),I_%(Q) = (LUN WORD FOR GETSEQ)._^1_%LLS_"6_"(Q)15-6 = GETSEQ LUN. (Q)5-0 = (PUTSEQ LUN WD)15-10._^1_%QLS_"10_!(Q)15-10 = (PUTSEQ LUN WD)15-10. (Q)9-0 = GETSEQ LUN._^1_%STQ-_!(LUN),I_%UPDATE EXTENDED BIT OF GETSEQ._^1_%RTJ_"RDD_)GET NEXT SEQ. DIR. ENTRY._^1_%JMP*_!GTSQER_%STOP RUN IF EO€€F._^1_%LDA*_!GTSQFT+ERRCNT (A)=0 IF NO RDD ERROR._^1_%SAN_"GTSQER_'STOP RUN IF ERROR ON SEQ. DIR._^1_%LDA*_!GTSQCT_%(A) = CORE SEQ. NO._^1_%EOR*_!GTSQBF_'COMPARE WITH SEQ. NO. IN SEQ. DIR._^1_%SAN_"GTSQER_%STOP RUN IF MISMATCH._^1_%LDQ*_!GTSQA+2_%(Q) = (I)ENTRY = FWA OF SEQ. FILE TABLE._^1_%LDA*_!GTSQBF+1_$(A) = LUN OF 1ST SEGMENT OF SEQUENCE._^1_%STA-_!(LUN),Q_%SET SEQ. LUN INTO S€€EQ. FILE TABLE._^1_%LDA*_!GTSQBF+2_$(A) = FILNUM OF 1ST SEGMENT OF SEQUENCE._^1_%STA-_!FILNUM,Q_$SET SEQ. FILNUM INTO SEQ. FILE TABLE._^1_%RTJ_"RESAQI_'RESTORE (A),(Q),(I) ENTRY._^1GTSQ02 ADC_"GTSQA-HERE_^1_%JMP*_!(GETSEQ)_#EXIT._^1GTSQER LDQ_"=XMSGSDE-HERE (Q) = FWA OF ERROR MESSAGE._^1_%SET_"A_,DISABLE SUFFIX._^1_%JMP_"BOMB_(STOP THE RUN._^1GTSQFT NUM_"$4000_(() = D/W/T/P,SKIPCT,€€A/B,DOCNT,EXTENDED,LUN._^1_%NUM_"0_+FILNUM._^1_%NUM_"0_,USUALLY RECLTH. HERE UNUSED._^1_%ADC_"3_,LENGTH OF SEQ. DIR. ENTRY MINUS LENGTH WORD._^1* AN ENTRY IN THE SEQUENCE DIRECTORY HAS THE FOLLOWING FORMAT_^1* LEN.WD. / SEQ.NO. / SEQ. LUN / SEQ. FILNUM_^1_%NUM_"0_+USUALLY SKIPCT. HERE IT]S FMR LEN. WD._^1GTSQBF NUM_"0_+USUALLY SKIPCT+1. HERE IT]S SEQ. NO._^1_%NUM_"0_,USUALLY DOCNT.€€ HERE IT]S SEQ. LUN._^1_%NUM_"0_,USUALLY DOCNT+1. HERE IT]S SEQ. FILNUM._^1GTSQ03 ADC_"GTSQBF-HERE_!BUFWA._^1_%NUM_"0_,USUALLY RECNT. HERE UNUSED._^1_%NUM_"0_,USUALLY RECNT+1. HERE UNUSED._^1_%NUM_"0_+ERRCNT._^1_%NUM_"0_+BLKCNT._^1_%NUM_"0_+RECFWA._^1_%NUM_"0_+XFRLTH._^1_%NUM_"0,0_*RECPTR._^1_%BZS_"(12)_(REQBUF._^1_%NUM_"0_+REQIND._^1_%ADC_"MNDSDE-MSGSDE_^1MSGSDE ALF_"/,SEQ. DIR. E€€RROR/_^1MNDSDE EQU_"MNDSDE(*)_^1_%EJT_]_^1* THE CALLING SEQUENCE IS (I)ENTRY = FWA OF OUTPUT-STRING FILE TABLE._^1*_9RTJ PUTSEQ_^1*_9(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1* THE RUN IS STOPPED IF AN ERROR OCCURS IN USE OF THE SEQ. DIRECTORY._^1PUTSEQ NUM_"0_^1_%RTJ_"SAVAQI_%SAVE (A)ENTRY,(Q)ENTRY,(I)ENTRY._^1PTSQA NUM_"0,0,0_^1_%RAO*_!PTSQBF_%UPDATE SEQ. NO. IN BUFFER._^1* BOS I€€NITIALLY SETS THE LUN WORD OF PTSQBF WITH EXTENDED BIT = 0._^1* PUTSEG UPDATES EXTENDED BIT OF LUN WORD OF FILE TABLE._^1* PUTSEQ MUST NOW UPDATE THE EXTENDED BIT OF PTSQBF VIA THE EXTENDED_^1* BIT OF THE FILE TABLE._^1_%LDA-_!(LUN),I_!(A)15-10 = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED._^1_%LDQ*_!PTSQBF+1_$(Q)9-0 = LUN._^1_%LLS_"6_,(Q) = LUN,D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED._^1_%QLS_"10€€_+(Q) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%STQ*_!PTSQBF+1_$UPDATE EXTENDED BIT OF PTSQBF PER FILE TABLE_^1PTSQ04 LDA_"=XPTSQFT-HERE (A) = FWA OF PTSQFT._^1_%STA-_!I_,TELL WRTD TO USE PTSQFT AS FILE TABLE._^1_%RTJ_"WRTD_(WRITE NEW ENTRY IN SEQ. DIR._^1_%LDA-_!ERRCNT,I_$(A)=0 IF NO ERRORS IN THE FILE._^1_%SAZ_"PTSQ03_'SKIP IF WRTD WAS CLEAN._^1_%JMP*_!GTSQER_%EXIT._^1PTSQ03 L€€DA_"GTSQFT+FILNUM (A) = CURRENT GETSEQ SEQ. DIR. FILNUM._^1_%SAN_"PTSQ05_'SKIP IF GETSEQ FILNUM IS SET._^1* TELL GETSEQ WHAT LUN AND WHAT FILNUM ARE 1ST FOR THE SEQ. DIRECTORY._^1_%LDA-_!(LUN),I_%(A) = LUN OF 1ST SEGMENT OF THE SEQ. DIR._^1_%STA_"GTSQFT_'TELL GETSEQ THE 1ST LUN._^1_%LDA-_!FILNUM,I_$(A) = FILNUM OF 1ST SEGMENT OF THE SEQ. DIR._^1_%STA_"GTSQFT+FILNUM TELL GETSEQ THE €€1ST FILNUM._^1PTSQ05 RTJ_"RESAQI_'RESTORE (A),(Q),(I) ENTRY._^1PTSQ01 ADC_"PTSQA-HERE_^1_%JMP*_!(PUTSEQ)_#EXIT._^1PTSQFT NUM_"$4000_(() = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%NUM_"0_+FILNUM._^1_%NUM_"0_,USUALLY RECLTH. HERE UNUSED._^1_%NUM_"0_,USUALLY BUFLTH. HERE UNUSED._^1* AN ENTRY IN THE SEQUENCE DIRECTORY HAS THE FOLLOWING FORMAT_^1* LEN.WD. / SEQ.NO. / SEQ. LUN / SEQ. F€€ILNUM_^1_%NUM_"0_+USUALLY SKIPCT. HERE IT]S FMR LEN. WD._^1PTSQBF NUM_"0_+USUALLY SKIPCT+1. HERE ()ENT = LAST SEQ.NO._^1* THE FOLLOWING 2 WORDS ARE INITIALLY SET BY BOS._^1* SEQ. LUN HAS EXTENDED BIT UPDATED BY PUTSEQ._^1_%NUM_"0_,USUALLY DOCNT. HERE IT]S SEQ. LUN._^1_%NUM_"0_,USUALLY DOCNT+1. HERE IT]S SEQ. FILNUM._^1PTSQ02 ADC_"PTSQBF-HERE_!BUFWA._^1_%NUM_"0_,USUALLY RECNT. HERE €€UNUSED._^1_%NUM_"0_,USUALLY RECNT+1. HERE UNUSED._^1_%NUM_"0_+ERRCNT._^1_%NUM_"0_+BLKCNT._^1_%NUM_"0_+RECFWA._^1_%NUM_"3_,XFRLTH._^1_%NUM_"0,0_*RECPTR._^1_%BZS_"(12)_(REQBUF._^1_%NUM_"0_+REQIND._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(I) = FWA OF OUTPUT STRING FILE TABLE._^1*_:RTJ BOS_^1*_:(I)EXIT = (I)ENTRY._^1*_:((LUN),I) AND (FILNUM,I) ARE SET AND THE_^1*_:CORRESPONDING FILE IS €€DEFINED, VIA DEFFIL._^1*_:(A)EXIT = ((LUN),I)EXIT._^1*_:(Q)EXIT = (FILNUM,I)EXIT._^1BOS_"NUM_"0_^1* 01=WORK FILE/0=SKIPCT/0=BINARY/0=DOCNT/0=EXTENDED/0=LUN, I.E. $4000._^1_%LDA-_!HX4000_^1_%STA-_!(LUN),I_%MAKE DEF FIND A LUN._^1_%CLR_"A_^1_%STA-_!FILNUM,I_$MAKE DEF FIND A FILNUM._^1_%RTJ_"DEF_*DEFINE FILNUM ON LUN._^1_%RTJ_"CLRFT_(RESET THE DYNAMIC WORDS OF THE FILE TABLE._^1_%LDA-€€_!(LUN),I_%(A) = (LUN WORD JUST SET BY DEF)._^1_%STA*_!PTSQBF+1_$TELL PUTSEQ WHAT LUN TO RECORD._^1_%LDQ-_!FILNUM,I_$(Q) = (FILNUM WORD JUST SET BY DEF)._^1_%STQ*_!PTSQBF+2_$TELL PUTSEQ WHAT FILNUM TO RECORD._^1_%JMP*_!(BOS)_(EXIT._^1*_]_^1* THE CALLING SEQUENCE IS_!(I) = FWA OF OUTPUT STRING FILE TABLE._^1*_:RTJ EOS_^1*_:(I)EXIT = (I)ENTRY._^1EOS_"NUM_"0_^1_%RTJ_"CLSU_)MAKE SURE T€€HAT THE LAST RECORDS ARE WRITTEN._^1_%RTJ*_!PUTSEQ_'TALLY THE COMPLETED SEQUENCE._^1_%JMP*_!(EOS)_(EXIT._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_:P_!RTJ RDD_^1*_:P+1 EOF OR ERROR RETURN._^1*_:P+2 NORMAL RETURN._^1*_:(I)EXIT = (I)ENTRY._^1RDDI_!NUM_"0_,() = (I)ENTRY = FWA OF FILE TABLE._^1RDDNIT NUM_"0_^1_%LDA-_!I_,(A) = (I)ENTRY = FWA OF FILE TABLE.€€_^1_%STA*_!RDDI_)SAVE (I)ENTRY._^1_%LDA_"=XFILNUM,I_"(A) = FWA OF FILNUM._^1_%STA*_!RDDFNO_'TELL FWA OF FILNUM TO RTVSEQ._^1_%LDA_"=XRECPTR,I_"(A) = FWA OF RECPTR._^1_%STA*_!RDDRPT_'TELL FWA OF RECPTR TO RTVSEQ._^1* FROM THE VIEWPOINT OF RTVSEQ, THE BLOCK OF LOGICAL RECORDS IS_^1* PART OF A FILE MANAGER RECORD, AND FOLLOWS A RECORD HEADER._^1_%LDA-_!BUFWA,I_%(A) = FWA OF BLOCK OF L€€OGICAL RECORDS._^1_%INA_"-1_+ALLOW FOR THE FILE-MANAGER-RECORD HEADER._^1_%STA*_!RDDBUF_'TELL FWA OF FILE-MGR-REC BUFFER TO RTVSEQ._^1_%LDA-_!BUFLTH,I_$(A) = SIZE OF BLOCK OF LOGICAL RECORDS._^1_%INA_"1_,ALLOW FOR THE FILE-MANAGER-RECORD HEADER._^1_%STA*_!RDDBLN_'() = LENGTH OF FILE-MANAGER-RECORD BUFFER._^1_%LDA_"=XREQBUF,I_"(A) = FWA OF REQBUF._^1_%STA*_!RDDRQB_'TELL FWA OF REQBU€€F TO RTVSEQ._^1_%LDA_"=XREQIND,I_"(A) = FWA OF REQIND._^1_%STA*_!RDDRQI_'TELL FWA OF REQIND TO RTVSEQ._^1_%JMP*_!(RDDNIT)_$EXIT._^1RDD_"NUM_"0_^1_%RTJ*_!RDDNIT_'INITIALIZE RTVSEQ._^1RDDREQ RTJ_"RTVSEQ_'GET THE NEXT FILE-MANAGER RECORD._^1RDDFNO NUM_"0_,FILNUM._^1_%NUM_"2_,FILCOM. (2)=0._^1RDDRPT NUM_"0_,RECPTR._^1RDDBUF NUM_"0_,RECBUF._^1RDD02 ADC_"RDDBLN-HERE_!RECLTH._^1RDDRQB NU€€M_"0_,REQBUF._^1RDDRQI NUM_"0_,REQIND._^1_%LDA*_!RDDI_)(A) = (I)ENTRY = FWA OF FILE TABLE._^1_%STA-_!I_,RESTORE (I)ENTRY._^1_%LDQ*_!(RDDRQI)_$(Q) = REQIND._^1_%SQN_"RDDCKI_'SKIP TO CHECK REQIND IF IT]S NONZERO._^1RDDP2 RAO-_!BLKCNT,I_$COUNT EACH GOOD BLOCK._^1_%LDA*_!(RDDBUF)_$(A) = LENGTH OF FILE MANAGER RECORD._^1_%INA_"-1_+(A) = LENGTH OF BLOCK OF LOGICAL RECORDS._^1_%STA-_!XFR€€LTH,I_$SAVE BLOCK LENGTH FOR DEBLOCKER._^1_%RAO*_!RDD_*SET UP P+2(NORMAL) EXIT._^1RDDP1 JMP*_!(RDD)_(EXIT._^1RDDCKI LDA*_!HX7F50_'TO MASK BITS 14-8,6,4._^1_%LAQ_"A_,(A) = (REQIND)14-8,6,4._^1_%SAN_"RDDHNG_'HANG IF ANY OF THOSE BITS ARE SET._^1_%LDA*_!HX8002_'TO MASK BITS 15,1._^1_%EAQ_"A_,(A)=0 IF ONLY BITS 15,1 ARE SET._^1_%SAZ_"RDDHNG_'HANG IF ONLY BITS 15,1 ARE SET._^1_%LDA*_!H€€X0085_'TO MASK BITS 7,2,0._^1_%LAQ_"A_,(A) = (REQIND)7,2,0._^1_%SAN_"RDDERR_'SKIP IF ANY OF THOSE BITS ARE SET._^1_%QLS_"15-5_)(Q)15 = (REQIND)5._^1_%SQM_"RDDRMV_'SKIP IF FILE-MGR-REC NONEXISTENT._^1_%QLS_"5-3_*(Q)15 = (REQIND)3._^1_%SQM_"RDDEOF_'SKIP IF EOF._^1_%QLS_"3-1_*(Q)15 = (REQIND)1._^1_%SQM_"RDDOK_(SKIP IF FILE LOCKED._^1* IF WE FALL INTO HANG, THEN ONLY BIT 15 OF REQIND W€€AS SET._^1RDDHNG RTJ WIERD_)ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM 2_^1_%JMP* RDDERR_'DISPLAY ERROR AND BLOCK, AND ACCEPT OPTION._^1RDDEOF RTJ*_!GETSEG_'CHECK WHETHER FILE HAS A NEXT SEGMENT._^1_%JMP*_!RDDP1_(TAKE P+1(EOF) EXIT IF NO NEXT SEGMENT._^1RDDRMV JMP* RDDREQ_'GET THE NEXT FILE MANAGER RECORD._^1RDDOK JMP*_!RDDP2_(TAKE NORMAL EXIT._^1RDDERR LDA*_!(RDDRQI)_$(A) = RE€€QIND._^1RDD01 LDQ_"=XMSGRDD-HERE (Q) = FWA OF ERROR MESSAGE._^1_%RAO- ERRCNT,I_$COUNT EACH ERROR._^1_%RTJ_"BADBLK_'DISPLAY ERROR AND BLOCK, AND ACCEPT OPTION._^1_%JMP*_!RDDP1_(TAKE EOF EXIT IF ]QT]._^1_%JMP*_!RDDREQ_'IF ]GO], GET THE NEXT FILE-MANAGER RECORD._^1RDDBLN NUM_"0_,() = LENGTH OF BUFFER FOR RTVSEQ._^1HX7F50 NUM_"$7F50_^1HX8002 NUM_"$8002_^1HX0085 NUM_"$0085_^1_%ADC_"MND€€RDD-MSGRDD_^1MSGRDD ALF_"/,RTVSEQ REQIND/_^1MNDRDD EQU_"MNDRDD(*)_^1_%EJT_]_^1* GETSEG TAKES A P+1 EXIT FOR USER FILES AND UNEXTENDED WORK FILES._^1* GETSEG RELEASES EXHAUSTED WORK FILES, EXTENDED OR UNEXTENDED._^1* FOR EXTENDED WORK FILES,_^1* GETSEG SEARCHES THE ENTIRE SEGMENT FILE, LOOKING FOR MENTION_^1* OF THE CURRENT FILNUM._^1* IF THE CURRENT FILNUM DOES NOT APPEAR IN THE SE€€GMENT LIST,_^1* THEN A P+1(EOF) EXIT IS TAKEN BY GETSEG._^1* OTHERWISE, THE LATEST MENTION OF THE CURRENT FILNUM IS FOUND_^1* AND THE EXTENSION FILNUM IS REMEMBERED._^1* IF THE EXTENSION FILNUM IS ZERO,_^1* THEN A P+1(EOF) EXIT IS TAKEN BY GETSEG._^1* IF THE EXTENSION FILNUM IS NONZERO, THEN IT AND THE EXTENSION LUN_^1* ARE SET INTO THE FI8E TABLE, WHICH, EXCEPT FOR LUN,...,BUFWA €€AND_^1* RECNT,RECFWA,XFRLTH, IS CLEARED, FOLLOWED BY A P+2 EXIT._^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_:P_!RTJ GETSEG_^1*_:P+1 NO EXTENSION, THEREFORE EOF._^1*_:P+2 YES EXTENSION._^1*_:(I)EXIT = (I)ENTRY._^1GTSEGI NUM_"0_,() = (I)ENTRY._^1GETSEG NUM_"0_^1_%LDQ-_!I_,() = (I)ENTRY._^1_%STQ*_!GTSEGI_'SAVE (I)ENTRY._^1_%LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,D€€OCNT,EXTENDED,LUN._^1_%ALS_"15-14_((A)15=1 IFF WORK FILE._^1_%SAP_"GTSGP1_'SKIP IF NOT WORK FILE._^1_%RTJ_"REL_*RELEASE EXHAUSTED WORK FILE._^1_%ALS_"14-10_((A)15 = EXTENDED BIT._^1_%SAM_"GTSEGX_'SKIP IF FILE HAS EXTENSION._^1GTSGP1 LDQ*_!GTSEGI_'(Q) = (I)ENTRY._^1_%STQ-_!I_,RESTORE (I)ENTRY._^1_%JMP*_!(GETSEG)_$TAKE P+1(EOF) EXIT IF NO EXTENSION._^1* THE EXHAUSTED FILE HAS EXTENSI€€ON. SEARCH THE SEGMENT LIST._^1GTSEGX LDA-_!FILNUM,I_$(A) = OLD (EXHAUSTED) FILNUM._^1_%STA*_!GTSGOF_'SAVE OLD FILNUM FOR USE AS SEARCH KEY._^1_%LDA*_!FWASGF_'(A) = FWA OF SEGMENT LIST FILE TABLE._^1_%STA-_!I_,SWITCH TO SEGMENT LIST FILE TABLE._^1_%RTJ_"CLRFT_(CLEAR THE FILE TABLE._^1_%STA*_!GTSEGF_'ZERO HOLD FOR LAST CORRESPONDING FILNUM._^1GTSEGR LDA*_!RDD_*(A) = FWA OF NSI OF OR€€IGINAL RDD CALLER._^1_%STA*_!GTSEG5_'SAVE RETURN TO ORIGINAL RDD CALLER._^1* TO AVOID RECURSION HERE, THE SEGMENT LIST CAN]T BE EXTENDED._^1_%RTJ*_!RDD_*GET NEXT ENTRY FROM SEGMENT LIST._^1_%CLR_"Q_,CLR (Q) IF EOF._^1_%ENQ_"1_,(Q)=1 IF NOT EOF._^1_%LDA*_!GTSEGI_'() = (I)ENTRY._^1_%STA-_!I_,SWITCH TO ENTRY FILE TABLE._^1_%RTJ_"RDDNIT_'RESTORE ENTRY RDD INITIALIZATION._^1_%LDA*_!GTSE€€G5_'(A) = FWA OF NSI OF ORIGINAL RDD CALLER._^1_%STA*_!RDD_*RESTORE RETURN TO ORIGINAL RDD CALLER._^1_%LDA*_!FWASGF_'(A) = FWA OF SEGMENT LIST FILE TABLE._^1_%STA-_!I_,SWITCH TO SEGMENT LIST FILE TABLE._^1_%LDA-_!ERRCNT,I_$(A) = IO ERROR COUNT FOR SEGMENT LIST._^1_%SAZ_"GTSEG1_'SKIP IF CLEAN._^1GTSEG4 LDQ_"=XMSGSGE-HERE (Q) = FWA OF ERROR MESSAGE._^1_%SET_"A_,DISABLE SUFFIX._^1_%JM€€P_"BOMB_)STOP THE RUN WITH ERROR MESSAGE._^1GTSEG5 NUM_"0_,() = (RDD ON ENTRY TO GETSEG)._^1GTSEG1 SQZ_"GTSEGE_'SKIP IF EOF ON SEGMENT LIST._^1* AN ENTRY IN THE SEGMENT LIST HAS THE FOLLOWING FORMAT._^1* LENGTH WORD / OLD LUN / OLD FILNUM / NEW LUN / NEW FILNUM,_^1* I.E. ((RDDBUF)),(1+(RDDBUF)),...,(4+(RDDBUF))._^1* DISCARD ANY EXTENDER ALREADY FOUND IF THE OLD FILNUM_^1* ITSELF IS€€ HERE USED AS AN EXTENDER._^1_%LDA*_!GTSGOF_'(A) = OLD FILNUM._^1_%EOR*_!SEGBUF+3_$(A)=0 IF OLD FILNUM = NEW FILNUM._^1_%SAN_"GTSEG6_'SKIP IF OLD FILNUM .NE. CURRENT EXTENDER._^1_%STA*_!GTSEGF_'DISCARD ANY EXTENDER ALREADY FOUND._^1GTSEG6 EQU_"GTSEG6(*)_^1_%LDA*_!SEGBUF+1_$(A) = OLD FILNUM._^1_%EOR*_!GTSGOF_'(A)=0 IF CURRENT FILNUM = OLD FILNUM._^1_%SAN_"GTSEG2_'SKIP IF MISMATCH._^€€1_%LDA*_!SEGBUF+2_$(A) = (NEW LUN WORD)._^1_%STA*_!GTSEGL_'SAVE (NEW LUN WORD). IT MAY YET BE REPLACED._^1_%LDA*_!SEGBUF+3_$(A) = NEW FILNUM._^1_%STA*_!GTSEGF_'REMEMBER NEW FILNUM. IT MAY YET BE REPLACED._^1GTSEG2 JMP*_!GTSEGR_'GET NEXT SEGMENT-LIST ENTRY._^1GTSEGE LDA*_!GTSEGF_'(A) = LAST CORRESPONDING NEW FILNUM._^1_%SAN_"GTSEG3_'SKIP IF MATCH WAS FOUND._^1_%JMP*_!GTSGP1_'TAKE P+€€1(EOF) EXIT IF NO MATCH._^1GTSEG3 LDQ*_!GTSEGI_'(Q) = (I)ENTRY._^1_%STQ-_!I_,RESTORE (I)ENTRY._^1_%STA-_!FILNUM,I_$USE NEW FILNUM AS CURRENT FILNUM._^1_%LDA*_!GTSEGL_'(A) = (NEW LUN WORD)._^1_%STA-_!(LUN),I_%USE (NEW LUN WORD) IN CURRENT LUN WORD._^1_%RTJ*_!CLRBIO_'ZERO DYNAMIC BLOCK-IO WORDS OF FILE TABLE._^1_%RAO*_!GETSEG_'SET UP P+2(NEW SEGMENT) EXIT._^1_%JMP*_!(GETSEG)_$BEGIN T€€O READ THE EXTENSION._^1GTSGOF NUM_"0_,() = OLD (EXHAUSTED) FILNUM._^1GTSEGL NUM_"0_,() = LAST CORRESPONDING NEW (LUN WORD)._^1GTSEGF NUM_"0_,() = LAST CORRESPONDING NEW-FILNUM._^1_%ADC_"MNDSGE-MSGSGE_^1MSGSGE ALF_"/,SEGMENT-LIST ERROR/_^1MNDSGE EQU_"MNDSGE(*)_^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_:RTJ CLRFT_^1*_:(A)EXIT = 0._^1*_:(Q),(I) EXIT = (€€Q),(I) ENTRY._^1*_:FILE TABLE WORDS ARE ZEROED ABOVE BUFWA._^1*_:(RECFWA,I)EXIT = (BUFWA,I) ENTRY._^1* LUN, FILNUM, RECLTH, BUFLTH, SKIPCT, DOCNT, BUFWA_^1* MUST BE INITIALIZED BY OTHER LOGIC PRECEDING OR FOLLOWING CLRFT._^1CLRFT NUM_"0_^1_%STQ*_!CLRFTQ_'SAVE (Q)ENTRY._^1_%LDA-_!BUFWA,I_%(A) = FWA OF DATA PORTION OF BUFFER._^1_%STA-_!RECFWA,I_$MAKE PUTU START WITH FWA OF DATA PORT€€ION._^1_%RTJ*_!CLRBIO_'ZERO DYNAMIC BLOCK-IO WORDS OF FILE TABLE._^1_%STA-_!XFRLTH,I_$ZERO THE TRANSFER LENGTH._^1_%STA-_!RECNT,I_%ZERO UPPER RECORD COUNT._^1_%STA-_!RECNT+1,I_#ZERO LOWER RECORD COUNT._^1_%LDQ*_!CLRFTQ_'RESTORE (Q)ENTRY._^1_%JMP*_!(CLRFT)_%EXIT._^1CLRFTQ NUM_"0_,() = (Q)ENTRY._^1*_]_^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_:RTJ CLRBIO_"ZERO ER€€RCNT, BLKCNT, RECPTR,_^1*_MREQBUF, REQIND._^1*_:(A)EXIT = 0._^1*_:(Q),(I) EXIT = (Q),(I) ENTRY._^1CLRBIO NUM_"0_^1_%LDA_"=XRECPTR,I_"(A) = FWA OF THE AREA TO ZERO._^1_%ENQ_"FTSIZE-RECPTR (Q) = NO. OF WORDS TO ZERO._^1_%RTJ_"CLR_*ZERO THE AREA DESIGNATED BY (A),(Q)._^1_%CLR_"A_^1_%STA-_!ERRCNT,I_$ZERO THE ERROR COUNT._^1_%STA-_!BLKCNT,I_$ZERO THE BLOCK COUNT._^1_%JMP*_!(CLRBIO)_$EXI€€T._^1_%EJT_]_^1_%NUM_"0_,FMR LENGTH WORD FOR SEGBUF._^1SEGBUF BZS_"SEGBUF(SGBKSZ)_"DATA PART OF SEGMENT LIST BUFFER._^1FWASGF ADC_"SEGFT-HERE_"() = FWA OF SEGFT._^1SEGFT NUM_"0_,() = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%NUM_"0_,FILNUM._^1_%NUM_"0_,USUALLY RECLTH. HERE UNUSED._^1_%ADC_"SGBKSZ_'BUFLTH._^1_%NUM_"0,0_*USUALLY SKIPCT. HERE UNUSED._^1_%NUM_"0,0_*USUALLY DOCNT. HER€€E UNUSED._^1_%ADC_"SEGBUF-HERE_!BUFWA._^1_%NUM_"0,0_*USUALLY RECNT. HERE UNUSED._^1_%NUM_"0_,ERRCNT._^1_%NUM_"0_,BLKCNT._^1_%NUM_"0_,RECFWA._^1_%NUM_"0_,XFRLTH._^1_%NUM_"0,0_*RECPTR._^1_%BZS_"(12)_)REQBUF._^1_%NUM_"0_,REQIND._^1_%EJT 0_^1* IF PUTSEG FAILS, THE RUN IS TERMINATED._^1* IF PUTSEG SUCCEEDS, THEN_^1* PUTSEG DEFINES A FILE TO EXTEND THE FILE THAT REACHED EOA,_^1* PUTSEG €€UPDATES THE SEGMENT FILE WITH_^1* OLD LUN / OLD FILNUM / NEW LUN / NEW FILNUM,_^1* PUTSEG SETS (LUN)10 TO INDICATE EXTENSION,_^1* PUTSEG SETS (LUN)9-0 = THE NEW LUN,_^1* PUTSEG SETS (FILNUM) = THE NEW FILNUM,_^1* PUTSEG ZEROES (ERRCNT),(BLKCNT),(RECPTR),(REQBUF),(REQIND)._^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_:RTJ PUTSEG_^1*_:(I)EXIT = (I)ENTRY._^1PTSEGI NU€€M_"0_,() = (I)ENTRY._^1PUTSEG NUM_"0_^1_%LDQ-_!I_,(Q) = (I)ENTRY._^1_%STQ*_!PTSEGI_'SAVE (I)ENTRY._^1_%LDA*_!FWASGF_'(A) = FWA OF SEG. LIST FILE TABLE._^1_%STA-_!I_,SWITCH TO SEG. LIST FILE TABLE._^1_%LDA-_!(LUN),Q_%(A) = (OLD LUN WORD)._^1_%STA*_!SEGBUF_'TO MENTION OLD LUN IN SEGMENT LIST._^1_%AND-_!HXF800_'ZERO LUN AND EXTENDED BITS._^1_%EOR-_!HX0400_'SET EXTENDED BIT._^1_%STA-_!€€(LUN),I_%MAKE DEF DEFINE NEW LUN IN SEGFT._^1_%LDA-_!FILNUM,Q_$(A) = OLD FILNUM._^1_%STA*_!SEGBUF+1_$TO MENTION OLD FILNUM IN SEGMENT LIST._^1_%CLR_"A_^1_%STA-_!FILNUM,I_$MAKE DEF DEFINE NEW FILNUM IN SEGFT._^1_%LDA-_!BUFLTH,Q_$(A) = OLD BUFLTH._^1_%STA-_!BUFLTH,I_$MAKE DEF USE MAXRL OF EXTENDEE._^1_%RTJ_"DEF_*IN SEGFT, DEFINE NEW FILNUM ON NEW LUN._^1_%LDA-_!(LUN),I_%(A) = (NEW LU€€N WORD)._^1_%STA*_!SEGBUF+2_$TO MENTION NEW LUN IN THE SEGMENT LIST._^1_%LDA-_!FILNUM,I_$(A) = NEW FILNUM._^1_%STA*_!SEGBUF+3_$TO MENTION NEW FILNUM IN SEGMENT LIST._^1_%LDA_"YSEGLU_'(A) = (LUN WORD OF SEGMENT LIST ITSELF)._^1_%STA-_!(LUN),I_%DEAL WITH SEG. LIST VIA SEGFT._^1_%LDA_"YSEGFN_'(A) = FILNUM OF SEG. LIST ITSELF._^1_%STA-_!FILNUM,I_$DEAL WITH SEG. LIST VIA SEGFT._^1_%RTJ*€€_!CLRFT_(CLEAR SEGFT._^1_%ENA_"SGBKSZ_'(A) = SIZE OF SEG. LIST ENTRY._^1_%STA-_!BUFLTH,I_$RESTORE BUFLTH, ALTERED ABOVE FOR DEF._^1_%STA-_!XFRLTH,I_$TELL WRTD HOW MUCH TO WRITE._^1_%RTJ*_!PTSGWT_'UPDATE THE SEGMENT LIST._^1* THE BELOW SETTING OF (YSEGLU) AND OF (YSEGFN)_^1* IS SUPERFLUOUS AND HARMLESS AFTER THE 1ST USAGE._^1_%LDA-_!(LUN),I_%() SET BY WRTD VIA DEF WHEN ()ENTRY=0._^1€€_%STA_"YSEGLU_'REMEMBER LUN OF THE SEGMENT LIST._^1_%LDA-_!FILNUM,I_$() SET BY WRTD VIA DEF WHEN ()ENTRY=0._^1_%STA_"YSEGFN_'REMEMBER FILNUM OF THE SEGMENT LIST._^1_%LDA*_!SEGBUF+2_$(A) = (NEW LUN WORD)._^1_%STA-_!(LUN),Q_%SET ENTRY FILE TABLE._^1_%LDA*_!SEGBUF+3_$(A) = NEW FILNUM._^1_%STA-_!FILNUM,Q_$SET ENTRY FILE TABLE._^1_%STQ-_!I_,SWITCH TO ENTRY FILE TABLE._^1_%RTJ*_!CLRBIO_'€€ZERO DYNAMIC BLOCK-IO WORDS OF FILE TABLE._^1_%JMP*_!(PUTSEG)_$EXIT._^1_%EJT_]_^1* PTSGWT INSULATES PUTSEG FROM THE PROBLEMS OF RECURSION ON WRTD._^1PTSGWQ NUM_"0_,() = (Q)ENTRY._^1PTSGWT NUM_"0_^1_%STQ*_!PTSGWQ_'SAVE (Q)ENTRY._^1_%LDA_"WRTD_)(A) = FWA OF NSI OF ORIGINAL WRTD CALLER._^1_%STA*_!PTSGWR_'SAVE RETURN TO ORIGINAL WRTD CALLER._^1_%RTJ_"WRTD_)UPDATE THE SEGMENT LIST._^1_%€€LDA*_!PTSEGI_'(A) = (I)ORIGINAL._^1_%STA-_!I_,SWITCH TO ORIGINAL FILE TABLE._^1_%RTJ_"WRTDIN_'RESTORE ORIGINAL WRTD INITIALIZATION._^1_%LDA*_!PTSGWR_'(A) = FWA OF NSI OF ORIGINAL WRTD CALLER._^1_%STA_"WRTD_)RESTORE RETURN TO ORIGINAL WRTD CALLER._^1_%LDA*_!FWASGF_'(A) = FWA OF SEGMENT LIST FILE TABLE._^1_%STA-_!I_,SWITCH TO SEGMENT LIST FILE TABLE._^1_%LDQ*_!PTSGWQ_'RESTORE (Q)ENTR€€Y._^1_%LDA-_!ERRCNT,I_$(A)=0 IF WRTD WAS CLEAN._^1_%SAZ_"PTSGWX_'SKIP IF WRTD WAS CLEAN._^1_%JMP_"GTSEG4_'ANNOUNCE THE ERROR, THEN BOMB._^1PTSGWX JMP*_!(PTSGWT)_$EXIT._^1PTSGWR NUM_"0_,() = FWA OF NSI OF ORIGINAL WRTD CALLER._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(I) = FWA OF FILE TABLE._^1*_:P_!RTJ RDP OR RTJ RDT_^1*_:P+1 EOF OR ERROR EXIT._^1*_:P+2 NORMAL EXIT._^1*_:(I)EXIT = €€(I)ENTRY._^1RDTI_!NUM_"0_,() = (I)ENTRY = FWA OF FILE TABLE._^1HX13FF NUM_"$13FF_($13FF = 0001 0011 1111 1111._^1RDP_"EQU_"RDP(*)_^1RDT_"NUM_"0_^1_%LDA-_!I_,(A) = (I)ENTRY = FWA OF FILE TABLE._^1_%STA*_!RDTI_)SAVE (I)ENTRY._^1_%LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%AND*_!HX13FF_'ISOLATE M AND LUN._^1_%STA*_!RDTLUN_'SET V,M,A,L OF FREAD._^1_%LDA-_!BUFWA,I_%€€(A) = FWA OF BUFFER._^1_%STA*_!RDTS_)SET S OF FREAD._^1_%LDA-_!BUFLTH,I_$(A) = MAXIMUM BLOCK LENGTH._^1_%INA_"1_,USE EXTRA WORD TO DETECT LENGTH ERROR._^1_%STA*_!RDTN_)SET N OF FREAD._^1RDTREQ RTJ-_!(AMONI)_^1_%VFD_"N1/0,N1/1,N5/4,N1/0,X4/PRLVL,X4/PRLVL_^1RDT01 ADC_"RDTC-HERE_#COMPLETION._^1_%NUM_"0_,THREAD._^1RDTLUN NUM_"0_,V,M,A,L._^1RDTN_!NUM_"0_,N._^1RDTS_!NUM_"0_,S._^1* A FOR€€EGROUND VERSION WOULD USE THE FOLLOWING TWO LINES OF CODE._^1*_$SQP_"RDTDIS_'SKIP IF REQUEST ACCEPTED._^1*_$JMP*_!RDTREQ_'RETRY REQUEST IF IT WAS REJECTED._^1RDTDIS JMP-_!(ADISP)_%GIVE UP CPU DURING IO._^1RDTC_!LDA*_!RDTI_)(A) = (I)ENTRY = FWA OF FILE TABLE._^1_%STA-_!I_,RESTORE (I)ENTRY._^1_%SQM_"RDTERR_'SKIP IF ERROR OR EOF._^1_%QLS_"1_,(Q)15 = LENGTH-ERROR BIT._^1_%SQM_"RDTLER_'€€SKIP IF LENGTH ERROR._^1_%JMP*_!RDTWLB_'JMP IF NO LENGTH-ERROR, THUS W.L.B._^1RDTLER LDQ*_!RDTS_)(Q) = FWA OF BUFFER._^1_%ADQ*_!RDTN_)(Q) = 1 + LWA OF BUFFER._^1_%INQ_"-2_+(Q) = -1 + LWA OF BUFFER._^1_%LDA-_!1,Q_*(A) = 1 + LWA OF ACTUAL TRANSFER._^1_%SUB*_!RDTS_)(A) = LENGTH OF ACTUAL TRANSFER._^1_%STA-_!XFRLTH,I_$TABULATE LENGTH OF ACTUAL TRANSFER._^1_%RAO*_!RDT_*ENTER HERE FOR P+€€2(NORMAL) EXIT._^1_%RAO-_!BLKCNT,I_$COUNT EACH GOOD BLOCK._^1RDTP1 JMP*_!(RDT)_(ENTER HERE FOR P+1(EOF OR ERROR) EXIT._^1RDTERR LDA*_!RDTLUN_'(A) = LUN, ETC._^1_%RTJ_"STATUS_^1_%JMP*_!RDTP1_(TAKE P+1(EOF OR ERROR) EXIT IF EOF._^1RDTRST LDQ_"=XMSGRST-HERE (Q) = FWA OF ERROR MESSAGE._^1_%JMP*_!RDTGQ_(JMP TO ASK USER WHAT TO DO IF ERROR._^1RDTWLB LDQ_"=XMSGWLB-HERE (Q) = FWA OF ERROR€€ MESSAGE._^1_%SET_"A_,DESELECT SUFFIX AS OPTION OF BADBLK._^1RDTGQ RAO-_!ERRCNT,I_$COUNT EACH ERROR._^1_%RTJ_"BADBLK_'DISPLAY ERROR AND BLOCK, AND ACCEPT OPTION._^1_%JMP*_!RDTP1_(IF ]QT], TAKE P+1(EOF OR ERROR) EXIT._^1_%JMP*_!RDTREQ_'IF ]GO], GET THE NEXT BLOCK._^1_%ADC_"MNDRST-MSGRST_^1MSGRST ALF_"/,FREAD STATUS/_^1MNDRST EQU_"MNDRST(*)_^1_%ADC_"MNDWLB-MSGWLB_^1MSGWLB ALF_"/,OVE€€RSIZE BLOCK/_^1MNDWLB EQU_"MNDWLB(*)_^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(A)15-9ENTRY IS IGNORED. (A)8-0ENTRY = LUN._^1*_:P_!RTJ STATUS_^1*_:(A)EXIT = HARDWARE STATUS._^1*_:(Q)EXIT = REQUEST STATUS._^1*_:(I)EXIT = (I)ENTRY._^1*_:P+1 EOF EXIT._^1*_:P+2 NOT-EOF EXIT._^1STATUS NUM_"0_^1_%AND-_!HX01FF_'ISOLATE LUN._^1_%STA*_!STATL_(SET LUN INTO STATUS REQUEST._^1_%LDA-_!I_,(A) = (I)€€ENTRY._^1_%STA*_!STATI_(SAVE (I)ENTRY._^1_%RTJ-_!(AMONI)_%STATUS REQUEST._^1_%NUM_"$0600_(0/0/00011=STATUS/0/0000 0000._^1STATL NUM_"0_,000/0/00=A/0/0 0000 0000=L._^1_%NUM_"0_^1_%STA*_!STATA_(SAVE HARDWARE STATUS._^1_%ALS_"15-11_((A)15 = EOF BIT OF HARDWARE STATUS._^1_%SAM_"STATEF_'SKIP IF EOF, TO CAUSE P+1 EXIT._^1_%RAO*_!STATUS_'SET UP P+2 EXIT._^1STATEF LDA*_!STATI_(RESTORE (I)€€ENTRY._^1_%STA-_!I_^1_%LDA*_!STATA_((A) = HARDWARE STATUS._^1_%JMP*_!(STATUS)_$TAKE P+1 OR P+2 EXIT._^1STATA NUM_"0_,() = HARDWARE STATUS._^1STATI NUM_"0_,() = (I)ENTRY._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_:RTJ WRTD_^1*_:(I)EXIT = (I)ENTRY._^1WRTDI NUM_"0_,() = (I)ENTRY = FWA OF FILE TABLE._^1WRTDIN NUM_"0_^1_%LDA-_!I_,(A) = (I)ENTRY = FWA OF€€ FILE TABLE._^1_%STA*_!WRTDI_(SAVE (I)ENTRY._^1_%LDA_"=XFILNUM,I_"(A) = FWA OF FILNUM._^1_%STA*_!WRTD00_"SET STOSEQ REQUEST._^1_%LDA_"=XRECPTR,I_"(A) = FWA OF RECPTR._^1_%STA*_!WRTD01_"SET STOSEQ REQUEST._^1_%LDA-_!BUFWA,I_!(A) = 1 + FWA OF RECBUF._^1_%INA_"-1_'(A) = FWA OF RECBUF._^1_%STA*_!WRTD02_"SET STOSEQ REQUEST._^1_%LDA-_!XFRLTH,I_$(A) = -1 + LENGTH OF FILE-MANAGER-RECORD._^€€1_%INA_"1_,(A) = LENGTH OF FILE-MANAGER-RECORD._^1_%STA*_!WRTD07_'SAVE FMR LENGTH SO STOSEQ CAN REFERENCE IT._^1_%LDA_"=XREQBUF,I_!(A) = FWA OF REQBUF._^1_%STA*_!WRTD04_"SET STOSEQ REQUEST._^1_%LDA_"=XREQIND,I_!(A) = FWA OF REQIND._^1_%STA*_!WRTD05_"SET STOSEQ REQUEST._^1_%JMP*_!(WRTDIN)_$EXIT._^1WRTD_!NUM_"0_^1_%RTJ*_!WRTDIN_'INITIALIZE STOSEQ._^1_%LDA-_!FILNUM,I_$(A)=0 IF FILNUM €€MUST FIRST BE SET._^1_%SAM WRTD11_'SKIP IF FILE MUST BE RELEASED AND REDEFINED_^1_%SAN_"WRTDRQ_'SKIP IF FILNUM IS ALREADY SET._^1WRTD11 RTJ_"DEF_*DEFINE THE FILE._^1_%RTJ_"CLRBIO_'CLEAR DYNAMIC BLOCK-IO WORDS OF FILE TABLE._^1WRTDRQ RTJ_"STOSEQ_^1WRTD00 NUM_"0_(FILNUM._^1WRTD01 NUM_"0_(RECPTR._^1WRTD02 NUM_"0_(RECBUF._^1WRTD03 ADC_"WRTD07-HERE_!RECLTH._^1WRTD04 NUM_"0_(REQBUF._^1W€€RTD05 NUM_"0_(REQIND._^1_%LDA*_!WRTDI_((A) = (I)ENTRY = FWA OF FILE TABLE._^1_%STA-_!I_,RESTORE (I)ENTRY._^1_%LDA*_!(WRTD05) (A) = REQIND._^1_%SAN_"WRTD06_"SKIP IF ABNORMAL._^1_%RAO-_!BLKCNT,I_$COUNT EACH GOOD BLOCK._^1_%JMP*_!(WRTD)_'EXIT._^1WRTD07 NUM_"0_,() = LENGTH OF FILE-MANAGER-RECORD._^1WRTD06 LDQ*_!(WRTD05)_$(Q) = REQIND._^1_%QLS_"15-8_)(Q)15 = NO-SPACE BIT OF REQIND._^1_€€%SQP_"WRTD10_'SKIP IF NOT NO-SPACE._^1_%RTJ_"DULU_)DOWN THE LUN IN YFMLUN._^1_%NUM_"$FFFF_(TELL DULU TO DOWN THE LUN, NOT UP IT._^1WRTD10 LDQ_"=N$5678_%$5678 = 0101 0110 0111 1000._^1_%LAQ_"Q_,ISOLATE BITS 14,12,10,9,6,5,4,3 OF REQIND._^1_%SQN_"WRTDHG_'HANG IF ANY OF THOSE BITS ARE SET._^1_%SAP_"WRTD09_'SKIP IF (REQIND)15=0._^1* SINCE (REQIND)15=1, WE SHOULD FIND ONE OF SEVERAL OTH€€ER BITS SET._^1_%LDQ =N$2985_($2985 = 0010 1001 1000 0101._^1_%LAQ_"Q_,ISOLATE BITS 13,11,8,7,2,0 OF REQIND._^1_%SQZ_"WRTDHG_'HANG IF UNEXPLAINED BIT 15._^1WRTD09 LDQ-_!(LUN),I_%(Q) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%QLS_"1_,(Q)15=1 IF WORK FILE._^1_%SQP_"WRTDU_(SKIP IF USER FILE OR SEGMENT FILE._^1* IT]S A WORK FILE. THUS, BITS 13,11,2,1 OF REQIND MUST BE ZERO._^1_%LDQ_€€"=N$2806_%$2806 = 0010 1000 0000 0110._^1_%LAQ_"Q_,ISOLATE BITS 13,11,2,1 OF REQIND._^1_%SQN_"WRTDHG_'HANG IF ANY OF THOSE BITS ARE SET._^1_%JMP*_!WRTDW_(CONTINUE ERROR PROCESSING FOR WORK FILE._^1WRTDHG RTJ WIERD_(ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM 3_^1_%JMP* WRTDOP_'DISPLAY ERROR AND BLOCK, AND ACCEPT OPTION._^1WRTDU ALS_"15-0_)(A)15 = UNDEFINED-FILNUM BIT OF REQIND.€€_^1WRTDUD SAP_"WRTDOP_'TELL OP IF UNDEFINED ISN]T THE PROBLEM._^1_%JMP*_!WRTD11_'FIRST DEFINE THE FILE, THEN RETRY THE STOSEQ_^1WRTDOP RAO-_!ERRCNT,I_$COUNT EACH ERROR._^1_%LDA*_!(WRTD05)_$(A) = REQIND._^1WRTD08 LDQ_"=XMSGWTD-HERE (Q) = FWA OF ERROR MESSAGE._^1_%RTJ_"BADBLK_'DISPLAY ERROR AND BLOCK, AND ACCEPT OPTION._^1_%JMP*_!WRTDBM_'STOP THE RUN IF ]QT]._^1_%JMP*_!WRTDRQ_'RETRY €€STOSEQ IF ]GO]._^1WRTDBM SET_"A,Q_*TELL BOMB THERE IS NO MESSAGE._^1_%JMP_"BOMB_)STOP RUN._^1WRTDW ALS_"15-8_)(A)15 = NO-SPACE BIT OF REQIND._^1_%SAM_"WRTDSG_'SKIP IF NO SPACE._^1_%ALS_"8-0_*(A)15 = UNDEFINED-FILNUM BIT OF REQIND._^1_%JMP*_!WRTDUD_'SEE IF UNDEFINED IS THE PROBLEM._^1WRTDSG RTJ_"PUTSEG_'TRY TO EXTEND THE FILE._^1_%JMP*_!WRTDRQ_'RETRY THE STOSEQ THAT PREVIOUSLY HIT €€EOA._^1_%ADC_"MNDWTD-MSGWTD_^1MSGWTD ALF_"/,STOSEQ REQIND /_^1MNDWTD EQU_"MNDWTD(*)_^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_:RTJ WRTT OR RTJ WRTP_^1*_:(I)EXIT = (I)ENTRY._^1WRTTI NUM_"0_,() = (I)ENTRY = FWA OF FILE TABLE._^1WRTP_!EQU_"WRTP(*)_^1WRTT_!NUM_"0_^1_%LDA-_!I_,(A) = (I)ENTRY = FWA OF FILE TABLE._^1_%STA*_!WRTTI_(SAVE (I)ENTRY._^1_%LDA-_€€!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%AND_"HX13FF_'ISOLATE M AND LUN._^1_%STA*_!WRTT01_"SET M AND LUN IN REQUEST._^1_%LDA-_!BUFWA,I_!(A) = FWA OF BUFFER._^1_%STA*_!WRTT03_"SET REQUEST._^1_%LDA-_!XFRLTH,I (A) = LENGTH OF BLOCK._^1_%STA*_!WRTT02_"SET REQUEST._^1WRTT00 RTJ-_!(AMONI)_^1_%VFD_"N1/0,N1/1,N5/6,N1/0,X4/PRLVL,X4/PRLVL_^1WRTT07 ADC_"WRTT04-HERE_!COMPLET€€ION._^1_%NUM_"0_(THREAD._^1WRTT01 NUM_"0_(V,M,A,L._^1WRTT02 NUM_"0_(N._^1WRTT03 NUM_"0_(S._^1* A FOREGROUND VERSION WOULD USE THE FOLLOWING TWO LINES OF CODE._^1*_$SQP_"WRTT06_'SKIP IF REQUEST ACCEPTED._^1*_$JMP*_!WRTT00_'RETRY REQUEST IF IT WAS REJECTED._^1WRTT06 JMP-_!(ADISP)_%GIVE UP CPU DURING IO._^1WRTT04 LDA*_!WRTTI_((A) = (I)ENTRY = FWA OF FILE TABLE._^1_%STA-_!I_,RESTORE (I€€)ENTRY._^1_%SQM_"WRTT05_'SKIP IF IO ERROR._^1_%RAO-_!BLKCNT,I_$COUNT EACH GOOD BLOCK._^1_%JMP*_!(WRTT)_'EXIT._^1WRTT05 RAO-_!ERRCNT,I_$COUNT EACH ERROR._^1_%LDA*_!WRTT01_'(A) = LUN, ETC._^1_%RTJ_"STATUS_'(A) = HARDWARE STATUS._^1_%NOP_"0_,EOF EXIT._^1WRTT08 LDQ_"=XMSGWST-HERE (Q) = FWA OF ERROR MESSAGE._^1_%RTJ_"BADBLK_'DISPLAY ERROR AND BLOCK, AND ACCEPT OPTION._^1_%JMP*_!WRTTBM_'€€STOP THE RUN IF ]QT]._^1_%JMP*_!WRTT00_'RETRY FWRITE IF ]GO]._^1WRTTBM SET_"A,Q_*SELECT STOP RUN WITHOUT MESSAGE._^1_%JMP_"BOMB_)STOP THE RUN._^1_%ADC_"MNDWST-MSGWST_^1MSGWST ALF_"/,FWRITE STATUS /_^1MNDWST EQU_"MNDWST(*)_^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE-TABLE_^1*_AWITH LUN TO UP/DOWN._^1*_:P_!RTJ DULU_^1*_:P+1 $0000/$FFFF TO UP/DOWN LUN IN YFMLUN._^1*_€€:P+2 EXIT._^1*_:(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1DULUA NUM_"0_,() = (A)ENTRY._^1DULUQ NUM_"0_,() = (Q)ENTRY._^1DULULU NUM_"0_,() = NEW VERSION OF MATCHING YFMLUN LUN._^1DULU_!NUM_"0_^1_%STA*_!DULUA_(SAVE (A)ENTRY._^1_%STQ*_!DULUQ_(SAVE (Q)ENTRY._^1_%ENQ_"4_,(Q) = SIZE OF YFMLUN TABLE._^1DULULP INQ_"-1_+POINT TO NEXT YFMLUN LUN TO BE CHECKED._^1_%SQP_"DULUCK_'IF THERE IS A €€NEXT LUN, CHECK IT._^1_%RTJ WIERD_(ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM -4_+ANNOUNCE ERROR NO.4 AND STOP THE RUN._^1DULUCK LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%AND-_!HX03FF_'ISOLATE LUN TO UP OR DOWN._^1_%EOR*_!(DULU)_'UP OR DOWN THE LUN._^1_%STA*_!DULULU_'SAVE THE VERDICT._^1_%EOR_"YFMLUN,Q_$COMPARE ENTRY LUN TO YFMLUN LUN._^1_%INA_"0_,RECOGNIZ€€E -0 AS MATCH INDICATION._^1_%SAZ_"DULUEQ_'SKIP IF ENTRY LUN MATCHES YFMLUN LUN._^1_%JMP*_!DULULP_'TRY NEXT YFMLUN LUN._^1DULUEQ LDA*_!DULULU_'(A) = NEW VERSION OF YFMLUN LUN._^1_%STA_"YFMLUN,Q_$RECORD THE VERDICT._^1_%LDA*_!DULUA_(RESTORE (A)ENTRY._^1_%LDQ*_!DULUQ_(RESTORE (Q)ENTRY._^1_%RAO*_!DULU_)SET UP P+2 EXIT TO BYPASS MASK._^1_%JMP*_!(DULU)_'TAKE P+2 EXIT._^1_%EJT_]_^1* THE €€CALLING SEQUENCE IS_!(I)ENTRY = FWA OF THE FILE TABLE._^1*_:RTJ DEF_^1*_:(Q),(I) EXIT = (Q),(I) ENTRY._^1* IF BOTH THE ENTRY LUN AND THE ENTRY FILNUM ARE NONZERO,_^1* THEN DEF WILL TRY TO DEFINE THAT FILNUM ON THAT LUN._^1* IF THE ENTRY LUN IS ZERO, DEF WILL GET A LUN FROM YFMLUN._^1* IF THE ENTRY FILNUM IS ZERO, DEF WILL GENERATE A RANDOM FILNUM._^1* DEF WILL ALWAYS EXIT IF (REQIN€€D)=0._^1* DEF WILL ALWAYS HANG IF (REQIND)14-9,6-1 .NE. 0._^1* DEF WILL ALWAYS HANG IF (REQIND)15=1 WHILE (REQIND)14-0 = 0._^1* DEF WILL HANG IF (REQIND)0=1 (PREDEFINED) FOR A NONZERO ENTRY FILNUM._^1* IF DEF IS FREE TO SELECT THE LUN, THEN DEF WILL GET A NEW LUN FROM_^1* YFMLUN WHENEVER IT ENCOUNTERS NO SPACE OR MM ERROR ON DEFFIL._^1* DEF WILL ALWAYS STOP RUN IF IT RUNS OUT OF LU€€NS OR RANDOM FILNUMS._^1DEFI_!NUM_"0_,() = (I)ENTRY = FWA OF THE FILE TABLE._^1DEFELU NUM_"0_,() = ENTRY LUN FROM FILE TABLE._^1DEFLCT NUM_"0_'() = NO. OF ACCESSES TO YFMLUN LEFT FOR THIS DEF._^1DEFQ_!NUM_"0_,() = (Q)ENTRY._^1DEF_"NUM_"0_^1_%STQ*_!DEFQ_)SAVE (Q)ENTRY._^1_%LDA-_!I_,(A) = (I)ENTRY = FWA OF THE FILE TABLE._^1_%STA*_!DEFI_)SAVE (I)ENTRY._^1_%ENA_"4_,(A) = MAX. YFMLUN A€€CCESSES PER DEF CALL._^1_%STA*_!DEFLCT_'START WITH ZERO ACCESSES OF YFMLUN._^1_%LDA_"=XFILNUM,I_"(A) = FWA OF FILNUM._^1_%STA*_!DEFFNO_'TELL FWA OF FILNUM TO DEFFIL._^1_%LDA-_!BUFLTH,I_$(A) = SIZE OF BLOCK OF LOGICAL RECORDS._^1_%INA_"1_,ALLOW FOR THE FILE-MANAGER-RECORD HEADER._^1_%STA*_!DEFMRL_'() = LENGTH OF FILE-MANAGER-RECORD BUFFER._^1_%LDA_"=XREQBUF,I_"(A) = FWA OF REQBUF._^€€1_%STA*_!DEFRQB_'TELL FWA OF REQBUF TO DEFFIL._^1_%LDA_"=XREQIND,I_"(A) = FWA OF REQIND._^1_%STA*_!DEFRQI_'TELL FWA OF REQIND TO DEFFIL._^1_%RTJ_"RANNIT_'INITIALIZE RANDOM NO. GENERATOR._^1DEFLCK LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%AND-_!HX03FF_'(A) = LUN._^1_%STA*_!DEFELU_'REMEMBER ENTRY LUN._^1_%SAZ_"DEFEL0_'SKIP IF ENTRY LUN IS ZERO._^1_%JMP*_!DEFTLU_€€'JMP TO TRY NONZERO ENTRY LUN._^1* WE DON]T HAVE A NONZERO ENTRY LUN, SO WE WILL TRY TO GET A LUN_^1* FROM YFMLUN._^1DEFEL0 LDQ*_!DEFLCT_!(Q) = NO. OF ACCESSES OF YFMLUN LEFT FOR THIS DEF_^1_%INQ_"-1_+COUNT EACH ACCESS OF YFMLUN._^1_%STQ*_!DEFLCT_'REMEMBER NEW NO. OF ACCESSES LEFT._^1_%SQM_"DEFTLD_'SKIP IF WE EXHAUSTED YFMLUN._^1_%LDA_"YFMLUN,Q_$(A) = (CURRENT YFMLUN ENTRY)._^1_%SA€€Z_"DEFTLD_'SKIP IF WE EXHAUSTED YFMLUN._^1_%SAM_"DEFDNL_'SKIP IF LUN IS DOWNED._^1_%JMP*_!DEFTLU_'TRY NONZERO LUN FROM YFMLUN._^1DEFDNL JMP*_!DEFEL0_'SEE IF THERE IS ANOTHER LUN._^1DEFTLD LDQ_"=XMSGTLD-HERE (Q) = FWA OF BOMB PREFIX._^1_%SET_"A_,DELETE OPTIONAL BOMB SUFFIX._^1_%JMP*_!DEFBMB_'STOP THE RUN._^1DEFGLU LDA*_!DEFELU_'(A) .NE. 0 IF NONZERO ENTRY LUN FAILED._^1_%SAN_"DEFERR€€_'STOP RUN IF NONZERO ENTRY LUN FAILED._^1_%JMP*_!DEFLCK_'JMP IF THERE MAY YET BE A LUN TO TRY._^1DEFERR LDA*_!(DEFRQI)_$(A) = (REQIND)._^1DEF01 LDQ_"=XMSGDEF-HERE (Q) = FWA OF ERROR MESSAGE._^1_%RTJ_"TPHEX_(ANNOUNCE THE ERROR._^1_%RTJ_"LUFNO_(PUBLISH LUN AND THEN FILNUM._^1_%SET_"A,Q_*DISABLE OPTIONAL MESSAGE OF BOMB._^1DEFBMB JMP_"BOMB_)STOP THE RUN._^1* WE HAVE A NONZERO LUN (E€€NTRY OR YFMLUN). LET]S TRY THE LUN._^1DEFTLU STA*_!DEFLUN_'PUT LUN WHERE DEFFIL WILL LOOK FOR IT._^1* SAVE THE TRIAL LUN IN THE FILE TABLE._^1_%LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,OLD._^1_%AND-_!HXFC00_'(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,0._^1_%EOR*_!DEFLUN_'(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,NEW._^1_%STA-_!(LUN),I_%PUT TRIAL LUN IN THE FILE TABLE._^1_%€€LDA-_!FILNUM,I_$(A) = CURRENT FILNUM._^1_%SAZ DEFRDM_'SKIP IF THERE IS NO CURRENT FILNUM_^1_%SAP DEFRLX_'SKIP IF IT IS NOT TO BE RELEASED_^1_%AND- HX7FFF_'MASK OFF BIT 15_^1_%STA- FILNUM,I_$RESTORE FILNUM_^1_%LDA* DEFFNO_'() = FWA OF FILNUM_^1_%STA* DEFRLN_'USE FOR RELFIL REQUEST_^1_%LDA* DEFRQB_'() = FWA OF REQBUF_^1_%STA* DEFRLB_'USE FOR RELFIL REQUEST_^1_%LDA* DEFRQI_'() = FWA€€ OF REQIND_^1_%STA* DEFRLI_'USE FOR RELFIL REQUEST_^1_%RTJ RELFIL_'RELEASE FILNUM (EFFECTIVELY REWINDS IT)_^1DEFRLN ADC 0_,() = FWA OF FILNUM_^1DEFRLB ADC 0_,() = FWA OF REQBUF_^1DEFRLI ADC 0_,() = FWA OF REQIND_^1DEFRLX JMP* DEFREQ_'GO TO REDEFINE THE SAME FILNUM_^1DEFRDM RTJ_"RANDOM_'GENERATE A RANDOM FILNUM._^1_%JMP*_!DEFTLD_'STOP THE RUN IF RANDOM EXHAUSTED._^1_%STA-_!FILNU€€M,I_$PUT NEW FILNUM IN THE FILE TABLE._^1DEFREQ RTJ_"DEFFIL_'TRY TO DEFINE THE FILNUM._^1DEFFNO NUM_"0_,() = FWA OF FILNUM._^1DEF02 ADC_"DEFMRL-HERE_!() = FWA OF MAXRL._^1DEF03 ADC_"DEFLUN-HERE_!() = FWA OF LUN._^1DEFRQB NUM_"0_,() = FWA OF REQBUF._^1DEFRQI NUM_"0_,() = FWA OF REQIND._^1_%LDA*_!DEFI_)(A) = (I)ENTRY = FWA OF THE FILE TABLE._^1_%STA-_!I_,RESTORE (I)ENTRY._^1_%LDA*_€€!(DEFRQI)_$(A) = REQIND._^1_%SAN_"DEFNZI_'SKIP IF NONZERO REQIND._^1_%LDQ*_!DEFQ_)RESTORE (Q)ENTRY._^1_%JMP*_!(DEF)_(EXIT._^1DEFNZI LDQ_"=N$7E7E_%$7E7E = 0111 1110 0111 1110._^1_%LAQ_"Q_,ISOLATE BITS 14-9 AND 6-1 OF REQIND._^1_%SQN_"DEFHNG_'HANG IF ANY OF THOSE BITS ARE SET._^1_%LDQ_"=N$0180_%$0180 = 0000 0001 1000 0000._^1_%LAQ_"Q_,ISOLATE BITS 8 AND 7 OF REQIND._^1_%SQZ_"DEFCK0_'€€SKIP IF BOTH BIT 8 AND BIT 7 ARE ZERO._^1* BIT 8 OR BIT 7 WAS SET, SO WE MUST TRY TO GET ANOTHER LUN._^1* THE LOGIC BELOW RESETS THE FILE TABLE LUN TO ITS ENTRY VALUE,_^1* SO THAT DEFLCK WILL LET US GET A LUN FROM YFMLUN IF ZERO ENTRY LUN._^1_%LDA-_!(LUN),I_%(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,LUN._^1_%AND-_!HXFC00_'(A) = D/W/T/P,SKIPCT,A/B,DOCNT,EXTENDED,0._^1_%EOR*_!DEFELU_'(€€A) = D/W/T/P,S0IPCT,A/B,DOCNT,EXTENDED,ELU._^1_%STA-_!(LUN),I_%RESET FILE TABLE LUN TO ITS ENTRY VALUE._^1_%JMP*_!DEFGLU_'GET NEXT LUN IF BIT 8 OR BIT 7 IS SET._^1DEFCK0 ALS_"15-0_)(A)15=1 IF FILNUM WAS PREDEFINED._^1_%SAP_"DEFHNG_'HANG IF UNEXPLAINED (REQIND)15=1._^1* THE FILNUM WAS ALREADY DEFINED BEFORE THE DEFFIL._^1DEFDUP LDA*_!RANDOM_'(A)=0 IF FILNUM NOT RANDOM._^1_%SAZ_"DEFH€€NG_'HANG IF DEF SHOULDN]T HAVE BEEN CALLED._^1_%JMP*_!DEFRDM_'GENERATE AND TRY THE NEXT RANDOM FILNUM._^1DEFHNG RTJ WIERD_(ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM -5_+ANNOUNCE ERROR NO.5 AND STOP THE RUN._^1DEFMRL NUM_"0_,() = LENGTH OF FILE-MANAGER-RECORD BUFFER._^1DEFLUN NUM_"0_,() = TRIAL LUN._^1_%ADC_"MNDDEF-MSGDEF_^1MSGDEF ALF_"/,DEFFIL REQIND/_^1MNDDEF EQU_"MNDDEF(*)_^€€1_%ADC_"MNDTLD-MSGTLD_^1MSGTLD ALF_"/,TOO LITTLE DISK/_^1MNDTLD EQU_"MNDTLD(*)_^1_%EJT_]_^1* RANDOM SETS (A)EXIT = A UNIFORM PSEUDO RANDOM NUMBER. THIS PSEUDO_^1* RANDOM NUMBER GENERATOR USES THE TECHNIQUE U(I+1) =_^1* (U(I)*K) MOD (2**B). U(0) MAY BE ANY ODD INTEGER, E.G. 1._^1* B IS THE BIT LENGTH OF THE U(I). K IS AN INTEGER OF THE FORM 8T+3_^1* OR THE FORM 8T-3, T AN INTEGER. K€€ SHOULD ROUGHLY EQUAL 2**(B/2)._^1* THE NUMBER OF PSEUDO RANDOM NUMBERS PRODUCED, BEFORE REPETITION,_^1* IS 2**(B-2). TO AVOID SIGN PROBLEMS, B=15 IN THIS ROUTINE. THUS_^1* K=22(8)+3=179 WHICH IS ROUGHLY 2**(B/2)=2**7.5, WHILE THE NUMBER_^1* OF CALLS BEFORE REPETITION IS 2**(B-2)=2**(15-2)=8192._^1RANDOM NUM_"0_^1_%RAO_"RANDCT_"COUNT EACH CALL._^1_%LDA_"=N8192_"REPETITION WON]T OCC€€UR FOR 8192 CALLS._^1_%SUB_"RANDCT_"(A) = NO. OF CALLS BEFORE REPETITION._^1_%SAP_"RANDGO_"SKIP IF NO DANGER OF REPETITION._^1_%JMP*_!(RANDOM) TAKE P+1 EXIT IF TOO MANY CALLS._^1RANDGO LDA*_!RANDU_#(A) = LAST PSEUDO RANDOM NUMBER, I.E. U(I)._^1_%MUI_"RANDK_#MULTIPLY BY K TO SET (A)14-0 = U(I+1)._^1_%AND_"=N$7FFF_!ZERO (A)15 TO MAKE (A) = U(I+1)._^1_%STA*_!RANDU_#REMEMBER U(I+1), W€€HICH WILL BE U(I) NEXT CALL._^1_%RAO*_!RANDOM_"SET UP P+2 EXIT._^1_%JMP*_!(RANDOM) P+2 EXIT WITH (A) = PSEUDO RANDOM NUMBER._^1RANDU NUM_"1_(AN ODD NUMBER, INITIALLY._^1RANDK NUM_"179_%8*22+3=179 WHILE 2**(15/2)=180.992_^1RANDCT NUM_"0_(() = NO. OF CALLS TO RANDOM._^1_%EJT_]_^1* RANNIT RESTORES RANDOM TO ITS UNUSED STATE, MAKING RANDOM SEEM TO_^1* HAVE NEVER BEEN CALLED, AND THU€€S GOOD FOR 8192 RANDOM NUMBERS._^1RANNIT NUM_"0_^1_%ENA_"1_,(A) = U0._^1_%STA*_!RANDU_(MAKE RANDUM EMIT U1=K*U0 NEXT._^1_%CLR_"A_^1_%STA*_!RANDOM_'MAKE RANDOM SEEM UNCALLED._^1_%STA*_!RANDCT_'ALLOW 8192 MORE P+2 EXITS BEFORE P+1 EXIT._^1_%JMP*_!(RANNIT)_$EXIT._^1_%EJT_]_^1* MOVE RIGHT TO LEFT._^1* MOVE MUST BE FAST. DURING A SINGLE SORT RUN, MOVE MOVES EACH BYTE OF_^1* EACH LOGICAL€€ RECORD SEVERAL TIMES, DESPITE THE FACT THAT THE NUMBER OF_^1* SUCH MOVES IS REDUCED BY MOVING POINTERS INSTEAD OF LOGICAL RECORDS,_^1* WHENEVER POSSIBLE._^1* WORD-TIMES = 4 + 9 * WORDS-TO-MOVE, E.G. 364 = F(80 BYTES), 4 = F(0)._^1* THE CALLING SEQUENCE IS_!(MVSRCE)ENTRY = FWA OF SOURCE._^1*_:(MVDEST)ENTRY = FWA OF DESTINATION._^1*_:(Q)ENTRY = NO. OF WORDS TO MOVE._^1*_:RTJ MOVE_"M€€OVE IFF (Q)ENTRY .GE. 1._^1*_:(A)EXIT = (LAST WORD MOVED)._^1*_:(Q)EXIT = -1._^1*_:(I),(MVSRCE),(MVDEST) EXIT = ENTRY._^1MOVE_!NUM_"0_^1MVLOOP INQ_"-1_+(Q) = FWA NEXT SOURCE WORD - FWA OF SOURCE,_^1*_5= FWA NEXT DESTINATION WORD - FWA OF DESTINATION._^1_%SQP_"MVLDA_(SKIP IF MORE WORDS TO MOVE._^1_%JMP*_!(MOVE)_'EXIT._^1MVLDA LDA*_!(MVSRCE),Q_"(A) = (NEXT WORD TO MOVE)._^1_%STA*_!(€€MVDEST),Q_"MOVE A WORD._^1_%JMP*_!MVLOOP_'EXIT OR MOVE NEXT WORD._^1MVSRCE NUM_"0_,() = FWA OF SOURCE._^1MVDEST NUM_"0_,() = FWA OF DESTINATION._^1_%EJT_]_^1SAVAQI NUM_"0_^1_%STA*_!(SAVAQI) SAVE (A)ENTRY._^1_%RAO*_!SAVAQI_"() = FWA OF Q SAVE AREA._^1_%STQ*_!(SAVAQI) SAVE (Q)ENTRY._^1_%RAO*_!SAVAQI_"() = FWA OF I SAVE AREA._^1_%LDQ-_!I_((Q) = (I)ENTRY._^1_%STQ*_!(SAVAQI) SAVE (I)€€._^1_%RAO*_!SAVAQI_"() = FWA OF NSI OF CALLER._^1_%LDQ*_!SAVAQI_"(Q) = FWA OF NSI OF CALLER._^1_%INQ_"-3_'(Q) = FWA OF A SAVE AREA._^1_%LDQ-_!1,Q_%(Q) = (Q)ENTRY._^1_%JMP*_!(SAVAQI) EXIT._^1RESAQI NUM_"0_^1_%LDQ*_!(RESAQI) (Q) = FWA OF A,Q,I SAVE AREA._^1_%LDA-_!2,Q_%(A) = SAVED (I)._^1_%STA-_!I_(RESTORE (I)._^1_%LDA-_!(ZERO),Q RESTORE (A)._^1_%LDQ-_!1,Q_%RESTORE (Q)._^1_%RAO*_!€€RESAQI_"SET UP P+2 EXIT._^1_%JMP*_!(RESAQI) TAKE P+2 EXIT._^1_%EJT_]_^1* ACCEPT OUTPUTS A MESSAGE AND ACCEPTS ONE WORD OF REPLY._^1* THE CALLING SEQUENCE IS_!(Q)ENTRY = FWA OF MESSAGE,_^1*_C= 1 + FWA OF MESSAGE LENGTH._^1*_:RTJ ACCEPT_^1*_:(A)EXIT = THE ONE-WORD REPLY._^1*_:(Q)EXIT = (Q)ENTRY. (I)EXIT = (I)ENTRY._^1ACCEPT NUM_"0_^1_%STQ*_!ACCEPQ_'SAVE (Q)ENTRY = FWA OF MESSAGE._^1€€_%LDA =N$18FC_%OUTPUT COMMENT LU_^1_%STA* TYPOUL_'CHANGE LU FOR TYPOUT_^1_%RTJ*_!TYPOUT_'REQUEST REPLY._^1_%LDA =N$18FB_%STANDARD OUTPUT LU_^1_%STA* TYPOUL_'RESTORE LU FOR TYPOUT_^1_%RTJ*_!TYPIN_(GET ONE-WORD REPLY._^1ACCEP1 ADC_"ACCEPA-HERE_!() = FWA OF ACCEPA._^1_%LDA*_!ACCEPA_'(A) = THE ONE-WORD REPLY._^1_%LDQ*_!ACCEPQ_'RESTORE (Q)ENTRY._^1_%JMP*_!(ACCEPT)_$EXIT._^1_%NUM_"1_,(€€) = 1 = LENGTH IN WORDS OF ACCEPA._^1ACCEPA NUM_"0_,() = THE ONE-WORD REPLY._^1ACCEPQ NUM_"0_,() = (Q)ENTRY = FWA OF MESSAGE._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(Q)ENTRY = FWA OF MESSAGE TO TYPE_^1*_C= 1 + FWA OF MESSAGE LENGTH._^1*_:RTJ TYPOUT_^1*_:(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1TYPOUT NUM_"0_^1_%RTJ_"SAVAQI_'SAVE ALL REGISTERS._^1TYPOUA NUM_"0,0,0_(() = (A),(Q),(I) E€€NTRY._^1_%STQ*_!TYPOUS_"PLACE FWA OF MESSAGE INTO FWRITE._^1_%INQ_"-1_'(Q) = FWA OF MESSAGE LENGTH._^1_%LDQ-_!(ZERO),Q (Q) = MESSAGE LENGTH._^1_%STQ*_!TYPOUN_"PLACE NO. OF WORDS OF MESSAGE INTO FWRITE._^1TYPOUR RTJ-_!(AMONI)_^1_%VFD_"N1/0,N1/1,N5/6,N1/0,X4/PRLVL,X4/PRLVL_^1TYPOUC ADC_"TYPOU1-HERE_"COMPLETION._^1_%NUM_"0_(THREAD._^1TYPOUL VFD_"N3/0,N1/1,N2/2,N10/$FB_"V,M,A,L._^1TYP€€OUN NUM_"0_(NO. OF WORDS IN MESSAGE._^1TYPOUS NUM_"0_(FWA OF MESSAGE._^1* A FOREGROUND VERSION WOULD USE THE FOLLOWING TWO LINES OF CODE._^1*_$SQP_"1_,SKIP IF FWRITE WAS ACCEPTED._^1*_$JMP*_!TYPOUR_'RESUBMIT THE REJECTED FWRITE._^1_%JMP-_!(ADISP)_^1TYPOU1 SQP_"TYPOUX_'SKIP IF FWRITE WAS GOOD._^1_%JMP*_!TYPOUR_"RETRY FWRITE IF IT WAS BAD._^1TYPOUX RTJ_"RESAQI_'RESTORE ALL REGISTERS.€€_^1TYPOU2 ADC_"TYPOUA-HERE_!() = FWA OF A,Q,I SAVE AREA._^1_%JMP*_!(TYPOUT)_"EXIT._^1_%EJT_]_^1* TYPIN READS INTO A BUFFER WHOSE FWA FOLLOWS RTJ TYPIN._^1* THE CALLING SEQUENCE IS_!(YPHASE)ENTRY = 3 * CURRENT PHASE NO._^1*_:(YPRMLV)ENTRY = PROMPTING LEVEL._^1*_:P_!RTJ TYPIN_^1*_:P+1 FWA OF BUFFER = 1 + FWA OF BUFFER LENGTH_^1*_:P+2 RETURN WITH (A) = NO. WORDS OBTAINED,_^1*_J(Q),(I)€€ = (Q)ENTRY,(I)ENTRY._^1*_:(YPHASE),(YPRMLV) EXIT = ENTRY._^1* TYPIN ERRORS LEAD TO ERROR RECOVERY IF (YPHASE).NE.0 OR (YPRMLV)=0,_^1* ELSE TYPIN ERRORS CAUSE ABNORMAL TERMINATION OF RUN._^1* TYPOUT IS CALLED TO PRINT EACH IO-ERROR-FREE REPLY._^1TYPIN NUM_"0_^1_%RTJ_"SAVAQI_^1TYPINA NUM_"0,0,0_^1_%LDA_"YPHASE_'(A)=0 IF SMCEDT IS RUNNING._^1_%LDQ+ IUP_*GET JOB CONTROL INPUT LU_^1_%€€SAZ_"TYPIN3_'SKIP IF SMCEDT IS RUNNING._^1_%LDQ =N$18FD_%(Q) = VMAL FOR INPUT COMMENT LU_^1TYPIN3 STQ*_!TYPINL_'SET VMAL OF FREAD._^1_%LDQ*_!(TYPIN)_%(Q) = FWA OF BUFFER._^1_%RAO*_!TYPIN_(() = FWA OF NSI._^1_%STQ*_!TYPINS_'PLACE FWA OF BUFFER INTO FREAD._^1_%INQ_"-2_+(Q) = -1 + FWA OF LENGTH WORD._^1_%LDQ-_!1,Q_*(Q) = BUFFER LENGTH IN WORDS._^1_%STQ*_!TYPINN_'PLACE BUFFER LENGTH I€€NTO FREAD._^1TYPINR RTJ-_!(AMONI)_^1_%VFD_"N1/0,N1/1,N5/4,N1/0,X4/PRLVL,X4/PRLVL_^1TYPIN1 ADC_"TYPINC-HERE_!COMPLETION._^1_%NUM_"0_,THREAD._^1TYPINL NUM_"0_,V,M,A,L._^1TYPINN NUM_"0_,NO. OF WORDS TO FREAD._^1TYPINS NUM_"0_,FWA OF FREAD BUFFER._^1* A FOREGROUND VERSION WOULD USE THE FOLLOWING TWO LINES OF CODE._^1*_$SQP_"1_,SKIP IF FREAD WAS ACCEPTED._^1*_$JMP*_!TYPINR_'RESUBMIT THE€€ REJECTED FREAD._^1_%JMP-_!(ADISP)_%GIVE UP CPU DURING IO._^1TYPINC SQP_"TYPING_'SKIP IF FREAD IS GOOD._^1_%JMP*_!TYPINB_'JMP IF FREAD IS BAD._^1TYPING LDA*_!TYPINN_'(A) = DESIRED LENGTH OF TRANSFER._^1_%QLS_"1_,(Q)15=1 IFF LENGTH ERROR._^1_%SQP_"TYPINX_'SKIP IF NO LENGTH ERROR._^1_%TRA_"Q_,(Q) = BUFFER LENGTH IN WORDS._^1_%ADQ*_!TYPINS_'(Q) = 1 + LWA OF BUFFER._^1_%INQ_"-2_+(Q) = €€-1 + LWA OF BUFFER._^1_%LDA-_!1,Q_*(A) = 1 + LWA ACTUALLY READ INTO._^1_%SUB*_!TYPINS_'(A) = ACTUAL TRANSFER LENGTH IN WORDS._^1_%SAZ_"TYPINB_'CONSIDER NO TRANSFER TO BE AN ERROR._^1TYPINX STA*_!TYPINA_'CAUSE (A)EXIT TO = NO. OF WORDS OBTAINED._^1* THE CODE BELOW LISTS THE TYPIN REPLY VIA TYPOUT._^1_%LDQ*_!TYPINS_'(Q) = FWA OF TYPIN BUFFER._^1_%INQ_"-2_+(Q) = -1 + FWA OF BUFFER LEN€€GTH-WORD._^1_%STA-_!1,Q_*SET (BUFFER LENGTH-WORD) = REPLY LENGTH._^1_%INQ_"2_,(Q) = FWA OF TYPIN BUFFER._^1_%RTJ_"TYPOUT_'LIST THE REPLY._^1_%LDA*_!TYPINN_'(A) = BUFFER LENGTH._^1_%INQ_"-2_+(Q) = -1 + FWA OF BUFFER LENGTH-WORD._^1_%STA-_!1,Q_*RESTORE (BUFFER LENGTH-WORD)._^1_%RTJ_"RESAQI_'RESTORE (Q)ENTRY,(I)ENTRY. SET (A)EXIT._^1TYPIN2 ADC_"TYPINA-HERE_!FWA OF (A),(Q),(I) SAVE ARE€€A._^1_%JMP*_!(TYPIN)_%EXIT._^1TYPINB LDQ_"=XMSGESC-HERE (Q) = FWA OF ERROR MESSAGE._^1_%LDA_"YPHASE_'(A)=0 IF SMCEDT IS RUNNING._^1_%SAN_"TYPINP_'SKIP IF SMCEDT IS NOT RUNNING._^1* SMCEDT IS RUNNING. LET]S CHECK THE PROMPTING LEVEL._^1_%LDA_"YPRMLV_'(A) = PROMPTING LEVEL._^1_%SAN_"TYPINP_'SKIP IF THERE IS PROMPTING._^1_%SET_"A_,TELL BOMB TO USE TYPOUT, NOT TPHEX._^1_%JMP_"BOMB_)SMC€€ ABNORMALLY TERMINATES._^1TYPINP RTJ_"TYPOUT_'ANNOUNCE THE FREAD ERROR._^1_%JMP*_!TYPINR_'RETRY THE FREAD._^1_%ADC_"MNDESC-MSGESC_^1MSGESC ALF_"/,TYPE-IN ERROR/_^1MNDESC EQU_"MNDESC(*)_^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(A)ENTRY = FWA OF AREA TO DUMP._^1*_:(Q)ENTRY = NO. OF WORDS TO DUMP._^1*_:RTJ HEXDMP_"DUMP THE AREA IN HEX._^1*_:(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1HXDPBL€€ EQU_"HXDPBL(8*3)_!LENGTH OF PRINT BUFFER._^1_%ADC_"HXDPBL_'() = LENGTH OF PRINT BUFFER._^1HXDPBF BZS_"HXDPBF(HXDPBL)_"THE PRINT BUFFER._^1HXDPBA ADC_"HXDPBF+1-HERE () = FWA OF 1ST HEX SLOT._^1HXDMPA NUM_"0_,() = (A)ENTRY._^1HXDMPQ NUM_"0_,() = (Q)ENTRY._^1HXDPIS NUM_"0_,() = FWA OF BINARY INPUT._^1HXDPIE NUM_"0_,() = 1 + LWA OF BINARY INPUT._^1HXDPLS NUM_"0_,() = LINE FWA TO GET N€€EXT STORE OF HEX._^1HXDPLE ADC_"HXDPBF+HXDPBL+1-HERE_"() = FWA OF 1 HEX SLOT TOO MANY._^1HEXDMP NUM_"0_^1_%STA*_!HXDMPA_'SAVE (A)ENTRY._^1_%STQ*_!HXDMPQ_'SAVE (Q)ENTRY._^1_%STA*_!HXDPIS_'POINT TO NEXT BINARY TO CONVERT._^1_%AAQ_"A_,ADD FWA AND LENGTH OF BINARY INPUT._^1_%STA*_!HXDPIE_'() = 1 + LWA OF BINARY INPUT._^1HXDPL0 LDA_"=A_+(A) = BLANK BLANK._^1_%ENQ_"HXDPBL_'(Q) = BUFFER L€€ENGTH IN WORDS._^1HXDPL1 INQ_"-1_+(Q) INDEXES NEXT BUFFER WORD TO BLANK._^1_%SQM_"HXDPL2_'SKIP IF DONE WITH BLANKING OF BUFFER._^1_%STA*_!HXDPBF,Q_$STORE TWO BLANKS IN BUFFER._^1_%JMP*_!HXDPL1_'SEE IF ALL OF BUFFER IS BLANKED YET._^1HXDPL2 LDA*_!HXDPBA_'(A) = FWA OF 1ST HEX SLOT._^1_%STA*_!HXDPLS_'MAKE HEX STORING START AT 1ST HEX SLOT._^1HXDPL3 LDA*_!HXDPIS_'(A) = FWA OF NEXT BINA€€RY INPUT TO CONVERT._^1_%SUB*_!HXDPIE_'(A)15=1 IF THERE IS MORE BINARY TO CONVERT._^1_%SAM_"HXDMPW_'SKIP TO GET NEXT WORD OF BINARY._^1_%LDA*_!HXDPLS_'(A) = FWA OF NEXT HEX SLOT._^1_%EOR*_!HXDPBA_'(A)=0 IF BUFFER IS EMPTY._^1_%SAZ_"HXDPXT_'SKIP OUTPUT IF BUFFER IS EMPTY._^1_%JMP*_!HXDPRT_'OUTPUT THE LAST LINE OF DUMP._^1HXDPXT LDA*_!HXDMPA_'RESTORE (A)ENTRY._^1_%LDQ*_!HXDMPQ_'RESTO€€RE (Q)ENTRY._^1_%JMP*_!(HEXDMP)_$EXIT._^1HXDMPW LDA*_!(HXDPIS)_$(A) = BINARY TO CONVERT TO HEX._^1_%RAO*_!HXDPIS_'() = FWA OF NEXT BINARY TO CONVERT._^1_%LDQ*_!HXDPLS_'(Q) = FWA OF HEX SLOT TO BE USED._^1_%RTJ_"BINHEX_'FORM HEX AND SET IT IN THE HEX SLOT._^1_%INQ_"3_,(Q) = FWA OF THE NEXT HEX SLOT TO BE USED._^1_%STQ*_!HXDPLS_'REMEMBER WHICH HEX SLOT TO USE NEXT TIME._^1_%LDA*_!HXD€€PLE_'(A) = FWA OF 1 HEX SLOT TOO MANY._^1_%EAQ_"A_,(A)=0 IF NEXT HEX SLOT IS 1 SLOT TOO MANY._^1_%SAZ_"HXDPRT_'SKIP TO PRINT A COMPLETED LINE OF HEX._^1_%JMP*_!HXDPL3_'JMP TO ADD MORE HEX TO THE BUFFER._^1HXDPRT LDQ*_!HXDPBA_'(Q) = 1 + FWA OF BUFFER._^1_%INQ_"-1_+(Q) = FWA OF LINE OF DUMP TO BE OUTPUT._^1_%RTJ_"TYPOUT_'OUTPUT THE LINE OF HEX._^1_%JMP*_!HXDPL0_'SEE IF THERE IS MORE €€BINARY TO CONVERT._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(A)ENTRY = BINARY TO BE CONVERTED TO HEX._^1*_:(Q)ENTRY = FWA OF 2-WORD BUFFER._^1*_:RTJ BINHEX_^1*_:(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1BINHEX NUM_"0_^1_%STA*_!B2HXA_(SAVE (A)ENTRY._^1_%STQ*_!B2HXQ_(SAVE (Q)ENTRY._^1_%STQ*_!B2HXPT_'SET POINTER TO HEX BUFFER._^1B2HXLP RTJ*_!B2HXBT_'SET (Q) = 8] HEX VERSION OF NEXT 4] OF €€(A)._^1_%QLS_"8_,LEFT-ADJUST IN (Q) THE 1ST OR 3RD HEX DIGIT._^1_%STQ*_!(B2HXPT)_$SET 1ST OR 3RD HEX DIGIT INTO BUFFER._^1_%RTJ*_!B2HXBT_'SET (Q) = 8] HEX VERSION OF NEXT 4] OF (A)._^1_%ADQ*_!(B2HXPT)_$ADD TO (Q) THE 2ND OR 4TH HEX DIGIT._^1_%STQ*_!(B2HXPT)_$SET 1ST,2ND OR 3RD,4TH HEX DIGITS INTO BUF._^1_%LDQ*_!B2HXQ_((Q) = (Q)ENTRY._^1_%ADQ*_!B2HXPT_'(Q) = 2*N OR 1+2*N FOR N=(Q)EN€€TRY._^1_%QLS_"15_+(Q)15=1 IF ALL DONE._^1_%SQM_"B2HXIT_'SKIP IF ALL DONE._^1_%RAO*_!B2HXPT_'POINT TO 2ND WORD OF BUFFER._^1_%JMP*_!B2HXLP_'CONVERT THE 2ND HALF OF (A)ENTRY._^1B2HXIT LDA*_!B2HXA_(RESTORE (A)ENTRY._^1_%LDQ*_!B2HXQ_(RESTORE (Q)ENTRY._^1_%JMP*_!(BINHEX)_$EXIT._^1* THE CALLING SEQUENCE IS_!(A)ENTRY = $WXYZ._^1*_:RTJ B2HXBT_^1*_:(A)EXIT = $XYZ0._^1*_:(Q)EXIT = $30,...,$3€€9,$41,...,$46_^1*_:AS W IS_#0,..., 9, $A,..., $F._^1B2HXBT NUM_"0_^1_%CLR_"Q_,PREPARE TO SET (Q) = NEXT 4] OF (A)._^1_%LLS_"4_,SET (Q) = NEXT 4] OF (A)._^1_%INQ_"-10_*(Q)15=1 IF WE ARE TO GENERATE $30,...,$39._^1_%SQM_"1_,SKIP TO GENERATE ONE OF $30,...,$39._^1_%INQ_"$41-10-$30_"PREPARE TO GENERATE ONE OF $41,...,$46._^1_%INQ_"10+$30_'(Q) = 8] HEX VERSION OF THE LATEST 4] OF (A)_^€€1_%JMP*_!(B2HXBT)_$EXIT._^1B2HXA NUM_"0_,() = (A)ENTRY._^1B2HXQ NUM_"0_,() = (Q)ENTRY._^1B2HXPT NUM_"0_,() = FWA OF CURRENT HEX BUFFER WORD._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(Q)ENTRY = 1ST 16] TO CONVERT TO BCD._^1*_:(A)ENTRY = 2ND 16] TO CONVERT TO BCD._^1*_:P_!RTJ BIGB2D_^1*_:P+1 FWA OF 4-WORD BCD BUFFER._^1*_:P+2 RETURN WITH (A),(Q),(I) EXIT =_^1*_J(A),(Q),(I) ENTRY._^1B€€IGB2D NUM_"0_^1_%STA*_!BGB2DA_'SAVE (A)ENTRY._^1_%STQ*_!BGB2DQ_'SAVE (Q)ENTRY._^1_%TRQ_"A_,(A) = 1ST 16] TO CONVERT TO BCD._^1_%LDQ*_!(BIGB2D)_$(Q) = FWA OF 4-WORD BCD BUFFER._^1_%RTJ*_!BINDEC_'GENERATE 1ST,2ND BCD WORDS._^1_%INQ_"2_,(Q) = FWA OF 3RD BCD WORD._^1_%LDA*_!BGB2DA_'(A) = 2ND 16] TO CONVERT TO BCD._^1_%RTJ*_!BINDEC_'GENERATE 3RD,4TH BCD WORDS._^1_%LDA*_!BGB2DA_'RESTORE €€(A)ENTRY._^1_%LDQ*_!BGB2DQ_'RESTORE (Q)ENTRY._^1_%RAO*_!BIGB2D_'SET UP P+2 EXIT._^1_%JMP*_!(BIGB2D)_$EXIT._^1BGB2DA NUM_"0_,() = (A)ENTRY._^1BGB2DQ NUM_"0_,() = (Q)ENTRY._^1_%EJT_]_^1* BINDEC HANGS IF (A)ENTRY .GE. 10000, ELSE BINDEC CONVERTS (A)ENTRY_^1* TO 4 ASCII DECIMAL DIGITS AND PLACES THESE DECIMAL DIGITS IN THE_^1* TWO WORD BUFFER WITH FWA = (Q)ENTRY._^1* THE CALLING SEQUEN€€CE IS_!(A)ENTRY = BINARY TO CONVERT TO BCD._^1*_:(Q)ENTRY = FWA OF 2-WORD-BUFFER._^1*_:RTJ BINDEC_^1*_:(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1BINDEC NUM_"0_^1_%RTJ_"SAVAQI_"SAVE ALL REGISTERS._^1B2DA_!NUM_"0_(() = (A)ENTRY._^1B2DQ_!NUM_"0_(() = (Q)ENTRY._^1_%NUM_"0_(() = (I)ENTRY._^1B2DLCK SUB_"=N10000_!(A)15=1 IF NO. TO CONVERT .LE. 9999._^1_%SAM_"B2DBOK_"SKIP IF NO. TO CONVERT .€€LE. 9999._^1_%RTJ WIERD_(ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM -6_+ANNOUNCE ERROR NO.6 AND STOP YHE RUN._^1B2DBOK LDA*_!B2DA_$(A) = NO. TO CONVERT._^1_%STQ-_!I_((I) = FWA OF DESTINATION OF CONVERSION._^1_%LDQ_"=A00_$(Q) = TWO ASCII ZEROS._^1_%STQ-_!1,I_%ZERO 2ND WD OF DEST IN CASE B2DLUP DONE ONCE._^1B2DLUP CLR_"Q_((Q)=0. (A) = BITS TO CONVERT._^1_%DVI*_!B2D10_#(Q) = 4TH O€€R 2ND DIGIT (1ST IS MOST SIG.)._^1_%INQ_"$30_%(Q)15-8=0. (Q)7-0 = 4TH OR 2ND ASCII DIGIT._^1_%STQ-_!(ZERO),I SET 1ST OR 2ND WORD OF DESTINATION._^1_%CLR_"Q_((Q)=0. (A) = BITS TO CONVERT._^1_%DVI*_!B2D10_#(Q) = 3RD OR 1ST DIGIT (1ST IS MOST SIG.)._^1_%INQ_"$30_%(Q)15-8=0. (Q)7-0 = 3RD OR 1ST ASCII DIGIT._^1_%QLS_"8_((Q)15-8 = 3RD OR 1ST ASCII DIGIT. (Q)7-0=0._^1_%ADQ-_!(ZERO),I (Q€€) = 3RD,4TH OR 2ND,1ST ASCII DIGITS._^1_%STQ-_!(ZERO),I SET 1ST OR 2ND WORD OF DESTINATION._^1_%RAO-_!I_(NEXT B2DLUP WILL DO 2ND WORD. 1ST WORD NOW DONE._^1_%SAZ_"B2DXIT_"SKIP IF NO MORE TO CONVERT._^1_%JMP*_!B2DLUP_^1* NOW WE MUST EXCHANGE THE TWO WORDS SINCE THEY WERE CREATED IN REVERSE_^1* ORDER TO TAKE ADVANTAGE OF THE RAO INSTRUCTION._^1B2DXIT LDA*_!B2DQ_)(A) = FWA OF 2-WORD-€€BUFFER._^1_%STA-_!I_,(I) = FWA OF 3RD,4TH ASCII DIGITS._^1_%LDQ-_!1,I_%(Q) = 1ST,2ND ASCII DIGITS FROM 2ND DEST. WORD._^1_%LDA-_!(ZERO),I (A) = 3RD,4TH ASCII DIGITS FROM 1ST DEST. WORD._^1_%STQ-_!(ZERO),I_$(1ST DEST. WORD) = 1ST,2ND ASCII DIGITS._^1_%STA-_!1,I_*(2ND DEST. WORD) = 3RD,4TH ASCII DIGITS._^1_%RTJ_"RESAQI_"RESTORE ALL REGISTERS._^1B2D01 ADC_"B2DA-HERE_"() = FWA OF A,Q€€,I SAVE AREA._^1_%JMP*_!(BINDEC) EXIT._^1B2D10 NUM_"10_'OUR RADIX._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(A)ENTRY = -0 OR 16] TO MAKE INTO BCD OR HEX_^1*_:(Q)ENTRY = -0 OR FWA OF ASCII PREFIX._^1*_:(HXBCDS)ENTRY = EVEN,ODD FOR HEX,BCD._^1*_:RTJ HADOUT_"OUTPUT HEX,ASCII, OR DECIMAL._^1*_:(A),(Q),(I),(HXBCDS) EXIT = ENTRY._^1HADOUT NUM_"0_^1_%RTJ_"SAVAQI_'SAVE (A),(Q),(I) ENTRY._^€€1HADOA NUM_"0,0,0_(() = (A),(Q),(I) ENTRY._^1_%EOR-_!HXFFFF_'(A)=0 IF (A)ENTRY = -0._^1_%SAZ_"HADOAF_'SKIP IF (A)ENTRY = -0._^1_%SET_"A_,SET (A)=-0 TO TEST WHETHER (Q)ENTRY=-0._^1_%EAQ_"A_,(A)=0 IF (Q)ENTRY = -0._^1_%SAN_"HADOTX_'SKIP IF (Q)ENTRY = FWA OF PREFIX._^1_%ENQ_"ZERO+1_'TELL TPHEX THAT PREFIX LENGTH IS ZERO._^1HADOTX LDA*_!HADOA_((A) = BINARY TO CONVERT TO HEX OR BCD._^1€€_%RTJ*_!TPHEX_(ANNOUNCE PREFIX AND HEX OR BCD SUFFIX._^1HADOXT RTJ_"RESAQI_'RESTORE (A),(Q),(I) ENTRY._^1HADO01 ADC_"HADOA-HERE_"() = FWA OF HADOA._^1_%JMP*_!(HADOUT)_$EXIT._^1HADOAF SET_"A_,SET (A)=-0 TO TEST WHETHER (Q)ENTRY=-0._^1_%EAQ_"A_,(A)=0 IF (Q)ENTRY = -0._^1_%SAZ_"HADOFF_'SKIP IF -0 = (Q)ENTRY AS WELL AS (A)ENTRY._^1_%RTJ_"TYPOUT_'ANNOUNCE PREFIX WITHOUT SUFFIX._^1HADOFF€€ JMP*_!HADOXT_'PREPARE TO EXIT._^1_%EJT_]_^1* BOMB ALWAYS OUTPUTS THE MESSAGE ]FATAL ERROR] AND THEN STOPS THE RUN._^1* BOMB MAY PRECEDE THE ABOVE MESSAGE WITH ANOTHER MESSAGE ACCORDING_^1* TO (A),(Q),(HXBCDS) ENTRY._^1* THE CALLING SEQUENCE IS_!(A)ENTRY = -0 OR 16] TO MAKE INTO BCD OR HEX_^1*_:(Q)ENTRY = -0 OR FWA OF ASCII PREFIX._^1*_:(HXBCDS)ENTRY = EVEN,ODD FOR HEX,BCD._^1*_:RT€€J BOMB_"GIVE UP CPU FOREVER, I.E. DIE._^1BOMB_!NUM_"0_^1_%RTJ*_!HADOUT_'OUTPUT OPTIONAL MESSAGE DEPENDING ON PARAMS._^1BOMBX LDQ_"=XMSGBOM-HERE (Q) = FWA OF ]FATAL ERROR]._^1_%RTJ_"TYPOUT_'ANNOUNCE ]FATAL ERROR]._^1_%JMP-_!(ADISP)_%GIVE UP THE CPU._^1_%ADC_"MNDBOM-MSGBOM_^1MSGBOM ALF_"/,FATAL ERROR/_^1MNDBOM EQU_"MNDBOM(*)_^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(A)ENTRY = BINARY T€€O BECOME BCD SUFFIX,_^1*_@OR = FWA OF 2 WORDS OF BINARY._^1*_:(Q)ENTRY = FWA OF PREFIX_^1*_C= 1 + FWA OF PREFIX LENGTH._^1*_:RTJ TPDEC_^1*_:(A)EXIT = (A)ENTRY. (Q)EXIT = (Q)ENTRY._^1TPDEC NUM_"0_^1_%RTJ*_!TPHEX_(PUBLISH PREFIX WITH BCD SUFFIX._^1TPDECX JMP*_!(TPDEC)_%EXIT._^1*_]_^1* THE CALLING SEQUENCE IS_!(A)ENTRY = FWA OF 2 BINARY WORDS_^1*_>TO BECOME 4-WORD BCD SUFFIX._^1*_:(Q€€)ENTRY = FWA OF PREFIX_^1*_C= 1 + FWA OF PREFIX LENGTH._^1*_:RTJ BTDEC_^1*_:(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1BTDEC NUM_"0_^1_%RTJ*_!TPDEC_(PUBLISH PREFIX WITH BCD SUFFIX._^1BTDECX JMP*_!(BTDEC)_%EXIT._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(A)ENTRY DESIGNATES BINARY TO CONVERT TO_^1*_>HEX OR BCD SUFFIX._^1*_:(Q)ENTRY = FWA OF PREFIX_^1*_C= 1 + FWA OF PREFIX LENGTH._^1*_:RTJ€€ TPHEX_^1*_:(A)EXIT = (A)ENTRY. (Q)EXIT = (Q)ENTRY._^1* TPHEX CONVERTS (A)ENTRY TO A HEX SUFFIX UNLESS TPHEX WAS CALLED BY_^1* TPDEC, WHICH CAUSES A BCD SUFFIX._^1* IF BTDEC CALLED TPDEC CALLED TPHEX,_^1* THEN (A)ENTRY = FWA OF 2 BINARY WORDS,_^1* EACH .GE. 0 AND .LE. 9999, TO CONVERT TO 4 WORDS OF BCD._^1* IF TPDEC CALLED TPHEX, BUT BTDEC DID NOT CALL TPDEC,_^1* THEN (A)ENTRY IS C€€ONVERTED TO 2 BCD WORDS IF 0 .LE. (A)ENTRY .LE. 9999_^1* AND TO 4 BCD WORDS IF 10000 .LE. (A)ENTRY .LE. 65535._^1TPHEX NUM_"0_^1_%STA*_!TPHEXA_'SAVE (A)ENTRY._^1_%STQ*_!TPHEXQ_'SAVE (Q)ENTRY._^1_%INQ_"-1_+(Q) = FWA OF PREFIX LENGTH._^1_%STQ_"MVSRCE_'TELL MOVE THE FWA OF PREFIX LENGTH._^1TPHEX1 LDQ_"=XTPHXSX+2-HERE_"(Q) = FWA OF HEX BUFFER._^1* SEE TPDEC W.R.T. TPHEX AND HXBCD._^1_€€%RTJ*_!HXBCD_(CONVERT (A)ENTRY TO HEX OR BCD IN BUFFER._^1TPHEX2 LDA_"=XTPHXSX-HERE (A) = 1 + LWA OF PREFIX DESTINATION._^1_%SUB_"(MVSRCE)_$(A) = FWA OF PREFIX DESTINATION._^1_%INA_"-1_+(A) = FWA OF PREFIX-LENGTH DESTINATION._^1_%STA_"MVDEST_'TELL MOVE THE PREFIX-LENGTH DESTINATION._^1_%SUB*_!TPHEX2+1_$(A) = - LENGTH OF PREFIX AND LENGTH WORD._^1_%TCA_"Q_,(Q) = LENGTH OF PREFIX AND€€ LENGTH WORD._^1_%RTJ_"MOVE_)MOVE PREFIX AND ITS LENGTH WORD._^1_%LDQ_"MVDEST_'(Q) = FWA OF LENGTH WORD FOR MESSAGE._^1_%LDA-_!(ZERO),Q_$(A) = LENGTH OF PREFIX._^1_%INA_"6_,ADD SUFFIX LENGTH. (A) = MESSAGE LENGTH._^1_%STA-_!(ZERO),Q_$SET LENGTH WORD OF MESSAGE._^1_%INQ_"1_,(Q) = FWA OF MESSAGE._^1_%RTJ_"TYPOUT_'PUBLISH THE MESSAGE._^1_%LDA*_!TPHEXA_'RESTORE (A)ENTRY._^1_%LDQ*_!TPHE€€XQ_'RESTORE (Q)ENTRY._^1_%JMP*_!(TPHEX)_%EXIT._^1TPHEXA NUM_"0_,() = (A)ENTRY._^1TPHEXQ NUM_"0_,() = (Q)ENTRY._^1_%BZS_"(20)_)PREFIX DESTINATION IN MOVE._^1TPHXSX ALF_"/, =XX/_%START OF SUFFIX. ALTERED BY HXBCD._^1_%NUM_"0,0,0,0_%HEX OR BCD BUFFER WITHIN SUFFIX._^1_%EJT_]_^1* IF (TPHEX)ENTRY INDICATE THAT TPHEX WAS NOT CALLED BY TPDEC,_^1* THEN (TPHEXA)ENTRY ARE CONVERTED TO HEX. I€€F TPDEC IS THE CALLER,_^1* THEN BCD IS PRODUCED, EITHER FROM (TPHEXA)ENTRY OR FROM 2 WORDS_^1* WITH FWA = (TPHEXA)ENTRY. SEE TPDEC AND BTDEC._^1*_:(Q)ENTRY = FWA OF HEX OR BCD BUFFER._^1*_:RTJ HXBCD_^1HXBCD NUM_"0_^1_%STQ*_!HXBCDQ_'SAVE (Q)ENTRY._^1_%LDA_"=A_+(A) = TWO BLANK BYTES._^1_%STA*_!TPHXSX+1_$SET BCD IDENTIFIER INTO SUFFIX._^1_%STA*_!TPHXSX+4_$BLANK THE 1ST OPTIONAL BCD W€€ORD._^1_%STA*_!TPHXSX+5_$BLANK THE 2ND OPTIONAL BCD WORD._^1_%LDA*_!TPHEX_((A) = FWA OF NSI OF TPHEX CALLER._^1HXBCD0 EOR_"=XTPDECX-HERE (A)=0 IF TPDEC CALLED TPHEX._^1_%SAZ_"HXBCDD_'SKIP IF TPDEC CALLED TPHEX._^1_%LDA_"=A $_^1_%STA*_!TPHXSX+1_$SET HEX IDENTIFIER INTO SUFFIX._^1_%LDA*_!TPHEXA_'(A) = BINARY TO CONVERT TO HEX._^1_%RTJ_"BINHEX_'FORM HEX IN BUFFER WITH FWA = (Q)._^1_%J€€MP*_!(HXBCD)_%EXIT._^1HXBCDD LDA*_!TPDEC_((A) = FWA OF NSI OF TPDEC CALLER._^1HXBCD1 EOR_"=XBTDECX-HERE (A)=0 IF BTDEC CALLED TPDEC._^1_%SAN_"HXBCDT_'SKIP IF BTDEC DIDN]T CALL TPDEC._^1_%LDA*_!(TPHEXA)_$(A) = (1ST BINARY WORD)._^1_%LDQ*_!TPHEXA_'(Q) = FWA OF 1ST BINARY WORD._^1_%LDQ-_!1,Q_*(Q) = (2ND BINARY WORD)._^1_%JMP*_!HXBCD4_'CONVERT THE TWO WORDS._^1HXBCDT CLR_"Q_,PREPARE TO€€ DIVIDE._^1_%LDA*_!TPHEXA_'(A) = BINARY TO CONVERT TO BCD._^1_%DVI_"=N10000_%(Q) = REMAINDER. (A) = QUOTIENT._^1_%SAN_"HXBCD4_'SKIP IF 4 WORDS OF BCD TO MAKE._^1_%TRQ_"A_,(A) = BINARY TO CONVERT TO BCD._^1HXBCD2 LDQ*_!HXBCDQ_'(Q) = FWA OF BCD DESTINATION._^1_%RTJ_"BINDEC_'FORM BCD IN BUFFER WITH FWA = (Q)._^1_%JMP*_!(HXBCD)_%EXIT._^1HXBCD4 STQ*_!HXBCDA_'SAVE CONVERTEE FOR LOWER BCD€€._^1_%LDQ*_!HXBCDQ_'(Q) = FWA OF UPPER BCD DESTINATION._^1_%RTJ_"BINDEC_'FORM 1ST 2 (OF 4) BCD WORDS._^1_%RAO*_!HXBCDQ_'() = FWA OF 2ND BCD WORD._^1_%RAO*_!HXBCDQ_'() = FWA OF 3RD BCD WORD._^1_%LDA*_!HXBCDA_'(A) = CONVERTEE FOR LOWER BCD._^1_%JMP*_!HXBCD2_'FORM 2ND 2 (OF 4) BCD WORDS._^1HXBCDA NUM_"0_,() = CONVERTEE FOR LOWER BCD._^1HXBCDQ NUM_"0_,() = (Q)ENTRY._^1_%EJT 0_^1* THE€€ CALLING SEQUENCE IS_!P_"RTJ WIERD_^1*_;P+1 CONDITION., OR ITS COMPLEMENT_^1*_;P+2 EXIT FOR POSITIVE CONDITION NO._^1*_;(A),(Q),(I) EXIT = (A),(Q),(I) ENTRY._^1* WIERD JUMPS TO BOMB FOR NEGATIVE CONDITION NUMBERS._^1WIERDA NUM 0_,() = (A)ENTRY._^1WIERDQ NUM 0_,() = (Q)ENTRY._^1WIERD NUM 0_^1_%STA* WIERDA_'SAVE (A) ENTRY._^1_%STQ* WIERDQ_'SAVE (Q)ENTRY._^1WIERD1 LDQ =XMSGABE-€€HERE (Q) = FWA OF PREFIX._^1_%LDA* (WIERD)_%(A) = NO. OF THE WIERD CONDITION._^1_%SAP WIERDT_'SKIP IF POSITIVE CONDITION._^1_%TCA A_,COMPLEMENT NEGATIVE CONDITION NO._^1WIERDT RTJ TPDEC_(ANNOUNCE THE WIERD CONDITION._^1_%LDA* (WIERD)_%(A) 15=1 IF FATAL CONDITION._^1_%SAM WIERDB_'BOMB IF ORDERED TO._^1_%LDA* WIERDA_'RESTORE (A)ENTRY._^1_%LDQ* WIERDQ_'RESTORE (Q)ENTRY._^1_%RAO* W€€IERD_(SET UP FOR P+2 EXIT._^1_%JMP* (WIERD)_%TAKE P+2 EXIT._^1WIERDB SET A,Q_*DESELECT OPTIONAL BOMB MESSAGE._^1_%JMP BOMB_)STOP THE RUN._^1_%ADC MNDABE-MSGABE_^1MSGABE ALF *,ABNORMAL ERROR*_^1MNDABE EQU MNDABE(*)_^1_%EJT_]_^1***SMC FIXED TABLES***_^1YLOCOR NUM 0_,() = FWA OF SMC, I.E. FWA OF 1ST PHASE._^1YIFTAD NUM_"0_(() = FWA OF INPUT FILE TABLES DEFINED BY SMCEDT._^1YEND_€€!ADC_"YKEY-HERE_#() = 1 + LWA OF VARIABLE TABLES._^1YHICOR NUM_"0_,() = 1 + LWA OF AVAILABLE CORE._^1YFTSIZ ADC_"FTSIZE_'() = FILE TABLE SIZE._^1YEDTSZ ADC_"EDTSIZ_'() = SIZE OF EDIT RESIDENT._^1YSRTSZ ADC_"SRTSIZ_'() = SIZE OF INTERNAL-SORT RESIDENT._^1YIMGSZ ADC_"IMGSIZ_'() = SIZE OF INTERMEDIATE-MERGE RESIDENT._^1YFMGSZ ADC_"FMGSIZ_'() = SIZE OF FINAL-MERGE RESIDENT._^1YPHASE NU€€M_"-1_+() = NUMBER OF CURRENT PHASE._^1YDM_"NUM_"0_+()15=1 IFF SORT. ()14-0 = NO. OF INPUT FILES._^1YKCT_!NUM_"0_(()15=1 IFF SEQ. CHECKING. ()14-0 = NO. OF KEYS._^1YG_#NUM_"0_,() = NO. OF REAL BINS IN TOURNAMENT._^1YU_#NUM_"0_,() = UNIT-STRINGS RATING OF SMCIMG._^1Y0WAY NUM_"0_,() = WAY OF 1ST INTERMEDIATE MERGE._^1YIWAY NUM_"0_,() = MAXIMUM WAY OF INTERMEDIATE MERGE._^1YFWAY NU€€M_"0_,() = MAXIMUM WAY OF FINAL MERGE._^1YSUMIB NUM_"0_,() = SUM OF USER INPUT BLOCK SIZES._^1YMAXIB NUM_"0_,() = MAXIMUM OF USER INPUT BLOCK SIZES._^1YWKBSZ NUM_"0_,() = WORK FILE BLOCK SIZE._^1* (YSRCNT),(YSRCNT+1) ARE SET BY INIT OF SMCIMG OR OF SMCFMG._^1YSRCNT NUM_"0,0_*() = NO. OF RECORDS INPUT TO SMCSRT._^1YIRCNT NUM_"0,0_*() = NO. OF RECORDS INPUT TO PHASE._^1YORCNT NUM_"0,€€0_*() = NO. OF RECORDS OUTPUT FROM PHASE._^1YSQ2MG NUM_"0_,() = NO. OF SEQUENCES LEFT TO MERGE._^1YSEQCT NUM_"0_,() = NO. OF SEQUENCES OUT OF SMCSRT._^1YCMPKY ADC_"CMPKEY-HERE_!() = FWA OF CMPKEY._^1YZERO ADC_"CLR-HERE_$() = FWA OF CLR._^1YBIGCT ADC_"BIGCNT-HERE_!() = FWA OF BIGCNT._^1YBGADD ADC_"BIGADD-HERE_!() = FWA OF BIGADD._^1YBGSUB ADC_"BIGSUB-HERE_!() = FWA OF BIGSUB._^1YBI€€GQ NUM_"0_,() = 1ST HALF OF 2-WORD RESULT._^1YBIGA NUM_"0_,() = 2ND HALF OF 2-WORD RESULT._^1YGORQT ADC_"GORQT-HERE_"() = FWA OF GORQT._^1YGETU ADC_"GETU-HERE_#() = FWA OF GETU._^1YPUTU ADC_"PUTU-HERE_#() = FWA OF PUTU._^1YLAPUT NUM_"0_,() = FWA OF DESTINATION OF LAST RECORD PUT._^1YFMLUN NUM_"0,0,0,0_%() = 1 TO 4 FILE MGR. LUN]S._^1YSEGLU NUM_"0_,() = LUN OF SEGMENT FILE._^1YS€€EGFN NUM_"0_,() = FILNUM OF SEGMENT FILE._^1YCLSU ADC_"CLSU-HERE_#() = FWA OF CLSU._^1YREL_!ADC_"REL-HERE_$() = FWA OF REL._^1YGTSEQ ADC_"GETSEQ-HERE_!() = FWA OF GETSEQ._^1YBOS_!ADC_"BOS-HERE_$() = FWA OF BOS._^1YEOS_!ADC_"EOS-HERE_$() = FWA OF EOS._^1YCLRFT ADC_"CLRFT-HERE_"() = FWA OF CLRFT._^1YSVAQI ADC_"SAVAQI-HERE_!() = FWA OF SAVAQI._^1YREAQI ADC_"RESAQI-HERE_!() = FWA OF R€€ESAQI._^1YACCEP ADC_"ACCEPT-HERE_!() = FWA OF ACCEPT._^1YTYPOT ADC_"TYPOUT-HERE_!() = FWA OF TYPOUT._^1YTYPIN ADC_"TYPIN-HERE_"() = FWA OF TYPIN._^1YPRMLV NUM_"0_,() = 0,1,2 = PROMPTING LEVEL._^1YHXDMP ADC_"HEXDMP-HERE_!() = FWA OF HEXDMP._^1YB2H_!ADC_"BINHEX-HERE_!() = FWA OF BINHEX._^1YBGB2D ADC_"BIGB2D-HERE_!() = FWA OF BIGB2D._^1YB2D_!ADC_"BINDEC-HERE_!() = FWA OF BINDEC._^1YHA€€DOT ADC_"HADOUT-HERE_!() = FWA OF HADOUT._^1YBOMB ADC_"BOMB-HERE_#() = FWA OF BOMB._^1YTPDEC ADC_"TPDEC-HERE_"() = FWA OF TPDEC._^1YBTDEC ADC_"BTDEC-HERE_"() = FWA OF BTDEC._^1YTPHEX ADC_"TPHEX-HERE_"() = FWA OF TPHEX._^1YWIERD ADC WIERD-HERE_"() = FWA OF WIERD._^1YOFT_!BZS_"YOFT(REQBUF) 1ST PART OF OUTPUT FILE TABLE._^1YCMPFA ADC_"CMPFA-1-HERE () = -1 + FWA OF CMPFA._^1YCMPFD €€ADC_"CMPFD-1-HERE () = -1 + FWA OF CMPFD._^1YCMPSA ADC_"CMPSA-1-HERE () = -1 + FWA OF CMPSA._^1YCMPSD ADC_"CMPSD-1-HERE () = -1 + FWA OF CMPSD._^1YCMPLA ADC_"CMPLA-1-HERE () = -1 + FWA OF CMPLA._^1YCMPLD ADC_"CMPLD-1-HERE () = -1 + FWA OF CMPLD._^1YCMCLA ADC_"CMPCLA-1-HERE () = -1 + FWA OF CMPCLA._^1YCMCLD ADC_"CMPCLD-1-HERE () = -1 + FWA OF CMPCLD._^1YCMPWA ADC_"CMPWA-1-HERE €€ () = -1 + FWA OF CMPWA._^1YCMPWD ADC_"CMPWD-1-HERE () = -1 + FWA OF CMPWD._^1YCMCUA ADC_"CMPCUA-1-HERE () = -1 + FWA OF CMPCUA._^1YCMCUD ADC_"CMPCUD-1-HERE () = -1 + FWA OF CMPCUD._^1_%BZS_"(YOFT+FTSIZE-*)_"LAST PART OF OUTPUT FILE TABLE._^1YKEY_!EQU_"YKEY(*)_%SMCEDT WILL BUILD THE KEY TABLE HERE._^1_%EJT_]_^1INIT_!NUM_"0_^1_%RTJ*_!RELOC_(RELOCATE ALL RELOCATABLES._^1INIT01 LDQ_"€€=XMSGBEG-HERE (Q) = FWA OF MESSAGE._^1_%RTJ_"TYPOUT_'ANNOUNCE START OF RUN._^1INIT02 LDA_"=XYKEY-HERE_!(A) = FWA OF THE KEY TABLE._^1_%STA_"KEYTBL_'TELL FWA OF KEY TABLE TO CMPKEY._^1_%RTJ_"SYFMLU_'SET YFMLUN FOR USE BY DEF._^1_%LDQ_"SMCMON_'(Q) = 1 + FWA OF SMC._^1_%INQ_"-1_+(Q) = FWA OF SMC._^1_%STQ_"YLOCOR_'STASH FWA OF SMC IN FIXED TABLES._^1INIT05 LDA_"=XYLOCOR-HERE (A) = FWA €€OF FIXED TABLES._^1_%STA-_!(ZERO),Q_$TELL LOAD TO PASS IT ON TO HIS LOADEE._^1_%CLR_"A,Q_*PREPARE TO DETERMINE LIMITS OF CORE._^1_%CORE_^1_%STA_"YHICOR_'(A) = 1 + LWA AVAILABLE CORE._^1_%SUB_"YEDTSZ_'(A) = FWA OF LOAD POINT OF SMCEDT._^1_%TRA_"Q_,(Q) = FWA OF LOAD POINT OF SMCEDT._^1_%SUB_"KEYTBL_'(A)15=1 IF TOO LITTLE CORE._^1_%SAP_"INIT04_'SKIP IF ENOUGH CORE._^1INIT03 LDQ_"=XMSG€€TLC-HERE (Q) = FWA OF ERROR MESSAGE._^1_%SET_"A_,DELETE SUFFIX._^1_%JMP_"BOMB_)ABNORMALLY TERMINATE._^1INIT04 CLR_"A_,SELECT SMCEDT._^1_%JMP*_!(INIT)_'EXIT._^1_%ADC_"MNDBEG-MSGBEG_^1MSGBEG ALF_"/,SMC BEGINS/_^1MNDBEG EQU_"MNDBEG(*)_^1_%ADC_"MNDTLC-MSGTLC_^1MSGTLC ALF_"/,TOO LITTLE CORE/_^1MNDTLC EQU_"MNDTLC(*)_^1_%EJT_]_^1* RELOC RELOCATES THE WORDS MENTIONED IN THE LIST, RELOC4._^€€1RELOC NUM_"0_^1_%ENQ_"RELOC3_"(Q) = NO. OF ENTRIES IN RELOC4._^1RELOC7 INQ_"-1_'(Q) = INDEX TO NEXT RELOCATEE._^1_%SQP_"RELOC6_"SKIP IF NOT DONE._^1_%JMP*_!(RELOC)_!EXIT IF DONE._^1RELOC6 LDA*_!RELOC4,Q (A) = FWA OF RELOCATEE - FWA OF HERE._^1_%ADD*_!INIT_)(A) = FWA OF RELOCATEE._^1_%STA*_!RELOC5_"SAVE FWA OF RELOCATEE._^1_%LDA*_!(RELOC5) (A) = RELOCATEE._^1_%ADD*_!INIT_)(A) = €€RELOCATED (RELOCATEE)._^1_%STA*_!(RELOC5) SET RELOCATEE._^1_%JMP*_!RELOC7_"JMP TO SEE IF DONE._^1RELOC5 NUM_"0_(() = FWA OF RELOCATEE._^1RELOC4 EQU_"RELOC4(*)_^1_%ADC_"SMCREL+1-HERE_^1_%ADC_"SMCEND+1-HERE_^1_%ADC_"BGADLA+1-HERE_^1_%ADC_"TYRCT0-HERE_^1_%ADC_"TYRCT1-HERE_^1_%ADC_"TYRCT2-HERE_^1_%ADC_"TYRCT4-HERE_^1_%ADC_"GORQTM-HERE_^1_%ADC_"GETU06-HERE_^1_%ADC_"GETU02+1-HERE_^1_%AD€€C_"GETU05-HERE_^1_%ADC_"GETU05+1-HERE_^1_%ADC_"GETU05+2-HERE_^1_%ADC_"GETU05+3-HERE_^1_%ADC_"LUFNO1+1-HERE_^1_%ADC_"LUFNO2+1-HERE_^1_%ADC_"PUTUWT-HERE_^1_%ADC_"PUTUWT+1-HERE_^1_%ADC_"PUTUWT+2-HERE_^1_%ADC_"PUTUWT+3-HERE_^1_%ADC_"CLSU01-HERE_^1_%ADC_"RELERR+1-HERE_^1_%ADC_"REL04-HERE_^1_%ADC_"GTSQ01+1-HERE_^1_%ADC_"GTSQ02-HERE_^1_%ADC_"GTSQER+1-HERE_^1_%ADC_"GTSQ03-HERE_^1_%ADC_"PTS€€Q04+1-HERE_^1_%ADC_"PTSQ01-HERE_^1_%ADC_"PTSQ02-HERE_^1_%ADC_"RDD02-HERE_^1_%ADC_"RDD01+1-HERE_^1_%ADC_"GTSEG4+1-HERE_^1_%ADC_"FWASGF-HERE_^1_%ADC_"SEGFT+BUFWA-HERE_^1_%ADC_"RDT01-HERE_^1_%ADC_"RDTRST+1-HERE_^1_%ADC_"RDTWLB+1-HERE_^1_%ADC_"WRTD03-HERE_^1_%ADC_"WRTD08+1-HERE_^1_%ADC_"WRTT07-HERE_^1_%ADC_"WRTT08+1-HERE_^1_%ADC_"DEFTLD+1-HERE_^1_%ADC_"DEF01+1-HERE_^1_%ADC_"DEF02-HERE_€€^1_%ADC_"DEF03-HERE_^1_%ADC_"ACCEP1-HERE_^1_%ADC_"TYPOUC-HERE_^1_%ADC_"TYPOU2-HERE_^1_%ADC_"TYPIN1-HERE_^1_%ADC_"TYPIN2-HERE_^1_%ADC_"TYPINB+1-HERE_^1_%ADC_"HXDPBA-HERE_^1_%ADC_"HXDPLE-HERE_^1_%ADC_"B2D01-HERE_^1_%ADC_"HADO01-HERE_^1_%ADC_"BOMBX+1-HERE_^1_%ADC_"TPHEX1+1-HERE_^1_%ADC_"TPHEX2+1-HERE_^1_%ADC_"HXBCD0+1-HERE_^1_%ADC_"HXBCD1+1-HERE_^1_%ADC WIERD1+1-HERE_^1_%ADC_"YEND-HE€€RE_^1_%ADC_"YCMPKY-HERE_^1_%ADC_"YZERO-HERE_^1_%ADC_"YBIGCT-HERE_^1_%ADC_"YBGADD-HERE_^1_%ADC_"YBGSUB-HERE_^1_%ADC_"YGORQT-HERE_^1_%ADC_"YGETU-HERE_^1_%ADC_"YPUTU-HERE_^1_%ADC_"YCLSU-HERE_^1_%ADC_"YREL-HERE_^1_%ADC_"YGTSEQ-HERE_^1_%ADC_"YBOS-HERE_^1_%ADC_"YEOS-HERE_^1_%ADC_"YCLRFT-HERE_^1_%ADC_"YSVAQI-HERE_^1_%ADC_"YREAQI-HERE_^1_%ADC_"YACCEP-HERE_^1_%ADC_"YTYPOT-HERE_^1_%ADC_"YTYP€€IN-HERE_^1_%ADC_"YHXDMP-HERE_^1_%ADC_"YB2H-HERE_^1_%ADC_"YBGB2D-HERE_^1_%ADC_"YB2D-HERE_^1_%ADC_"YHADOT-HERE_^1_%ADC_"YBOMB-HERE_^1_%ADC_"YTPDEC-HERE_^1_%ADC_"YBTDEC-HERE_^1_%ADC_"YTPHEX-HERE_^1_%ADC YWIERD-HERE_^1_%ADC_"YCMPFA-HERE_^1_%ADC_"YCMPFD-HERE_^1_%ADC_"YCMPSA-HERE_^1_%ADC_"YCMPSD-HERE_^1_%ADC_"YCMPLA-HERE_^1_%ADC_"YCMPLD-HERE_^1_%ADC_"YCMCLA-HERE_^1_%ADC_"YCMCLD-HERE_^1_€€%ADC_"YCMPWA-HERE_^1_%ADC_"YCMPWD-HERE_^1_%ADC_"YCMCUA-HERE_^1_%ADC_"YCMCUD-HERE_^1_%ADC_"INIT01+1-HERE_^1_%ADC_"INIT02+1-HERE_^1_%ADC_"INIT05+1-HERE_^1_%ADC_"INIT03+1-HERE_^1RELOC3 EQU_"RELOC3(*-RELOC4)_^1_%EJT_]_^1* SYFMLU STORES UP TO 4 FILE MANAGER LUNS IN YFMLUN OF FIXED TABLES._^1SYFMLU NUM_"0_^1_%ENQ_"4_,PREPARE TO TABULATE .LE. 4 LUNS._^1SYFML1 INQ_"-1_+POINT TO NEXT WORD O€€F YFMLUN._^1_%SQM_"SYFMLX_'SKIP IF ENOUGH LUNS ARE TABULATED._^1_%RTJ*_!GFMLU_(GET A LUN._^1_%SAM_"SYFMLX_'SKIP IF LUN NOT RETURNED._^1_%STA_"YFMLUN,Q_$TABULATE A LUN._^1_%JMP*_!SYFML1_'GET AND TABULATE NEXT LUN._^1SYFMLX JMP*_!(SYFMLU)_$EXIT._^1GFMLU NUM_"0_^1_%STQ*_!GFMLUQ_'SAVE (Q)ENTRY._^1_%LDQ*_!GFMLU1_'(Q) = FWA CURRENT ENTRY - FWA FSLIST._^1_%LDA+_!FSLIST,Q_$(A)15-7 = NO. W€€DS. IN LU ENTRY. (A)6-0 = LU._^1_%SAM_"GFMLUX_'SKIP TO EXIT IF END OF FILE-SPACE-LIST._^1_%CLR_"Q_,PREPARE TO ISOLATE ENTRY LENGTH IN Q._^1_%LLS_"9_,(Q) = LU ENTRY LENGTH IN WORDS._^1_%ADQ*_!GFMLU1_'(Q) = FWA NEXT ENTRY - FWA FSLIST._^1_%STQ*_!GFMLU1_'REMEMBER RELATIVE LOCATION OF NEXT ENTRY._^1_%CLR_"Q_,PREPARE TO ISOLATE LUN IN A._^1_%LRS_"9_,(A) = LUN._^1_%LDQ*_!GFMLUQ_'RESTORE €–(Q)ENTRY._^1GFMLUX JMP*_!(GFMLU)_%EXIT._^1GFMLUQ NUM_"0_,() = (Q)ENTRY._^1GFMLU1 NUM_"0_,()ENTRY = FWA CURRENT ENTRY - FWA FSLIST._^1_%END_"SMCMON_^__–PSMCEDT CSY/ SM3 P€1_%NAM SMCEDT_'DECK-ID S03 SMC 1.0_.SUMMARY-108_^1*_$SORT-MERGE EDITOR_^1*_$SORT/MERGE VERSION 1.0_^1*_$SMALL SYSTEMS DIVISION. LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976._^1_%EXT_"NUMLU_^1_%ENT_"SMCEDT_^1AMONI EQU_"AMONI($F4)_^1ADISP EQU_"ADISP($EA)_^1PLUG_!EQU_"PLUG($7FFF)_^1ENDWRD EQU_"ENDWRD(36)_^1ENDCOL EQU ENDCOL(2*ENDWRD)_^1LOWBSZ EQU_"LOWBSZ(92)_"€€MINIMUM WORK BLOCK DATA SIZE._^1_%EJT_]_^1*FILE TABLE STRUCTURE._^1LUN_"EQU_"LUN(2)_'(2)=0._^1FILNUM EQU_"FILNUM(1)_^1RECLTH EQU_"RECLTH(FILNUM+1)_^1BUFLTH EQU_"BUFLTH(RECLTH+1)_^1SKIPCT EQU_"SKIPCT(BUFLTH+1)_^1DOCNT EQU_"DOCNT(SKIPCT+2)_^1BUFWA EQU_"BUFWA(DOCNT+2)_^1RECNT EQU_"RECNT(BUFWA+1)_^1ERRCNT EQU_"ERRCNT(RECNT+2)_^1BLKCNT EQU_"BLKCNT(ERRCNT+1)_^1RECFWA EQU_"RECFWA(BLKCN€€T+1)_^1XFRLTH EQU_"XFRLTH(RECFWA+1)_^1RECPTR EQU_"RECPTR(XFRLTH+1)_^1REQBUF EQU_"REQBUF(RECPTR+2)_^1REQIND EQU_"REQIND(REQBUF+12)_^1FTSIZE EQU_"FTSIZE(1+REQIND)_^1_%EJT_]_^1*SMC FIXED-TABLE STRUCTURE._^1YLOCOR EQU_"YLOCOR(0)_^1YIFTAD EQU_"YIFTAD(YLOCOR+1)_^1YEND_!EQU_"YEND(YIFTAD+1)_^1YHICOR EQU_"YHICOR(YEND+1)_^1YFTSIZ EQU_"YFTSIZ(YHICOR+1)_^1YEDTSZ EQU_"YEDTSZ(YFTSIZ+1)_^1YSRTSZ €€EQU_"YSRTSZ(YEDTSZ+1)_^1YIMGSZ EQU_"YIMGSZ(YSRTSZ+1)_^1YFMGSZ EQU_"YFMGSZ(YIMGSZ+1)_^1YPHASE EQU_"YPHASE(YFMGSZ+1)_^1YDM_"EQU_"YDM(YPHASE+1)_^1YKCT_!EQU_"YKCT(YDM+1)_^1YG_#EQU_"YG(YKCT+1)_^1YU_#EQU_"YU(YG+1)_^1Y0WAY EQU_"Y0WAY(YU+1)_^1YIWAY EQU_"YIWAY(Y0WAY+1)_^1YFWAY EQU_"YFWAY(YIWAY+1)_^1YSUMIB EQU_"YSUMIB(YFWAY+1)_^1YMAXIB EQU_"YMAXIB(YSUMIB+1)_^1YWKBSZ EQU_"YWKBSZ(YMAXIB+1)_€€^1YSRCNT EQU_"YSRCNT(YWKBSZ+1)_^1YIRCNT EQU_"YIRCNT(YSRCNT+2)_^1YORCNT EQU_"YORCNT(YIRCNT+2)_^1YSQ2MG EQU_"YSQ2MG(YORCNT+2)_^1YSEQCT EQU_"YSEQCT(YSQ2MG+1)_^1YCMPKY EQU_"YCMPKY(YSEQCT+1)_^1YZERO EQU_"YZERO(YCMPKY+1)_^1YBIGCT EQU_"YBIGCT(YZERO+1)_^1YBGADD EQU_"YBGADD(YBIGCT+1)_^1YBGSUB EQU_"YBGSUB(YBGADD+1)_^1YBIGQ EQU_"YBIGQ(YBGSUB+1)_^1YBIGA EQU_"YBIGA(YBIGQ+1)_^1YGORQT EQU_"YGO€€RQT(YBIGA+1)_^1YGETU EQU_"YGETU(YGORQT+1)_^1YPUTU EQU_"YPUTU(YGETU+1)_^1YLAPUT EQU_"YLAPUT(YPUTU+1)_^1YFMLUN EQU_"YFMLUN(YLAPUT+1)_^1YSEGLU EQU_"YSEGLU(YFMLUN+4)_^1YSEGFN EQU_"YSEGFN(YSEGLU+1)_^1YCLSU EQU_"YCLSU(YSEGFN+1)_^1YREL_!EQU_"YREL(YCLSU+1)_^1YGTSEQ EQU_"YGTSEQ(YREL+1)_^1YBOS_!EQU_"YBOS(YGTSEQ+1)_^1YEOS_!EQU_"YEOS(YBOS+1)_^1YCLRFT EQU_"YCLRFT(YEOS+1)_^1YSVAQI EQU_"YSVAQI€€(YCLRFT+1)_^1YREAQI EQU_"YREAQI(YSVAQI+1)_^1YACCEP EQU_"YACCEP(YREAQI+1)_^1YTYPOT EQU_"YTYPOT(YACCEP+1)_^1YTYPIN EQU_"YTYPIN(YTYPOT+1)_^1YPRMLV EQU_"YPRMLV(YTYPIN+1)_^1YHXDMP EQU_"YHXDMP(YPRMLV+1)_^1YB2H_!EQU_"YB2H(YHXDMP+1)_^1YBGB2D EQU_"YBGB2D(YB2H+1)_^1YB2D_!EQU_"YB2D(YBGB2D+1)_^1YHADOT EQU_"YHADOT(YB2D+1)_^1YBOMB EQU_"YBOMB(YHADOT+1)_^1YTPDEC EQU_"YTPDEC(YBOMB+1)_^1YBTDEC EQU_€€"YBTDEC(YTPDEC+1)_^1YTPHEX EQU_"YTPHEX(YBTDEC+1)_^1YWIERD EQU YWIERD(YTPHEX+1)_^1YOFT_!EQU YOFT(YWIERD+1)_^1YCMPFA EQU_"YCMPFA(YOFT+REQBUF)_^1YCMPFD EQU_"YCMPFD(YCMPFA+1)_^1YCMPSA EQU_"YCMPSA(YCMPFD+1)_^1YCMPSD EQU_"YCMPSD(YCMPSA+1)_^1YCMPLA EQU_"YCMPLA(YCMPSD+1)_^1YCMPLD EQU_"YCMPLD(YCMPLA+1)_^1YCMCLA EQU_"YCMCLA(YCMPLD+1)_^1YCMCLD EQU_"YCMCLD(YCMCLA+1)_^1YCMPWA EQU_"YCMPWA(YCMC€€LD+1)_^1YCMPWD EQU_"YCMPWD(YCMPWA+1)_^1YCMCUA EQU_"YCMCUA(YCMPWD+1)_^1YCMCUD EQU_"YCMCUD(YCMCUA+1)_^1YKEY_!EQU_"YKEY(YOFT+FTSIZE)_^1_%EJT_]_^1*OFTEN NEEDED CONSTANTS._^1ZERO_!EQU_"ZERO(2)_!(2)=0._^1HX0007 EQU_"HX0007(5)_$(5)=$0007._^1HX0020 EQU_"HX0020($28)_"($28)=$0020._^1HX00FF EQU_"HX00FF($A)_#($A) = $00FF._^1HX0800 EQU_"HX0800($2E)_"($2E)=$0800._^1HX1000 EQU_"HX1000($2F)_"($2F)€€=$1000._^1HX2000 EQU_"HX2000($30)_"($30)=$2000._^1HX7FFF EQU_"HX7FFF($42)_"($42)=$7FFF._^1HX8000 EQU_"HX8000($32)_"($32)=$8000._^1HXDFFF EQU_"HXDFFF($40)_"($40)=$DFFF._^1HXEFFF EQU_"HXEFFF($3F)_"($3F)=$EFFF._^1HXF7FF EQU_"HXF7FF($3E)_"($3E)=$F7FF._^1HXFC00 EQU_"HXFC00($1C)_"($1C)=$FC00._^1HXFFFE EQU_"HXFFFE($13)_!($13)=$FFFE._^1_%EJT_]_^1SMCEDT NUM_"0_^1_%CLR_"A_,(A) = PHASE NO. OF€€ SMCEDT._^1_%STA-_!YPHASE,I_$TELL FIXED TABLES THAT SMCEDT IS RUNNING._^1_%LDA*_!SMCEDT_'(A) = FWA OF NSI OF SMCMON._^1_%STA_"EDTXIT+1_$SAFEGUARD RETURN FROM OVERLAY BY TABLES._^1_%RTJ_"RELOC_#RELOCATE ALL RELOCATABLES._^1_%RTJ_"LINK_)RESOLVE ALL SMCEDT REFERENCES TO SMCMON._^1_%JMP*_!EDITRX_^1_%EJT_]_^1*RELOC DISABLES ITSELF AFTER THE 1ST CALL._^1*ON THE 1ST CALL, RELOC RELOCATES €€THE WORDS MENTIONED IN THE LIST,_^1*RELOC4._]_^1RELOC NUM_"0_^1*_83 CARDS DELETED._^1RELOC1 RTJ*_!HERE_$SET RELOCATION FACTOR._^1HERE_!NUM_"0_(() = 0 OR FWA OF HERE._^1_%ENQ_"RELOC3_"(Q) = NO. OF ENTRIES IN RELOC4._^1RELOC7 INQ_"-1_'(Q) = INDEX TO NEXT RELOCATEE._^1_%SQP_"RELOC6_"SKIP IF NOT DONE._^1_%JMP*_!(RELOC)_!EXIT IF DONE._^1RELOC6 LDA*_!RELOC4,Q (A) = FWA OF RELOCATEE - (€€HERE)._^1_%ADD*_!HERE_$(A) = FWA OF RELOCATEE._^1_%STA*_!RELOC5_"SAVE FWA OF RELOCATEE._^1_%LDA*_!(RELOC5) (A) = RELOCATEE._^1_%ADD*_!HERE_$(A) = RELOCATED (RELOCATEE)._^1_%STA*_!(RELOC5) SET RELOCATEE._^1_%JMP*_!RELOC7_"JMP TO SEE IF DONE._^1RELOC5 NUM_"0_(() = FWA OF RELOCATEE._^1RELOC4 EQU_"RELOC4(*)_^1_%ADC_"EDITRX+1-HERE_^1_%ADC_"EDIT02+1-HERE_^1_%ADC_"EDIT05+1-HERE_^1_%ADC_€€"EDIT07+1-HERE_^1_%ADC_"EDIT09+1-HERE_^1_%ADC_"EDIT04+1-HERE_^1_%ADC_"RUN09+1-HERE_^1_%ADC_"RUN10+1-HERE_^1_%ADC_"RUN00+1-HERE_^1_%ADC_"RUN02+1-HERE_^1_%ADC_"RUN08+1-HERE_^1_%ADC_"RUN05+1-HERE_^1_%ADC_"CKYSZ2-HERE_^1_%ADC_"KEYNIT+1-HERE_^1_%ADC_"KEYNXT+1-HERE_^1_%ADC_"KEY04+1-HERE_^1_%ADC_"KEY10+1-HERE_^1_%ADC_"KEY16+1-HERE_^1_%ADC_"IN01+1-HERE_^1_%ADC_"IN06+1-HERE_^1_%ADC_"IN00+1-€€HERE_^1_%ADC_"IN31+1-HERE_^1_%ADC_"IN34+1-HERE_^1_%ADC_"IN05+1-HERE_^1_%ADC_"IN09+1-HERE_^1_%ADC_"IN07+1-HERE_^1_%ADC_"IN10+1-HERE_^1_%ADC_"INE17+1-HERE_^1_%ADC_"OUTNIT+1-HERE_^1_%ADC_"OUT00+1-HERE_^1_%ADC_"OUT09+1-HERE_^1_%ADC_"OUT03+1-HERE_^1_%ADC_"OUT01+1-HERE_^1_%ADC_"OUT06+1-HERE_^1_%ADC_"PROM03+1-HERE_^1_%ADC_"SCDIA2+1-HERE_^1_%ADC_"SCDIA3+1-HERE_^1_%ADC_"SCDIA4-HERE_^1_%ADC_€€"SCL01-HERE_^1_%ADC_"SCL02-HERE_^1_%ADC_"TOKNMV+1-HERE_^1_%ADC_"COMMAE+1-HERE_^1RELOC3 EQU_"RELOC3(*-RELOC4)_^1_%EJT_]_^1LINK_!NUM_"0_^1_%LDA-_!YTYPOT,I_$(A) = FWA OF TYPOUT._^1_%STA_"EDIT03+1_^1_%STA_"PROM04+1_^1_%STA_"PROM05+1_^1_%STA_"PROM06+1_^1_%STA_"SCDIA5+1_^1_%LDA-_!YTPDEC,I_^1_%STA_"EDIT06+1_^1_%STA_"EDIT08+1_^1_%STA_"EDIT10+1_^1_%LDA-_!YB2D,I_'(A) = FWA OF BINDEC._^1_%STA€€_"IN11+1_^1_%LDA-_!YSVAQI,I_$(A) = FWA OF SAVAQI._^1_%STA_"SCDIA0+1_^1_%STA_"SCLAQI-1_^1_%LDA-_!YBGADD,I_^1_%STA_"IN16+1_^1_%LDA-_!YREAQI,I_^1_%STA_"SCDIA6+1_^1_%STA_"SCLRES+1_^1_%LDA-_!YBOMB,I_%(A) = FWA OF BOMB._^1_%STA_"EDTBMB+1_^1_%LDA-_!YTYPIN,I_$(A) = FWA OF TYPIN._^1_%STA_"SCLRD+1_^1_%LDA- YWIERD,I_$(A) = FWA OF WIERD IN SMCMON._^1_%STA* WIERD_(SAVE FWA OF WIERD._^1_%LDA-_!Y€€EDTSZ,I_$(A) = TABULATED SIZE OF SMCEDT._^1_%EOR_"=XEDTSIZ_$COMPARE TABULATED TO ACTUAL._^1_%SAZ LINK01_'SKIP IF TABULATED = ACTUAL._^1_%RTJ* (WIERD)_%ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM -7_+ANNOUNCE ERROR NO.7 AND STOP THE RUN._^1LINK01 EQU LINK01(*)_^1_%JMP*_!(LINK)_'EXIT._^1WIERD NUM 0_-() = FWA OF WIERD IN SMCMON._^1_%EJT_]_^1EDTRES EQU_"EDTRES(*)_#START OF SMCEDT €€RESIDENT._^1_%ADC_"MNDEDT-MSGEDT_^1MSGEDT ALF_"/,EDIT BEGINS/_^1_%NUM_"$0D0A_($0D=RETURN. $0A=LINE FEED._^1MNDEDT EQU_"MNDEDT(*)_^1EDITRX LDQ_"=XMSGEDT-HERE (Q) = FWA OF MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1EDIT03 RTJ+_!PLUG_)ANNOUNCE START OF SMCEDT._^1_%RTJ_"NEWSCL_'MAKE 1ST TOKEN CALL IMMEDIATELY DO FREAD._^1EDIT02 LDQ_"=XMSGE15-HERE_"(Q) = FWA OF ERROR ME€€SSAGE WE MIGHT NEED._^1_%RTJ_"BIGNUM_"LOOK FOR LEVEL OF PROMPTING._^1_%JMP*_!EDITRX_'JMP TO RESTART PRMLVL STATEMENT IF ]Z]._^1_%SQN_"EDIT01_"SKIP IF LEVEL IS TOO BIG._^1_%INA_"-3_'(A)15=1 IF ACCEPTABLE LEVEL OF PROMPTING._^1_%SAM_"EDIT00_"SKIP IF LEVEL OF PROMPTING .LE. 2._^1EDIT01 JMP_"BIGERR_"ANNOUNCE ERROR AND REQUEST REPLY._^1EDIT00 INA_"3_,(A) = VALID LEVEL OF PROMPTING._^1_%€€STA_"PRMLVL_'SAVE REPLY._^1_%STA-_!YPRMLV,I_$TABULATE THE PROMPTING LEVEL._^1_%RTJ_"RUN_*REQUEST,CHECK,TABULATE RUN STATEMENT._^1_%RTJ_"CKYSIZ_'SEE IF ENOUGH CORE TO BUILD TABLES._^1_%JMP*_!EDIT04_'JMP IF POSSIBLY TOO LITTLE CORE._^1_%RTJ_"KEYS_$REQUEST,CHECK,TABULATE KEYS STATEMENT._^1_%RTJ_"INFILE_"REQUEST,CHECK,TABULATE INFILE STATEMENT._^1_%RTJ_"OUTFIL_"REQUEST,CHECK,TABULATE O€€UTFIL STATEMENT._^1_%RTJ_"MEM_*SEE IF ENOUGH CORE FOR DESIRED RUN._^1_%JMP*_!EDIT04_'JMP IF TOO LITTLE CORE._^1_%RTJ_"XCK_*CROSSCHECK THE TABULATED PARAMETERS._^1* PUBLISH YG,YIWAY,YFWAY ONLY FOR A SORT-ONLY RUN._^1EDIT05 LDQ_"=XMSGYG-HERE (Q) = FWA OF MESSAGE PREFIX._^1_%LDA-_!YG,I_)(A) = G TO CONVERT TO SUFFIX._^1_%SAZ_"EDTXIT_'SKIP IF NOT SORT-ONLY RUN._^1* INIT REPLACES PLUG B€€ELOW WITH FWA OF TPDEC._^1EDIT06 RTJ+_!PLUG_^1EDIT07 LDQ_"=XMSGYIW-HERE (Q) = FWA OF MESSAGE PREFIX._^1_%LDA-_!YIWAY,I_%(A) = IWAY TO CONVERT TO SUFFIX._^1* INIT REPLACES PLUG BELOW WITH FWA OF TPDEC._^1EDIT08 RTJ+_!PLUG_^1EDIT09 LDQ_"=XMSGYFW-HERE (Q) = FWA OF MESSAGE PREFIX._^1_%LDA-_!YFWAY,I_%(A) = FWAY TO CONVERT TO SUFFIX._^1* INIT REPLACES PLUG BELOW WITH FWA OF TPDEC._^1EDIT€€10 RTJ+_!PLUG_^1EDTXIT JMP+_!0_,RETURN TO SMCMON._^1EDIT04 LDQ_"=XMSGTLC-HERE (Q) = FWA OF ERROR MESSAGE._^1_%SET_"A_,DELETE SUFFIX._^1* INIT REPLACES PLUG BELOW WITH FWA OF BOMB._^1EDTBMB JMP+_!PLUG_^1_%EJT_]_^1RUN_"NUM_"0_^1RUNNIT CLR_"A_(ZERO ENTRIES TO BE SET BY RUN STATEMENT._^1_%STA-_!YDM,I_^1_%STA-_!YKCT,I_^1_%STA-_!YWKBSZ,I_^1RUN09 LDQ_"=XMSGP00-HERE (Q) = FWA OF MESSAGE._€€^1_%RTJ_"PROMPT_"ASK OPERATOR FOR RUN STATEMENT._^1_%RTJ_"NEWSCL_"MAKE 1ST TOKEN CALL IMMEDIATELY DO FREAD._^1RUN10 LDQ_"=XMSGE00-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"ALPHA_#LOOK FOR ]C]/]D]/]M]._^1_%JMP*_!RUNNIT_"JMP TO RESTART RUN STATEMENT IF ]Z]._^1_%INA_"-$43_$$43 IS ASCII FOR ]C]._^1_%SAZ_"RUN00_(SKIP IF ]C]._^1_%JMP*_!RUN01_#JMP IF NOT ]C]._^1RUN00 LDQ_"€€=XMSGE01-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPOS_"LOOK FOR COMMA THEN FILCNT._^1_%JMP*_!RUNNIT_"JMP TO RESTART RUN STATEMENT IF ]Z]._^1_%EOR-_!YDM,I_(UPDATE (YDM,I)14-0. PRESERVE (YDM,I)15._^1_%STA-_!YDM,I_^1_%JMP*_!(RUN)_#EXIT._^1RUN01 INA_"-$44+$43 $44 IS ASCII FOR ]D]._^1_%SAZ_"RUN11_(SKIP IF ]D]._^1_%JMP*_!RUN06_#JMP IF NOT ]D]._^1* SET (YDM,I)15 TO REM€€EMBER IT IS A DISK SORT-ONLY RUN._^1RUN11 LDA-_!YDM,I_(PRESERVE (YDM,I)14-0._^1_%AND-_!HX7FFF_'ISOLATE (YDM,I)14-0._^1_%EOR-_!HX8000_'SET (YDM,I)15._^1_%STA-_!YDM,I_(REMEMBER IT IS A DISK SORT-ONLY RUN._^1RUN02 LDQ_"=XMSGE05-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPOS_'LOOK FOR COMMA THEN WKBKSZ._^1_%JMP*_!RUNNIT_"JMP TO RESTART RUN STATEMENT IF ]Z]._^1_%INA_"-€€LOWBSZ_%(A)15=1 IF WKBKSZ .LT. LOWBSZ._^1_%SAP_"RUN03_(SKIP IF WKBKSZ .GE. LOWBSZ._^1_%JMP_"POSERR_'JMP IF WKBKSZ .LT. LOWBSZ._^1RUN03 INA_"LOWBSZ_'UNDO THE PRECEDING INA -LOWBSZ._^1_%STA-_!YWKBSZ,I_$STORE WKBKSZ._^1RUN08 LDQ_"=XMSGE02-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMALF_"LOOK FOR COMMA THEN ]N]/]S]._^1_%JMP*_!RUNNIT_"JMP TO RESTART RUN STATEMENT IF ]Z]€€._^1_%INA_"-$4E_$$4E IS ASCII FOR ]N]._^1_%SAZ_"RUN05_#SKIP IF ]N]._^1_%INA_"-$53+$4E $53 IS ASCII FOR ]S]._^1_%SAZ_"RUN04_#SKIP IF ]S]._^1_%JMP_"ALFERR_"JMP IF NOT ]N]/]S]._^1RUN04 LDA-_!HX8000_"(A)=$8000._^1_%STA-_!YKCT,I_'(YKCT)15=1._^1RUN05 LDQ_"=XMSGE03-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPOS_"LOOK FOR COMMA THEN KEYCNT._^1_%JMP*_!RUNNIT_"JMP TO RESTA€€RT RUN STATEMENT IF ]Z]._^1_%ADD-_!YKCT,I_^1_%STA-_!YKCT,I_"STORE KEYCNT._^1_%JMP*_!RUN00_#LOOK FOR COMMA THEN FILCNT._^1RUN06 INA_"-$4D+$44 $4D IS ASCII FOR ]M]._^1_%SAZ_"RUN07_#SKIP IF ]M]._^1_%JMP_"ALFERR_"JMP IF NOT ]C]/]D]/]M]._^1RUN07 JMP*_!RUN08_#LOOK FOR COMMA THEN ]N]/]S]._^1_%EJT_]_^1* CKYSIZ CONSERVATIVELY VERIFIES THAT THERE IS ENOUGH CORE TO TABULATE_^1* ALL THE USE€€R PARAMETERS._^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FIXED TABLES._^1*_:P_!RTJ CKYSIZ_^1*_:P+1 POSSIBLY TOO LITTLE CORE._^1*_:P+2 ENOUGH CORE._^1*_:(I)EXIT = (I)ENTRY._^1CKYSIZ NUM_"0_^1_%LDA-_!YDM,I_((A)14-0 = NO. OF INPUT FILES._^1_%AND-_!HX7FFF_'(A) = NO. OF INPUT FILES._^1_%MUI_"=XBUFWA_%ALLOW BUFWA WORDS PER INPUT FILE TABLE._^1_%STA*_!CKYSZ1_'SAVE CORE NEED OF INPUT F€€ILE TABLES._^1_%LDA-_!YKCT,I_'(A)14-0 = NO. OF KEYS._^1_%AND-_!HX7FFF_'(A) = NO. OF KEYS._^1_%MUI-_!HX0007_'ALLOW MAXIMUM=7 WORDS PER KEY._^1_%INA_"1_,ALLOW FOR TERMINATOR OF KEY TABLE._^1_%ADD*_!CKYSZ1_'(A) .GE. SIZE OF VARIABLE TABLES._^1_%ADD_"=XYKEY-1,I_"(A) .GE. LWA OF VARIABLE TABLES._^1_%SUB*_!CKYSZ2_'SUBTRACT FWA OF SMCEDT RESIDENT._^1_%SAP_"CKYSZX_'TAKE P+1 EXIT IF POSSIBL€€E CORE SHORTAGE._^1_%RAO*_!CKYSIZ_'SET UP P+2 EXIT SINCE ENOUGH CORE._^1CKYSZX JMP*_!(CKYSIZ)_$EXIT._^1CKYSZ1 NUM_"0_,()EXIT = CORE NEED OF THE INPUT FILE TABLES._^1CKYSZ2 ADC_"EDTRES-HERE_!() = FWA OF SMCEDT RESIDENT._^1_%EJT_]_^1KEYS_!NUM_"0_^1_%LDA-_!YKCT,I_^1_%AND-_!HX7FFF_"(A) = NO. OF KEYS._^1_%SAN_"KEYLIM_"SKIP IF THERE ARE KEYS._^1_%JMP*_!(KEYS)_"EXIT SINCE THERE ARE NO KEY€€S._^1KEYLIM STA*_!KEYCNT_"REMEMBER THE ITERATION LIMIT FOR KEYS ROUTINE._^1KEYNIT LDQ_"=XMSGP03-HERE_"(Q) = FWA OF MESSAGE._^1_%RTJ_"PROMPT_"ASK OPERATOR FOR KEYS STATEMENT._^1_%RTJ_"NEWSCL_"MAKE 1ST TOKEN CALL IMMEDIATELY DO FREAD._^1_%ENA_"0_^1_%STA*_!KEYDON_"SAY WE HAVEN]T DONE ANY KEYS YET._^1_%LDA_"=XYKEY,I_$(A) = FWA OF KEY TABLE._^1_%STA*_!KEYPTR_'SAY THERE IS NOTHING IN THE€€ KEY TABLE YET._^1KEYNXT LDQ_"=XMSGE06-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"ALPHA_#LOOK FOR ]F]/]S]/]L]/]C]._^1_%JMP*_!KEYNIT_"JMP TO RESTART KEYS STMT IF ]Z]._^1_%CLR_"Q_^1_%STQ*_!KEYLPT_"ZERO INDEX FOR TABLE OF LOGIC ADDRESSES._^1_%INA_"-$46_$$46 IS ASCII FOR ]F]._^1_%SAN_"KEY01_#SKIP IF NOT ]F]._^1_%JMP*_!KEY04_#JMP IF ]F]._^1KEY01 RAO*_!KEYLPT_'POINT TO CMPF€€D._^1_%RAO*_!KEYLPT_'POINT TO CMPSA._^1_%INA_"-$53+$46_"$53 IS ASCII FOR ]S]._^1_%SAN_"KEY02_#SKIP IF NOT ]S]._^1_%JMP*_!KEY04_#JMP IF ]S]._^1KEY02 RAO*_!KEYLPT_'POINT TO CMPSD._^1_%RAO*_!KEYLPT_'POINT TO CMPLA._^1_%INA_"-$4C+$53 $4C IS ASCII FOR ]L]._^1_%SAN_"KEY03_#SKIP IF NOT ]L]._^1_%JMP*_!KEY04_#JMP IF ]L]._^1KEY03 RAO*_!KEYLPT_'POINT TO CMPLD._^1_%RAO*_!KEYLPT_'POINT TO CM€€PCLA._^1_%INA_"-$43+$4C_"$43 IS ASCII FOR ]C]._^1_%SAZ_"KEY04_#SKIP IF ]C]._^1_%JMP_"ALFERR_"JMP IF NOT ]F]/]S]/]L]/]C]._^1KEY04 LDQ_"=XMSGE07-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMALF_"LOOK FOR COMMA THEN ]A]/]D]._^1_%JMP*_!KEYNIT_"JMP TO RESTART KEYS STATEMENT IF ]Z]._^1_%INA_"-$41_$$41 IS ASCII FOR ]A]._^1_%SAZ_"KEY10_#SKIP IF ]A]._^1_%INA_"-$44+$41 $44 IS€€ ASCII FOR ]D]._^1_%SAZ_"KEY09_#SKIP IF ]D]._^1_%JMP_"ALFERR_"JMP IF NOT ]A]/]D]._^1KEY09 RAO*_!KEYLPT_"CAUSE DESCENDING LOGIC TO BE STACKED._^1KEY10 LDQ_"=XMSGE08-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPOS_"LOOK FOR COMMA THEN KEYCOL._^1_%JMP*_!KEYNIT_"JMP TO RESTART KEYS STATEMENT IF ]Z]._^1_%STA*_!KEYCOL_"REMEMBER STARTING COLUMN OF KEY._^1_%LDQ*_!KEYLPT_^1€€_%INQ_"-6_'(Q).LT.0 IF F/S/L. (Q).GE.0 IF C._^1_%SQM_"KEY14_#SKIP IF F/S/L._^1_%JMP*_!KEYBYT_"JMP IF C._^1KEY14 ALS_"15_'(A)15 = 1 IFF KEYCOL IS ODD._^1_%SAM_"KEY15_#SKIP IF KEYCOL IS ODD._^1_%JMP_"POSERR_"JMP IF KEYCOL IS EVEN, WHICH IS TABOO FOR F/S/L._^1KEY15 RTJ*_!KEYFWA_"FROM KEYCOL, COMPUTE AND STACK REL. FWA OF KEY._^1_%INQ_"6_(UNDO THE PRECEDING INQ -6 SO (Q) = (KEYLPT)._€€^1_%LDA-_!YCMPFA,B_$(A) = -1 + FWA OF PROPER COMPARE LOGIC._^1_%STA*_!(KEYPTR)_$STACK -1 + FWA OF COMPARE LOGIC._^1_%RAO*_!KEYPTR_"POINT TO NEXT FREE WORD OF KEY TABLE._^1KEYXCK RAO*_!KEYDON_"UPDATE NO. OF KEYS DONE._^1_%LDA*_!KEYDON_"(A) = NO. OF KEYS DONE._^1_%SUB*_!KEYCNT_"(A) = NO. OF KEYS DONE - NO. OF KEYS._^1_%SAP_"KEYXIT_"SKIP IF ALL KEYS ARE DONE._^1_%RTJ_"COMMA_(LOOK FOR €€COMMA._^1_%JMP*_!KEYNIT_'JMP TO RESTART KEYS STATEMENT IF ]Z]._^1_%JMP*_!KEYNXT_"DO NEXT KEY._^1KEYXIT ENA_"-0_^1_%STA*_!(KEYPTR) STACK THE KEY TABLE TERMINATOR._^1_%RAO*_!KEYPTR_^1_%LDA*_!KEYPTR_"(A) = 1 + LWA OF KEY TABLE._^1_%STA-_!YEND,I_"(YEND) = FWA OF NEXT FREE CORE._^1_%RTJ_"KRANGE_'COMPUTE (KEYMAX) FROM YKEY ENTRIES._^1_%JMP*_!(KEYS)_"EXIT._^1KEYCNT NUM_"0_(() = NO. OF US€€ER KEYS IN KEYS STATEMENT._^1KEYDON NUM_"0_(() = NO. OF USER KEYS TABULATED SO FAR._^1KEYLPT NUM_"0_,() = INDEX INTO YCMPFA,YCMPFD,..._^1KEYPTR NUM_"0_(() = FWA OF CURRENT WORD OF KEY TABLE._^1KEYCOL NUM_"0_(() = STARTING COLUMN OF CURRENT KEY._^1KYCOLS NUM_"0_(() = NO. OF COLUMNS IN CURRENT KEY._^1KYWLEN NUM_"0_(() = NO. WORDS IN WORD KEY._^1KEYFWA NUM_"0_^1_%LDA*_!KEYCOL_"(A) = S€€TARTING COLUMN OF KEY._^1_%INA_"-1_'(A) = FCA OF KEY - FWA OF RECORD._^1_%ARS_"1_((A) = FWA OF KEY - FWA OF RECORD._^1_%STA*_!(KEYPTR) STACK RELATIVE FWA OF KEY._^1_%RAO*_!KEYPTR_"POINT TO NEXT FREE WORD OF KEY TABLE._^1_%JMP*_!(KEYFWA)_"EXIT._^1KEYBYT STQ*_!KEYLPT_"(Q) = 0 FOR ASCENDING, 1 FOR DESCENDING._^1KEY16 LDQ_"=XMSGE09-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%R€€TJ_"COMPOS_"LOOK FOR COMMA THEN KEYCOLS._^1_%JMP*_!KEYNIT_'JMP TO RESTART KEYS STATEMENT IF ]Z]._^1_%STA*_!KYCOLS_"REMEMBER NO. OF COLUMNS IN KEY._^1_%LDA*_!KEYCOL_"(A) = STARTING COLUMN OF KEY._^1_%ALS_"15_'(A)15=1 IFF KEYCOL IS ODD._^1_%SAM_"KEYODD_"SKIP IF KEYCOL IS ODD._^1_%JMP*_!KEYEVN_"JMP IF KEYCOL IS EVEN. I.E. LOWER CHARACTER._^1KEYODD LDA*_!KYCOLS_"(A) = NO. OF COLUMNS RE€€MAINING OF C KEY._^1_%INA_"-1_^1_%SAN_"KEY3CK_"SKIP IF .GE. 2 COLUMNS REMAIN OF C KEY._^1_%JMP*_!KEYCU_#JMP IF 1 COLUMN REMAINS OF C KEY._^1KEY3CK INA_"-3_^1_%SAP_"KEYW_$SKIP IF .GE. 4 COLUMNS REMAIN OF C KEY._^1_%JMP*_!KYLIMP_"JMP IF 2 .LE. REMAINING COLUMNS .LE. 3._^1KEYW_!RTJ*_!KEYFWA_"FROM KEYCOL, COMPUTE AND STACK REL. FWA OF KEY._^1_%LDQ*_!KEYLPT_"(Q) = 0 FOR ASCENDING, 1 FOR€€ DESCENDING._^1_%LDA-_!YCMPWA,B_$(A) = -1 + FWA OF PROPER COMPARE LOGIC._^1_%STA*_!(KEYPTR)_$STACK -1 + FWA OF THE COMPARE LOGIC._^1_%RAO*_!KEYPTR_"POINT TO NEXT FREE WORD OF KEY TABLE._^1_%LDA*_!KYCOLS_"(A) = NO. OF COLUMNS REMAINING OF C KEY._^1_%ARS_"1_((A) = NO. OF WORDS OF WORD KEY._^1_%ALS_"1_((A) = NO. OF BYTES OF WORD KEY._^1_%STA*_!KYWLEN_'SAVE LENGTH OF WORD KEY._^1_%ADD*€€_!KEYCOL_"(A) = 1 + LAST COLUMN OF WORD KEY._^1_%STA*_!KEYCOL_"SAVE IT FOR POSTERITY AND FOR COMING KEYFWA CALL_^1_%RTJ*_!KEYFWA_"STACK 1 + LWA OF WORD KEY._^1_%LDA*_!KYCOLS_"(A) = NO. OF REMAINING COLUMNS BEFORE WORD KEY._^1_%SUB*_!KYWLEN_"(A) = NO. OF COLUMNS AFTER WORD KEY._^1_%STA*_!KYCOLS_"UPDATE NO. OF COLUMNS REMAINING OF C KEY._^1_%SAN_"KEYCU_#SKIP IF C KEY NOT YET EXHAUSTE€€D._^1_%JMP*_!KEYXCK_"JMP TO SEE IF THERE IS ANOTHER KEY TO DO._^1KEYCU RTJ*_!KEYFWA_"FROM KEYCOL, COMPUTE AND STACK REL. FWA OF KEY._^1_%LDQ*_!KEYLPT_"(Q) = 0 FOR ASCENDING, 1 FOR DESCENDING._^1_%LDA-_!YCMCUA,B_$(A) = -1 + FWA OF PROPER COMPARE LOGIC._^1_%STA*_!(KEYPTR)_$STACK -1 + FWA OF THE COMPARE LOGIC._^1_%RAO*_!KEYPTR_"POINT TO NEXT FREE WORD OF KEY TABLE._^1_%JMP*_!KEYXCK_"€€JMP TO SEE IF THERE IS ANOTHER KEY TO DO._^1KEYEVN RTJ*_!KEYFWA_"FROM KEYCOL, COMPUTE AND STACK REL. FWA OF KEY._^1_%LDQ*_!KEYLPT_"(Q) = 0 FOR ASCENDING, 1 FOR DESCENDING._^1_%LDA-_!YCMCLA,B_$(A) = -1 + FWA OF PROPER COMPARE LOGIC._^1_%STA*_!(KEYPTR)_$STACK -1 + FWA OF THE COMPARE LOGIC._^1_%RAO*_!KEYPTR_"POINT TO NEXT FREE WORD OF KEY TABLE._^1_%LDA*_!KYCOLS_"(A) = NO. OF COLUMNS €€BEFORE LOWER CHARACTER._^1_%INA_"-1_'(A) = NO. OF COLUMNS AFTER LOWER CHARACTER._^1_%SAN_"KEY20_#SKIP IF C KEY NOT EXHAUSTED._^1_%JMP*_!KEYXCK_"JMP TO SEE IF THERE IS ANOTHER KEY TO DO._^1KEY20 STA*_!KYCOLS_"UPDATE NO. OF COLUMNS REMAINING OF C KEY._^1_%RAO*_!KEYCOL_"UPDATE STARTING COLUMN OF REMAINDER OF C KEY._^1_%JMP*_!KEYODD_"DO NEXT PART OF C KEY._^1KYLIMP RTJ*_!KEYFWA_"FROM €€KEYCOL, COMPUTE AND STACK REL. FWA OF KEY._^1_%LDQ*_!KEYLPT_"(Q) = 0 FOR ASCENDING, 1 FOR DESCENDING._^1_%LDA-_!YCMPLA,B_$(A) = -1 + FWA OF PROPER COMPARE LOGIC._^1_%STA*_!(KEYPTR)_$STACK -1 + FWA OF THE COMPARE LOGIC._^1_%RAO*_!KEYPTR_"POINT TO NEXT FREE WORD OF KEY TABLE._^1_%LDA*_!KYCOLS_"(A) = NO. OF COLUMNS BEFORE IMPLIED L KEY._^1_%INA_"-2_'(A) = NO. OF COLUMNS AFTER IMPLIED €€L KEY._^1_%SAN_"KEY21_#SKIP IF C KEY NOT YET EXHAUSTED._^1_%JMP*_!KEYXCK_"JMP TO SEE IF THERE IS ANOTHER KEY TO DO._^1KEY21 STA*_!KYCOLS_"UPDATE NO. OF COLUMNS REMAINING OF C KEY._^1_%RAO*_!KEYCOL_^1_%RAO*_!KEYCOL_"NOW (KEYCOL) = NO. OF NEXT COL. OF C KEY._^1_%JMP*_!KEYCU_#JMP TO GENERATE LAST PART OF C KEY._^1_%EJT_]_^1* KRANGE DETERMINES THE MAXIMUM LWA OF THE KEY FIELDS IN YKEY€€._^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FIXED TABLES._^1*_:RTJ KRANGE_^1*_:(I)EXIT = (I)ENTRY._^1*_:(KEYMAX)EXIT = MAX. LWA OF THE KEY FIELDS._^1KRANGE NUM_"0_^1_%CLR_"A_^1_%STA*_!KEYMAX_'START WITH ZERO AS MAXIMUM LWA._^1_%LDQ_"=XYKEY,I_$(Q) = FWA OF THE KEY TABLE._^1KRNG00 LDA-_!(ZERO),Q_$(A) = (1ST WORD OF ENTRY FOR CURRENT KEY)._^1_%SAP_"KRNG01_'SKIP IF NOT TERMINATOR €€OF YKEY._^1_%JMP*_!(KRANGE)_$EXIT IF TERMINATOR OF YKEY._^1KRNG01 STA*_!KEYLWA_'LWA OF KEY MIGHT = FWA OF KEY._^1_%INQ_"1_"(Q) = FWA OF LOGIC-ADDRESS WORD OF YKEY ENTRY._^1_%LDA-_!(ZERO),Q_$(A) = -1 + FWA OF COMPARE LOGIC._^1_%EOR-_!YCMPFA,I_$(A)=0 IF ASCENDING FLOATING-POINT KEY._^1_%SAZ_"KRNG02_'SKIP IF ASCENDING FLOATING-POINT._^1_%LDA-_!(ZERO),Q_$(A) = -1 + FWA OF COMPARE LOGIC€€._^1_%EOR-_!YCMPFD,I_$(A)=0 IF DESCENDING FLOATING-POINT KEY._^1_%SAZ_"KRNG02_'SKIP IF DESCENDING FLOATING-POINT._^1_%LDA-_!(ZERO),Q_$(A) = -1 + FWA OF COMPARE LOGIC._^1_%EOR-_!YCMPWA,I_$(A)=0 IF ASCENDING WORD KEY._^1_%SAZ_"KRNG05_'SKIP IF ASCENDING WORD KEY._^1_%LDA-_!(ZERO),Q_$(A) = -1 + FWA OF COMPARE LOGIC._^1_%EOR-_!YCMPWD,I_$(A)=0 IF DESCENDING WORD KEY._^1_%SAN_"KRNG03_'SKI€€P IF NOT FA,FD,WA,WD KEY TYPES._^1KRNG05 JMP*_!KRNG06_'JMP IF WA OR WD KEY TYPES._^1KRNG02 RAO*_!KEYLWA_'FOR FLOATING POINT KEY, LWA = 1 + FWA._^1KRNG03 LDA*_!KEYMAX_'(A) = CURRENT MAXIMUM KEY-LWA._^1_%SUB*_!KEYLWA_'(A).GE.0 IF OLD MAXIMUM STILL HOLDS._^1_%SAP_"KRNG04_'SKIP IF OLD MAXIMUM IS STILL GOOD._^1_%LDA*_!KEYLWA_'(A) = LWA OF CURRENT KEY._^1_%STA*_!KEYMAX_'SAVE THE NEW MAXI€€MUM._^1KRNG04 INQ_"1_,(Q) = FWA OF NEXT ENTRY IN YKEY._^1_%JMP*_!KRNG00_'BEGIN PROCESSING OF NEXT ENTRY._^1KRNG06 INQ_"1_,(Q) = FWA OF 1+LWA WORD OF WORD KEY ENTRY._^1_%LDA-_!(ZERO),Q_$(A) = 1+LWA OF WORD KEY._^1_%INA_"-1_+(A) = LWA OF WORD KEY._^1_%STA*_!KEYLWA_'SAVE LWA OF CURRENT KEY._^1_%JMP*_!KRNG03_'SEE IF CURRENT LWA IS A NEW MAXIMUM._^1KEYMAX NUM_"0_,() = MAX. REL. LWA FOR €€KEY FIELDS._^1KEYLWA NUM_"0_,() = REL. LWA FOR CURRENT KEY._^1_%EJT_]_^1INCNT NUM_"0_,() = NO. OF INPUT FILES TO HAVE DONE._^1INDONE NUM_"0_(() = NO. OF LAST INFILE._^1INTYP NUM_"0_(() = 0,1,2 FOR DISK,MAG-TAPE,PAPER-TAPE._^1INFILE NUM_"0_^1_%LDA-_!I_((A) = (I)ENTRY._^1_%STA*_!INI_%SAVE (I)ENTRY._^1_%LDA-_!YEND,I_'(A) = 1 + LWA OF KEY TABLE._^1_%STA-_!YIFTAD,I_$() = FWA OF 1ST IN€€PUT FILE TABLE._^1_%LDA-_!YDM,I_^1_%AND-_!HX7FFF_"(A) = NO. OF INPUT FILES._^1_%STA*_!INCNT_#REMEMBER NO. OF INPUT FILES._^1_%CLR_"A_^1_%STA*_!INDONE_"SAY WE HAVEN]T DEFINED ANY INFILE TABLES._^1INCTCK LDA*_!INDONE_"(A) = NO. OF INFILE TABLES DONE._^1_%SUB*_!INCNT_#(A) = NO. DONE ALREADY - NO. TO HAVE DONE._^1_%SAM_"INNEXT_"SKIP IF NO. DONE ALREADY IS NOT ENOUGH._^1_%LDA*_!INI_%(A)€€ = (I)ENTRY._^1_%STA-_!I_(RESTORE (I)ENTRY._^1_%JMP*_!(INFILE) EXIT IF QUOTA IS MET._^1INNEXT LDA*_!INDONE_"(A) = NO. OF LAST INFILE._^1_%SAN_"IN14_)ONLY DO THE BELOW STA FOR THE 1ST FILE._^1_%STA-_!YOFT+RECLTH,I SAY RECLTH ISN]T SET FOR RUN YET._^1IN14_!INA_"1_,(A) = CURRENT FILE NO. TO CONVERT TO DECIMAL_^1IN01_!LDQ_"=XMSGINN-HERE_"(Q) = FWA OF FILE NO. PART OF INFILE MSG._^1* I€€NIT REPLACES PLUG BELOW WITH FWA OF BINDEC._^1IN11_!RTJ+_!PLUG_)PLACE INFILE NO. INTO MESSAGE._^1IN06_!LDQ_"=XMSGP05-HERE_"(Q) = FWA OF MESSAGE._^1_%RTJ_"PROMPT_"ASK OPERATOR TO SUPPLY INFILE STATEMENT._^1_%RTJ_"NEWSCL_'MAKE 1ST TOKEN CALL IMMEDIATELY DO FREAD._^1_%LDQ*_!INI_%(Q) = FWA OF FIXED TABLES._^1_%LDA-_!YEND,Q_"(A) = FWA OF CURRENT INPUT FILE TABLE._^1_%STA-_!I_,I WILL POI€€NT TO THE FILE TABLE AS IT BUILDS._^1IN00_!LDQ_"=XMSGE10-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"ALPHA_#LOOK FOR ]D]/]T]/]P]._^1_%JMP*_!INNEXT_"JMP TO RESTART CURRENT INPUT STATEMENT IF ]Z]._^1_%CLR_"Q_^1_%STQ*_!INTYP_#INTYP = 0,1,2 DENOTES DISK,MAG-TAPE,PAPER-TAPE._^1_%INA_"-$44_$$44 IS ASCII FOR ]D]._^1_%SAN_"IN02_$SKIP IF NOT ]D]._^1_%JMP*_!IN04_$JMP IF ]D]._^1IN€€02_!RAO*_!INTYP_#(INTYP) = 1._^1_%INA_"-$54+$44_"$54 IS ASCII FOR ]T]._^1_%SAN_"IN03_$SKIP IF NOT ]T]._^1_%JMP*_!IN04_)JMP IF ]T]._^1IN03_!RAO*_!INTYP_#(INTYP)=2._^1_%INA_"-$50+$54_"$50 IS ASCII FOR ]P]._^1_%SAZ_"IN04_$SKIP IF ]P]._^1_%JMP_"ALFERR_"JMP IF NOT ]D]/]T]/]P]._^1IN04_!LDA*_!INTYP_#(A) = 0,1,2 FOR DISK,MAG-TAPE,PAPER-TAPE._^1* ENCODE THE INPUT MEDIUM AS PER SMC IOCS CONV€€ENTIONS._^1_%SAZ_"1_,SKIP IF DISK. I.E. 0 GOES TO 0._^1_%INA_"1_,I.E. 1,2 GO TO 2,3._^1_%ALS_"14_'(A)15-14 = 0,2,3 FOR DISK,MAG-TAPE,PAPER-TAPE._^1_%STA-_!(LUN),I_^1_%ALS_"1_,(A)15=1 IF PAPER TAPE._^1_%SAM_"IN31_$SKIP IF PAPER-TAPE._^1_%JMP*_!IN33_$JMP IF DISK OR MAG-TAPE._^1IN31_!LDQ_"=XMSGE18-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMALF_"LOOK FOR COMMA THEN ]A]/€€]B]._^1_%JMP*_!INNEXT_"JMP TO RESTART CURRENT INPUT STATEMENT IF ]Z]._^1_%TRA_"Q_((Q) = REPLY._^1_%LDA-_!(LUN),I_^1_%AND-_!HXEFFF_"ZERO THE ASCII/BINARY BIT._^1_%INQ_"-$42_$$42 IS ASCII FOR ]B]._^1_%SQZ_"IN32_$SKIP IF ]B]._^1_%EOR-_!HX1000_"SET BIT 12 FOR ASCII._^1_%INQ_"-$41+$42 $41 IS ASCII FOR ]A]._^1_%SQZ_"IN32_$SKIP IF ]A]._^1_%JMP_"ALFERR_"ANNOUNCE ERROR AND REQUEST REPLY._^€€1IN32_!STA-_!(LUN),I_%REMEMBER MODE SELECTION._^1IN33_!LDA*_!INTYP_#(A) = 0,1,2 FOR DISK,MAG-TAPE,PAPER-TAPE._^1_%SAZ_"IN34_$SKIP IF DISK._^1_%CLR_"A_^1_%STA-_!FILNUM,I_$FOR LUFNO MESSAGE CLARITY._^1_%JMP*_!IN05_$JMP IF MAG-TAPE OR PAPER-TAPE._^1IN34_!LDQ_"=XMSGE14-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPOS_"LOOK FOR COMMA THEN FILNUM._^1_%JMP*_!INNEXT_"JMP TO R€€ESTART CURRENT INPUT STATEMENT IF ]Z]._^1_%STA-_!FILNUM,I SET FILNUM OF INPUT FILE._^1_%JMP*_!IN09_$ACQUIRE COMMA THEN RECLTH._^1INI_"NUM_"0_,() = (I)ENTRY = FWA OF FIXED TABLES._^1IN05_!LDQ_"=XMSGE11-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPOS_"LOOK FOR COMMA THEN LUN._^1INEXT1 JMP*_!INNEXT_"JMP TO RESTART CURRENT INPUT STATEMENT IF ]Z]._^1_%TCA_"Q_((Q) = - NO.€€ REPLIED._^1_%ADQ_"=XNUMLU_!(Q) .LT. 0 IF NO. EXCEEDS MAX. POSSIBLE LUN._^1_%SQP_"IN08_$SKIP IF NO. SEEMS ACCEPTABLE AS LUN._^1_%JMP_"POSERR_"ANNOUNCE ERROR AND REQUEST REPLY._^1IN08_!TRA_"Q_((Q) = LUN._^1_%LDA-_!(LUN),I_^1_%AND-_!HXFC00_"ZERO THE LUN BITS OF LUN WORD._^1_%EAQ_"A_,COMBINE LUN AND LUN WORD._^1_%STA-_!(LUN),I_%UPDATE LUN WORD._^1IN09_!LDQ_"=XMSGE12-HERE_"(Q) = FWA OF€€ ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPOS_"LOOK FOR COMMA THEN RECLTH._^1_%JMP*_!INNEXT_"JMP TO RESTART CURRENT INPUT STATEMENT IF ]Z]._^1_%STA-_!RECLTH,I SET RECLTH OF INPUT FILE._^1_%LDQ*_!INI_%(Q) = FWA OF FIXED TABLES._^1* COMPOS SET (A) .NE. 0, BUT (YOFT+RECLTH,Q) = 0 OR =_^1* PREVIOUSLY APPROVED RECLTH VALUE._^1_%EOR-_!YOFT+RECLTH,Q (A)=0 IF NEW RECLTH = APPROVED VALUE._^€€1_%SAZ_"IN07_)SKIP IF NEW RECLTH PREAPPROVED._^1* PERHAPS NO RECLTH WAS APPROVED YET, EXPLAINING THE UNEQUAL COMPARE._^1_%LDA-_!YOFT+RECLTH,Q (A)=0 OR = PREAPPROVED VALUE._^1_%SAN_"IN12_)SKIP IF NEW RECLTH .NE. PREAPPROVED VALUE._^1* NO RECLTH VALUE HAS YET BEEN APPROVED._^1* CHECK THAT RECLTH WILL CONTAIN ALL KEY FIELDS._^1_%LDA_"KEYMAX_'(A) = MAXIMUM RELATIVE KEY-LWA._^1_%SUB-_!R€€ECLTH,I_$(RECLTH) = 1 + MAX. RELATIVE FWA CONTAINED._^1_%SAP_"IN12_)SKIP IF NOT ALL KEYS CONTAINED._^1* WE WILL APPROVE THE NEW RECLTH IF IT FACTORS WKBKSZ._^1* THE LOGIC BELOW IS OK EVEN IF WKBKSZ = 0 DUE TO COPY OR MERGE-ONLY._^1_%LDA-_!YWKBSZ,Q_$(A) = WORK BLOCK DATA SIZE._^1_%CLR_"Q_,PREPARE TO DIVIDE._^1_%DVI-_!RECLTH,I_$(Q)=0 IF NEW RECLTH IS OK._^1_%SQZ_"IN13_)SKIP IF NEW RE€€CLTH IS OK._^1* THE NEW RECLTH IS INCONSISTENT._^1IN12_!JMP_"POSERR_'ANNOUNCE ERROR AND REQUEST REPLY._^1* THE CODE BELOW SETS RECLTH FOR THE RUN._^1IN13_!LDA-_!RECLTH,I_$(A) = NEW APPROVED RECLTH VALUE._^1_%LDQ*_!INI_*(Q) = FWA OF FIXED TABLES._^1_%STA-_!YOFT+RECLTH,Q SET THE APPROVED RECLTH VALUE._^1IN07_!LDQ_"=XMSGE13-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPO€€S_"LOOK FOR COMMA THEN BLKSIZ._^1_%JMP*_!INNEXT_"JMP TO RESTART CURRENT INPUT STATEMENT IF ]Z]._^1_%STA-_!BUFLTH,I SET BLKSIZ OF INPUT FILE._^1* COMPOS GUARANTEED THAT BLKSIZ .GE. 1 AND RECLTH .GE. 1._^1* VERIFY THAT BLKSIZ/RECLTH = 1,2,3..._^1_%CLR_"Q_,PREPARE TO DIVIDE._^1_%DVI-_!RECLTH,I_$(Q)=0 IFF BLKSIZ/RECLTH = 1,2,3..._^1_%SQZ_"IN15_)SKIP IF BLKSIZ IS OK._^1_%JMP_"POSERR_'A€€NNOUNCE ERROR AND REQUEST REPLY._^1IN15_!LDA-_!BUFLTH,I_$(A) = NEW BLKSIZ._^1_%LDQ*_!INI_%(Q) = FWA OF FIXED TABLES._^1_%ADD-_!YSUMIB,Q (A) = TOTAL OF ALL INPUT BLKSIZ]S SO FAR._^1_%STA-_!YSUMIB,Q RECORD NEW TOTAL._^1_%LDA-_!YMAXIB,Q (A) = MAXIMUM OF PREVIOUS INPUT BLKSIZ]S._^1_%SUB-_!BUFLTH,I (A)15=0 IF OLD MAXIMUM STILL HOLDS._^1_%SAP_"IN10_$SKIP IF OLD MAXIMUM STILL HOLDS._^€€1_%LDA-_!BUFLTH,I (A) = NEW MAXIMUM = CURRENT BLKSIZ._^1_%STA-_!YMAXIB,Q RECORD NEW MAXIMUM._^1IN10_!LDQ_"=XMSGE16-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMBIG_"LOOK FOR COMMA THEN SKIP COUNT._^1_%JMP*_!INEXT1_"JMP TO RESTART CURRENT INPUT STATEMENT IF ]Z]._^1_%STQ-_!SKIPCT,I STORE HIGH HALF OF SKIP COUNT._^1_%STA-_!SKIPCT+1,I_"STORE LOW HALF OF SKIP COUNT._^1_€€%SQN_"IN21_$* THE EFFECT OF THIS LOGIC IS TO SET (Q) .NE. 0_^1_%SAZ_"IN21_$* IF SKIP COUNT .NE. 0._^1_%ENQ_"1_(*_^1IN21_!LDA-_!(LUN),I_^1_%AND-_!HXDFFF_"CLEAR SKIP BIT,BIT 13._^1_%SQZ_"IN22_$SKIP IF SKIP COUNT = 0._^1_%EOR-_!HX2000_"SET SKIP BIT,BIT 13._^1IN22_!STA-_!(LUN),I_!REMEMBER WHETHER OR NOT SKIP COUNT IS NONZERO._^1IN23_!RTJ_"COMMA_#LOOK FOR COMMA._^1_%JMP*_!INEXT1_"JMP TO€€ RESTART CURRENT INPUT STATEMENT IF ]Z]._^1_%JMP*_!IN26_$LOOK FOR DOCNT._^1IN25_!INA_"-$45_$$45 IS ASCII FOR ]E]._^1_%SAN_"INE17_#SKIP IF ALPHA BUT NOT ]E]._^1_%ENQ_"-0_'SET FLAG TO CAUSE BIT 11 NOT TO BE SET._^1_%JMP*_!IN27_$JMP TO UPDATE BIT 11 OF INLUN._^1INE17 LDQ_"=XMSGE17-HERE_"(Q) = FWA OF ERROR MESSAGE._^1_%RTJ_"SCDIAG_"ANNOUNCE ERROR AND REQUEST REPLY._^1IN26_!RTJ_"TOKEN_€€#LOOK FOR DOCNT._^1_%JMP*_!INE17_#JMP IF ERROR. EXPECTED DOCNT._^1_%JMP*_!INEXT1_"JMP TO RESTART CURRENT INPUT STATEMENT IF ]Z]._^1_%JMP*_!IN25_$JMP IF ALPHA TO SEE IF IT IS ]E]._^1_%STQ-_!DOCNT,I_!REMEMBER NUMERICAL DOCNT._^1_%STA-_!DOCNT+1,I_^1* FOR USE OF DOCNT BY GETU, COMPUTE NO. OF LAST RECORD OF FILE_^1* TO INCLUDE IN RUN._^1_%LDQ_"=XSKIPCT-1,I (Q) = -1 + FWA OF SKIPCT._^1_€€%LDA_"=XDOCNT,I_#(A) = FWA OF DOCNT._^1* INIT REPLACES PLUG BELOW WITH FWA OF BIGADD._^1IN16_!RTJ+_!PLUG_^1_%STQ-_!DOCNT,I_%(Q) = (1ST HALF OF MAX. RECNT)._^1_%STA-_!DOCNT+1,I_#(A) = (2ND HALF OF MAX. RECNT)._^1IN27_!LDA-_!(LUN),I_^1_%AND-_!HXF7FF_"ZERO BIT 11._^1_%SQM_"IN28_$IF ]E], THEN SKIP SETTING BIT 11._^1_%EOR-_!HX0800_"SET BIT 11 TO INDICATE NUMERICAL DOCNT._^1IN28_!STA-_!(€€LUN),I_%REMEMBER WHETHER DOCNT IS NUMBER OR "E"._^1_%LDQ*_!INI_%(Q) = FWA OF FIXED TABLES._^1_%LDA-_!YEND,Q_"(A) = FWA OF CURRENT INFILE TABLE._^1_%INA_"BUFWA_(ADD INPUT FILE TABLE SIZE._^1_%STA-_!YEND,Q_"(A) = 1 + LWA OF EXISTING SMC TABLES._^1_%RAO_"INDONE_"() = NO. OF INFILE TABLES DONE._^1_%JMP_"INCTCK_"JMP TO DO THE NEXT INFILE TABLE._^1_%EJT_]_^1OUTYP NUM_"0_(() = 0,1,2 FOR €€DISK,MAG-TAPE,PAPER-TAPE._^1OUTFIL NUM_"0_^1OUTNIT LDQ_"=XMSGP07-HERE_"(Q) = FWA OF MESSAGE._^1_%RTJ_"PROMPT_"ASK OPERATOR FOR OUTFILE STATEMENT._^1_%RTJ_"NEWSCL_"MAKE 1ST TOKEN CALL IMMEDIATELY DO FREAD._^1OUT00 LDQ_"=XMSGE10-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"ALPHA_#LOOK FOR ]D]/]T]/]P]._^1_%JMP*_!OUTNIT_"JMP TO RESTART OUTFIL STATEMENT IF ]Z]._^1_%CLR_"Q_^1€€_%STQ*_!OUTYP_#(OUTYP) = 0,1,2 DENOTES DISK,MAG-TAPE,PAPER-TAPE_^1_%STQ-_!YOFT+RECNT,I_^1_%STQ-_!YOFT+RECNT+1,I_^1_%STQ-_!YOFT+FILNUM,I_^1_%INA_"-$44_$$44 IS ASCII FOR ]D]._^1_%SAZ_"OUT02_#SKIP IF ]D]._^1_%RAO*_!OUTYP_#(OUTYP) = 1._^1_%INA_"-$54+$44 $54 IS ASCII FOR ]T]._^1_%SAZ_"OUT02_^1_%RAO*_!OUTYP_#(OUTYP)=2._^1_%INA_"-$50+$54_"$50 IS ASCII FOR ]P]._^1_%SAZ_"OUT02_#SKIP IF PAP€€ER-TAPE._^1_%JMP_"ALFERR_"ANNOUNCE ERROR AND REQUEST REPLY._^1OUT02 LDA_"OUTYP_#(A) = 0,1,2 FOR DISK,MAG-TAPE,PAPER-TAPE._^1* ENCODE THE OUTPUT MEDIUM AS PER SMC IOCS CONVENTIONS._^1_%SAZ_"1_,SKIP IF DISK. I.E. 0 GOES TO 0._^1_%INA_"1_,I.E. 1,2 GO TO 2,3._^1_%ALS_"14_'(A)15-14 = 0,2,3 FOR DISK,MAG-TAPE,PAPER-TAPE._^1_%STA-_!YOFT,I_'SET LUN WORD OF OUTPUT FILE TABLE._^1_%SAZ_"OUT09€€_#SKIP IF DISK._^1_%ALS_"1_,(A)15=1 IF PAPER TAPE._^1_%CLR_"Q_^1_%STQ-_!YOFT+FILNUM,I FOR LUFNO MESSAGE CLARITY._^1_%JMP*_!OUT05_#JMP IF MAG-TAPE OR PAPER-TAPE._^1OUT09 LDQ_"=XMSGE14-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPOS_"LOOK FOR COMMA THEN FILNUM._^1_%JMP*_!OUTNIT_"JMP TO RESTART OUTPUT FILE STATEMENT IF ]Z]._^1_%ADD- HX8000_'SET FLAG BIT TO FORCE RELEAS€€E AND REDEFINE_^1_%STA-_!YOFT+FILNUM,I_"SET FILNUM IN OUTPUT FILE TABLE._^1OUT03 LDQ_"=XMSGE11-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPOS_"LOOK FOR COMMA THEN LUN._^1_%JMP*_!OUTNIT_"JMP TO RESTART OUTFILE STATEMENT IF ]Z]._^1_%TCA_"Q_((Q) = -NO._^1_%ADQ_"=XNUMLU_!(Q) .LT. 0 IF NO. EXCEEDS MAX. POSSIBLE LUN._^1_%SQP_"OUT04_#SKIP IF NO. .LE. MAX. POSSIBLE LUN._^1€€_%JMP_"POSERR_"ANNOUNCE ERROR AND REQUEST REPLY._^1OUT04 TRA_"Q_((Q) = LUN._^1_%LDA-_!YOFT,I_'(A) = (LUN WORD OF OUTPUT FILE TABLE)._^1_%AND_"=N$D000_!ZERO THE LUN BITS. PRESERVE THE FLAGS._^1_%EAQ_"A_,COMBINE THE FLAGS AND THE LUN._^1_%STA-_!YOFT,I_'REMEMBER THE FLAGS AND THE LUN._^1OUT01 LDQ_"=XMSGE13-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMPOS_"LOOK FOR COMM€€A THEN BLKSIZ._^1_%JMP*_!OUTNIT_"JMP TO RESTART OUTFIL STATEMENT IF ]Z]._^1_%STA-_!YOFT+BUFLTH,I_"SET BLKSIZ IN OUTPUT FILE TABLE._^1* COMPOS GUARANTEED THAT BLKSIZ .GE. 1 AND RECLTH .GE. 1._^1* VERIFY THAT BLKSIZ/RECLTH = 1,2,3..._^1_%CLR_"Q_,PREPARE TO DIVIDE._^1_%DVI-_!YOFT+RECLTH,I (Q)=0 IFF BLKSIZ/RECLTH = 1,2,3..._^1_%SQZ_"OUT10_(SKIP IF BLKSIZ IS OK._^1_%JMP_"POSERR_'ANNOUNC€€E ERROR AND REQUEST REPLY._^1OUT10 JMP*_!(OUTFIL)_$EXIT._^1OUT05 SAM_"OUT06_#SKIP IF PAPER-TAPE._^1_%JMP*_!OUT03_#JMP IF MAG-TAPE TO LOOK FOR COMMA THEN LUN._^1OUT06 LDQ_"=XMSGE18-HERE_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"COMALF_"LOOK FOR COMMA THEN ]A]/]B]._^1_%JMP*_!OUTNIT_"JMP TO RESTART OUTFIL STATEMENT IF ]Z]._^1_%TRA_"Q_((Q) = REPLY._^1_%LDA-_!YOFT,I_'(A) = L€€UN AND FLAGS OF OUTPUT FILE._^1_%AND-_!HXEFFF_"ZERO ASCII FLAG. RESERVE THE REST OF (OUTLUN)._^1_%INQ_"-$42_)$42 IS ASCII FOR ]B]._^1_%SQZ_"OUT08_(SKIP IF ]B]._^1_%EOR-_!HX1000_"SET ASCII FLAG._^1OUT07 INQ_"-$41+$42_$$41 IS ASCII FOR ]A]._^1_%SQZ_"OUT08_(SKIP IF ]A]._^1_%JMP_"ALFERR_"JMP IF NOT ]A]/]B]. EXPECTED ]A]/]B]._^1OUT08 STA-_!YOFT,I_'REMEMBER FLAGS VIA LUN WORD._^1_%JMP*€€_!OUT03_#JMP TO LOOK FOR COMMA THEN LUN._^1_%EJT_]_^1* XCK DOES GLOBAL CONSISTENCY CHECKING OF THE ENTIRE SET OF TABULATED_^1* PARAMETERS._^1XCK_"NUM_"0_^1_%JMP*_!(XCK)_(EXIT._^1_%EJT_]_^1PROMPT NUM_"0_^1_%LDA*_!PRMLVL_"(A) = LEVEL OF PROMPTING._^1_%SAN_"PROM00_"SKIP IF SOME PROMPTING REQUESTED._^1_%JMP*_!(PROMPT) EXIT IF ZERO PROMPTING REQUESTED._^1PROM00 STQ*_!PROM01_"SAVE FWA O€€F LEVEL 1 MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1PROM04 RTJ+_!PLUG_)PUBLISH LEVEL 1 MESSAGE._^1_%LDA*_!PRMLVL_"(A) = LEVEL OF PROMPTING._^1_%INA_"-1_'(A)=0 IF LEVEL 1 PROMPTING REQUESTED._^1_%SAN_"PROM02_"SKIP IF LEVEL 2 PROMPTING REQUESTED._^1_%JMP*_!(PROMPT) EXIT IF LEVEL 1 PROMPTING REQUESTED._^1PROM02 LDQ*_!PROM01_"(Q) = FWA OF LEVEL 1 MESSAGE._^1_%INQ_"-2€€_+(Q) = -1 + FWA OF LENGTH OF LEVEL 1 MESSAGE._^1_%ADQ-_!1,Q_*(Q) = -3 + FWA OF LEVEL 2 MESSAGE._^1_%INQ_"3_,(Q) = FWA OF LEVEL 2 MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1PROM05 RTJ+_!PLUG_)PUBLISH LEVEL 2 MESSAGE._^1PROM03 LDQ_"=XMSGP02-HERE_"(Q) = FWA ]AWAITING REPLY]._^1* INIT REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1PROM06 RTJ+_!PLUG_)SAY ]AWAITING REPLY]._^€€1_%JMP*_!(PROMPT) EXIT._^1PROM01 NUM_"0_(() = FWA OF LEVEL 1 MESSAGE._^1PRMLVL NUM_"0_(() = REQUESTED LEVEL OF PROMPTING._^1_%EJT_]_^1SCDIAG NUM_"0_^1* INIT REPLACES PLUG BELOW WITH FWA OF SAVAQI._^1SCDIA0 RTJ+_!PLUG_)SAVE ALL REGS._^1SCDIA1 NUM_"0,0,0_^1_%STQ_"MVSRCE_"(Q) = FWA OF EXPECTED TOKEN._^1_%INQ_"-1_'(Q) = FWA OF MESSAGE LENGTH._^1_%LDQ-_!(ZERO),Q (Q) = NO. OF WORDS IN €€MESSAGE._^1SCDIA2 LDA_"=XHOPE-HERE_"(A) = FWA OF EXPECTED-TOKEN-AREA OF MSG._^1_%STA_"MVDEST_"TELL MOVE WHERE TO PLACE EXPECTATION._^1_%RTJ_"BLANK_(BLANK THE HOPE BUFFER._^1_%ADC_"HOPLEN_'() = LENGTH OF HOPE BUFFER._^1_%RTJ_"MOVE_$MOVE EXPECTED TOKEN TO MESSAGE._^1SCDIA3 LDQ_"=XMSGEXP-HERE (Q) = FWA OF MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1SCDIA5 RTJ+_!PLUG_)T€€YPE THE MESSAGE._^1_%LDA_"PRMLVL_"(A) = REQUESTED LEVEL OF PROMPTING._^1_%SAZ_"SCDIAB_'STOP RUN IF NO PROMPTING REQUESTED._^1_%LDQ*_!PROM03+1_$(Q) = FWA ]AWAITING REPLY]._^1_%RTJ*_!(SCDIA5+1)_"CALL TYPOUT._^1_%RTJ_"NEWSCL_"GIVE USER A CHANCE TO RECOVER._^1* INIT REPLACES PLUG BELOW WITH FWA OF RESAQI._^1SCDIA6 RTJ+_!PLUG_)RESTORE ALL REGS._^1SCDIA4 ADC_"SCDIA1-HERE_"() = FWA OF A,Q€€,I SAVE AREA._^1_%JMP*_!(SCDIAG)_"EXIT._^1SCDIAB SET_"A,Q_*DELETE OPTIONAL MESSAGE OF BOMB._^1_%JMP_"EDTBMB_'SMC ABNORMALLY TERMINATES._^1_%EJT_]_^1* MOVE RIGHT TO LEFT._^1* MOVE MUST BE FAST. DURING A SINGLE SORT RUN, MOVE MOVES EACH BYTE OF_^1* EACH LOGICAL RECORD SEVERAL TIMES, DESPITE THE FACT THAT THE NUMBER OF_^1* SUCH MOVES IS REDUCED BY MOVING POINTERS INSTEAD OF LOGICAL RE€€CORDS,_^1* WHENEVER POSSIBLE._^1* WORD-TIMES = 4 + 9 * WORDS-TO-MOVE, E.G. 364 = F(80 BYTES), 4 = F(0)._^1* THE CALLING SEQUENCE IS_!(MVSRCE)ENTRY = FWA OF SOURCE._^1*_:(MVDEST)ENTRY = FWA OF DESTINATION._^1*_:(Q)ENTRY = NO. OF WORDS TO MOVE._^1*_:RTJ MOVE_"MOVE IFF (Q)ENTRY .GE. 1._^1*_:(A)EXIT = (LAST WORD MOVED)._^1*_:(Q)EXIT = -1._^1*_:(I),(MVSRCE),(MVDEST) EXIT = ENTRY._^1MOVE€€_!NUM_"0_^1MVLOOP INQ_"-1_+(Q) = FWA NEXT SOURCE WORD - FWA OF SOURCE,_^1*_5= FWA NEXT DESTINATION WORD - FWA OF DESTINATION._^1_%SQP_"MVLDA_(SKIP IF MORE WORDS TO MOVE._^1_%JMP*_!(MOVE)_'EXIT._^1MVLDA LDA*_!(MVSRCE),Q_"(A) = (NEXT WORD TO MOVE)._^1_%STA*_!(MVDEST),Q_"MOVE A WORD._^1_%JMP*_!MVLOOP_'EXIT OR MOVE NEXT WORD._^1MVSRCE NUM_"0_,() = FWA OF SOURCE._^1MVDEST NUM_"0_,() = €€FWA OF DESTINATION._^1* BLANK RIGHT TO LEFT._^1* TO BLANK THE MOVE DESTINATION BUFFER, CALL BLANK JUST BEFORE MOVE._^1* THE CALLING SEQUENCE IS_!(MVDEST)ENTRY = FWA OF DESTINATION._^1*_:P_!RTJ BLANK_"BLANK DESTINATION BUFFER._^1*_:P+1 NO. OF WORDS TO BLANK._^1*_:P+2 EXIT._^1*_:(A)EXIT = TWO BLANK BYTES._^1*_:(Q),(I) EXIT = (Q),(I) ENTRY._^1BLANK NUM_"0_^1_%STQ*_!BLANKQ_'SAVE (Q)EN€€TRY._^1_%LDA_"=A_+(A) = TWO BLANK BYTES._^1_%LDQ*_!(BLANK)_%(Q) = NO. OF WORDS TO BLANK._^1BLANKL SQZ_"BLANKX_'SKIP IF ZERO WORDS LEFT TO BLANK._^1_%INQ_"-1_+POINT TO NEXT WORD TO BLANK._^1_%STA*_!(MVDEST),Q_"BLANK THAT WORD._^1_%JMP*_!BLANKL_'SEE IF THERE IS A NEXT WORD TO BLANK._^1BLANKX LDQ*_!BLANKQ_'RESTORE (Q)ENTRY._^1_%RAO*_!BLANK_(SET UP P+2 EXIT._^1_%JMP*_!(BLANK)_%TAKE P+2€€ EXIT._^1BLANKQ NUM_"0_,() = (Q)ENTRY._^1_%EJT_]_^1NEWSCL NUM_"0_^1_%STA*_!NEWSC1_"SAVE (A)ENTRY._^1_%ENA_"-0_^1_%STA_"BYTBIN_"FORCE SCLBYT TO BE CALLED AT NEXT TOKEN CALL._^1_%ENA_"ENDCOL_^1_%STA*_!SCLDEX_"FORCE SCLBUF TO BE RELOADED AT NEXT SCLBYT CALL._^1_%LDA*_!NEWSC1_"RESTORE (A)ENTRY._^1_%JMP*_!(NEWSCL)_"EXIT._^1NEWSC1 NUM_"0_(() = (A)ENTRY._^1_%EJT_]_^1* SCLBYT SUPPLIES SUCC€€ESSIVE BYTES OF SORT CONTROL LANGUAGE._^1* THE CALLING SEQUENCE IS_!RTJ SCLBYT_^1*_:(A)EXIT = NEXT NONBLANK BYTE .NE. $FF._^1*_:(BYTBIN)EXIT = (A)EXIT._^1*_:(Q),(I) EXIT = (Q),(I) ENTRY._^1SCLLIM NUM_"0_(() = NO. CHARACTERS IN LAST READ._^1*THE FOLLOWING COMMENT APPLIES AT ENTRY TO SCLBYT._^1SCLDEX NUM_"-1_'() = FCA LAST BYTE - FCA SCLBUF._^1SCLBYT NUM_"0_^1* INIT REPLACES PLUG BEL€€OW WITH FWA OF SAVAQI._^1_%RTJ+_!PLUG_)SAVE ALL REGS._^1SCLAQI NUM_"0,0,0_(()EXIT = (A),(Q),(I) EXIT._^1SCLRAO RAO*_!SCLDEX_"(SCLDEX) = FCA CURRENT SCL BYTE - FCA SCLBUF._^1_%LDA*_!SCLDEX_'(A) = FCA CURRENT SCL BYTE - FCA SCLBUF._^1_%SUB*_!SCLLIM_"(A)=0 IFF SCLBUF IS EMPTY._^1_%SAM_"1_(SKIP IF SCLBUF NOT EMPTY._^1_%JMP*_!SCLRD_#READ MORE._^1_%LDQ*_!SCLDEX_'(Q) = FCA CURRENT SCL BYT€€E - FCA SCLBUF._^1* THE LRS BELOW RELIES ON (A)15=0 BEFORE THE LLS. THE ABOVE LOGIC MAKES_^1* THIS AN OK ASSUMPTION. AFTER THE LLS, (Q) = FWA CURR BYTE - FWA SCLBUF_^1* WHILE (A)15=1 IFF THE CURR BYTE IS IN THE LOWER HALF OF A WORD._^1_%LRS_"1_"(Q) = WD INDEX NEXT BYTE. (A)15=0 IFF LEFT HALF-WORD._^1_%SAP_"SCLTOP_"SKIP IF CURR BYTE IS LEFT HALF-WORD._^1_%LDA*_!SCLBUF,Q_"(A)7-0 = CU€€RR BYTE OF SCL._^1_%JMP*_!SCLAND_"JMP TO SET (A)15-8 = 0._^1SCLTOP LDA*_!SCLBUF,Q_"(A)15-8 = CURR BYTE OF SCL._^1_%ARS_"8_((A)7-0 = CURR BYTE OF SCL._^1SCLAND AND-_!HX00FF_"(A)15-8=0. (A)7-0 = CURRENT BYTE OF SCL._^1_%STA*_!SCLAQI_"RESAQI WILL SET (A)EXIT = CURRENT BYTE OF SCL._^1_%EOR-_!HX0020_"(A)=0 IFF CURRENT BYTE IS A BLANK._^1_%SAZ_"SCLNUL_'SKIP IFF CURRENT BYTE IS A BLANK._^€€1* IF AN ODD NO. OF BYTES WAS INPUT, $FF = THE LAST BYTE OF THE_^1* LAST WORD INPUT._^1_%EOR*_!HX00DF_'(A)=0 IFF CURRENT BYTE IS $FF._^1_%SAN_"SCLRES_'SKIP IF CURRENT BYTE .NE. $FF._^1SCLNUL JMP*_!SCLRAO_'GET ANOTHER BYTE._^1HX00DF NUM_"$00DF_($00DF = $0020 .EOR. $00FF._^1* INIT REPLACES PLUG BELOW WITH FWA OF RESAQI._^1SCLRES RTJ+ PLUG_)SET (A)EXIT, RESTORE(Q),(I) ENTRY._^1SCL01 €€ADC_"SCLAQI-HERE_"() = FWA OF A,Q,I SAVE AREA._^1_%STA*_!BYTBIN_'() = NEW BYTE OF SCL._^1_%JMP*_!(SCLBYT)_$EXIT._^1* INIT REPLACES PLUG BELOW WITH FWA OF TYPIN._^1SCLRD RTJ+_!PLUG_)READ A LINE OF SCL._^1SCL02 ADC_"SCLBUF-HERE_!() = FWA OF TYPIN BUFFER._^1_%ALS_"1_,(A) = NO. OF BYTES ACTUALLY READ._^1_%STA*_!SCLLIM_'LIMIT THE SCAN OF SCLBUF._^1_%ENA_"-1_)-1 IMPLIES THE LAST BYTE J€€UST PRECEDED SCLBUF._^1_%STA_"SCLDEX_"INITIALIZE BYTE INDEX FOR NEW SCLBUF LOAD._^1_%JMP*_!SCLRAO_"BEGIN TO SCAN NEW SCLBUF LOAD._^1_%ADC_"ENDWRD_'() = LENGTH OF SCLBUF._^1SCLBUF BZS_"SCLBUF(ENDWRD)_!SORT CONTROL LANGUAGE INPUT BUFFER._^1_%EJT_]_^1BYTBIN NUM_"$FF_%() = -0,$FF, OR LAST NONBLANK SCL BYTE._^1TOKI_!NUM_"0_(() = (I)ENTRY._^1TOKEN NUM_"0_^1_%LDA-_!I_((A) = (I)ENTRY._^1_€€%STA*_!TOKI_$SAVE (I)ENTRY._^1_%LDA*_!BYTBIN_"(A) = -0,$FF, OR LAST NONBLANK SCL BYTE._^1_%SAP_"TOK00_#SKIP IF BYTBIN FILLED. (A)=BYTE._^1_%RTJ_"SCLBYT_"SET (A) = NEXT NONBLANK BYTE._^1TOK00 STA_"TOKVAL_"SET TENTATIVE VALUE OF TOKEN._^1_%TRA_"Q_((Q)15-8=0. (Q)7-0 = THE BYTE._^1_%ADQ-_!HX2000_"MAKE (Q)15-8 = BLANK._^1_%STQ_"REPLY_#SET REPLY IN MSGEXP._^1_%INA_"-$2C_$$2C IS ASCII FO€€R COMMA._^1_%SAN_"TOKDCK_"SKIP IF NOT COMMA._^1TOKALF ENA_"-0_'SET BYTBIN EMPTY._^1_%STA*_!BYTBIN_^1_%JMP*_!TOKP3_#TAKE P+3(ALPHA) EXIT._^1TOKP4 RAO*_!TOKEN_#ENTER HERE FOR P+4(NUMBER) EXIT._^1TOKP3 RAO*_!TOKEN_#ENTER HERE FOR P+3(ALPHA) EXIT._^1TOKP2 RAO*_!TOKEN_#ENTER HERE FOR P+2(Z) EXIT._^1TOKP1 LDA*_!TOKI_$(A) = (I)ENTRY._^1_%STA-_!I_(RESTORE (I)ENTRY._^1_%LDA*_!TOKVAL_"(A€€) = VALUE OF TOKEN._^1_%JMP*_!(TOKEN)_"P+1,P+2,P+3,P+4 FOR ERROR,Z,ALPHA,NUMBER._^1TOKDCK RTJ*_!DIGTST_"CHECK FOR DECIMAL DIGIT._^1_%JMP*_!TOKACK_"JMP IF NOT DECIMAL DIGIT._^1_%JMP*_!TOKNUM_"JMP IF DECIMAL DIGIT._^1TOKACK LDA*_!BYTBIN_"(A) = CURRENT NONBLANK BYTE._^1_%INA_"-$41_$$41 IS ASCII FOR A._^1_%SAP_"TOKGEA_"SKIP IF (BYTBIN) .GE. A._^1TOKERR SET_"A_^1_%STA*_!BYTBIN_"FLAG BYT€€BIN AS EMPTY._^1_%JMP*_!TOKP1_#TAKE P+1 EXIT SINCE ERROR._^1TOKGEA INA_"-$47+$41_"$47 IS ASCII FOR G._^1_%SAP_"1_(SKIP IF (BYTBIN) .GE. G._^1_%JMP*_!TOKALF_"JMP IF A .LE. (BYTBIN) .LE. F._^1_%INA_"-$4C+$47_"$4C IS ASCII FOR L._^1_%SAN_"1_^1_%JMP*_!TOKALF_"JMP IF (BYTBIN)=L._^1_%INA_"-$4D+$4C_"$4D IS ASCII FOR M._^1_%SAN_"1_^1_%JMP*_!TOKALF_"JMP IF (BYTBIN)=M._^1_%INA_"-$4E+$4D_"$4E€€ IS ASCII FOR N._^1_%SAN_"1_^1_%JMP*_!TOKALF_"JMP IF (BYTBIN)=N._^1_%INA_"-$50+$4E_"$50 IS ASCII FOR P._^1_%SAN_"1_^1_%JMP*_!TOKALF_"JMP IF (BYTBIN)=P._^1_%INA_"-$53+$50_"$53 IS ASCII FOR S._^1_%SAN_"1_^1_%JMP*_!TOKALF_"JMP IF (BYTBIN)=S._^1_%INA_"-$54+$53_"$54 IS ASCII FOR T._^1_%SAN_"1_^1_%JMP*_!TOKALF_"JMP IF (BYTBIN)=T._^1_%INA_"-$5A+$54_"$5A IS ASCII FOR Z._^1_%SAZ_"1_(SKIP IF€€ Z._^1_%JMP*_!TOKERR_"JMP IF INVALID BYTE IN BYTBIN._^1_%ENA_"-0_^1_%STA_"BYTBIN_"FLAG BYTBIN AS EMPTY._^1_%JMP_"TOKP2_#P+2 EXIT SINCE Z._^1TOKDCT NUM_"0_(COUNT OF DIGITS SO FAR FOUND FOR CURRENT TOKEN._^1TOKVAL NUM_"0,0_^1BYTSTK BZS_"BYTSTK(8)_^1*THE LOGIC BELOW ATTEMPTS TO GET AND STACK A STRING OF .LE. 8 DIGITS._^1TOKNUM ENA_"0_^1_%STA*_!TOKDCT_^1_%STA*_!TOKVAL_^1_%STA*_!TOKVAL+€€1_^1TOKNLP RAO*_!TOKDCT_"COUNT EACH DIGIT IN CURRENT NUMBER._^1_%LDA*_!BYTBIN_"(A)15-8=0. (A)7-0 = THE ASCII DIGIT._^1_%LDQ*_!TOKDCT_"(Q) = ORDINAL OF CURRENT DIGIT._^1_%STA*_!BYTSTK-1,Q_!STACK THE CURRENT DIGIT._^1_%RTJ_"SCLBYT_"GET NEXT NONBLANK BYTE._^1_%RTJ*_!DIGTST_"CHECK FOR DECIMAL DIGIT._^1_%JMP*_!TOKNMV_"JMP IF NOT DECIMAL DIGIT._^1_%INQ_"-8_'8 DIGITS IS OUR LIMIT._^1_%SQZ€€_"1_(SKIP IF WE]VE BAGGED OUR LIMIT._^1_%JMP*_!TOKNLP_"COUNT AND STACK NEW DIGIT._^1*THE LOGIC BELOW RIGHT-ADJUSTS THE DIGIT-STRING WITHIN BYTSTK._^1TOKNMV LDA_"=XBYTSTK-HERE_"(A) = FWA FROM WHICH TO MOVE._^1_%STA_"MVSRCE_"TELL MOVE._^1_%LDQ*_!TOKDCT_"(Q) = NO. OF DIGITS IN STRING._^1_%TCQ_"Q_((Q) = - NO. OF DIGITS IN STRING._^1_%INQ_"8_((Q) = ]TO] FWA - ]FROM] FWA._^1_%AAQ_"A_((A)€€ = FWA TO WHICH TO MOVE._^1_%STA_"MVDEST_"TELL MOVE._^1_%LDQ*_!TOKDCT_"(Q) = LENGTH OF MOVE._^1_%RTJ_"MOVE_$RIGHT-ADJUST THE DIGIT STRING._^1*TO COMPLETE THE RIGHT-ADJUSTMENT, FILL FRONT OF BYTSTK WITH ZEROES._^1_%LDQ*_!TOKDCT_'(Q) = NO. OF DIGITS IN STRING._^1_%TCQ_"Q_((Q) = - NO. OF DIGITS IN STRING._^1_%INQ_"8_((Q) = NO. OF LEADING ZEROS NEEDED._^1TOKZLP SQZ_"TOKZXT_'SKIP IF ALL€€ DONE._^1_%INQ_"-1_+POINT TO NEXT RECIPIENT OF ZERO._^1_%ENA_"$30_%(A) = ASCII ZERO._^1_%STA_"BYTSTK,Q STACK A LEADING ZERO._^1_%JMP*_!TOKZLP_"JMP TO STACK NEXT ZERO._^1*NOW WE REPLACE EACH ASCII DIGIT STACKED WITH ITS BINARY VALUE._^1TOKZXT ENQ_"7_,START WITH RIGHTHAND DIGIT._^1TOKM30 LDA*_!BYTSTK,Q (A) = ASCII DIGIT._^1_%INA_"-$30_$(A) = BINARY VALUE._^1_%STA*_!BYTSTK,Q REPLAC€€E ASCII WITH BINARY._^1_%SQZ_"TOKD2A_"SKIP IF ALL DONE._^1_%INQ_"-1_'POINT TO NEXT WORD TO CONVERT._^1_%JMP*_!TOKM30_"JMP TO CONVERT NEXT WORD._^1*NOW WE HAVE A RIGHT-JUSTIFIED STRING OF 8 DECIMAL DIGITS._^1*EACH DIGIT IS REPRESENTED BY ITS VALUE AS 16] OF BINARY._^1*LET]S SPLIT THE 8-DIGIT STRING INTO 2 4-DIGIT STRINGS._^1*THEN LET]S CONVERT EACH 4-DIGIT STRING TO 16] OF BINARY,_^€€1*.GE. 0 AND .LE. 9999 IN DECIMAL VALUE._^1TOKD2A ENA_"-3_'START WITH LEFTHAND DIGIT_^1_%STA-_!I_(OF RIGHTHAND 4-DIGIT STRING._^1TOKDAL LDA*_!BYTSTK+7,I_"(A) = DIGIT._^1_%MUI*_!TOKFAC+3,I_"ALLOW FOR SIGNIFICANCE OF DIGIT._^1_%ADD*_!TOKVAL_"ACCUMULATE NET WORTH OF_^1_%STA*_!TOKVAL_"RIGHTHAND 4-DIGIT STRING._^1_%LDA-_!I_((A) = INDEX OF LATEST DIGIT._^1_%SAZ_"TOKD2Q_"SKIP IF ALL DONE €€WITH RIGHTHAND STRING._^1_%RAO-_!I_(POINT TO NEXT DIGIT._^1_%JMP*_!TOKDAL_"HANDLE THE NEXT DIGIT._^1TOKFAC NUM_"1000,100,10,1_!DIVISORS FOR EUCLID]S ALGORITHM._^1TOKD2Q ENA_"-3_'START WITH LEFTHAND DIGIT_^1_%STA-_!I_(OF LEFTHAND 4-DIGIT STRING._^1TOKDQL LDA*_!BYTSTK+3,I_!(A) = DIGIT._^1_%MUI*_!TOKFAC+3,I_!ALLOW FOR SIGNIFICANCE OF DIGIT._^1_%ADD*_!TOKVAL+1 ACCUMULATE NET WORTH OF_€€^1_%STA*_!TOKVAL+1 LEFTHAND 4-DIGIT STRING._^1_%LDA-_!I_((A) = INDEX OF LATEST DIGIT._^1_%SAZ_"TOKDQA_"SKIP IF ALL DONE WITH LEFTHAND STRING._^1_%RAO-_!I_(POINT TO NEXT DIGIT._^1_%JMP*_!TOKDQL_'HANDLE THE NEXT DIGIT._^1TOKDQA LDQ*_!TOKVAL+1 (Q) = VALUE OF LEFTHAND 4-DIGIT STRING._^1_%JMP*_!TOKP4_#TAKE P+4(NUMBER) EXIT._^1_%EJT_]_^1DIGTST NUM_"0_^1_%STA*_!DIGA_$SAVE (A)ENTRY._^1_%€€LDA_"BYTBIN_"(A) = CURRENT SCL BYTE._^1_%INA_"-$30_$(A)15=0 IF DIGIT._^1_%SAM_"DIGXIT_"IF NOT DIGIT, SKIP TO TAKE P+1 RETURN._^1_%INA_"-$3A+$30 (A)15=1 IF DIGIT._^1_%SAP_"DIGXIT_"IF NOT DIGIT, SKIP TO TAKE P+1 RETURN._^1DIGRAO RAO_"DIGTST_"SET UP P+2 RETURN SINCE DIGIT._^1DIGXIT LDA*_!DIGA_$RESTORE (A)ENTRY._^1_%JMP*_!(DIGTST)_$EXIT._^1DIGA_!NUM_"0_(() = (A)ENTRY._^1_%EJT_]_^1BIGN€€UM NUM_"0_^1_%STQ*_!BIGQSV_"SAVE FWA OF MESSAGE._^1_%LDQ*_!BIGNUM_^1_%INQ_"1_^1_%STQ*_!BIGP2_#SET UP P+2 EXIT._^1BIGTOK RTJ_"TOKEN_#LOOK FOR NO._^1_%JMP*_!BIGERR_"JMP IF ALIEN. EXPECTED NO._^1_%JMP*_!(BIGNUM) TAKE P+1 EXIT IF ]Z]._^1_%JMP*_!BIGERR_"JMP IF ALPHA. EXPECTED NO._^1_%JMP*_!(BIGP2)_!TAKE P+2 EXIT IF NO._^1BIGP2 NUM_"0_(P+2 FWA FOR P+2 EXIT._^1BIGERR LDQ*_!BIGQSV_"(Q) =€€ FWA OF MESSAGE._^1_%RTJ_"SCDIAG_"ANNOUNCE ERROR AND REQUEST REPLY._^1_%JMP*_!BIGTOK_"GIVE OPERATOR ANOTHER CHANCE._^1BIGQSV NUM_"0_(() = FWA OF MESSAGE._^1_%EJT_]_^1COMBIG NUM_"0_^1_%STQ*_!CBGQSV_"SAVE FWA OF MESSAGE._^1_%RTJ_"COMMA_#LOOK FOR COMMA._^1_%JMP*_!(COMBIG) TAKE P+1 EXIT IF ]Z]._^1_%LDQ*_!CBGQSV_"(Q) = FWA OF ERROR MESSAGE WE MIGHT USE._^1_%RTJ_"BIGNUM_"LOOK FOR NO. .G€€E. 0 AND .LE. 99999999._^1_%JMP*_!(COMBIG) TAKE P+1 EXIT IF ]Z]._^1_%RAO*_!COMBIG_"SET UP P+2 EXIT._^1_%JMP*_!(COMBIG) TAKE P+2 EXIT._^1CBGQSV NUM_"0_(() = FWA OF MESSAGE._^1_%EJT_]_^1* POSNUM DOES A P+1 RETURN IF THE TOKEN IS ]Z], OR A P+2 RETURN IF_^1* THE TOKEN IS A NO. .GE. 1 AND .LE. 32767. POSNUM REJECTS TOKENS_^1* OTHER THAN THE FOREGOING TYPES, AND LETS THE OPERATOR TRY A€€GAIN_^1* UNTIL POSNUM GETS A LEGAL TOKEN. (A)EXIT, AT P+2, = THE NO. IN_^1* BINARY FORM. (Q)ENTRY = FWA OF MESSAGE TO ISSUE FOR A BAD TOKEN._^1POSNUM NUM_"0_^1_%LDA*_!POSNUM_^1_%INA_"1_^1_%STA*_!POSP2_#SET UP P+2 EXIT IN CASE WE WILL NEED IT._^1POSBIG RTJ*_!BIGNUM_"LOOK FOR NO._^1_%JMP*_!(POSNUM) TAKE P+1 EXIT IF ]Z]._^1_%STQ*_!POSQ_$SAVE UPPER DIGITS._^1_%STA*_!POSA_$SAVE LOWER D€€IGITS._^1_%SQN_"POSNZ_(SKIP IF NONZERO REPLY._^1_%SAN_"POSNZ_(SKIP IF NONZERO REPLY._^1_%JMP*_!POSERR_'A ZERO REPLY IS AN ERROR._^1POSNZ INQ_"-4_^1_%SQP_"POSERR_"SKIP IF NO. .GE. 40000._^1_%LDA*_!POSQ_^1_%MUI_"=N10000_!CONVERT TOP DIGIT. (A) = BINARY EQUIVALENT._^1_%SOV_"0_(CLEAR OVERFLOW._^1_%ADD*_!POSA_$ADD THE LOWER DIGITS._^1_%SOV_"POSERR_"SKIP IF OVERFLOW._^1_%JMP*_!(POSP2)_!€€NO OVERFLOW, SO TAKE P+2 EXIT WITH (A) = NO._^1POSP2 NUM_"0_^1POSERR JMP*_!BIGERR_"ANNOUNCE ERROR, REQUEST REPLY, LET OP RETRY._^1POSA_!NUM_"0_(() = UPPER DIGITS._^1POSQ_!NUM_"0_(() = LOWER DIGITS._^1_%EJT_]_^1COMPOS NUM_"0_^1_%STQ*_!COMPS1_"SAVE FWA OF MESSAGE._^1_%LDQ*_!COMPOS_^1_%INQ_"1_^1_%STQ*_!COMPS2_"SET UP P+2 EXIT._^1_%RTJ_"COMMA_#LOOK FOR COMMA._^1_%JMP*_!(COMPOS) TAKE €€P+1 EXIT IF ]Z]._^1_%LDQ*_!COMPS1_"(Q) = FWA OF MESSAGE._^1_%RTJ_"POSNUM_"LOOK FOR NO. .GE. 1 AND .LE. 32767._^1_%JMP*_!(COMPOS) TAKE P+1 EXIT IF ]Z]._^1_%JMP*_!(COMPS2) TAKE P+2 EXIT WITH (A) = NO._^1COMPS1 NUM_"0_(() = (Q)ENTRY = FWA OF MESSAGE._^1COMPS2 NUM_"0_(() = P+2._^1_%EJT_]_^1COMMA NUM_"0_^1COMMA1 RTJ_"TOKEN_#LOOK FOR COMMA._^1_%JMP*_!COMMAE_"JMP IF ERROR. EXPECTED COM€€MA._^1_%JMP*_!(COMMA)_"TAKE P+1 EXIT IF ]Z]._^1_%JMP*_!COMMA2_"JMP IF ALPHA._^1COMMAE LDQ_"=XMSGE02-HERE_"(Q) = FWA OF ERROR MESSAGE._^1_%RTJ_"SCDIAG_"ANNOUNCE ERROR AND REQUEST REPLY._^1_%JMP*_!COMMA1_"GIVE OPERATOR ANOTHER CHANCE._^1COMMA2 INA_"-$2C_$$2C IS ASCII FOR COMMA._^1_%SAZ_"COMMA3_"SKIP IF COMMA._^1_%JMP*_!COMMAE_"JMP IF NOT COMMA._^1COMMA3 RAO*_!COMMA_(SET UP P+2 EXIT S€€INCE COMMA._^1_%JMP*_!(COMMA)_!TAKE P+2 EXIT SINCE COMMA._^1_%EJT_]_^1COMALF NUM_"0_^1_%STQ*_!COMAL1_"SAVE FWA OF MESSAGE._^1_%LDQ*_!COMALF_^1_%INQ_"1_^1_%STQ*_!COMAL2_"SET UP P+2 EXIT._^1_%RTJ_"COMMA_(LOOK FOR COMMA._^1_%JMP*_!(COMALF) TAKE P+1 EXIT IF ]Z]._^1_%LDQ*_!COMAL1_"(Q) = FWA OF MESSAGE._^1_%RTJ_"ALPHA_#LOOK FOR ALPHABETIC TOKEN._^1_%JMP*_!(COMALF) TAKE P+1 EXIT IF ]Z].€€_^1_%JMP*_!(COMAL2) TAKE P+2 EXIT WITH (A) = ALPHABETIC TOKEN._^1COMAL1 NUM_"0_(() = (Q)ENTRY = FWA OF MESSAGE._^1COMAL2 NUM_"0_(() = P+2._^1_%EJT_]_^1ALPHA NUM_"0_^1_%LDA*_!ALPHA_^1_%INA_"1_^1_%STA*_!ALFP2_#SET UP P+2 EXIT IN CASE WE WILL NEED IT._^1_%STQ*_!ALFQ_$SAVE FWA OF MESSAGE._^1ALFTOK RTJ_"TOKEN_#LOOK FOR ALPHA._^1_%JMP*_!ALFERR_"JMP IF ALIEN. EXPECTED ALPHA._^1_%JMP*_!(€€ALPHA)_!TAKE P+1 EXIT IF ]Z]._^1_%JMP*_!(ALFP2)_!TAKE P+2 EXIT IF ALPHA._^1ALFERR LDQ*_!ALFQ_$(Q) = FWA OF MESSAGE._^1_%RTJ_"SCDIAG_"ANNOUNCE ERROR AND REQUEST REPLY._^1_%JMP*_!ALFTOK_"GIVE OPERATOR ANOTHER CHANCE._^1ALFP2 NUM_"0_(P+2 FWA FOR P+2 EXIT._^1ALFQ_!NUM_"0_(FWA OF MESSAGE._^1_%EJT_]_^1_%ADC_"MNDP00-MSGP00_^1MSGP00 NUM_"$0D0A_#$0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,RUN=$_€€^1_%NUM_"$0D0A_($0D=RETURN. $0A=LINE FEED._^1MNDP00 EQU_"MNDP00(*)_^1_%ADC_"MNDP01-MSGP01_^1MSGP01 ALF_"$,_!D,(WKBKSZ),(S/N),(KEYCNT),(FILCNT),(CR)$_^1_%NUM_"$0D0A_#$0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,_!M,(S/N),(KEYCNT),(FILCNT),(CR)$_^1_%NUM_"$0D0A_^1_%ALF_"$,_!C,(FILCNT),(CR)$_^1MNDP01 EQU_"MNDP01(*)_^1_%ADC_"MNDP02-MSGP02_^1MSGP02 NUM_"$0D0A_#$0D=RETURN. $0A=LINE FEED._^1_%ALF€€_"$,AWAITING REPLY$_^1_%NUM_"$0D0A_($0D=RETURN. $0A=LINE FEED._^1MNDP02 EQU_"MNDP02(*)_^1_%ADC_"MNDP03-MSGP03_^1MSGP03 NUM_"$0D0A_#$0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,KEYS=$_^1_%NUM_"$0D0A_($0D=RETURN. $0A=LINE FEED._^1MNDP03 EQU_"MNDP03(*)_^1_%ADC_"MNDP04-MSGP04_^1MSGP04 ALF_"$,_!...L/S/F,A/D,(KEYCOL),...$_^1_%NUM_"$0D0A_#$0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,_!...C,A/D,(KEYCOL)€€,(KEYCOLS),...$_^1MNDP04 EQU_"MNDP04(*)_^1_%ADC_"MNDP05-MSGP05_^1MSGP05 NUM_"$0D0A_#$0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,INFILE $_^1MSGINN NUM_"0,0_^1_%ALF_"$, =$_^1_%NUM_"$0D0A_($0D=RETURN. $0A=LINE FEED._^1MNDP05 EQU_"MNDP05(*)_^1_%ADC_"MNDP06-MSGP06_^1MSGP06 ALF_"$,_!D,(FILNUM),(RECLTH),(BLKSIZ),(SKIPCNT),(DOCNT),(CR)$_^1_%NUM_"$0D0A_($0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,_!T€€,(LUN),(RECLTH),(BLKSIZ),(SKIPCNT),(DOCNT),(CR)$_^1_%NUM_"$0D0A_($0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,_!P,A/B,(LUN),(RECLTH),(BLKSIZ),(SKIPCNT),(DOCNT),(CR)$_^1MNDP06 EQU_"MNDP06(*)_^1_%ADC_"MNDP07-MSGP07_^1MSGP07 NUM_"$0D0A_#$0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,OUTFILE=$_^1_%NUM_"$0D0A_($0D=RETURN. $0A=LINE FEED._^1MNDP07 EQU_"MNDP07(*)_^1_%ADC_"MNDP08-MSGP08_^1MSGP08 ALF_"$,_!D€€,(FILNUM),(LUN),(BLKSIZ),(CR)$_^1_%NUM_"$0D0A_($0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,_!T,(LUN),(BLKSIZ),(CR)$_^1_%NUM_"$0D0A_($0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,_!P,A/B,(LUN),(BLKSIZ),(CR)$_^1MNDP08 EQU_"MNDP08(*)_^1_%EJT_]_^1_%ADC_"MNDE00-MSGE00_^1MSGE00 ALF_"$,D/M/C$_^1MNDE00 EQU_"MNDE00(*)_^1_%ADC_"MNDE01-MSGE01_^1MSGE01 ALF_"$,(FILCNT)$_^1MNDE01 EQU_"MNDE01(*)_^1_%ADC_"MNDE0€€2-MSGE02_^1MSGE02 ALF_"$,S/N$_^1MNDE02 EQU_"MNDE02(*)_^1_%ADC_"MNDE03-MSGE03_^1MSGE03 ALF_"$,(KEYCNT)$_^1MNDE03 EQU_"MNDE03(*)_^1_%ADC_"MNDE04-MSGE04_^1MSGE04 ALF_"$,,$_^1MNDE04 EQU_"MNDE04(*)_^1_%ADC_"MNDE05-MSGE05_^1MSGE05 ALF_"$,(WKBKSZ)$_^1MNDE05 EQU_"MNDE05(*)_^1_%ADC_"MNDE06-MSGE06_^1MSGE06 ALF_"$,L/S/F/C$_^1MNDE06 EQU_"MNDE06(*)_^1_%ADC_"MNDE07-MSGE07_^1MSGE07 ALF_"$,A/D$_^1€€MNDE07 EQU_"MNDE07(*)_^1_%ADC_"MNDE08-MSGE08_^1MSGE08 ALF_"$,(KEYCOL)$_^1MNDE08 EQU_"MNDE08(*)_^1_%ADC_"MNDE09-MSGE09_^1MSGE09 ALF_"$,(KEYCOLS)$_^1MNDE09 EQU_"MNDE09(*)_^1_%ADC_"MNDE10-MSGE10_^1MSGE10 ALF_"$,D/T/P$_^1MNDE10 EQU_"MNDE10(*)_^1_%ADC_"MNDE11-MSGE11_^1MSGE11 ALF_"$,(LUN)$_^1MNDE11 EQU_"MNDE11(*)_^1_%ADC_"MNDE12-MSGE12_^1MSGE12 ALF_"$,(RECLTH)$_^1MNDE12 EQU_"MNDE12(*)_^1€€_%ADC_"MNDE13-MSGE13_^1MSGE13 ALF_"$,(BLKSIZ)$_^1MNDE13 EQU_"MNDE13(*)_^1_%ADC_"MNDE14-MSGE14_^1MSGE14 ALF_"$,(FILNUM)$_^1MNDE14 EQU_"MNDE14(*)_^1_%ADC_"MNDE15-MSGE15_^1MSGE15 NUM_"$0D0A_#$0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,(PROMLVL)$_^1MNDE15 EQU_"MNDE15(*)_^1_%ADC_"MNDE16-MSGE16_^1MSGE16 ALF_"$,(SKIPCNT)$_^1MNDE16 EQU_"MNDE16(*)_^1_%ADC_"MNDE17-MSGE17_^1MSGE17 ALF_"$,(DOCNT)$_^€€1MNDE17 EQU_"MNDE17(*)_^1_%ADC_"MNDE18-MSGE18_^1MSGE18 ALF_"$,A/B$_^1MNDE18 EQU_"MNDE18(*)_^1_%ADC_"MNDEXP-MSGEXP_^1MSGEXP ALF_"$,EXPECTED $_^1HOPLEN EQU_"HOPLEN(6)_^1HOPE_!BZS_"HOPE(HOPLEN)_^1_%NUM_"$0D0A_#$0D=RETURN. $0A=LINE FEED._^1_%ALF_"$,FOUND $_^1REPLY NUM_"0_^1MNDEXP EQU_"MNDEXP(*)_^1_%ADC_"MNDTLC-MSGTLC_^1MSGTLC ALF_"/,TOO LITTLE CORE/_^1MNDTLC EQU_"MNDTLC(*)_^1_%ADC_"€€MNDYG-MSGYG_^1MSGYG ALF_"/,G/_^1MNDYG EQU_"MNDYG(*)_^1_%ADC_"MNDYIW-MSGYIW_^1MSGYIW ALF_"/,IWAY/_^1MNDYIW EQU_"MNDYIW(*)_^1_%ADC_"MNDYFW-MSGYFW_^1MSGYFW ALF_"/,FWAY/_^1MNDYFW EQU_"MNDYFW(*)_^1_%EJT_]_^1* INPUTS ARE_!I,YHICOR,YEND,YDM,YKCT,YSRTSZ,YMAXIB,YWKBSZ,_^1*_-YOFT+RECLTH,YIMGSZ,YFTSIZ,YFMGSZ,YOFT+BUFLTH,_^1*_-YFWAY,YSUMIB._^1*_]_^1* THE CALLING SEQUENCE IS_#P_!RTJ_!MEM_^1*_€€:P+1_!INSUFFICIENT MEMORY_^1*_:P+2_!SUFFICIENT MEMORY_^1*_]_^1* OUTPUTS ARE_!YG,YIWAY,YFWAY. YSQ2MG IS SET FOR MERGE-ONLY._^1MEM_"NUM_"0_^1* COMPUTE HOW MUCH CORE AN OVERLAY MAY HAVE._^1_%LDA-_!YHICOR,I_$(A) = 1 + MAXIMUM AVAILABLE ADDRESS._^1_%SUB-_!YEND,I_'SUBTRACT 1+LWA OF VARIABLE TABLES._^1_%STA*_!MEMCOR_"(A) = NO. OF WORDS AVAILABLE ABOVE VAR. TABLES._^1* DETERMINE TYPE OF R€€UN, I.E. COPY, MERGE,OR SORT._^1* THE CORE REQUIREMENTS DIFFER FOR EACH TYPE OF RUN._^1_%LDA-_!YDM,I_#(A)15=1 IF SORT. (A)14-0 = NO. OF INPUT FILES._^1_%LDQ-_!HX7FFF_'(Q) = MASK TO ISOLATE NO. OF INPUT FILES._^1_%LAQ_"Q_((Q) = NO. OF INPUT FILES._^1_%STQ*_!MMRGNF_"SAVE NO. OF INPUT FILES IN CASE IT]S NEEDED._^1_%SAM_"MSRT_$SKIP IF SORT RUN._^1_%LDA-_!YKCT,I_"(A)15=1 IF SEQ. CHECKIN€€G. (A)14-0 = NO. OF KEYS._^1_%AND-_!HX7FFF_"(A) = NO. OF KEYS._^1_%SAN_"MEMMRG_"SKIP IF MERGE RUN._^1_%JMP*_!MCPY_$JMP IF COPY RUN._^1MEMMRG JMP*_!MMRG_$JMP IF MERGE RUN._^1MEMCOR NUM_"0_(() = NO. OF WORDS AVAILABLE ABOVE VAR. TABLES._^1MMRGNF NUM_"0_(() = NO. OF INPUT FILES(SORT, MERGE, OR COPY)._^1* COMPUTE NO. OF WORDS OF CORE AVAILABLE TO THE TOURNAMENT._^1MSRT_!LDA*_!MEMCOR_"(€€A) = NO. OF WORDS AVAILABLE ABOVE VAR. TABLES._^1_%SUB-_!YSRTSZ,I SUBTRACT SIZE OF INTERNAL SORT LOGIC._^1_%SUB-_!YMAXIB,I SUBTRACT SIZE OF INPUT BUFFER._^1_%INA_"-2_+ALLOW FOR INPUT BUFFER HDR AND TLR WORDS._^1_%SUB-_!YWKBSZ,I SUBTRACT SIZE OF WORK BLOCK SIZE._^1* NOW (A) = NO. OF WORDS OF CORE AVAILABLE TO THE SORT TOURNAMENT._^1_%SAP_"MSRT1_#SKIP IF BALANCE NOT YET OVERDRAWN.€€_^1_%JMP*_!(MEM)_#TAKE P+1(BAD) EXIT._^1* COMPUTE G._^1MSRT1 LDQ-_!YOFT+RECLTH,I_"(Q) = BINSIZ._^1_%RTJ*_!DETG_$(A) = G._^1_%STA-_!YG,I_$SAVE G._^1_%INA_"-1_'(A)15=1 IF G IS TOO SMALL._^1_%SAP_"MIMG_$SKIP IF G IS OK._^1_%JMP*_!(MEM)_#TAKE P+1(BAD) EXIT._^1* COMPUTE YIWAY ASSUMING, CONSERVATIVELY, THAT YIWAY IS ODD._^1* BEGIN BY COMPUTING CORE AVAILABLE FOR PER-MERGE-ORDER COSTS._^€€1MIMG_!LDA*_!MEMCOR_"(A) = NO. OF WORDS AVAILABLE ABOVE VAR. TABLES._^1_%SUB-_!YIMGSZ,I SUBTRACT SIZE OF INTERMEDIATE MERGE LOGIC._^1_%INA_"1-1-1_#ADD SIZE OF TAG-TAG-SEQ.NO. = - SIZE OF SEQ.NO._^1_%SUB-_!YWKBSZ,I_$SUBTRACT SIZE OF OUTPUT BUFFER DATA._^1* NOW (A) = NO. WORDS OF CORE AVAILABLE FOR PER-MERGE-ORDER COSTS._^1* COMPUTE COST PER MERGE ORDER._^1_%ENQ_"1+2+1_#ALLOW FOR SE€€Q. NO., BIN, AND TAG, RESPECTIVELY._^1_%ADQ-_!YFTSIZ,I ADD SIZE OF INPUT FILE TABLE._^1_%ADQ-_!YWKBSZ,I_$ADD SIZE OF WORK BLOCK DATA._^1_%INQ_"1_,ALLOW FOR WORK BLOCK HEADER._^1_%STQ*_!MEMCPM_"SAVE CORE NEEDED PER MERGE-ORDER._^1* COMPUTE YIWAY._^1_%CLR_"Q_(PREPARE FOR DIVIDE._^1_%DVI*_!MEMCPM_"(A) = INTERMEDIATE MERGE ORDER._^1_%STA-_!YIWAY,I_!SAVE INTERMEDIATE MERGE ORDER._^1* C€€HECK THAT INTERMEDIATE MERGE ORDER .GE. 2._^1_%INA_"-2_'(A)15=0 IF INTERMEDIATE MERGE ORDER .GE. 2._^1_%SAP_"MFMG_$SKIP IF INTERMEDIATE MERGE ORDER .GE. 2._^1_%JMP*_!(MEM)_#TAKE P+1(BAD) EXIT._^1MEMCPM NUM_"0_(() = CORE NEEDED PER MERGE-ORDER._^1* COMPUTE YFWAY ASSUMING, CONSERVATIVELY, THAT YFWAY IS ODD._^1* BEGIN BY COMPUTING CORE AVAILABLE FOR PER-MERGE-ORDER COSTS._^1MFMG_!LDA*€€_!MEMCOR_"(A) = NO. WORDS AVAILABLE ABOVE VAR. TABLES._^1_%SUB-_!YFMGSZ,I SUBTRACT SIZE OF FINAL MERGE LOGIC._^1_%INA_"1-1-1-1_%ADD SIZE OF TAG-TAG-SEQ.NO.-OUT.BUF.NONDATA_^1_%SUB-_!YOFT+BUFLTH,I_"SUBTRACT SIZE OF OUTPUT BUFFER._^1* COMPUTE YFWAY._^1_%CLR_"Q_(PREPARE FOR DIVIDE._^1_%DVI*_!MEMCPM_"(A) = FINAL MERGE ORDER._^1_%STA-_!YFWAY,I_!SAVE FINAL MERGE ORDER._^1* CHECK THAT FI€€NAL MERGE ORDER .GE. 1._^1_%INA_"-1_'(A)15=0 IF FINAL MERGE ORDER .GE. 1._^1MEMXIT SAM_"MEMP1X_'SKIP TO TAKE P+1(BAD) EXIT._^1MEMP2X RAO*_!MEM_%SET UP P+2(GOOD) EXIT._^1MEMP1X JMP*_!(MEM)_(ENTER HERE FOR P+1(BAD) EXIT._^1* COMPUTE CORE SURPLUS FOR COPY RUN._^1MCPY_!LDA*_!MEMCOR_"(A) = NO. OF WORDS AVAILABLE ABOVE VAR. TABLES._^1_%SUB-_!YSRTSZ,I_$SUBTRACT SIZE OF COPY LOGIC._^1_%SUB€€-_!YMAXIB,I SUBTRACT SIZE OF INPUT BUFFER._^1_%INA_"-2_+ALLOW FOR INPUT BUFFER HDR AND TLR WORDS._^1_%SUB-_!YOFT+BUFLTH,I_"SUBTRACT SIZE OF OUTPUT BUFFER._^1_%JMP*_!MEMXIT_'TAKE P+2(GOOD) EXIT IF CORE SURPLUS .GE. 0._^1* COMPUTE MERGE ORDER ASSUMING, CONSERVATIVELY, THAT MERGE ORDER IS ODD._^1* BEGIN BY COMPUTING CORE AVAILABLE FOR PER-MERGE-ORDER COSTS._^1* 1ST WE COMPUTE AND SUB€€TRACT THE CORE FOR ALL INPUT FILE TABLES._^1MMRG_!LDA*_!MMRGNF_"(A) = NO. OF MERGE INPUT FILES._^1_%STA-_!YFWAY,I_%SO SMCFMG MAY HAVE EASY UPPER LIMIT TEST._^1_%STA-_!YSQ2MG,I_$TELL MERGE-ONLY HOW MANY STRINGS TO MERGE._^1_%MUI-_!YFTSIZ,I (A) = NO. WORDS NEEDED FOR INPUT FILE TABLES._^1_%TCA_"A_((A) = - NO. WORDS NEEDED FOR INPUT FILE TABLES._^1_%ADD*_!MEMCOR_"(A) = NO. WORDS AFTE€€R ALLOWING FOR INP. TABLES._^1_%SUB-_!YFMGSZ,I_$SUBTRACT SIZE OF MERGE LOGIC._^1_%SUB-_!YSUMIB,I SUBTRACT SUM OF EACH INPUT BUFFER SIZE._^1_%SUB*_!MMRGNF_'ALLOW FOR INPUT BUFFER NONDATA WORDS._^1_%SUB-_!YOFT+BUFLTH,I_"SUBTRACT SIZE OF OUTPUT BUFFER._^1_%INA_"-1_+ALLOW 1 OUTPUT BUFFER NONDATA WORD._^1* NOW (A) = NO. OF WORDS OF CORE AVAILABLE TO THE MERGE TOURNAMENT._^1* COMPUTE CO€€RRESPONDING MERGE ORDER FOR THAT NO. OF WORDS._^1_%ENQ_"2_((Q) = SIZE OF BIN._^1_%RTJ*_!DETG_$(A) = MERGE ORDER._^1* CHECK THAT MERGE ORDER IS .GE. NO. OF MERGE INPUT FILES._^1_%SUB*_!MMRGNF_"(A)15=1 IF MERGE ORDER IS TOO SMALL._^1_%JMP*_!MEMXIT_"P+2(GOOD) EXIT IF MERGE ORDER .GE. NO. OF INPUTS_^1_%EJT_]_^1*THE CALLING SEQUENCE IS_!(A)ENTRY = NO. OF WORDS AVAILABLE._^1*_9(Q)ENTRY =€€ BIN SIZE IN WORDS._^1*_9RTJ DETG_^1*_9(A)EXIT = G._^1*_9(Q)EXIT = NO. OF WORDS USED FOR ALL ARRAYS._^1DETG_!NUM_"0_^1_%STA*_!DETGA_#SAVE NO. OF WORDS AVAILABLE._^1_%INA_"1_((A) = SIZE, IN WORDS, OF AREA+TAG._^1_%INQ_"2_(ALLOW 1 WORD FOR SEQ. NO. AND 1 WORD FOR TAG._^1_%STQ*_!DETGQ_#(Q) = SIZE, IN WORDS, OF BIN+SEQ.NO.+TAG._^1_%CLR_"Q_(PREPARE FOR DIVIDE._^1_%DVI*_!DETGQ_#(A) = (A€€REA+TAG)/(BIN+SEQ.NO.+TAG)._^1*AT THIS POINT, (A)=G IF (A) IS EVEN._^1*IF (A) IS ODD, (A)=G IF (Q) .GE. SIZE, IN WORDS, OF SEQ.NO.+TAG,_^1*ELSE (A)=G+1._^1_%STA*_!DETGG_#SAVE TENTATIVE VALUE OF G._^1_%ALS_"15_'(A)15=1 IF G IS ODD._^1_%SAP_"DETGX_#SKIP IF G IS EVEN AND DETGG IS OK._^1*IF (Q) .GE. NO. WORDS IN SEQ.NO.+TAG, THEN G IS ODD AND DETGG IS OK._^1_%INQ_"-2_'ALLOW FOR EXTRA S€€EQ. NO. AND TAG._^1_%SQP_"DETGX_#SKIP IF G IS ODD AND DETGG IS OK._^1*G IS EVEN. G = -1+(DETGG)._^1_%LDA*_!DETGG_#REDUCE (DETGG) BY 1._^1_%INA_"-1_^1_%STA*_!DETGG_^1DETGX TCQ_"Q_((Q) = - NO. OF SURPLUS WORDS._^1_%ADQ*_!DETGA_#(Q) = NO. OF WORDS USED FOR ALL ARRAYS._^1_%LDA*_!DETGG_#(A) = G._^1_%JMP*_!(DETG)_"EXIT._^1DETGA NUM_"0_(() = (A)ENTRY = NO. OF AVAILABLE WORDS._^1DETGQ N€XUM_"0_(() = (Q)ENTRY = NO. WORDS IN BIN+SEQ.NO.+TAG._^1DETGG NUM_"0_(() = G._^1* TOTAL SIZE OF EDIT LOGIC._^1* SMCEDT LOADS HIGH, SO TO AVOID JP02 ON GTFILE OF SMCEDT,_^1* THE SIZE OF SMCEDT MUST BE ROUNDED UP TO THE NEAREST WHOLE_^1* NUMBER OF SECTORS._^1EDTSZ1 EQU_"EDTSZ1(*-SMCEDT+95)_^1EDTSIZ EQU_"EDTSIZ(EDTSZ1/96*96)_^1_%END_"SMCEDT_^__ XPSMCSRT CSY/ SM4 P€1_%NAM SMCSRT_'DECK-ID S04 SMC 1.0_.SUMMARY-108_^1*_$SORT-MERGE INTERMEDIATE SORT_^1*_$SORT/MERGE VERSION 1.0_^1*_$SMALL SYSTEMS DIVISION. LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976._^1_%ENT_"SMCSRT_^1AMONI EQU_"AMONI($F4)_^1ADISP EQU_"ADISP($EA)_^1PLUG_!EQU_"PLUG($7FFF)_^1_%EJT_]_^1LUN_"EQU_"LUN(2)_"(2)=0._^1FILNUM EQU_"FILNUM(1)_^1RECLTH EQU_"RECLTH(FIL€€NUM+1)_^1BUFLTH EQU_"BUFLTH(RECLTH+1)_^1SKIPCT EQU_"SKIPCT(BUFLTH+1)_^1DOCNT EQU_"DOCNT(SKIPCT+2)_^1BUFWA EQU_"BUFWA(DOCNT+2)_^1RECNT EQU_"RECNT(BUFWA+1)_^1ERRCNT EQU_"ERRCNT(RECNT+2)_^1BLKCNT EQU_"BLKCNT(ERRCNT+1)_^1RECFWA EQU_"RECFWA(BLKCNT+1)_^1XFRLTH EQU_"XFRLTH(RECFWA+1)_^1RECPTR EQU_"RECPTR(XFRLTH+1)_^1REQBUF EQU_"REQBUF(RECPTR+2)_^1REQIND EQU_"REQIND(REQBUF+12)_^1FTSIZE E€€QU_"FTSIZE(1+REQIND)_^1_%EJT_]_^1*SMC FIXED-TABLE STRUCTURE._^1YLOCOR EQU_"YLOCOR(0)_^1YIFTAD EQU_"YIFTAD(YLOCOR+1)_^1YEND_!EQU_"YEND(YIFTAD+1)_^1YHICOR EQU_"YHICOR(YEND+1)_^1YFTSIZ EQU_"YFTSIZ(YHICOR+1)_^1YEDTSZ EQU_"YEDTSZ(YFTSIZ+1)_^1YSRTSZ EQU_"YSRTSZ(YEDTSZ+1)_^1YIMGSZ EQU_"YIMGSZ(YSRTSZ+1)_^1YFMGSZ EQU_"YFMGSZ(YIMGSZ+1)_^1YPHASE EQU_"YPHASE(YFMGSZ+1)_^1YDM_"EQU_"YDM(YPHASE+1)€€_^1YKCT_!EQU_"YKCT(YDM+1)_^1YG_#EQU_"YG(YKCT+1)_^1YU_#EQU_"YU(YG+1)_^1Y0WAY EQU_"Y0WAY(YU+1)_^1YIWAY EQU_"YIWAY(Y0WAY+1)_^1YFWAY EQU_"YFWAY(YIWAY+1)_^1YSUMIB EQU_"YSUMIB(YFWAY+1)_^1YMAXIB EQU_"YMAXIB(YSUMIB+1)_^1YWKBSZ EQU_"YWKBSZ(YMAXIB+1)_^1YSRCNT EQU_"YSRCNT(YWKBSZ+1)_^1YIRCNT EQU_"YIRCNT(YSRCNT+2)_^1YORCNT EQU_"YORCNT(YIRCNT+2)_^1YSQ2MG EQU_"YSQ2MG(YORCNT+2)_^1YSEQCT EQU_"YS€€EQCT(YSQ2MG+1)_^1YCMPKY EQU_"YCMPKY(YSEQCT+1)_^1YZERO EQU_"YZERO(YCMPKY+1)_^1YBIGCT EQU_"YBIGCT(YZERO+1)_^1YBGADD EQU_"YBGADD(YBIGCT+1)_^1YBGSUB EQU_"YBGSUB(YBGADD+1)_^1YBIGQ EQU_"YBIGQ(YBGSUB+1)_^1YBIGA EQU_"YBIGA(YBIGQ+1)_^1YGORQT EQU_"YGORQT(YBIGA+1)_^1YGETU EQU_"YGETU(YGORQT+1)_^1YPUTU EQU_"YPUTU(YGETU+1)_^1YLAPUT EQU_"YLAPUT(YPUTU+1)_^1YFMLUN EQU_"YFMLUN(YLAPUT+1)_^1YSEGL€€U EQU_"YSEGLU(YFMLUN+4)_^1YSEGFN EQU_"YSEGFN(YSEGLU+1)_^1YCLSU EQU_"YCLSU(YSEGFN+1)_^1YREL_!EQU_"YREL(YCLSU+1)_^1YGTSEQ EQU_"YGTSEQ(YREL+1)_^1YBOS_!EQU_"YBOS(YGTSEQ+1)_^1YEOS_!EQU_"YEOS(YBOS+1)_^1YCLRFT EQU_"YCLRFT(YEOS+1)_^1YSVAQI EQU_"YSVAQI(YCLRFT+1)_^1YREAQI EQU_"YREAQI(YSVAQI+1)_^1YACCEP EQU_"YACCEP(YREAQI+1)_^1YTYPOT EQU_"YTYPOT(YACCEP+1)_^1YTYPIN EQU_"YTYPIN(YTYPOT+1)_^1YPR€€MLV EQU_"YPRMLV(YTYPIN+1)_^1YHXDMP EQU_"YHXDMP(YPRMLV+1)_^1YB2H_!EQU_"YB2H(YHXDMP+1)_^1YBGB2D EQU_"YBGB2D(YB2H+1)_^1YB2D_!EQU_"YB2D(YBGB2D+1)_^1YHADOT EQU_"YHADOT(YB2D+1)_^1YBOMB EQU_"YBOMB(YHADOT+1)_^1YTPDEC EQU_"YTPDEC(YBOMB+1)_^1YBTDEC EQU_"YBTDEC(YTPDEC+1)_^1YTPHEX EQU_"YTPHEX(YBTDEC+1)_^1YWIERD EQU YWIERD(YTPHEX+1)_^1YOFT_!EQU YOFT(YWIERD+1)_^1YKEY_!EQU_"YKEY(YOFT+FTSIZE)_^€€1_%EJT_]_^1* OFTEN NEEDED CONSTANTS._^1ZERO_!EQU_"ZERO(2)_!(2)=0._^1HX0020 EQU_"HX0020($28)_"($28)=$0020._^1HX00FF EQU_"HX00FF($A)_#($A) = $00FF._^1HX0800 EQU_"HX0800($2E)_"($2E)=$0800._^1HX1000 EQU_"HX1000($2F)_"($2F)=$1000._^1HX2000 EQU_"HX2000($30)_"($30)=$2000._^1HX7FFF EQU_"HX7FFF($42)_"($42)=$7FFF._^1HX8000 EQU_"HX8000($32)_"($32)=$8000._^1HXDFFF EQU_"HXDFFF($40)_"($40)=$DFFF€€._^1HXEFFF EQU_"HXEFFF($3F)_"($3F)=$EFFF._^1HXF7FF EQU_"HXF7FF($3E)_"($3E)=$F7FF._^1HXFC00 EQU_"HXFC00($1C)_"($1C)=$FC00._^1_%EJT_]_^1SMCSRT NUM_"0_^1_%RTJ_"INIT_)INITIALIZE SMCSRT._^1HERE_!EQU_"HERE(*)_%RELOC REFERENCE POINT._^1_%JMP*_!COPY_)INIT SAYS IT IS COPY RUN._^1MAINLP RTJ_"GET_%SUBMIT A REAL OR DUMMY RECORD TO THE TOURNAMENT._^1_%RTJ_"TOURN_#RUN THE TOURNAMENT._^1_%RTJ_"PU€€T_%DISPOSE OF THE WINNER, REAL OR DUMMY._^1_%JMP*_!MAINLP_"REPEAT CYCLE UNTIL TOURNAMENT IS FLUSHED._^1COPY_!RTJ_"IEOR_)GET A LOGICAL RECORD._^1_%JMP*_!ENDCPY_'JMP IF END OF INPUT._^1_%LDQ_"FWAOFT_'(Q) = FWA OF OUTPUT FILE TABLE._^1_%STQ-_!I_,TELL IO LOGIC WHAT FILE TABLE TO USE._^1_%RTJ_"(OEOR)_'OUTPUT THE LOGICAL RECORD._^1_%JMP*_!COPY_)GET THE NEXT LOGICAL RECORD._^1ENDCPY LDQ_"€€FWAOFT_'(Q) = FWA OF FINAL-OUTPUT FILE-TABLE._^1_%STQ-_!I_,TELL CLSU WHICH FILE TABLE TO USE._^1* INIT REPLACES PLUG BELOW WITH FWA OF CLSU._^1END008 RTJ+_!PLUG_^1_%JMP*_!END007_^1ENDSRT LDA_"FWAFXY_'(A) = FWA OF FIXED TABLES._^1_%STA-_!I_,SIMPLIFY ACCESS TO FIXED TABLES._^1_%LDA_"CURSEQ_'(A) = CURRENT SEQUENCE NO. OF TOURN._^1_%SUB_"TAGCNT_'(A) = NO. OF REAL SEQUENCES OUTPUT._^1_%€€STA-_!YSEQCT,I_$SAVE FOR NEXT PHASE._^1_%STA-_!YSQ2MG,I_$SAVE FOR NEXT PHASE._^1END001 LDQ_"=XMSGOSC-HERE (Q) = FWA OF MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF TPDEC._^1END002 RTJ+_!PLUG_)ANNOUNCE SEQUENCE COUNT._^1END007 LDA_"FWAFXY_'(A) = FWA OF FIXED TABLES._^1_%STA-_!I_,SIMPLIFY ACCESS TO FIXED TABLES._^1END003 LDQ_"=XMSGIRC-HERE (Q) = FWA OF PREFIX OF MESSAGE._^1_%LDA€€_"=XYIRCNT,I_"(A) = FWA OF BINARY TO CONVERT TO SUFFIX._^1* INIT REPLACES PLUG BELOW WITH FWA OF BTDEC._^1END004 RTJ+_!PLUG_)ANNOUNCE INPUT RECORD COUNT._^1END005 LDQ_"=XMSGORC-HERE (Q) = FWA OF PREFIX OF MESSAGE._^1_%LDA_"=XYORCNT,I_"(A) = FWA OF BINARY TO CONVERT TO SUFFIX._^1_%RTJ*_!(END004+1)_"ANNOUNCE OUTPUT RECORD COUNT._^1SRTXIT JMP*_!(SMCSRT) EXIT TO SMC MONITOR._^1_%ADC_"€€MNDOSC-MSGOSC_^1MSGOSC ALF_"/,SEQUENCES /_^1MNDOSC EQU_"MNDOSC(*)_^1_%ADC_"MNDIRC-MSGIRC_^1MSGIRC ALF_"/,RECORDS IN/_^1MNDIRC EQU_"MNDIRC(*)_^1_%ADC_"MNDORC-MSGORC_^1MSGORC ALF_"/,RECORDS OUT /_^1MNDORC EQU_"MNDORC(*)_^1_%EJT_]_^1* IEOR MAKES SEVERAL INPUT FILES SEEM LIKE ONE FILE ._^1* THE CALLING SEQUENCE IS_!P_!RTJ IEOR_^1*_:P+1 END-OF-INPUT._^1*_:P+2 NORMAL. (A) = FWA OF RECORD€€._^1*_F(Q) = LENGTH, IN WORDS, OF RECOR_^1*_:(I)EXIT = FWA OF FILE TABLE EXPANSION._^1IEOR_!NUM_"0_^1_%LDA_"FWAIFT_'(A) = FWA OF EXPANDED FILE TABLE._^1_%STA-_!I_,(I) = FWA OF EXPANDED FILE TABLE._^1*THE BELOW INST. BECOMES NOP VIA IEOR01._^1* THUS, WE BEGIN IEOR BY GOING TO IEOR01 TO GET THE 1ST FILE._^1* LATER, WE WILL GO TO IEOR01 TO GET THE NEXT FILE,_^1* WHENEVER THE CURRENT F€€ILE ENDS._^1IEOR08 JMP*_!IEOR01_"GET 1ST FILE._^1* INIT REPLACES PLUG BELOW WITH FWA OF GETU._^1IEOR03 RTJ+_!PLUG_)GET NEXT RECORD._^1_%JMP*_!IEOR01_"IF EOF, THEN JMP TO GET NEXT FILE._^1_%RAO*_!IEOR_$SET UP P+2 EXIT._^1_%JMP*_!(IEOR)_"P+2 EXIT._^1IEOR01 LDA*_!IEOR05_"(A) = NOP._^1_%STA*_!IEOR08_"DEACTIVATE IEOR08._^1_%LDQ*_!OVRUFT_"(Q) = 1 + LWA OF UNEXPANDED INPUT FILE TABLES._^1€€_%LDA*_!IEOR02_'(A) = FWA OF NEW FILE TABLE._^1_%EAQ_"Q_,(Q)=0 IF NO MORE FILE TABLES TO EXPAND._^1_%SQN_"IEOR04_'SKIP IF WE GOT A FILE TABLE._^1_%JMP*_!(IEOR)_"P+1 EXIT IF NO MORE FILES._^1OVRUFT NUM_"0_,() = 1 + LWA OF UNEXPANDED INPUT FILE TABLES_^1IEOR04 STA_"MVSRCE_'TELL MOVE WHERE TO GET FILE TABLE._^1_%ENQ_"BUFWA_(TELL MOVE HOW MUCH TO MOVE._^1_%AAQ_"A_,(A) = FWA OF NEXT FIL€€E TABLE._^1_%STA*_!IEOR02_'REMEMBER FWA OF NEXT FILE TABLE._^1_%LDA-_!I_,(A) = FWA OF FILE TABLE EXPANSION._^1_%STA_"MVDEST_'TELL MOVE WHERE TO PUT FILE TABLE._^1_%RTJ_"MOVE_)MOVE NEW FILE TABLE TO EXPANSION AREA._^1* INIT REPLACES PLUG BELOW WITH FWA OF CLRFT._^1IEOR11 RTJ+_!PLUG_)RESET THE DYNAMIC WORDS OF THE FILE TABLE._^1IEOR09 LDQ_"=XMSGRFI-HERE (Q) = FWA OF MESSAGE._^1_%RAO*€€_!IEORFN_'SET () = NO. OF CURRENT FILE._^1_%LDA*_!IEORFN_'(A) = NO. OF CURRENT FILE._^1* INIT REPLACES PLUG BELOW WITH FWA OF TPDEC._^1IEOR12 RTJ+_!PLUG_)ASK OPERATOR TO READY THE FILE._^1_%SET_"A,Q_*DISABLE OPTIONAL MESSAGE FROM GORQT._^1* INIT REPLACES PLUG BELOW WITH FWA OF GORQT._^1IEOR13 RTJ+_!PLUG_)SEE WHAT OPERATOR WANTS TO DO._^1_%JMP*_!IEOR01_'GO ON TO NEXT FILE IF ]QT]._^€€1_%JMP*_!IEOR03_"DO 1ST GET ON NEW FILE._^1*IEOR02 MUST BE INITIALIZED AT RUN TIME._^1IEOR02 NUM_"0_(FWA OF CURRENT FILE TABLE._^1IEOR05 NOP_"0_,USE TO DEACTIVATE LOGIC._^1IEORFT BZS_"IEORFT(FTSIZE)_!EXPANSION OF INPUT FILE TABLE FROM EDIT._^1_%ADC_"MNDRFI-MSGRFI_^1MSGRFI ALF_"/,READY FILE/_^1MNDRFI EQU_"MNDRFI(*)_^1IEORFN NUM_"0_,() = NO. OF CURRENT FILE._^1_%EJT_]_^1* MOVE RIGHT €€TO LEFT._^1* MOVE MUST BE FAST. DURING A SINGLE SORT RUN, MOVE MOVES EACH BYTE OF_^1* EACH LOGICAL RECORD SEVERAL TIMES, DESPITE THE FACT THAT THE NUMBER OF_^1* SUCH MOVES IS REDUCED BY MOVING POINTERS INSTEAD OF LOGICAL RECORDS,_^1* WHENEVER POSSIBLE._^1* WORD-TIMES = 4 + 9 * WORDS-TO-MOVE, E.G. 364 = F(80 BYTES), 4 = F(0)._^1* THE CALLING SEQUENCE IS_!(MVSRCE)ENTRY = FWA OF SOURC€€E._^1*_:(MVDEST)ENTRY = FWA OF DESTINATION._^1*_:(Q)ENTRY = NO. OF WORDS TO MOVE._^1*_:RTJ MOVE_"MOVE IFF (Q)ENTRY .GE. 1._^1*_:(A)EXIT = (LAST WORD MOVED)._^1*_:(Q)EXIT = -1._^1*_:(I),(MVSRCE),(MVDEST) EXIT = ENTRY._^1MOVE_!NUM_"0_^1MVLOOP INQ_"-1_+(Q) = FWA NEXT SOURCE WORD - FWA OF SOURCE,_^1*_5= FWA NEXT DESTINATION WORD - FWA OF DESTINATION._^1_%SQP_"MVLDA_(SKIP IF MORE WORDS €€TO MOVE._^1_%JMP*_!(MOVE)_'EXIT._^1MVLDA LDA*_!(MVSRCE),Q_"(A) = (NEXT WORD TO MOVE)._^1_%STA*_!(MVDEST),Q_"MOVE A WORD._^1_%JMP*_!MVLOOP_'EXIT OR MOVE NEXT WORD._^1MVSRCE NUM_"0_,() = FWA OF SOURCE._^1MVDEST NUM_"0_,() = FWA OF DESTINATION._^1_%EJT_]_^1GETLEN NUM_"0_(() = (Q) FROM IEOR, I.E. REC. LENGTH._^1GET_"NUM_"0_^1*THE NOP BELOW IS REPLACED WITH JMP* GETMAX-GETEHK AT EOI._^€€1GETEHK NOP_"0_^1_%RTJ*_!IEOR_$GET NEXT RECORD._^1_%JMP*_!GETEOI_"JMP IF END OF INPUT._^1_%STA*_!MVSRCE_"TELL MOVE FWA OF NEW RECORD._^1_%STQ*_!GETLEN_"SAVE RECORD LENGTH._^1***WARNING***_^1* FOR PROPER HANDLING OF TIES, CALL CMPKEY WITH (A) = FWA OF LAST WINNER_^1* AND (Q) = FWA OF NEW RECORD. THIS WILL ALLOW A SERIES OF EQUAL RECORDS_^1* TO ENTER THE SAME SEQUENCE, DUE TO CMPKEY €€SETTING (A),(Q) EXIT =_^1* (A),(Q) ENTRY FOR TIES._^1_%TRA_"Q_,(Q) = FWA OF NEW RECORD._^1_%LDA*_!TFWA_)(A) = FWA OF LAST WINNER BIN._^1_%STA*_!MVDEST_'TELL MOVE WHERE TO PUT NEW RECORD._^1*THE INSTRUCTION BELOW IS REPLACED WITH NOP WHEN 1ST REAL RECORD WINS_^1*TOURNAMENT._^1GETNIT JMP*_!GETNXT_"PUT 1ST G RECORDS IN NEXT SEQ._^1* INIT REPLACES PLUG BELOW WITH FWA OF CMPKEY._^1GETCM€€P RTJ+_!PLUG_)COMPARE NEW RECORD TO LAST WINNER._^1_%SUB*_!TFWA_$(A)=0 IF LAST WINNER BEAT NEW RECORD._^1_%SAZ_"GETCUR_"SKIP IF LAST WINNER BEAT NEW RECORD._^1GETNXT ENA_"1_(BEGIN TO COMPUTE NEXT SEQUENCE NUMBER._^1GETCUR ADD*_!CURSEQ_"(A) = SEQUENCE NUMBER, EITHER CURRENT OR NEXT._^1_%STA*_!GETNRS_'REMEMBER SEQUENCE NUMBER._^1_%LDQ*_!GETLEN_"TELL MOVE HOW MUCH TO MOVE._^1_%RTJ*_!M€€OVE_$MOVE NEW RECORD TO BIN OF LAST WINNER._^1_%LDA*_!GETNRS_"(A) = SEQUENCE NUMBER, EITHER CURRENT OR NEXT._^1GETSEQ LDQ*_!TRIAL_((Q) = NO. OF WINNER BIN, 0...G-1._^1_%STA*_!(FWASEQ),Q_"SET SEQ. NO. INTO SEQ. ARRAY._^1_%JMP*_!(GET)_#EXIT._^1GETNRS NUM_"0_,() = SEQUENCE NUMBER OF NEW RECORD._^1GBIG_!NUM_"0,0_*() = TWO-WORD FORM OF G._^1GETEOI LDQ_"FWAFXY_'(Q) = FWA OF FIXED TABLES.€€_^1_%LDA*_!GBIG_)(A) = HIGH ORDER G._^1_%SUB-_!YIRCNT,Q_$COMPARE WITH INPUT RECORD COUNT._^1_%SAM_"GETP2X_'SKIP IF INPUT RECORD COUNT .GT. G._^1_%SAN_"GETZCK_'SKIP IF INPUT RECORD COUNT .LT. G._^1* HIGH ORDER VALUES TIE. LET US COMPARE LOW ORDER VALUES._^1_%LDA-_!YIRCNT+1,Q_"(A) = LOW ORDER INPUT RECORD COUNT._^1_%SUB*_!GBIG+1_'COMPARE WITH LOW ORDER G._^1_%SAM_"GETZCK_'SKIP IF INP€€UT RECORD COUNT .LT. G._^1* MERGING IS NEEDED SINCE RECORD COUNT .GE. G._^1GETP2X RAO_"SMCSRT_'TELL SMCMON THAT MERGING IS NEEDED._^1GETSHK LDA*_!GETJMP_'(A) = JMP* GETMAX-GETEHK._^1* FORCE FLUSH OF TOURNAMENT AND BYPASS OF RTJ IEOR._^1_%STA*_!GETEHK_^1GETMAX LDA*_!MAXSEQ_'(A) = $7FFF,$7FFE,$7FFD,...,$7FFF-G+1._^1_%INA_"-1_+(A) = $7FFE,$7FFD,$7FFC,...,$7FFE-G+1._^1_%STA*_!MAXSEQ_'M€€AKE EACH LOSING DUMMY DIFFER IN SEQ. NO._^1_%JMP*_!GETSEQ_"JMP TO SET SEQ. NO. INTO SEQ. ARRAY._^1* WE KNOW G .GE. INPUT RECORD COUNT. LET US CHECK FOR NULL INPUT._^1GETZCK LDA-_!YIRCNT+1,Q_"(A) = LOW ORDER INPUT RECORD COUNT._^1_%SAN_"GETBCK_'SKIP IF NON-NULL INPUT._^1_%LDA-_!YIRCNT,Q_$(A) = HIGH ORDER INPUT RECORD COUNT._^1_%SAN_"GETBCK_'SKIP IF NON-NULL INPUT._^1_%JMP_"END007_'V€€IA P+1 EXIT, TELL SMCMON THAT RUN IS OVER._^1GETJMP JMP*_!GETMAX-GETEHK+*_"USED TO MODIFY TOURN FOR FLUSHING._^1* WE KNOW THAT TOURN CURRENTLY HOLDS ONE NON-NULL SEQUENCE CONTAINING_^1* ALL THE INPUT RECORDS. LET US CHECK WHETHER SMCSRT CAN AFFORD THE_^1* FINAL-OUTPUT BUFFER._^1GETBCK LDA*_!FWARSA_'(A) = 1 + LWA OF TOTAL IO BUFFER SPACE._^1* (SOUTFT+BUFWA) = FWA OF DATA-AREA OF OUT€€PUT-BUFFER._^1_%SUB_"SOUTFT+BUFWA (A) = BUFFER-DATA SIZE SMCSRT CAN AFFORD._^1_%SUB-_!YOFT+BUFLTH,Q SUBTRACT DATA-SIZE OF FINAL-OUTPUT BUFFER._^1_%SAP_"GETTDP_'SKIP IF SMCSRT CAN AFFORD FINAL-OUTPUT BUFFE_^1_%JMP*_!GETP2X_'WE WILL HAVE TO OUTPUT TO A WORK FILE._^1* MODIFY SMCSRT TO DUMP RSA OF TOURN DIRECTLY TO FINAL-OUTPUT FILE._^1GETTDP LDA_"=XYOFT,Q_$(A) = FWA OF FINAL-OUTPUT F€€ILE TABLE._^1_%STA_"FWAOFT_'TELL SMCSRT TO OUTPUT TO FINAL-OUTPUT FILE._^1_%LDA_"=N$0B00_%(A) = NOP INSTRUCTION._^1_%STA_"PUTBOS_'DISABLE USE OF STRING-DIRECTORY._^1_%STA_"PUTBOS+1_^1_%LDA-_!YCLSU,Q_%(A) = FWA OF CLSU._^1_%STA_"PUTEOS+1_$DISABLE USE OF STRING-DIRECTORY._^1_%JMP*_!GETSHK_'PREPARE TO FLUSH RSA._^1_%EJT_]_^1TRIAL NUM_"0_,() = BIN INDEX OF TRIAL RECORD._^1FWASEQ NUM_"€€0_,() = FWA OF SEQ. NO. ARRAY._^1FWARSA NUM_"0_,() = FWA OF RECORD STORAGE AREA._^1TFWA_!NUM_"0_,() = FWA OF TRIAL BIN._^1MAXSEQ NUM_"$7FFF_(() = 1 + SEQ. NO. OF NEXT LOSING DUMMY._^1CURSEQ NUM_"0_,() = NO. OF CURRENT SEQUENCE._^1TOURN NUM_"0_^1_%LDQ*_!TRIAL_#(Q) = BIN INDEX OF TRIAL RECORD._^1_%LDA*_!(FWASEQ),Q_"(A) = SEQ. NO. OF TRIAL RECORD._^1_%QRS_"1_((Q) = FLOOR(TRIAL BIN IN€€DEX/2)._^1_%TCQ_"Q_((Q) = -FLOOR(TRIAL BIN INDEX/2)._^1_%ADQ*_!TAGCNT_"(Q) = INDEX OF BASE TAG OF TRIAL AND COMPETITOR._^1_%STQ-_!I_((I) = INDEX OF CURRENT TAG._^1CMPSEQ LDQ*_!(PRETSA),I_"(Q) = INDEX OF COMPETITOR BIN._^1_%SUB*_!(FWASEQ),Q_"(A) = TRIAL SEQ. NO. - COMPETITOR SEQ. NO._^1_%SAM_"TWINS_#SKIP IF TRIAL WINS DUE TO LOWER SEQ. NO._^1_%SAN_"CWINS_(SKIP IF TRIAL LOSES DUE TO €€HIGHER SEQ. NO._^1_%JMP*_!SEQTIE_'JMP IF SEQUENCE NUMBERS TIE._^1CWINS LDA*_!TRIAL_#(A) = BIN INDEX OF TRIAL RECORD._^1_%LDQ*_!(PRETSA),I_"(Q) = INDEX OF COMPETITOR BIN._^1_%STA*_!(PRETSA),I_"RECORD TRIAL AS LOSER._^1_%STQ*_!TRIAL_#RECORD COMPETITOR AS NEW TRIAL._^1_%JMP*_!TWINS1_'SEE IF THERE IS A NEXT TREE LEVEL._^1TWINS LDQ*_!TRIAL_((Q) = BIN INDEX OF TRIAL RECORD._^1TWINS1 LD€€A-_!I_((A) = INDEX OF LAST TAG._^1_%ARS_"1_((A) = INDEX OF CURRENT TAG._^1_%SAN_"NXTLVL_"SKIP IF THERE IS A NEXT TREE LEVEL._^1_%TRQ_"A_((A) = BIN INDEX OF WINNER RECORD._^1_%MUI*_!BINSIZ_^1_%ADD*_!FWARSA_"(A) = FWA OF WINNER RECORD._^1_%STA*_!TFWA_$(A) = FWA OF TRIAL BIN._^1_%JMP*_!(TOURN)_!EXIT IF END OF TREE._^1NXTLVL STA-_!I_(UPDATE TREE LEVEL. (I) = INDEX OF CURRENT TAG._^1_%L€€DA*_!(FWASEQ),Q_"(A) = SEQ. NO. OF TRIAL._^1_%JMP*_!CMPSEQ_^1SEQTIE TRQ_"A_((A) = BIN INDEX OF COMPETITOR RECORD._^1_%MUI*_!BINSIZ_^1_%ADD*_!FWARSA_"(A) = FWA OF COMPETITOR RECORD._^1_%STA*_!CFWA_$SAVE FWA OF COMPETITOR RECORD._^1_%LDA*_!TRIAL_#(A) = BIN INDEX OF TRIAL RECORD._^1_%MUI*_!BINSIZ_^1_%ADD*_!FWARSA_"(A) = FWA OF TRIAL RECORD._^1_%LDQ*_!CFWA_$(Q) = FWA OF COMPETITOR RECO€€RD._^1***WARNING***_^1* EFFICIENCY DEMANDS THAT TRIAL WINS TIES._^1* CALL CMPKEY WITH (A)ENTRY = FWA OF TRIAL._^1* INIT REPLACES PLUG BELOW WITH FWA OF CMPKEY._^1TRNCMP RTJ+_!PLUG_)(A) = FWA OF WINNER RECORD._^1_%EOR*_!CFWA_$(A)=0 IF COMPETITOR WON._^1_%SAZ_"JCWINS_"SKIP IF COMPETITOR WON._^1_%JMP*_!TWINS_#JMP IF TRIAL WON._^1JCWINS JMP*_!CWINS_#JMP IF COMPETITOR WON._^1G_$NUM_"0_,€€() = TOTAL NO. OF RSA BINS, PSEUDO OR REAL._^1TAGCNT NUM_"0_,() = NO. OF TSA TAGS = G-1._^1PRETSA NUM_"0_,() = -1 + FWA OF TAG STORAGE AREA._^1OVRTSA NUM_"0_,() = 1 + LWA OF TSA._^1BINSIZ NUM_"0_,() = NO. OF WORDS IN AN RSA BIN._^1CFWA_!NUM_"0_,() = FWA OF COMPETITOR RECORD._^1FWAFXY NUM_"0_,() = FWA OF FIXED TABLES._^1FWAIFT ADC_"IEORFT-HERE_!() = FWA OF EXPANDED INPUT FILE TABLE.€€_^1FWAOFT ADC_"SOUTFT-HERE_!() = FWA OF OUTPUT FILE TABLE._^1_%EJT_]_^1* INIT REPLACES PLUG BELOW WITH FWA OF PUTU._^1OEOR_!ADC_"PLUG_)() = FWA OF PUTU._^1PUT_"NUM_"0_^1_%LDQ*_!FWAOFT_'(Q) = FWA OF OUTPUT FILE TABLE._^1_%STQ-_!I_,TELL BOS,PUTU,EOS._^1_%LDQ*_!TRIAL_#(Q) = NO. OF WINNER BIN._^1PUTSEQ LDA*_!(FWASEQ),Q_"(A) = SEQ. NO. OF WINNER._^1_%SUB*_!CURSEQ_"(A) = WIN. SEQ. NO. - €€CUR. SEQ. NO._^1_%SAZ_"PUTLTG_'SKIP IF WINNING-DUMMY OR CURRENT-SEQ. REAL._^1_%SAP_"PUTGEG_"SKIP IF REAL RECORD OR LOSING DUMMY._^1*THE BELOW INSTRUCTION BECOMES A NOP WHEN THE 1ST REAL WINNER EMERGES._^1PUTLTG JMP*_!(PUT)_#EXIT._^1PUTPUT LDA*_!TFWA_$(A) = FWA OF WINNER BIN._^1_%RTJ*_!(OEOR)_'OUTPUT THE LOGICAL RECORD._^1_%JMP*_!(PUT)_#EXIT._^1*THE BELOW INSTRUCTION BECOMES A NOP W€€HEN THE 1ST REAL WINNER EMERGES._^1PUTGEG JMP*_!PUT1ST_"JUMP TO INITIALIZE FOR REAL RECORDS._^1* INIT REPLACES PLUG BELOW WITH FWA OF EOS._^1PUTEOS RTJ+_!PLUG_)END THE CURRENT STRING._^1_%LDQ*_!TRIAL_((Q) = NO. OF WINNER BIN._^1_%LDA*_!(FWASEQ),Q_"(A) = SEQ. OF WINNER BIN._^1_%SUB*_!MAXSEQ_"(A) = WIN. SEQ. - MAX. SEQ._^1_%SAM_"PUTGON_"SKIP IF REAL WINNER._^1_%JMP_"ENDSRT_"JMP IF LO€€SING DUMMY._^1PUT1ST LDA*_!PUTNOP_"ALTER PUT LOGIC DUE TO EMERGENCE OF REAL WINNER._^1_%STA*_!PUTLTG_^1_%STA*_!PUTGEG_^1_%STA_"GETNIT_"ALTER GET LOGIC DUE TO EMERGENCE OF REAL WINNER._^1PUTGON RAO_"CURSEQ_"NEXT SEQ BECOMES CURRENT._^1* INIT REPLACES PLUG BELOW WITH FWA OF BOS._^1PUTBOS RTJ+_!PLUG_)BEGIN THE NEXT STRING._^1_%JMP*_!PUTPUT_"OUTPUT THE RECORD._^1PUTNOP NOP_"0_^1_%EJT_]€€_^1* THE CALLING SEQUENCE IS_!(A)ENTRY = SIZE IN WORDS OF EACH RSA BIN._^1*_:(Q)ENTRY = NO. OF REAL RSA BINS._^1*_:(I)ENTRY = FWA OF FIXED TABLES._^1*_:(FWARSA)ENTRY = FWA OF THE RSA._^1*_:RTJ TURNIT_^1* OUTPUTS ARE_!BINSIZ,TNITEG,G,TAGCNT,CURSEQ,FWASEQ,PRETSA,OVRTSA,_^1*_.TRIAL,TFWA, SEQ. NO. ARRAY, TSA ARRAY,_^1*_.(A)EXIT = (FWARSA),_^1*_.(Q)EXIT=JUNK, (I)EXIT = (I)ENTRY._^1* THE€€ ARRANGEMENT OF THE ARRAYS IN CORE IS RSA,SEQ,TSA FROM LOW TO HIGH._^1TURNIT NUM_"0_^1_%STA_"BINSIZ_'SAVE RSA BIN LENGTH FOR TOURN AND TURNIT._^1* THE FOLLOWING INQ,LRS,QLS ROUND (Q) UP TO THE NEAREST EVEN INTEGER._^1_%INQ_"1_,(Q) = 1 + NO. OF REAL RSA BINS._^1_%LRS_"1_,(Q) = HALF OF NEAREST EVEN NO. .GE. (Q)ENTRY_^1_%STA*_!TNITEG_'(TNITEG)15=1 IF NO. OF REAL BINS IS EVEN._^1_%QLS_€€"1_,(Q) = NEAREST EVEN NO. .GE. (Q)ENTRY._^1_%STQ*_!G_,(G) = TOTAL NO. OF RSA BINS, PSEUDO OR REAL._^1_%INQ_"-1_+(Q) = NO. OF TSA TAGS._^1_%STQ*_!TAGCNT_^1_%STQ_"CURSEQ_'() .GE. SEQ. NO. OF ANY WINNING DUMMY._^1* COMPUTE RSA SIZE BY INITIALLY ASSUMING ALL RSA BINS ARE REAL BINS,_^1* THEN, IF THERE WAS A PSEUDO BIN, WE SUBTRACT (BINSIZ)._^1_%LDA*_!G_^1_%MUI*_!BINSIZ_'(A) = (G)*(BINS€€IZ)._^1_%LDQ*_!TNITEG_'(Q)15=1 IF ALL BINS ARE REAL BINS._^1_%SQM_"TNITRX_'SKIP IF ALL BINS ARE REAL BINS._^1_%SUB*_!BINSIZ_'REPLACE A REAL BIN WITH A PSEUDO BIN._^1* WE ENTER THE NEXT LOGIC WITH (A) = NO. OF WORDS IN RSA._^1TNITRX ADD_"FWARSA_'ADD NO. OF WORDS IN RSA TO FWA OF RSA._^1_%STA_"FWASEQ_'() = FWA OF SEQUENCE NUMBER ARRAY._^1_%ADD*_!TAGCNT_'ADD -1 + SIZE OF SEQ. NO. ARRA€€Y._^1_%STA*_!PRETSA_'() = -1 + FWA OF TAG STORAGE AREA._^1_%ADD*_!G_,ADD 1 + SIZE OF TAG STORAGE AREA._^1_%STA*_!OVRTSA_'() = 1 + LWA OF TAG STORAGE AREA._^1* TENTATIVELY SET SEQ. NO. ARRAY AS IF NO. OF REAL BINS WERE EVEN._^1* LATER, WE WILL CHANGE THE SEQUENCE NO. OF THE LAST RSA BIN_^1* TO $7FFF IF THE LAST RSA BIN IS A PSEUDO BIN, I.E. IF THE NO. OF_^1* REAL BINS IS ODD._^1_%LD€€Q*_!TAGCNT_'(Q) = G-1._^1TNITSQ STQ_"(FWASEQ),Q_"SET SEQ(I)=I FOR I=G-1 TO I=0 STEP -1._^1_%INQ_"-1_+DECREMENT INDEX. POINT TO NEXT SEQ. NO._^1_%SQM_"TNITAG_'SKIP IF ALL SEQ. NUMBERS ARE SET._^1_%JMP*_!TNITSQ_'SET NEXT SEQ. NO._^1TNITEG NUM_"0_,()15=1 IF NO. OF REAL BINS IS EVEN._^1TNITAG LDA_"G_,(A)=G SO THAT (A) MAY START = G-2 AT TNITA1._^1_%CLR_"Q_,POINT TO WORD PRECEDING 1ST T€€AG TO SET._^1TNITA1 INA_"-2_+(A) = (NEXT TAG)._^1_%SAM_"TNIDMY_'SKIP IF DONE WITH ALL TAGS._^1_%SAZ_"TNITA2_'SKIP IF DONE WITH NON-BASE TAGS._^1_%INQ_"1_,POINT TO NEXT TAG TO SET._^1_%STA*_!(PRETSA),Q_"SET TAGS = G-2,G-4,...,2,G-1,G-3,...,1._^1_%JMP*_!TNITA1_'SET NEXT TAG._^1TNITA2 LDA_"G_^1_%INA_"1_((A)=G+1 SO THAT (A) MAY START = G-1 AT TNITA1._^1_%JMP*_!TNITA1_'JMP TO DO BASE (I€€.E. LOWEST LEVEL) TAGS._^1* BECAUSE OF THE ABOVE LOGIC, (Q) = (TAGCNT) = (G) - 1._^1* BELOW, SET LAST SEQ. NO. TO $7FFF IF NO. OF REAL BINS IS ODD._^1TNIDMY LDA*_!TNITEG_'(A)15=1 IF NO. OF REAL BINS IS EVEN._^1_%SAM_"TNITXT_'SKIP IF NO. OF REAL BINS IS EVEN._^1_%LDA-_!HX7FFF_'A SEQ. NO. OF $7FFF CAUSES ETERNAL LOSER._^1_%STA_"(FWASEQ),Q_"THE CORRESPONDING PSEUDO BIN CAN]T WIN NOW._€€^1* MAKE IT APPEAR THAT 1ST RSA BIN WAS THE LAST WINNER._^1TNITXT CLR_"A_^1_%STA_"TRIAL_(() = INDEX OF 1ST RSA BIN._^1_%LDA_"FWARSA_'(A) = FWA OF RECORD STORAGE AREA._^1_%STA_"TFWA_)() = FWA OF 1ST RSA BIN._^1_%JMP*_!(TURNIT)_$EXIT._^1_%EJT_]_^1* INIT INITIALIZES THE INTERNAL SORT._^1*_]_^1* THE CORE LAYOUT ASSUMED IS_^1*_"1ST-MSOS_^1*_"2ND-SMCMON_^1*_"3RD-FIXED TABLES_^1*_"4TH-VAR€€IABLE TABLES_^1*_"5TH-SMCSRT PERMANENT LOGIC_^1*_"6TH-SMCSRT TEMPORARY LOGIC AND WORK AREA_^1*_"7TH-TOP OF CORE_^1*_]_^1* THE WORK AREA LAYOUT IS_^1*_"1ST-FILE TABLE FOR OUTPUT WORK FILE_^1*_"2ND-BUFFER FOR OUTPUT WORK FILE_^1*_"3RD-BUFFER FOR INPUT FILE SET_^1*_"4TH-RECORD STORAGE AREA_^1*_"5TH-SEQUENCE NUMBER ARRAY_^1*_"6TH-TAG STORAGE AREA_^1*_]_^1_%ADC_"MNDSRT-MSGSRT_^1MSGSRT A€€LF_"/,INTERNAL SORT BEGINS/_^1MNDSRT EQU_"MNDSRT(*)_^1_%ADC_"MNDCPY-MSGCPY_^1MSGCPY ALF_"/,COPY BEGINS/_^1MNDCPY EQU_"MNDCPY(*)_^1INIT_!NUM_"0_,() = FWA OF HERE._^1_%ENA_"1_,(A) = PHASE NO. OF SMCSRT._^1_%STA-_!YPHASE,I_$TELL FIXED TABLES THAT SMCSRT IS RUNNING._^1_%STQ_"FWAFXY_'() = FWA OF FIXED TABLES._^1_%RTJ_"RELOC_(RELOCATE ALL RELOCATABLES._^1_%RTJ_"LINK_)RESOLVE SMCSRT REFER€€ENCES TO SMCMON._^1INIT01 LDQ_"=XMSGCPY-HERE (Q) = FWA OF COPY MESSAGE._^1_%LDA-_!YKCT,I_'(A)14-0 = NO. OF KEYS._^1_%AND-_!HX7FFF_'(A) = NO. OF KEYS._^1_%SAZ_"INIT03_'SKIP IF COPY RUN._^1INIT02 LDQ_"=XMSGSRT-HERE (Q) = FWA OF SORT MESSAGE._^1_%RAO*_!SRTCPY_'TELL MAINLINE IT IS A SORT RUN, NOT A COPY._^1* LINK REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1INIT03 RTJ+_!PLUG_)ANNOUNCE WHA€€T IS STARTING._^1_%LDA-_!YIFTAD,I_$(A) = FWA OF UNEXPANDED INPUT FILE TABLES._^1_%STA_"IEOR02_'() = FWA OF NEXT FILE TABLE TO EXPAND._^1* READY FINAL-OUTPUT FILE-TABLE IN CASE IT WILL BE NEEDED._^1_%LDA*_!SOUTFT+BUFWA_^1_%STA-_!YOFT+BUFWA,I FOR COPY RUN OR CORE SORT._^1_%LDQ_"FWAFXY_'(Q) = FWA OF FIXED TABLES._^1_%LDA_"=XYOFT,Q_$(A) = FWA OF FINAL-OUTPUT FILE-TABLE._^1_%STA-_!I_,T€€ELL CLRFT WHICH FILE TABLE TO RESET._^1* LINK REPLACES PLUG BELOW WITH FWA OF CLRFT._^1INIT05 RTJ+_!PLUG_)RESET THE FILE TABLE WHOSE FWA = (I)._^1_%LDA-_!BUFWA,I_%(A) = FWA OF OUTPUT BUFFER DATA AREA._^1_%STQ-_!I_,RESTORE (I)ENTRY = FWA OF FIXED TABLES._^1_%INA_"1_,ALLOW FOR INPUT BUFFER HEADER WORD._^1_%LDQ*_!SRTCPY_'SET (Q) = 1 FOR SORT, = 0 FOR COPY._^1_%SQN_"INIT04_'SKIP IF SOR€€T RUN._^1* ESTABLISH INPUT BUFFER FOR COPY RUN._^1_%ADD-_!YOFT+BUFLTH,I ALLOW FOR OUTPUT BUFFER DATA AREA._^1_%STA_"IEORFT+BUFWA TELL INPUT BUFFER FWA TO INPUT FILE TABLE._^1* ESTABLISH OUTPUT FILE TABLE FOR COPY RUN._^1_%LDA_"=XYOFT,I_$(A) = FWA OF FINAL-OUTPUT FILE-TABLE._^1_%STA_"FWAOFT_'MAKE COPY USE THAT FILE-TABLE._^1_%JMP*_!INITXT_'EXIT._^1* ESTABLISH INPUT BUFFER FOR SORT €€RUN._^1INIT04 ADD-_!YWKBSZ,I_$ALLOW FOR WORK BUFFER DATA AREA._^1_%STA_"IEORFT+BUFWA_^1_%ADD-_!YMAXIB,I_^1_%INA_"1_,ALLOW FOR INPUT BUFFER TRAILER WORD._^1_%STA_"FWARSA_^1* FOR SORT-ONLY WORK FILES, TELL RECLTH AND BUFLTH TO SOUTFT._^1_%LDA-_!YOFT+RECLTH,I (A) = LOGICAL RECORD SIZE._^1_%STA*_!SOUTFT+RECLTH TELL TO WORK-FILE FILE-TABLE._^1_%LDA-_!YWKBSZ,I_$(A) = WORK BUFFER DATA SIZ€€E._^1_%STA*_!SOUTFT+BUFLTH TELL TO WORK-FILE FILE-TABLE._^1* SET UP GBIG FOR USE IN DETECTING AN OPPORTUNITY TO DO A CORE SORT._^1_%CLR_"Q_,PREPARE TO DIVIDE._^1_%LDA-_!YG,I_)(A) = NO. OF REAL RSA BINS._^1_%DVI_"=N10000_%SPLIT NO. INTO TWO WORD VERSION._^1_%STA_"GBIG_)SET 1ST OF TWO WORDS._^1_%STQ_"GBIG+1_'SET 2ND OF TWO WORDS._^1* INITIALIZE THE TOURNAMENT AND ITS ARRAYS._^1_%LDA-€€_!YOFT+RECLTH,I_^1_%LDQ-_!YG,I_^1_%RTJ_"TURNIT_^1INITXT LDQ*_!SRTCPY_'SET (Q) = 1 FOR SORT, = 0 FOR COPY._^1_%JMP*_!(INIT),Q_$TAKE P+2 EXIT FOR SORT, P+1 EXIT FOR COPY._^1SRTCPY NUM_"0_,() = 1 FOR SORT, = 0 FOR COPY._^1_%EJT_]_^1SOUTFT EQU_"SOUTFT(*)_^1_%BSS_"(BUFWA)_^1_%ADC_"SOUTBF-HERE_!() = FWA OF SOUTBF._^1_%BSS_"(FTSIZE-1-BUFWA)_^1_%NUM_"0_,LENGTH WORD FOR THE BUFFER BELOW._^1€€SOUTBF EQU_"SOUTBF(*)_#THE BUFFER FOR THE MERGE OUTPUT FILE._^1_%EJT_]_^1* RELOC RELOCATES THE WORDS MENTIONED IN THE LIST, RELOC4._^1RELOC NUM_"0_^1_%ENQ_"RELOC3_"(Q) = NO. OF ENTRIES IN RELOC4._^1RELOC7 INQ_"-1_'(Q) = INDEX TO NEXT RELOCATEE._^1_%SQP_"RELOC6_"SKIP IF NOT DONE._^1_%JMP*_!(RELOC)_!EXIT IF DONE._^1RELOC6 LDA*_!RELOC4,Q (A) = FWA OF RELOCATEE - FWA OF HERE._^1_%ADD€€*_!INIT_$(A) = FWA OF RELOCATEE._^1_%STA*_!RELOC5_"SAVE FWA OF RELOCATEE._^1_%LDA*_!(RELOC5) (A) = RELOCATEE._^1_%ADD*_!INIT_$(A) = RELOCATED (RELOCATEE)._^1_%STA*_!(RELOC5) SET RELOCATEE._^1_%JMP*_!RELOC7_"JMP TO SEE IF DONE._^1RELOC5 NUM_"0_(() = FWA OF RELOCATEE._^1RELOC4 EQU_"RELOC4(*)_^1_%ADC_"END001+1-HERE_^1_%ADC_"END003+1-HERE_^1_%ADC_"END005+1-HERE_^1_%ADC_"IEOR09+1-HERE€€_^1_%ADC_"FWAIFT-HERE_^1_%ADC_"FWAOFT-HERE_^1_%ADC_"INIT01+1-HERE_^1_%ADC_"INIT02+1-HERE_^1_%ADC_"SOUTFT+BUFWA-HERE_^1RELOC3 EQU_"RELOC3(*-RELOC4)_^1_%EJT_]_^1* LINK RESOLVES THE REFERENCES OF SMCSRT TO SMCMON._^1LINK_!NUM_"0_^1_%LDA-_!YCLSU,I_%(A) = FWA OF CLSU._^1_%STA_"END008+1_^1_%LDA-_!YTPDEC,I_$(A) = FWA OF TPDEC._^1_%STA_"END002+1_^1_%STA_"IEOR12+1_^1_%LDA-_!YBTDEC,I_$(A) = €€FWA OF BTDEC._^1_%STA_"END004+1_^1_%LDA-_!YTYPOT,I_$(A) = FWA OF TYPOUT._^1_%STA_"INIT03+1_^1_%LDA-_!YCMPKY,I_$(A) = FWA OF CMPKEY._^1_%STA_"GETCMP+1_^1_%STA_"TRNCMP+1_^1_%LDA-_!YGETU,I_%(A) = FWA OF GETU._^1_%STA_"IEOR03+1_^1_%LDA-_!YEOS,I_'(A) = FWA OF EOS._^1_%STA_"PUTEOS+1_^1_%LDA-_!YEND,I_"(A) = 1 + LWA OF UNEXPANDED INPUT FILE TABLES._^1_%STA_"OVRUFT_'TELL IEOR WHEN TO STOP G€€ETTING FILE TABLES._^1_%LDA-_!YCLRFT,I_$(A) = FWA OF CLRFT._^1_%STA_"IEOR11+1_^1_%STA_"INIT05+1_^1_%LDA-_!YGORQT,I_$(A) = FWA OF GORQT._^1_%STA_"IEOR13+1_^1_%LDA-_!YPUTU,I_%(A) = FWA OF PUTU._^1_%STA_"OEOR_^1_%LDA-_!YBOS,I_'(A) = FWA OF BOS._^1_%STA_"PUTBOS+1_^1_%LDA- YWIERD,I_$(A) = FWA OF WIERD IN SMCMON._^1_%STA* WIERD_(SAVE FWA OF WIERD._^1_%LDA-_!YSRTSZ,I_$(A) = TABULATED SIZE€€ OF SMCSRT RESIDENT._^1_%EOR_"=XSRTSIZ_$COMPARE TABULATED TO ACTUAL._^1_%SAZ LINK01_'SKIP IF TABULATED = ACTUAL._^1_%RTJ* (WIERD)_%ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM -8_+ANNOUNCE ERROR NO.8 AND STOP THE RUN._^1LINK01 EQU LINK01(*)_^1_%JMP*_!(LINK)_'EXIT._^1WIERD NUM 0_,() = FWA OF WIERD IN SMCMON._^1* SIZE OF SMCSRT RESIDENT LOGIC._^1SRTSIZ EQU_"SRTSIZ(SOUTBF-SMCSRT)€_^1_%END_"SMCSRT_^__PSMCIMG CSY/ SM5 P€1_%NAM SMCIMG_'DECK-ID S05 SMC 1.0_.SUMMARY-108_^1*_$SORT-MERGE INTERMEDIATE MERGE_^1*_$SORT/MERGE VERSION 1.0_^1*_$SMALL SYSTEMS DIVISION. LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976._^1_%ENT_"SMCIMG_^1AMONI EQU_"AMONI($F4)_^1ADISP EQU_"ADISP($EA)_^1PLUG_!EQU_"PLUG($7FFF)_^1_%EJT_]_^1* FILE TABLE STRUCTURE._^1LUN_"EQU_"LUN(2)_'(2)=0._^1FILNUM EQU_"FILNUM(€€1)_^1RECLTH EQU_"RECLTH(FILNUM+1)_^1BUFLTH EQU_"BUFLTH(RECLTH+1)_^1SKIPCT EQU_"SKIPCT(BUFLTH+1)_^1DOCNT EQU_"DOCNT(SKIPCT+2)_^1BUFWA EQU_"BUFWA(DOCNT+2)_^1RECNT EQU_"RECNT(BUFWA+1)_^1ERRCNT EQU_"ERRCNT(RECNT+2)_^1BLKCNT EQU_"BLKCNT(ERRCNT+1)_^1RECFWA EQU_"RECFWA(BLKCNT+1)_^1XFRLTH EQU_"XFRLTH(RECFWA+1)_^1RECPTR EQU_"RECPTR(XFRLTH+1)_^1REQBUF EQU_"REQBUF(RECPTR+2)_^1REQIND EQU_"R€€EQIND(REQBUF+12)_^1FTSIZE EQU_"FTSIZE(1+REQIND)_^1_%EJT_]_^1*SMC FIXED-TABLE STRUCTURE._^1YLOCOR EQU_"YLOCOR(0)_^1YIFTAD EQU_"YIFTAD(YLOCOR+1)_^1YEND_!EQU_"YEND(YIFTAD+1)_^1YHICOR EQU_"YHICOR(YEND+1)_^1YFTSIZ EQU_"YFTSIZ(YHICOR+1)_^1YEDTSZ EQU_"YEDTSZ(YFTSIZ+1)_^1YSRTSZ EQU_"YSRTSZ(YEDTSZ+1)_^1YIMGSZ EQU_"YIMGSZ(YSRTSZ+1)_^1YFMGSZ EQU_"YFMGSZ(YIMGSZ+1)_^1YPHASE EQU_"YPHASE(YFMGSZ+1€€)_^1YDM_"EQU_"YDM(YPHASE+1)_^1YKCT_!EQU_"YKCT(YDM+1)_^1YG_#EQU_"YG(YKCT+1)_^1YU_#EQU_"YU(YG+1)_^1Y0WAY EQU_"Y0WAY(YU+1)_^1YIWAY EQU_"YIWAY(Y0WAY+1)_^1YFWAY EQU_"YFWAY(YIWAY+1)_^1YSUMIB EQU_"YSUMIB(YFWAY+1)_^1YMAXIB EQU_"YMAXIB(YSUMIB+1)_^1YWKBSZ EQU_"YWKBSZ(YMAXIB+1)_^1YSRCNT EQU_"YSRCNT(YWKBSZ+1)_^1YIRCNT EQU_"YIRCNT(YSRCNT+2)_^1YORCNT EQU_"YORCNT(YIRCNT+2)_^1YSQ2MG EQU_"YSQ2MG€€(YORCNT+2)_^1YSEQCT EQU_"YSEQCT(YSQ2MG+1)_^1YCMPKY EQU_"YCMPKY(YSEQCT+1)_^1YZERO EQU_"YZERO(YCMPKY+1)_^1YBIGCT EQU_"YBIGCT(YZERO+1)_^1YBGADD EQU_"YBGADD(YBIGCT+1)_^1YBGSUB EQU_"YBGSUB(YBGADD+1)_^1YBIGQ EQU_"YBIGQ(YBGSUB+1)_^1YBIGA EQU_"YBIGA(YBIGQ+1)_^1YGORQT EQU_"YGORQT(YBIGA+1)_^1YGETU EQU_"YGETU(YGORQT+1)_^1YPUTU EQU_"YPUTU(YGETU+1)_^1YLAPUT EQU_"YLAPUT(YPUTU+1)_^1YFMLUN EQ€€U_"YFMLUN(YLAPUT+1)_^1YSEGLU EQU_"YSEGLU(YFMLUN+4)_^1YSEGFN EQU_"YSEGFN(YSEGLU+1)_^1YCLSU EQU_"YCLSU(YSEGFN+1)_^1YREL_!EQU_"YREL(YCLSU+1)_^1YGTSEQ EQU_"YGTSEQ(YREL+1)_^1YBOS_!EQU_"YBOS(YGTSEQ+1)_^1YEOS_!EQU_"YEOS(YBOS+1)_^1YCLRFT EQU_"YCLRFT(YEOS+1)_^1YSVAQI EQU_"YSVAQI(YCLRFT+1)_^1YREAQI EQU_"YREAQI(YSVAQI+1)_^1YACCEP EQU_"YACCEP(YREAQI+1)_^1YTYPOT EQU_"YTYPOT(YACCEP+1)_^1YTYPIN €€EQU_"YTYPIN(YTYPOT+1)_^1YPRMLV EQU_"YPRMLV(YTYPIN+1)_^1YHXDMP EQU_"YHXDMP(YPRMLV+1)_^1YB2H_!EQU_"YB2H(YHXDMP+1)_^1YBGB2D EQU_"YBGB2D(YB2H+1)_^1YB2D_!EQU_"YB2D(YBGB2D+1)_^1YHADOT EQU_"YHADOT(YB2D+1)_^1YBOMB EQU_"YBOMB(YHADOT+1)_^1YTPDEC EQU_"YTPDEC(YBOMB+1)_^1YBTDEC EQU_"YBTDEC(YTPDEC+1)_^1YTPHEX EQU_"YTPHEX(YBTDEC+1)_^1YWIERD EQU YWIERD(YTPHEX+1)_^1YOFT_!EQU YOFT(YWIERD+1)_^1YKE€€Y_!EQU_"YKEY(YOFT+FTSIZE)_^1_%EJT_]_^1* OFTEN NEEDED CONSTANTS._^1ZERO_!EQU_"ZERO(2)_!(2)=0._^1HX0020 EQU_"HX0020($28)_"($28)=$0020._^1HX00FF EQU_"HX00FF($A)_#($A) = $00FF._^1HX0800 EQU_"HX0800($2E)_"($2E)=$0800._^1HX1000 EQU_"HX1000($2F)_"($2F)=$1000._^1HX2000 EQU_"HX2000($30)_"($30)=$2000._^1HX7FFF EQU_"HX7FFF($42)_"($42)=$7FFF._^1HX8000 EQU_"HX8000($32)_"($32)=$8000._^1HXDFFF EQ€€U_"HXDFFF($40)_"($40)=$DFFF._^1HXEFFF EQU_"HXEFFF($3F)_"($3F)=$EFFF._^1HXF7FF EQU_"HXF7FF($3E)_"($3E)=$F7FF._^1HXFC00 EQU_"HXFC00($1C)_"($1C)=$FC00._^1_%EJT_]_^1SMCIMG NUM_"0_^1_%RTJ_"INIT_)INITIALIZE THIS PHASE._^1HERE_!EQU_"HERE(*)_%RELOC REFERENCE POINT._^1SEQMRG RTJ_"MGINIT_'INITIALIZE THIS MERGE._^1RECMRG RTJ*_!GET_*SUBMIT SEQUENCE NO. AND/OR RECORD TO MTOURN._^1_%RTJ*_!MTOURN€€_'DETERMINE WINNING RECORD._^1_%RTJ_"PUT_*TAKE P+1 OR P+2 EXIT._^1_%JMP*_!FMGCHK_'WINNER WAS LOSING-DUMMY._^1_%JMP*_!RECMRG_'WINNER WAS WINNING-DUMMY OR REAL-RECORD._^1FMGCHK LDQ_"FWAFXY_'(Q) = FWA OF FIXED TABLES._^1* A MERGE OF M STRINGS REDUCES THE NUMBER OF STRINGS TO BE MERGED BY_^1* M-1 BECAUSE OF THE STRING OUTPUT BY THAT MERGE._^1_%LDA-_!YSQ2MG,Q_$(A) = PREVIOUS NO. OF STRI€€NGS TO BE MERGED._^1_%INA_"1_,ALLOW FOR THE STRING OUTPUT BY THE MERGE._^1_%SUB_"M_,ALLOW FOR THE STRINGS INPUT BY THE MERGE._^1_%STA-_!YSQ2MG,Q_$(A) = CURRENT NO. OF STRINGS TO BE MERGED._^1_%TCA_"A_,(A) = - CURRENT NO. OF STRINGS TO BE MERGED._^1_%ADD-_!YFWAY,Q_%(A) = FINAL MERGE ORDER - NO. STRINGS TO DO._^1_%SAP_"ENDIMG_'SKIP IF FINAL MERGE CAN BEGIN._^1_%LDA- YIWAY,Q_%(A)= MAX€€IMUM INTERMEDIATE MERGE ORDER_^1_%STA M_,MAKE EACH I-MERGE MAXIMAL CEPT THE 1ST_^1_%JMP*_!SEQMRG_'DO NEXT INTERMEDIATE MERGE._^1_%EJT_]_^1ENDIMG LDA_"FWAFXY_'(A) = FWA OF FIXED TABLES._^1_%STA-_!I_,SIMPLIFY ACCESS TO FIXED TABLES._^1END004 LDQ_"=XMSGDEL-HERE (Q) = FWA OF MESSAGE._^1_%LDA*_!DELCNT_'(A) = NO. OF RECORDS DELETED._^1* INIT REPLACES PLUG BELOW WITH FWA OF TPDEC._^1END0€€06 RTJ+_!PLUG_^1END001 LDQ_"=XMSGIRC-HERE (Q) = FWA OF PREFIX OF MESSAGE._^1_%LDA_"=XYIRCNT,I_"(A) = FWA OF BINARY TO CONVERT TO SUFFIX._^1* INIT REPLACES PLUG BELOW WITH FWA OF BTDEC._^1END002 RTJ+_!PLUG_)ANNOUNCE INPUT RECORD COUNT._^1END003 LDQ_"=XMSGORC-HERE (Q) = FWA OF PREFIX OF MESSAGE._^1_%LDA_"=XYORCNT,I_"(A) = FWA OF BINARY TO CONVERT TO SUFFIX._^1* INIT REPLACES PLUG BEL€€OW WITH FWA OF BTDEC._^1END005 RTJ+_!PLUG_)ANNOUNCE PHASE RECORD COUNT._^1_%JMP*_!(SMCIMG)_$EXIT._^1_%ADC_"MNDDEL-MSGDEL_^1MSGDEL ALF_"/,DELETES /_^1MNDDEL EQU_"MNDDEL(*)_^1DELCNT NUM_"0_,() = NO. OF RECORDS DELETED._^1_%ADC_"MNDIRC-MSGIRC_^1MSGIRC ALF_"/,RECORDS IN/_^1MNDIRC EQU_"MNDIRC(*)_^1_%ADC_"MNDORC-MSGORC_^1MSGORC ALF_"/,RECORDS OUT /_^1MNDORC EQU_"MNDORC(*)_^1_%EJT_]_^1GET€€_"NUM_"0_^1_%LDQ*_!TFWA_)(Q) = FWA OF LAST WINNER BIN._^1_%LDA-_!1,Q_*(A) = FWA OF LAST WINNER FILE TABLE._^1_%STA-_!I_,TELL GETU WHAT FILE TABLE TO USE._^1* INIT REPLACES PLUG BELOW WITH FWA OF GETU._^1GETGET RTJ+_!PLUG_)GET NEXT RECORD FROM LAST WINNER FILE TABLE._^1_%JMP*_!GETEOF_'SUBMIT A LOSING DUMMY IF EOF._^1GETRSA STA*_!(TFWA)_'SUBMIT FWA OF NEW RECORD TO MTOURN._^1_%LDA*_!€€G_,(A) = SEQ. NO. OF A REAL RECORD._^1GETSEQ LDQ*_!TRIAL_((Q) = LAST-WINNER-BIN NO., I.E. 0,...,G-1._^1_%STA*_!(FWASEQ),Q_"STORE SEQ. NO. IN SEQ. NO. ARRAY._^1_%JMP*_!(GET)_(EXIT._^1GETEOF LDA*_!MAXSEQ_'(A) = $7FFF,$7FFE,$7FFD,..._^1_%INA_"-1_+(A) = $7FFE,$7FFD,$7FFC,..._^1_%STA*_!MAXSEQ_'MAKE EACH LOSING DUMMY DIFFER IN SEQ. NO._^1_%JMP*_!GETSEQ_'SUBMIT THE SEQUENCE NUMBER TO MTOU€€RN._^1_%EJT_]_^1* MTOURN USES 2-WORD RSA BINS._^1* (1ST WORD) = FWA OF A LOGICAL RECORD WITHIN AN INPUT BUFFER._^1* (2ND WORD) = FWA OF THE FILE-TABLE FOR THE CORRESPONDING INPUT FILE._^1MTOURN NUM_"0_^1_%LDQ*_!TRIAL_#(Q) = BIN INDEX OF TRIAL RECORD._^1_%LDA*_!(FWASEQ),Q_"(A) = SEQ. NO. OF TRIAL RECORD._^1_%QRS_"1_((Q) = FLOOR(TRIAL BIN INDEX/2)._^1_%TCQ_"Q_((Q) = -FLOOR(TRIAL BIN €€INDEX/2)._^1_%ADQ*_!TAGCNT_"(Q) = INDEX OF BASE TAG OF TRIAL AND COMPETITOR._^1_%STQ-_!I_((I) = INDEX OF CURRENT TAG._^1CMPSEQ LDQ*_!(PRETSA),I_"(Q) = INDEX OF COMPETITOR BIN._^1_%SUB*_!(FWASEQ),Q_"(A) = TRIAL SEQ. NO. - COMPETITOR SEQ. NO._^1_%SAM_"TWINS_#SKIP IF TRIAL WINS DUE TO LOWER SEQ. NO._^1_%SAN_"CWINS_(SKIP IF TRIAL LOSES DUE TO HIGHER SEQ. NO._^1_%JMP*_!SEQTIE_'JMP IF SE€€QUENCE NUMBERS TIE._^1CWINS LDA*_!TRIAL_#(A) = BIN INDEX OF TRIAL RECORD._^1_%LDQ*_!(PRETSA),I_"(Q) = INDEX OF COMPETITOR BIN._^1_%STA*_!(PRETSA),I_"RECORD TRIAL AS LOSER._^1_%STQ*_!TRIAL_#RECORD COMPETITOR AS NEW TRIAL._^1_%JMP*_!TWINS1_'SEE IF THERE IS A NEXT TREE LEVEL._^1TWINS LDQ*_!TRIAL_((Q) = BIN INDEX OF TRIAL RECORD._^1TWINS1 LDA-_!I_((A) = INDEX OF LAST TAG._^1_%ARS_"1_€€((A) = INDEX OF CURRENT TAG._^1_%SAN_"NXTLVL_"SKIP IF THERE IS A NEXT TREE LEVEL._^1* THE FOLLOWING EXIT LOGIC IS A STREAMLINED VERSION OF THAT_^1* IN THE SMCSRT TOURNAMENT._^1_%QLS_"1_,(Q) = FWA OF WINNER BIN - FWA OF RSA._^1_%ADQ*_!FWARSA_'(Q) = FWA OF WINNER BIN._^1_%STQ*_!TFWA_)WINNER BIN WILL BE NEXT TRIAL._^1_%JMP*_!(MTOURN)_$EXIT IF END OF TREE._^1NXTLVL STA-_!I_(UPDATE TREE€€ LEVEL. (I) = INDEX OF CURRENT TAG._^1_%LDA*_!(FWASEQ),Q_"(A) = SEQ. NO. OF TRIAL._^1_%JMP*_!CMPSEQ_^1*A MERGE NETWORK IS FORMED WHEN THE FOLLOWING SEQTIE VERSION IS_^1*SUBSTITUTED FOR THAT IN TOURN._^1SEQTIE QLS_"1_,(Q) = FWA OF COMPETITOR BIN - FWA OF RSA._^1_%LDQ*_!(FWARSA),Q_"(Q) = FWA OF COMPETITOR RECORD._^1_%LDA*_!TRIAL_#(A) = BIN INDEX OF TRIAL ITEM._^1_%ALS_"1_(ALLOW 2 WOR€€DS PER BIN._^1_%ADD*_!FWARSA_"(A) = FWA OF TRIAL ITEM._^1_%STA*_!TFWA_$SAVE FWA OF TRIAL ITEM._^1_%LDA*_!(TFWA)_"(A) = FWA OF TRIAL RECORD._^1***WARNING***_^1* EFFICIENCY DEMANDS THAT TRIAL WINS TIES._^1* CALL CMPKEY WITH (A)ENTRY = FWA OF TRIAL._^1* INIT REPLACES PLUG BELOW WITH FWA OF CMPKEY._^1TRNCMP RTJ+_!PLUG_)(A) = FWA OF WINNER RECORD._^1_%EOR*_!(TFWA)_'(A)=0 IF TRIAL RECORD€€ WON._^1_%SAN_"JCWINS_'SKIP IF COMPETITOR RECORD WON._^1_%JMP*_!TWINS_#JMP IF TRIAL RECORD WON._^1JCWINS JMP*_!CWINS_#JMP IF COMPETITOR RECORD WON._^1TRIAL NUM_"0_(() = BIN INDEX OF TRIAL RECORD._^1G_$NUM_"0_,() = TOTAL NO. OF RSA BINS, PSEUDO OR REAL._^1M_$NUM_"0_,() = CURRENT MERGE ORDER._^1TAGCNT NUM_"0_(() = NO. OF TSA TAGS = G-1._^1FWASEQ NUM_"0_(() = FWA OF SEQ. NO. ARRAY._^€€1PRETSA NUM_"0_,() = -1 + FWA OF TAG STORAGE AREA._^1OVRTSA NUM_"0_,() = 1 + LWA OF TSA._^1BINSIZ NUM_"0_(() = NO. OF WORDS IN AN RSA BIN._^1FWARSA NUM_"0_(() = FWA OF RECORD STORAGE AREA._^1TFWA_!NUM_"0_(() = FWA OF TRIAL BIN._^1MAXSEQ NUM_"$7FFF_(() = 1 + SEQ. NO. OF NEXT LOS+NG DUMMY._^1FWAFXY NUM_"0_,() = FWA OF FIXED TABLES._^1_%EJT_]_^1* MOVE RIGHT TO LEFT._^1* MOVE MUST BE F€€AST. DURING A SINGLE SORT RUN, MOVE MOVES EACH BYTE OF_^1* EACH LOGICAL RECORD SEVERAL TIMES, DESPITE THE FACT THAT THE NUMBER OF_^1* SUCH MOVES IS REDUCED BY MOVING POINTERS INSTEAD OF LOGICAL RECORDS,_^1* WHENEVER POSSIBLE._^1* WORD-TIMES = 4 + 9 * WORDS-TO-MOVE, E.G. 364 = F(80 BYTES), 4 = F(0)._^1* THE CALLING SEQUENCE IS_!(MVSRCE)ENTRY = FWA OF SOURCE._^1*_:(MVDEST)ENTRY = FWA€€ OF DESTINATION._^1*_:(Q)ENTRY = NO. OF WORDS TO MOVE._^1*_:RTJ MOVE_"MOVE IFF (Q)ENTRY .GE. 1._^1*_:(A)EXIT = (LAST WORD MOVED)._^1*_:(Q)EXIT = -1._^1*_:(I),(MVSRCE),(MVDEST) EXIT = ENTRY._^1MOVE_!NUM_"0_^1MVLOOP INQ_"-1_+(Q) = FWA NEXT SOURCE WORD - FWA OF SOURCE,_^1*_5= FWA NEXT DESTINATION WORD - FWA OF DESTINATION._^1_%SQP_"MVLDA_(SKIP IF MORE WORDS TO MOVE._^1_%JMP*_!(MOVE)_'€€EXIT._^1MVLDA LDA*_!(MVSRCE),Q_"(A) = (NEXT WORD TO MOVE)._^1_%STA*_!(MVDEST),Q_"MOVE A WORD._^1_%JMP*_!MVLOOP_'EXIT OR MOVE NEXT WORD._^1MVSRCE NUM_"0_,() = FWA OF SOURCE._^1MVDEST NUM_"0_,() = FWA OF DESTINATION._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!P_!RTJ PUT_^1*_:P+1 LOSING-DUMMY EXIT._^1*_:P+2 WINNING-DUMMY OR NORMAL EXIT._^1PUT_"NUM_"0_^1PUTSTI LDA_"=XIOUTFT-HERE (A) = FWA€€ OF MERGE-OUTPUT FILE-TABLE._^1_%STA-_!I_,TELL PUTU WHAT FILE-TABLE TO USE._^1_%LDQ*_!TRIAL_((Q) = NO. OF WINNER BIN._^1_%LDA*_!(FWASEQ),Q_"(A) = SEQ. NO. OF WINNER._^1_%SUB*_!G_,(A)15=1 IF WINNING-DUMMY._^1_%SAP_"PUTGEG_'SKIP IF NOT WINNING-DUMMY._^1_%JMP*_!PUTP2_(DISCARD WINNING-DUMMY._^1PUTGEG SAZ_"PUTEQG_'SKIP IF WINNER IS REAL-RECORD._^1* A LOSING DUMMY WON, THEREFORE THE OUTP€€UT STRING ENDS._^1* INIT REPLACES PLUG BELOW WITH FWA OF EOS._^1PUTEOS RTJ+_!PLUG_)WRITE PARTIAL BLOCK. UPDATE SEQ. DIRECTORY._^1_%LDA*_!PUTJMP_'(A) = JMP* PUT1ST-PUTSCK_^1* DON]T LET PUT SEQUENCE-CHECK THE 1ST RECORD OF THE NEXT STRING._^1_%STA*_!PUTSCK_'SET HOOK TO BYPASS SEQUENCE-CHECK._^1_%JMP*_!(PUT)_(TAKE P+1(END-OF-STRING) EXIT._^1PUTEQG LDQ*_!(TFWA)_'(Q) = FWA OF CURRENT WI€€NNING RECORD._^1_%LDA*_!(PUTYLA)_$(A) = FWA OF PREVIOUS WINNER._^1***WARNING***_^1* TIES WILL CAUSE SEQUENCE ERRORS UNLESS CMPKEY IS CALLED WITH_^1* (A)ENTRY = FWA OF PREVIOUS WINNER._^1* PUT1ST REPLACES JMP* BELOW WITH RTJ+._^1PUTSCK JMP*_!PUT1ST_'BYPASS SEQUENCE CHECK ON 1ST RECORD OF SEQ._^1* INIT REPLACES PLUG BELOW WITH FWA OF CMPKEY._^1_%ADC_"PLUG_^1_%EOR*_!(PUTYLA)_$(A)=0 IF€€F NO SEQUENCE ERROR._^1_%SAN_"PUTSER_'SKIP IF SEQUENCE ERROR._^1PUTSOK TRQ_"A_,(A) = FWA OF CURRENT WINNING RECORD._^1* INIT REPLACES PLUG BELOW WITH FWA OF PUTU._^1PUTPUT RTJ+_!PLUG_)OUTPUT THE RECORD._^1PUTP2 RAO*_!PUT_*SET UP P+2 EXIT._^1_%JMP*_!(PUT)_(TAKE P+2 EXIT._^1PUT1ST LDA*_!PUTRTJ_'(A) = RTJ+._^1* INIT REPLACES THE STA BELOW WITH NOP IF NO SEQUENCE CHECKING._^1PUTASQ ST€€A*_!PUTSCK_'ACTIVATE SEQUENCE-CHECKING FOR NEXT WINNERS._^1_%JMP*_!PUTSOK_'SKIP SEQUENCE-CHECKING FOR CURRENT WINNER._^1PUTSER LDQ_"=XMSGSER-HERE (Q) = FWA OF SEQUENCE-ERROR MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1PUTTY1 RTJ+_!PLUG_^1_%LDA*_!(PUTYLA)_$(A) = FWA OF PREVIOUS WINNER._^1_%LDQ-_!RECLTH,I_$(Q) = LENGTH OF PREVIOUS WINNER._^1* INIT REPLACES PLUG BELOW €€WITH FWA OF HEXDMP._^1PUTHD1 RTJ+_!PLUG_)DUMP THE PREVIOUS WINNER._^1PUTPRE LDQ_"=XMSGPRE-HERE (Q) = FWA OF MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1PUTTY2 RTJ+_!PLUG_^1_%LDA*_!(TFWA)_'(A) = FWA OF CURRENT WINNING RECORD._^1_%LDQ-_!RECLTH,I_$(Q) = LENGTH OF CURRENT WINNER._^1* INIT REPLACES PLUG BELOW WITH FWA OF HEXDMP._^1PUTHD2 RTJ+_!PLUG_)DUMP THE CURRENT WINN€€ER._^1_%SET_"A,Q_*DISABLE GORQT OPTIONAL MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF GORQT._^1PUTGOQ RTJ+_!PLUG_)TELL OPERATOR. SEE WHAT HE WANTS TO DO._^1_%JMP*_!PUTQT_(OPERATOR SAYS TO DELETE NEW WINNER._^1_%LDA*_!(TFWA)_'(A) = FWA OF CURRENT WINNING RECORD._^1_%JMP*_!PUTPUT_'OPERATOR SAYS TO INCLUDE NEW WINNER._^1PUTQT RAO_"DELCNT_'COUNT EACH RECORD DELETED._^1_%JMP*_!PUT€€P2_(DELETE THE RECORD._^1* INIT REPLACES PLUG BELOW WITH FWA OF YLAPUT._^1PUTYLA ADC_"PLUG_^1PUTJMP JMP*_!PUT1ST-PUTSCK+* USED TO SKIP SEQ CK OF 1ST RECORD OF SEQ._^1PUTRTJ NUM_"$5400_(RTJ+. USED TO REACTIVATE SEQUENCE CHECKING._^1_%ADC_"MNDSER-MSGSER_^1MSGSER ALF_"/,SEQUENCE ERROR/_^1MNDSER EQU_"MNDSER(*)_^1_%ADC_"MNDPRE-MSGPRE_^1MSGPRE ALF_"/,PRECEDES/_^1MNDPRE EQU_"MNDPRE(*)_^1€€_%EJT_]_^1MGINIT NUM_"0_^1_%LDA-_!HX7FFF_'(A) = SEQ. NO. OF PSEUDO BIN._^1_%STA*_!MAXSEQ_'() = 1 + SEQ. NO. OF NEXT LOSING DUMMY._^1* PREPARE TO CALL TURNIT._^1_%ENA_"2_,(A) = 2 = SIZE OF RSA BIN._^1_%LDQ*_!M_,(Q) = NO. OF REAL RSA BINS._^1_%RTJ*_!TURNIT_'INITIALIZE MTOURN AND ARRAYS._^1_%RTJ*_!FTINIT_'INITIALIZE INPUT FILE TABLES._^1MGNIT1 LDA_"=XIOUTFT-HERE (A) = FWA OF OUTPUT FI€€LE TABLE._^1_%STA-_!I_,TELL BOS WHAT FILE TABLE TO USE._^1* INIT REPLACES PLUG BELOW WITH FWA OF BOS._^1MGNIT2 RTJ+_!PLUG_)INITIALIZE OUTPUT FILE AND FILE TABLE._^1_%JMP*_!(MGINIT)_$EXIT._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(A)ENTRY = SIZE IN WORDS OF EACH RSA BIN._^1*_:(Q)ENTRY = NO. OF REAL RSA BINS._^1*_:(I)ENTRY = FWA OF FIXED TABLES._^1*_:(FWARSA)ENTRY = FWA OF THE RSA._^1*€€_:RTJ TURNIT_^1* OUTPUTS ARE_!BINSIZ,TNITEG,G,TAGCNT,CURSEQ,FWASEQ,PRETSA,OVRTSA,_^1*_.TRIAL,TFWA, SEQ. NO. ARRAY, TSA ARRAY,_^1*_.(A)EXIT = (FWARSA),_^1*_.(Q)EXIT=JUNK, (I)EXIT = (I)ENTRY._^1* THE ARRANGEMENT OF THE ARRAYS IN CORE IS RSA,SEQ,TSA FROM LOW TO HIGH._^1TURNIT NUM_"0_^1_%STA*_!BINSIZ_'SAVE RSA BIN LENGTH FOR TOURN AND TURNIT._^1* THE FOLLOWING INQ,LRS,QLS ROUND (Q) UP €€TO THE NEAREST EVEN INTEGER._^1_%INQ_"1_,(Q) = 1 + NO. OF REAL RSA BINS._^1_%LRS_"1_,(Q) = HALF OF NEAREST EVEN NO. .GE. (Q)ENTRY_^1_%STA*_!TNITEG_'(TNITEG)15=1 IF NO. OF REAL BINS IS EVEN._^1_%QLS_"1_,(Q) = NEAREST EVEN NO. .GE. (Q)ENTRY._^1_%STQ*_!G_,(G) = TOTAL NO. OF RSA BINS, PSEUDO OR REAL._^1_%INQ_"-1_+(Q) = NO. OF TSA TAGS._^1_%STQ*_!TAGCNT_^1* COMPUTE RSA SIZE BY INITIALLY€€ ASSUMING ALL RSA BINS ARE REAL BINS,_^1* THEN, IF THERE WAS A PSEUDO BIN, WE SUBTRACT (BINSIZ)._^1_%LDA*_!G_^1_%MUI*_!BINSIZ_'(A) = (G)*(BINSIZ)._^1_%LDQ*_!TNITEG_'(Q)15=1 IF ALL BINS ARE REAL BINS._^1_%SQM_"TNITRX_'SKIP IF ALL BINS ARE REAL BINS._^1_%SUB*_!BINSIZ_'REPLACE A REAL BIN WITH A PSEUDO BIN._^1* WE ENTER THE NEXT LOGIC WITH (A) = NO. OF WORDS IN RSA._^1TNITRX ADD*_!FWAR€€SA_'ADD NO. OF WORDS IN RSA TO FWA OF RSA._^1_%STA*_!FWASEQ_'() = FWA OF SEQUENCE NUMBER ARRAY._^1_%ADD*_!TAGCNT_'ADD -1 + SIZE OF SEQ. NO. ARRAY._^1_%STA*_!PRETSA_'() = -1 + FWA OF TAG STORAGE AREA._^1_%ADD*_!G_,ADD 1 + SIZE OF TAG STORAGE AREA._^1_%STA*_!OVRTSA_'() = 1 + LWA OF TAG STORAGE AREA._^1* TENTATIVELY SET SEQ. NO. ARRAY AS IF NO. OF REAL BINS WERE EVEN._^1* LATER, WE WI€€LL CHANGE THE SEQUENCE NO. OF THE LAST RSA BIN_^1* TO $7FFF IF THE LAST RSA BIN IS A PSEUDO BIN, I.E. IF THE NO. OF_^1* REAL BINS IS ODD._^1_%LDQ*_!TAGCNT_'(Q) = G-1._^1TNITSQ STQ*_!(FWASEQ),Q_"SET SEQ(I)=I FOR I=G-1 TO I=0 STEP -1._^1_%INQ_"-1_+DECREMENT INDEX. POINT TO NEXT SEQ. NO._^1_%SQM_"TNITAG_'SKIP IF ALL SEQ. NUMBERS ARE SET._^1_%JMP*_!TNITSQ_'SET NEXT SEQ. NO._^1TNITEG NU€€M_"0_,()15=1 IF NO. OF REAL BINS IS EVEN._^1TNITAG LDA_"G_,(A)=G SO THAT (A) MAY START = G-2 AT TNITA1._^1_%CLR_"Q_,POINT TO WORD PRECEDING 1ST TAG TO SET._^1TNITA1 INA_"-2_+(A) = (NEXT TAG)._^1_%SAM_"TNIDMY_'SKIP IF DONE WITH ALL TAGS._^1_%SAZ_"TNITA2_'SKIP IF DONE WITH NON-BASE TAGS._^1_%INQ_"1_,POINT TO NEXT TAG TO SET._^1_%STA_"(PRETSA),Q_"SET TAGS = G-2,G-4,...,2,G-1,G-3,...,1€€._^1_%JMP*_!TNITA1_'SET NEXT TAG._^1TNITA2 LDA_"G_^1_%INA_"1_((A)=G+1 SO THAT (A) MAY START = G-1 AT TNITA1._^1_%JMP*_!TNITA1_'JMP TO DO BASE (I.E. LOWEST LEVEL) TAGS._^1* BECAUSE OF THE ABOVE LOGIC, (Q) = (TAGCNT) = (G) - 1._^1* BELOW, SET LAST SEQ. NO. TO $7FFF IF NO. OF REAL BINS IS ODD._^1TNIDMY LDA*_!TNITEG_'(A)15=1 IF NO. OF REAL BINS IS EVEN._^1_%SAM_"TNITXT_'SKIP IF NO. OF €€REAL BINS IS EVEN._^1_%LDA-_!HX7FFF_'A SEQ. NO. OF $7FFF CAUSES ETERNAL LOSER._^1_%STA_"(FWASEQ),Q_"THE CORRESPONDING PSEUDO BIN CAN]T WIN NOW._^1* MAKE IT APPEAR THAT 1ST RSA BIN WAS THE LAST WINNER._^1TNITXT CLR_"A_^1_%STA_"TRIAL_(() = INDEX OF 1ST RSA BIN._^1_%LDA_"FWARSA_'(A) = FWA OF RECORD STORAGE AREA._^1_%STA_"TFWA_)() = FWA OF 1ST RSA BIN._^1_%JMP*_!(TURNIT)_$EXIT._^1_%EJT€€_]_^1FTINIT NUM_"0_^1_%ENA_"FTSIZE_'(A) = SIZE OF ONE FILE TABLE._^1_%MUI_"M_,(A) = SIZE OF M FILE TABLES._^1_%ADD*_!FWAIFT_'(A) = 1 + LWA OF INPUT FILE TABLES._^1FTNIT1 INA_"-FTSIZE_%(A) = FWA OF NEXT INPUT FILE TABLE._^1_%STA-_!I_,TELL GETSEQ AND CLRFT WHICH FT TO USE._^1_%SUB*_!FWAIFT_'(A)15=1 IF WE ARE DONE._^1_%SAP_"FTNIT2_'SKIP IF NOT YET DONE._^1_%JMP*_!(FTINIT)_$EXIT IF DON€€E._^1* INIT REPLACES PLUG BELOW WITH FWA OF GETSEQ._^1FTNIT2 RTJ+_!PLUG_)GET AN INPUT STRING._^1* INIT REPLACES PLUG BELOW WITH FWA OF CLRFT._^1FTNIT3 RTJ+_!PLUG_)INITIALIZE THE FILE TABLE._^1_%LDA-_!I_,(A) = FWA OF CURRENT INPUT FILE TABLE._^1_%JMP*_!FTNIT1_'SEE IF WE ARE DONE._^1FWAIFT NUM_"0_,() = FWA OF THE INPUT FILE TABLES._^1_%EJT_]_^1* LINK REPLACES PLUG BELOW WITH FWA OF T€€PDEC._^1INIT01 ADC_"PLUG_)() = FWA OF TPDEC._^1INIT_!NUM_"0_,() = FWA OF HERE._^1_%ENA_"2_,(A) = PHASE NO. OF SMCIMG._^1_%STA-_!YPHASE,I_$TELL FIXED TABLES THAT SMCIMG IS RUNNING._^1_%STQ_"FWAFXY_'() = FWA OF FIXED TABLES._^1_%RTJ_"RELOC_(RELOCATE ALL RELOCATABLES._^1_%RTJ_"LINK_)RESOLVE SMCIMG REFERENCES TO SMCMON._^1INIT06 LDQ_"=XMSGIMG-HERE (Q) = FWA OF MESSAGE._^1* LINK REPLACE€€S PLUG BELOW WITH FWA OF TYPOUT._^1INIT07 RTJ+_!PLUG_)ANNOUNCE WHAT IS STARTING._^1_%LDA-_!YKCT,I_'(A)15=1 IF SEQUENCE-CHECKING._^1_%SAM_"INIT08_'SKIP IF SEQUENCE-CHECKING._^1_%LDA_"=X$0B00_%(A) = NOP INSTRUCTION._^1_%STA_"PUTASQ_'DISABLE SEQUENCE-CHECKING._^1INIT08 RTJ_"DETM_)SET (YU),(Y0WAY),(M)._^1INIT09 LDQ_"=XMSGM0-HERE (Q) = FWA OF PREFIX OF MESSAGE._^1_%LDA-_!Y0WAY,I_%(A) =€€ 1ST MERGE ORDER OF SMCIMG._^1_%RTJ*_!(INIT01)_$CALL TPDEC TO PUBLISH Y0WAY._^1INIT10 LDQ_"=XMSGU-HERE_!(Q) = FWA OF PREFIX OF MESSAGE._^1_%LDA-_!YU,I_)(A) = UNIT STRINGS FOR SMCIMG._^1_%RTJ*_!(INIT01)_$CALL TPDEC TO PUBLISH YU._^1_%LDA-_!YOFT+RECLTH,I (A) = NO. OF WORDS PER LOGICAL RECORD._^1_%STA*_!IOUTFT+RECLTH TELL RECLTH TO OUTPUT WORK FILE TABLE._^1_%LDA-_!YWKBSZ,I_$(A) = NO.€€ OF DATA WORDS PER WORK BUFFER._^1_%STA*_!IOUTFT+BUFLTH TELL BUFLTH TO OUTPUT WORK FILE TABLE._^1_%INA_"1_,(A) = TOTAL NO. OF WORDS PER WORK BUFFER._^1_%MUI-_!YIWAY,I_%(A) = MAX. NO. OF WORDS NEEDED FOR IN. BUFS._^1_%ADD*_!IOUTFT+BUFWA ADD FWA OF OUTPUT WORK BUFFER DATA._^1_%ADD*_!IOUTFT+BUFLTH ADD MAX. NO. OF OUTPUT BUFFER DATA WORDS._^1_%STA_"FWAIFT_'() = FWA OF THE MERGE INPUT €€FILE TABLES._^1_%STA*_!INIT05_'() = 1 + LWA OF INPUT WORK FILE BUFFERS._^1_%ENA_"FTSIZE_'(A) = NO. OF WORDS PER FILE TABLE._^1_%MUI-_!YIWAY,I_%ALLOW FOR MAX. NO. OF INPUT FILE TABLES._^1_%ADD_"FWAIFT_'ADD FWA OF INPUT FILE TABLES._^1_%STA_"FWARSA_'() = FWA OF RSA FOR MTOURN._^1* SET THE 2ND WORD OF EACH RSA BIN TO FWA OF THE CORRESPONDING_^1* INPUT FILE TABLE._^1* ALSO SET (RECLTH)€€,(BUFLTH),(BUFWA) FOR EACH INPUT WORK FILE TABLE._^1_%STA*_!INIT02_'PREPARE FOR INDIRECT ADDRESSING OF RSA._^1_%RAO*_!INIT02_'() = FWA OF 1ST RECIPIENT OF INPUT FT FWA._^1_%LDQ-_!YIWAY,I_%(Q) = MAXIMUM INTERMEDIATE MERGE ORDER._^1_%QLS_"1_,ALLOW 2 WORDS PER RSA BIN._^1INIT03 INQ_"-2_+POINT TO NEXT INPUT FT FWA RECIPIENT._^1_%SQP_"INIT04_'SKIP IF NOT YET DONE._^1_%JMP*_!(INIT)_'EXIT€€._^1INIT05 NUM_"0_,() = 1 + LWA OF NEXT LOWER INPUT BUFFER._^1INIT04 INA_"-FTSIZE_%(A) = NEXT INPUT FT FWA TO STORE._^1_%STA*_!(INIT02),Q_"STORE FWA OF AN INPUT FILE TABLE._^1_%STA-_!I_,(I) = FWA OF CURRENT INPUT FILE TABLE._^1_%LDA*_!INIT05_'(A) = 1 + LWA OF CORRESPONDING DATA WORDS._^1_%SUB*_!IOUTFT+BUFLTH (A) = FWA OF CORRESPONDING DATA WORDS._^1_%STA-_!BUFWA,I_%TELL FILE TABLE €€WHERE ITS DATA WORDS ARE._^1_%INA_"-1_+(A) = FWA OF HEADER WORD OF CURRENT BUFFER._^1_%STA*_!INIT05_'() = 1 + LWA OF NEXT LOWER INPUT BIFFER._^1_%LDA*_!IOUTFT+RECLTH (A) = NO. OF WORDS PER LOGICAL RECORD._^1_%STA-_!RECLTH,I_$SET RECORD LENGTH OF EACH INPUT FILE TABLE._^1_%LDA*_!IOUTFT+BUFLTH (A) = NO. OF DATA WORDS PER WORK BUFFER._^1_%STA-_!BUFLTH,I_$TELL EACH INPUT WORK FILE TABL€€E._^1_%LDA-_!I_,(A) = FWA OF CURRENT INPUT WORK FILE TABLE._^1_%JMP*_!INIT03_'SEE IF WE ARE ALL DONE._^1INIT02 NUM_"0_,() = 1 + (FWARSA)._^1_%EJT_]_^1IOUTFT EQU_"IOUTFT(*)_#THE FILE TABLE FOR THE I-MERGE OUTPUT FILE._^1_%BSS_"(BUFWA)_^1_%ADC_"IOUTBF-HERE_!() = FWA OF IOUTBF._^1_%BSS_"(FTSIZE-1-BUFWA)_^1_%NUM_"0_,LENGTH WORD FOR THE BUFFER BELOW._^1IOUTBF EQU_"IOUTBF(*)_#THE BUFFER €€FOR THE I-MERGE OUTPUT FILE._^1_%ADC_"MNDIMG-MSGIMG_^1MSGIMG ALF_"/,INTERMEDIATE MERGE BEGINS/_^1MNDIMG EQU_"MNDIMG(*)_^1_%ADC_"MNDM0-MSGM0_^1MSGM0 ALF_"/,1STWAY/_^1MNDM0 EQU_"MNDM0(*)_^1_%ADC_"MNDU-MSGU_^1MSGU_!ALF_"/,U /_^1MNDU_!EQU_"MNDU(*)_^1_%EJT_]_^1* DETM HANGS IF SMCIMG SHOULDN]T HAVE BEEN LOADED._^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FIXED TABLES._^1*_:(YSEQCT)E€€NTRY = NO. OF STRINGS FROM SMCSRT._^1*_:(YIWAY)ENTRY = MAX. INTERMEDIATE MERGE ORDER_^1*_:(YFWAY)ENTRY = MAX. FINAL MERGE ORDER._^1*_:(YU)ENTRY = 0._^1*_:RTJ DETM_^1*_:(I),(YSEQCT),(YIWAY),(YFWAY) EXIT = ENTRY._^1*_:(YU)EXIT = NO. OF UNIT STRINGS FOR SMCIMG._^1*_:(Y0WAY)EXIT = ORDER OF 1ST MERGE OF SMCIMG._^1*_:(M)EXIT = (Y0WAY)EXIT._^1*_]_^1* THE FOLLOWING ALGORITHM, VIZ. DETM, SU€€CCESSIVELY APPROXIMATES THE_^1* MERGE PATTERN REQUIRED TO HANDLE ALL STRINGS FROM THE INTERNAL SORT._^1*_]_^1* WE START WITH THE FINAL OUTPUT STRING AND THEN WORK BACKWARDS FROM_^1* THE FINAL MERGE TO THE LAST INTERMEDIATE MERGE ... TO THE 1ST_^1* INTERMEDIATE MERGE, UNTIL THE RESULTING TREE STRUCTURE HAS A FANOUT_^1* EQUAL TO THE NUMBER OF STRINGS FROM THE INTERNAL SORT._^1*_]_^1*€€ WE ALWAYS EXTEND THE FANOUT WITH MAXIMAL-ORDER MERGES, EXCEPT FOR THE_^1* FIRST MERGE, WHETHER INTERMEDIATE OR FINAL, WHOSE ORDER IS THAT NEEDED_^1* TO BRING THE FANOUT TO EQUALITY WITH THE NUMBER OF STRINGS FROM THE_^1* INTERNAL SORT._^1*_]_^1* PERFORMANCE IS OPTIMIZED BY THE PRACTICE OF USING THE MAXIMUM MERGE_^1* ORDERS POSSIBLE, SINCE THIS REDUCES THE NUMBER OF LEVELS IN THE M€€ERGE_^1* PATTERN, THEREBY REDUCING THE NUMBER OF TIMES A GIVEN STRING FROM THE_^1* INTERNAL SORT, I.E. UNIT STRING, IS HANDLED._^1*_]_^1* IF WE COUNT EACH TIME EACH UNIT STRING IS MERGED, WE GET THE_^1* UNIT-STRINGS RATING OF THE MERGES. THE NUMBER_^1* OF MERGE PASSES WOULD BE THE UNIT STRINGS RATING OF THE MERGING_^1* DIVIDED BY THE NUMBER OF STRINGS FROM THE INTERNAL SORT._^1DETM€€_!NUM_"0_^1_%LDA-_!YFWAY,I_%(A) = MAXIMUM ORDER OF FINAL MERGE._^1_%STA*_!DETMF_(REMEMBER CURRENT FANOUT._^1_%SUB-_!YSEQCT,I_$(A)15=1 IF INTERMEDIATE MERGE IS NEEDED._^1_%SAM_"DETMI_(SKIP IF INTERMEDIATE MERGE IS NEEDED._^1_%RTJ (WIERD)_%ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM -9_+ANNOUNCE ERROR NO.9 AND STOP THE RUN._^1* LET]S SEE IF WE NEED ONE MORE COMPLETE INTERMEDIATE M€€ERGE PASS_^1* TO GET ADEQUATE FANOUT._^1DETMI LDA-_!YIWAY,I_%(A) = MAXIMUM ORDER OF INTERMEDIATE MERGE._^1* ADDING A COMPLETE INTERMEDIATE PASS WOULD MULTIPLY THE FANOUT_^1* BY THE ORDER OF THE MERGES IN THAT PASS._^1_%MUI*_!DETMF_((A) = FANOUT IF INTERMEDIATE PASS IS ADDED._^1_%TRA_"Q_,SAVE PROPOSED FANOUT IN Q._^1_%SUB-_!YSEQCT,I_$(A)15=1 IF PROPOSED FANOUT IS TOO LOW._^1_%SAP_"€€DETMDF_'SKIP IF PROPOSED FANOUT IS AT LEAST ENOUGH._^1* WE NEED ONE MORE COMPLETE INTERMEDIATE MERGE PASS, AND THEN SOME._^1_%STQ*_!DETMF_(UPDATE FANOUT ASSUMING ADDITION OF I-PASS._^1* THE UNIT STRINGS RATING MUST ALSO REFLECT THE ADDITION OF THE I-PASS._^1_%LDA-_!YSEQCT,I_$(A) = USR INCREMENT DUE TO ADDED I-PASS._^1_%ADD-_!YU,I_)ADD THE OLD UNIT STRINGS RATING._^1_%STA-_!YU,I_)UP€€DATE THE UNIT STRINGS RATING._^1_%JMP*_!DETMI_(SEE IF WE NEED YET ANOTHER COMPLETE I-PASS._^1* THE BELOW CODE ASSUMES WE NEED AT MOST ONE MORE COMPLETE I-PASS._^1* THE QUESTION IS WHETHER WE NEED ONLY ADD A PARTIAL I-PASS,_^1* AND HOW PARTIAL, I.E. HOW MANY MERGES AND IS ONE OF THEM NON-MAXIMAL._^1* IF A NON-MAXIMAL I-MERGE CAN BE USED, WHAT IS ITS ORDER._^1DETMDF LDA-_!YIWAY,I_%(A€€) = MAXIMUM ORDER OF AN I-MERGE._^1_%INA_"-1_+(A) = I-MERGE STRING-REDUCTION CAPACITY._^1_%STA*_!DETMI1_'SAVE STRING-REDUCTION RATING OF ONE I-MERGE._^1_%LDA-_!YSEQCT,I_$(A) = TOTAL FANOUT NEEDED._^1_%SUB*_!DETMF_((A) = ADDITIONAL FANOUT NEEDED._^1* WE WILL NOW COMPUTE THE NUMBER OF ADDITIONAL I-MERGES NEEDED BY_^1* DIVIDING THE ADDITIONAL FANOUT NEEDED BY THE STRING-REDUCTION_^1* €€RATING OF ONE MAXIMAL-ORDER I-MERGE._^1_%CLR_"Q_,PREPARE TO DIVIDE._^1* THE FOLLOWING DVI SETS (A) = NO. OF ADDITIONAL MAXIMAL I-MERGES NEEDED_^1* AND SETS (Q) = STRING-REDUCTION RATING, = -1 + MERGE ORDER, OF ANY_^1* ADDITIONAL NON-MAXIMAL I-MERGE NEEDED._^1_%DVI*_!DETMI1_'(A) = NO. OF EXTRA MAXIMAL I-MERGES NEEDED._^1_%STQ-_!Y0WAY,I_%(Q) = -1 + ORDER OF NON-MAXIMAL I-MERGE._^1_%M€€UI-_!YIWAY,I_%(A) = USR INCREMENT BY EXTRA MAX. I-MERGES._^1_%ADD-_!YU,I_)(A) = TOTAL USR EXCEPT FOR NON-MAX I-MERGE._^1_%LDQ-_!Y0WAY,I_%(Q) = -1 + ORDER OF NON-MAXIMAL I-MERGE._^1_%SQN_"DETMRA_'SKIP IF A NON-MAXIMAL I-MERGE IS NEEDED._^1* ONLY MAXIMAL I-MERGES WILL BE USED, THEREFORE ORDER OF 1ST MERGE_^1* OF RUN WILL BE MAXIMUM INTERMEDIATE-MERGE ORDER._^1_%LDQ-_!YIWAY,I_%(A) = M€€AXIMUM INTERMEDIATE-MERGE ORDER._^1DETMXT STQ-_!Y0WAY,I_%SET ORDER OF 1ST MERGE IN RUN._^1_%STQ_"M_,SET ORDER OF NEXT INTERMEDIATE MERGE._^1_%STA-_!YU,I_)SET PREDICTED UNIT STRING RATING._^1_%JMP*_!(DETM)_'EXIT._^1DETMRA INQ_"1_,(Q) = ORDER OF NON-MAXIMAL I-MERGE._^1_%AAQ_"A_,(A) = TOTAL USR FOR SMCIMG._^1_%JMP*_!DETMXT_'RECORD THE TOTAL AND EXIT._^1DETMF NUM_"0_,() = CURRENT FANO€€UT._^1DETMI1 NUM_"0_,() = -1 + MAXIMUM ORDER OF I-MERGE._^1_%EJT_]_^1* RELOC RELOCATES THE WORDS MENTIONED IN THE LIST, RELOC4._^1RELOC NUM_"0_^1_%ENQ_"RELOC3_"(Q) = NO. OF ENTRIES IN RELOC4._^1RELOC7 INQ_"-1_'(Q) = INDEX TO NEXT RELOCATEE._^1_%SQP_"RELOC6_"SKIP IF NOT DONE._^1_%JMP*_!(RELOC)_!EXIT IF DONE._^1RELOC6 LDA*_!RELOC4,Q (A) = FWA OF RELOCATEE - FWA OF HERE._^1_%ADD_"IN€€IT_)(A) = FWA OF RELOCATEE._^1_%STA*_!RELOC5_"SAVE FWA OF RELOCATEE._^1_%LDA*_!(RELOC5) (A) = RELOCATEE._^1_%ADD_"INIT_)(A) = RELOCATED (RELOCATEE)._^1_%STA*_!(RELOC5) SET RELOCATEE._^1_%JMP*_!RELOC7_"JMP TO SEE IF DONE._^1RELOC5 NUM_"0_(() = FWA OF RELOCATEE._^1RELOC4 EQU_"RELOC4(*)_^1_%ADC_"END004+1-HERE_^1_%ADC_"END001+1-HERE_^1_%ADC_"END003+1-HERE_^1_%ADC_"PUTSTI+1-HERE_^1_%A€€DC_"PUTSER+1-HERE_^1_%ADC_"PUTPRE+1-HERE_^1_%ADC_"MGNIT1+1-HERE_^1_%ADC_"INIT06+1-HERE_^1_%ADC_"INIT09+1-HERE_^1_%ADC_"INIT10+1-HERE_^1_%ADC_"IOUTFT+BUFWA-HERE_^1RELOC3 EQU_"RELOC3(*-RELOC4)_^1_%EJT_]_^1LINK_!NUM_"0_^1_%LDA-_!YTPDEC,I_^1_%STA_"END006+1_^1_%STA_"INIT01_^1_%LDA-_!YBTDEC,I_^1_%STA_"END002+1_^1_%STA_"END005+1_^1_%LDA-_!YTYPOT,I_^1_%STA_"PUTTY1+1_^1_%STA_"PUTTY2+1_^1_%S€€TA_"INIT07+1_^1_%LDA-_!YGETU,I_^1_%STA_"GETGET+1_^1_%LDA-_!YCMPKY,I_^1_%STA_"TRNCMP+1_^1_%STA_"PUTSCK+1_^1_%LDA-_!YEOS,I_^1_%STA_"PUTEOS+1_^1_%LDA-_!YPUTU,I_^1_%STA_"PUTPUT+1_^1_%LDA-_!YHXDMP,I_^1_%STA_"PUTHD1+1_^1_%STA_"PUTHD2+1_^1_%LDA-_!YGORQT,I_^1_%STA_"PUTGOQ+1_^1_%LDA_"=XYLAPUT,I_"(A) = FWA OF YLAPUT._^1_%STA_"PUTYLA_^1_%LDA-_!YBOS,I_^1_%STA_"MGNIT2+1_^1_%LDA-_!YGTSEQ,I_^1_%S€€TA_"FTNIT2+1_^1_%LDA-_!YCLRFT,I_^1_%STA_"FTNIT3+1_^1* PASS SMCSRT INPUT RECORD COUNT._^1* ONE MIGHT EXPECT YSRCNT TO BE SET IN SMCSRT,_^1* BUT THE BELOW INSTRUCTIONS EFFECTIVELY TAKE NO CORE IN SMCIMG._^1_%LDA-_!YIRCNT,I_^1_%STA-_!YSRCNT,I_^1_%LDA-_!YIRCNT+1,I_^1_%STA-_!YSRCNT+1,I_^1_%CLR_"A_^1_%STA-_!YIRCNT,I_$ZERO PHASE INPUT RECORD COUNT._^1_%STA-_!YIRCNT+1,I_^1_%STA-_!YORCNT,I_€€$ZERO PHASE OUTPUT RECORD COUNT._^1_%STA-_!YORCNT+1,I_^1_%LDA- YWIERD,I_$(A) = FWA OF WIERD IN SMCMON._^1_%STA* WIERD_(SAVE FWA OF WIERD._^1_%LDA-_!YIMGSZ,I_$(A) = TABULATED SIZE OF SMCIMG RESIDENT._^1_%EOR_"=XIMGSIZ_$COMPARE TABULATED TO ACTUAL._^1_%SAZ LINK01_'SKIP IF TABULATED = ACTUAL._^1_%RTJ* (WIERD)_%ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM -10_*ANNOUNCE ERROR NO.10 AN€ΘD STOP THE RUN._^1LINK01 EQU LINK01(*)_^1_%JMP*_!(LINK)_'EXIT._^1WIERD NUM 0_,() = FWA OF WIERD IN SMCMON._^1* SIZE OF SMCIMG RESIDENT LOGIC._^1IMGSIZ EQU_"IMGSIZ(IOUTBF-SMCIMG)_^1_%END_"SMCIMG_^__ΘPSMCFMG CSY/ SM6 P€1_%NAM SMCFMG_'DECK-ID S06 SMC 1.0_.SUMMARY-108_^1*_$SORT-MERGE FINAL MERGE_^1*_$SORT/MERGE VERSION 1.0_^1*_$SMALL SYSTEMS DIVISION. LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976._^1_%ENT_"SMCFMG_^1AMONI EQU_"AMONI($F4)_^1ADISP EQU_"ADISP($EA)_^1PLUG_!EQU_"PLUG($7FFF)_^1_%EJT_]_^1* FILE TABLE STRUCTURE._^1LUN_"EQU_"LUN(2)_"(2)=0._^1FILNUM EQU_"FILNUM(1)_^1RE€€CLTH EQU_"RECLTH(FILNUM+1)_^1BUFLTH EQU_"BUFLTH(RECLTH+1)_^1SKIPCT EQU_"SKIPCT(BUFLTH+1)_^1DOCNT EQU_"DOCNT(SKIPCT+2)_^1BUFWA EQU_"BUFWA(DOCNT+2)_^1RECNT EQU_"RECNT(BUFWA+1)_^1ERRCNT EQU_"ERRCNT(RECNT+2)_^1BLKCNT EQU_"BLKCNT(ERRCNT+1)_^1RECFWA EQU_"RECFWA(BLKCNT+1)_^1XFRLTH EQU_"XFRLTH(RECFWA+1)_^1RECPTR EQU_"RECPTR(XFRLTH+1)_^1REQBUF EQU_"REQBUF(RECPTR+2)_^1REQIND EQU_"REQIND(R€€EQBUF+12)_^1FTSIZE EQU_"FTSIZE(1+REQIND)_^1_%EJT_]_^1*SMC FIXED-TABLE STRUCTURE._^1YLOCOR EQU_"YLOCOR(0)_^1YIFTAD EQU_"YIFTAD(YLOCOR+1)_^1YEND_!EQU_"YEND(YIFTAD+1)_^1YHICOR EQU_"YHICOR(YEND+1)_^1YFTSIZ EQU_"YFTSIZ(YHICOR+1)_^1YEDTSZ EQU_"YEDTSZ(YFTSIZ+1)_^1YSRTSZ EQU_"YSRTSZ(YEDTSZ+1)_^1YIMGSZ EQU_"YIMGSZ(YSRTSZ+1)_^1YFMGSZ EQU_"YFMGSZ(YIMGSZ+1)_^1YPHASE EQU_"YPHASE(YFMGSZ+1)_^1YDM€€_"EQU_"YDM(YPHASE+1)_^1YKCT_!EQU_"YKCT(YDM+1)_^1YG_#EQU_"YG(YKCT+1)_^1YU_#EQU_"YU(YG+1)_^1Y0WAY EQU_"Y0WAY(YU+1)_^1YIWAY EQU_"YIWAY(Y0WAY+1)_^1YFWAY EQU_"YFWAY(YIWAY+1)_^1YSUMIB EQU_"YSUMIB(YFWAY+1)_^1YMAXIB EQU_"YMAXIB(YSUMIB+1)_^1YWKBSZ EQU_"YWKBSZ(YMAXIB+1)_^1YSRCNT EQU_"YSRCNT(YWKBSZ+1)_^1YIRCNT EQU_"YIRCNT(YSRCNT+2)_^1YORCNT EQU_"YORCNT(YIRCNT+2)_^1YSQ2MG EQU_"YSQ2MG(YORCNT€€+2)_^1YSEQCT EQU_"YSEQCT(YSQ2MG+1)_^1YCMPKY EQU_"YCMPKY(YSEQCT+1)_^1YZERO EQU_"YZERO(YCMPKY+1)_^1YBIGCT EQU_"YBIGCT(YZERO+1)_^1YBGADD EQU_"YBGADD(YBIGCT+1)_^1YBGSUB EQU_"YBGSUB(YBGADD+1)_^1YBIGQ EQU_"YBIGQ(YBGSUB+1)_^1YBIGA EQU_"YBIGA(YBIGQ+1)_^1YGORQT EQU_"YGORQT(YBIGA+1)_^1YGETU EQU_"YGETU(YGORQT+1)_^1YPUTU EQU_"YPUTU(YGETU+1)_^1YLAPUT EQU_"YLAPUT(YPUTU+1)_^1YFMLUN EQU_"YFML€€UN(YLAPUT+1)_^1YSEGLU EQU_"YSEGLU(YFMLUN+4)_^1YSEGFN EQU_"YSEGFN(YSEGLU+1)_^1YCLSU EQU_"YCLSU(YSEGFN+1)_^1YREL_!EQU_"YREL(YCLSU+1)_^1YGTSEQ EQU_"YGTSEQ(YREL+1)_^1YBOS_!EQU_"YBOS(YGTSEQ+1)_^1YEOS_!EQU_"YEOS(YBOS+1)_^1YCLRFT EQU_"YCLRFT(YEOS+1)_^1YSVAQI EQU_"YSVAQI(YCLRFT+1)_^1YREAQI EQU_"YREAQI(YSVAQI+1)_^1YACCEP EQU_"YACCEP(YREAQI+1)_^1YTYPOT EQU_"YTYPOT(YACCEP+1)_^1YTYPIN EQU_"YT€€YPIN(YTYPOT+1)_^1YPRMLV EQU_"YPRMLV(YTYPIN+1)_^1YHXDMP EQU_"YHXDMP(YPRMLV+1)_^1YB2H_!EQU_"YB2H(YHXDMP+1)_^1YBGB2D EQU_"YBGB2D(YB2H+1)_^1YB2D_!EQU_"YB2D(YBGB2D+1)_^1YHADOT EQU_"YHADOT(YB2D+1)_^1YBOMB EQU_"YBOMB(YHADOT+1)_^1YTPDEC EQU_"YTPDEC(YBOMB+1)_^1YBTDEC EQU_"YBTDEC(YTPDEC+1)_^1YTPHEX EQU_"YTPHEX(YBTDEC+1)_^1YWIERD EQU YWIERD(YTPHEX+1)_^1YOFT_!EQU YOFT(YWIERD+1)_^1YKEY_!EQU_€€"YKEY(YOFT+FTSIZE)_^1_%EJT_]_^1*OFTEN NEEDED CONSTANTS._^1ZERO_!EQU_"ZERO(2)_!(2)=0._^1HX0020 EQU_"HX0020($28)_"($28)=$0020._^1HX00FF EQU_"HX00FF($A)_#($A) = $00FF._^1HX0800 EQU_"HX0800($2E)_!($2E)=$0800._^1HX1000 EQU_"HX1000($2F)_"($2F)=$1000._^1HX2000 EQU_"HX2000($30)_"($30)=$2000._^1HX7FFF EQU_"HX7FFF($42)_"($42)=$7FFF._^1HX8000 EQU_"HX8000($32)_"($32)=$8000._^1HXDFFF EQU_"HXDFF€€F($40)_"($40)=$DFFF._^1HXEFFF EQU_"HXEFFF($3F)_"($3F)=$EFFF._^1HXF7FF EQU_"HXF7FF($3E)_"($3E)=$F7FF._^1HXFC00 EQU_"HXFC00($1C)_"($1C)=$FC00._^1_%EJT_]_^1SMCFMG NUM_"0_^1_%RTJ_"INIT_)INITIALIZE THIS PHASE._^1HERE_!EQU_"HERE(*)_%RELOC REFERENCE POINT._^1RECMRG RTJ*_!GET_*SUBMIT SEQUENCE NO. AND/OR RECORD TO MTOURN._^1_%RTJ*_!MTOURN_'DETERMINE WINNING RECORD._^1_%RTJ_"PUT_*TAKE P+1 OR€€ P+2 EXIT._^1_%JMP*_!ENDFMG_'WINNER WAS LOSING-DUMMY._^1_%JMP*_!RECMRG_'WINNER WAS WINNING-DUMMY OR REAL-RECORD._^1_%EJT_]_^1ENDFMG LDA_"FWAFXY_'(A) = FWA OF FIXED TABLES._^1_%STA-_!I_+SIMPLIFY ACCESS TO FIXED TABLES._^1_%LDA-_!YDM,I_((A)15=1 IF FINAL-MERGE._^1_%SAP_"ENDMRG_'SKIP IF MERGE-ONLY._^1_%LDA-_!YORCNT+1,I_"(A) = LOW ORDER OUTPUT RECORD COUNT._^1_%EOR-_!YSRCNT+1,I_"COMPARE€€ WITH INTERNAL SORT._^1_%SAN_"ENDINE_'SKIP IF INTERPHASE INEQUALITY._^1_%LDA-_!YORCNT,I_$(A) = HIGH ORDER OUTPUT RECORD COUNT._^1_%EOR-_!YSRCNT,I_$COMPARE WITH INTERNAL SORT._^1_%SAZ_"ENDMRG_'SKIP IF INTERPHASE EQUALITY._^1ENDINE LDQ_"=XMSGINE-HERE (Q) = FWA OF MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1END001 RTJ+_!PLUG_)ANNOUNCE INTERPHASE INEQUALITY._^1ENDMRG LD€€Q_"=XMSGDEL-HERE (Q) = FWA OF MESSAGE._^1_%LDA_"DELCNT_'(A) = NO. OF RECORDS DELETED._^1* INIT REPLACES PLUG BELOW WITH FWA OF TPDEC._^1END006 RTJ+_!PLUG_^1END002 LDQ_"=XMSGIRC-HERE (Q) = FWA OF PREFIX OF MESSAGE._^1_%LDA_"=XYIRCNT,I_"(A) = FWA OF BINARY TO CONVERT TO SUFFIX._^1* INIT REPLACES PLUG BELOW WITH FWA OF BTDEC._^1END003 RTJ+_!PLUG_)ANNOUNCE INPUT RECORD COUNT._^1END004 €€LDQ_"=XMSGORC-HERE (Q) = FWA OF PREFIX OF MESSAGE._^1_%LDA_"=XYORCNT,I_"(A) = FWA OF BINARY TO CONVERT TO SUFFIX._^1* INIT REPLACES PLUG BELOW WITH FWA OF BTDEC._^1END005 RTJ+_!PLUG_)ANNOUNCE PHASE RECORD COUNT._^1_%JMP*_!(SMCFMG)_$EXIT._^1_%ADC_"MNDDEL-MSGDEL_^1MSGDEL ALF_"/,DELETES /_^1MNDDEL EQU_"MNDDEL(*)_^1DELCNT NUM_"0_,() = NO. OF RECORDS DELETED._^1_%ADC_"MNDINE-MSGINE_^1MS€€GINE ALF_"/,INTERPHASE RECORD COUNTS DISAGREE/_^1MNDINE EQU_"MNDINE(*)_^1_%ADC_"MNDIRC-MSGIRC_^1MSGIRC ALF_"/,RECORDS IN/_^1MNDIRC EQU_"MNDIRC(*)_^1_%ADC_"MNDORC-MSGORC_^1MSGORC ALF_"/,RECORDS OUT /_^1MNDORC EQU_"MNDORC(*)_^1_%EJT_]_^1GET_"NUM_"0_^1_%LDQ*_!TFWA_)(Q) = FWA OF LAST WINNER BIN._^1_%LDA-_!1,Q_*(A) = FWA OF LAST WINNER FILE TABLE._^1_%STA-_!I_,TELL GETU WHAT FILE TABLE €€TO USE._^1* INIT REPLACES PLUG BELOW WITH FWA OF GETU._^1GETGET RTJ+_!PLUG_)GET NEXT RECORD FROM LAST WINNER FILE TABLE._^1_%JMP*_!GETEOF_'SUBMIT A LOSING DUMMY IF EOF._^1GETRSA STA*_!(TFWA)_'SUBMIT FWA OF NEW RECORD TO MTOURN._^1_%LDA*_!G_,(A) = SEQ. NO. OF A REAL RECORD._^1GETSEQ LDQ*_!TRIAL_((Q) = LAST-WINNER-BIN NO., I.E. 0,...,G-1._^1_%STA*_!(FWASEQ),Q_"STORE SEQ. NO. IN SEQ. €€NO. ARRAY._^1_%JMP*_!(GET)_(EXIT._^1GETEOF LDA*_!MAXSEQ_'(A) = $7FFF,$7FFE,$7FFD,..._^1_%INA_"-1_+(A) = $7FFE,$7FFD,$7FFC,..._^1_%STA*_!MAXSEQ_'MAKE EACH LOSING DUMMY DIFFER IN SEQ. NO._^1_%JMP*_!GETSEQ_'SUBMIT THE SEQUENCE NUMBER TO MTOURN._^1_%EJT_]_^1* MTOURN USES 2-WORD RSA BINS._^1* (1ST WORD) = FWA OF A LOGICAL RECORD WITHIN AN INPUT BUFFER._^1* (2ND WORD) = FWA OF THE FILE-T€€ABLE FOR THE CORRESPONDING INPUT FILE._^1MTOURN NUM_"0_^1_%LDQ*_!TRIAL_#(Q) = BIN INDEX OF TRIAL RECORD._^1_%LDA*_!(FWASEQ),Q_"(A) = SEQ. NO. OF TRIAL RECORD._^1_%QRS_"1_((Q) = FLOOR(TRIAL BIN INDEX/2)._^1_%TCQ_"Q_((Q) = -FLOOR(TRIAL BIN INDEX/2)._^1_%ADQ*_!TAGCNT_"(Q) = INDEX OF BASE TAG OF TRIAL AND COMPETITOR._^1_%STQ-_!I_((I) = INDEX OF CURRENT TAG._^1CMPSEQ LDQ*_!(PRETSA),I_"(€€Q) = INDEX OF COMPETITOR BIN._^1_%SUB*_!(FWASEQ),Q_"(A) = TRIAL SEQ. NO. - COMPETITOR SEQ. NO._^1_%SAM_"TWINS_#SKIP IF TRIAL WINS DUE TO LOWER SEQ. NO._^1_%SAN_"CWINS_(SKIP IF TRIAL LOSES DUE TO HIGHER SEQ. NO._^1_%JMP*_!SEQTIE_'JMP IF SEQUENCE NUMBERS TIE._^1CWINS LDA*_!TRIAL_#(A) = BIN INDEX OF TRIAL RECORD._^1_%LDQ*_!(PRETSA),I_"(Q) = INDEX OF COMPETITOR BIN._^1_%STA*_!(PRETSA)€€,I_"RECORD TRIAL AS LOSER._^1_%STQ*_!TRIAL_#RECORD COMPETITOR AS NEW TRIAL._^1_%JMP*_!TWINS1_'SEE IF THERE IS A NEXT TREE LEVEL._^1TWINS LDQ*_!TRIAL_((Q) = BIN INDEX OF TRIAL RECORD._^1TWINS1 LDA-_!I_((A) = INDEX OF LAST TAG._^1_%ARS_"1_((A) = INDEX OF CURRENT TAG._^1_%SAN_"NXTLVL_"SKIP IF THERE IS A NEXT TREE LEVEL._^1* THE FOLLOWING EXIT LOGIC IS A STREAMLINED VERSION OF THAT_^1€€* IN THE SMCSRT TOURNAMENT._^1_%QLS_"1_,(Q) = FWA OF WINNER BIN - FWA OF RSA._^1_%ADQ*_!FWARSA_'(Q) = FWA OF WINNER BIN._^1_%STQ*_!TFWA_)WINNER BIN WILL BE NEXT TRIAL._^1_%JMP*_!(MTOURN)_$EXIT IF END OF TREE._^1NXTLVL STA-_!I_(UPDATE TREE LEVEL. (I) = INDEX OF CURRENT TAG._^1_%LDA*_!(FWASEQ),Q_"(A) = SEQ. NO. OF TRIAL._^1_%JMP*_!CMPSEQ_^1*A MERGE NETWORK IS FORMED WHEN THE FOLLOWIN€€G SEQTIE VERSION IS_^1*SUBSTITUTED FOR THAT IN TOURN._^1SEQTIE QLS_"1_,(Q) = FWA OF COMPETITOR BIN - FWA OF RSA._^1_%LDQ*_!(FWARSA),Q_"(Q) = FWA OF COMPETITOR RECORD._^1_%LDA*_!TRIAL_#(A) = BIN INDEX OF TRIAL ITEM._^1_%ALS_"1_(ALLOW 2 WORDS PER BIN._^1_%ADD*_!FWARSA_"(A) = FWA OF TRIAL ITEM._^1_%STA*_!TFWA_$SAVE FWA OF TRIAL ITEM._^1_%LDA*_!(TFWA)_"(A) = FWA OF TRIAL RECORD._^1***W€€ARNING***_^1* EFFICIENCY DEMANDS THAT TRIAL WINS TIES._^1* CALL CMPKEY WITH (A)ENTRY = FWA OF TRIAL._^1* INIT REPLACES PLUG BELOW WITH FWA OF CMPKEY._^1TRNCMP RTJ+_!PLUG_)(A) = FWA OF WINNER RECORD._^1_%EOR*_!(TFWA)_'(A)=0 IF TRIAL RECORD WON._^1_%SAN_"JCWINS_'SKIP IF COMPETITOR RECORD WON._^1_%JMP*_!TWINS_#JMP IF TRIAL RECORD WON._^1JCWINS JMP*_!CWINS_#JMP IF COMPETITOR RECORD WON€€._^1TRIAL NUM_"0_(() = BIN INDEX OF TRIAL RECORD._^1G_$NUM_"0_,() = TOTAL NO. OF RSA BINS, PSEUDO OR REAL._^1M_$NUM_"0_,() = CURRENT MERGE ORDER._^1TAGCNT NUM_"0_(() = NO. OF TSA TAGS = G-1._^1FWASEQ NUM_"0_(() = FWA OF SEQ. NO. ARRAY._^1PRETSA NUM_"0_,() = -1 + FWA OF TAG STORAGE AREA._^1OVRTSA NUM_"0_,() = 1 + LWA OF TSA._^1BINSIZ NUM_"0_(() = NO. OF WORDS IN AN RSA BIN._^1FWARS€€A NUM_"0_(() = FWA OF RECORD STORAGE AREA._^1TFWA_!NUM_"0_(() = FWA OF TRIAL BIN._^1MAXSEQ NUM_"$7FFF_(() = 1 + SEQ. NO. OF NEXT LOSING DUMMY._^1FWAIFT NUM_"0_,() = FWA OF EXPANDED INPUT FILE TABLE._^1FWAFXY NUM_"0_,() = FWA OF FIXED TABLES._^1_%EJT_]_^1* MOVE RIGHT TO LEFT._^1* MOVE MUST BE FAST. DURING A SINGLE SORT RUN, MOVE MOVES EACH BYTE OF_^1* EACH LOGICAL RECORD SEVERAL TIM€€ES, DESPITE THE FACT THAT THE NUMBER OF_^1* SUCH MOVES IS REDUCED BY MOVING POINTERS INSTEAD OF LOGICAL RECORDS,_^1* WHENEVER POSSIBLE._^1* WORD-TIMES = 4 + 9 * WORDS-TO-MOVE, E.G. 364 = F(80 BYTES), 4 = F(0)._^1* THE CALLING SEQUENCE IS_!(MVSRCE)ENTRY = FWA OF SOURCE._^1*_:(MVDEST)ENTRY = FWA OF DESTINATION._^1*_:(Q)ENTRY = NO. OF WORDS TO MOVE._^1*_:RTJ MOVE_"MOVE IFF (Q)ENTRY .G€€E. 1._^1*_:(A)EXIT = (LAST WORD MOVED)._^1*_:(Q)EXIT = -1._^1*_:(I),(MVSRCE),(MVDEST) EXIT = ENTRY._^1MOVE_!NUM_"0_^1MVLOOP INQ_"-1_+(Q) = FWA NEXT SOURCE WORD - FWA OF SOURCE,_^1*_5= FWA NEXT DESTINATION WORD - FWA OF DESTINATION._^1_%SQP_"MVLDA_(SKIP IF MORE WORDS TO MOVE._^1_%JMP*_!(MOVE)_'EXIT._^1MVLDA LDA*_!(MVSRCE),Q_"(A) = (NEXT WORD TO MOVE)._^1_%STA*_!(MVDEST),Q_"MOVE A W€€ORD._^1_%JMP*_!MVLOOP_'EXIT OR MOVE NEXT WORD._^1MVSRCE NUM_"0_,() = FWA OF SOURCE._^1MVDEST NUM_"0_,() = FWA OF DESTINATION._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!P_!RTJ PUT_^1*_:P+1 LOSING-DUMMY EXIT._^1*_:P+2 WINNING-DUMMY OR NORMAL EXIT._^1PUT_"NUM_"0_^1PUTSTI LDQ*_!FWAFXY_'(Q) = FWA OF FIXED TABLES._^1_%LDA_"=XYOFT,Q_$(A) = FWA OF FINAL-OUTPUT FILE-TABLE._^1_%STA-_!I_,TELL PU€€TU WHAT FILE-TABLE TO USE._^1_%LDQ*_!TRIAL_((Q) = NO. OF WINNER BIN._^1_%LDA*_!(FWASEQ),Q_"(A) = SEQUENCE NO. OF WINNER._^1_%SUB*_!G_,(A)15=1 IF WINNING-DUMMY._^1_%SAP_"PUTGEG_'SKIP IF NOT WINNING-DUMMY._^1_%JMP*_!PUTP2_(DISCARD WINNING-DUMMY._^1PUTGEG SAZ_"PUTEQG_'SKIP IF WINNER IS REAL-RECORD._^1* A LOSING DUMMY WON, THEREFORE THE OUTPUT STRING ENDS._^1* INIT REPLACES PLUG BELOW €€WITH FWA OF CLSU._^1PUTCLS RTJ+_!PLUG_)MAKE SURE THAT THE LAST RECORDS ARE WRITTEN._^1_%JMP*_!(PUT)_(TAKE P+1(END-OF-STRING) EXIT._^1PUTEQG LDQ*_!(TFWA)_'(Q) = FWA OF CURRENT WINNING RECORD._^1_%LDA*_!(PUTYLA)_$(A) = FWA OF PREVIOUS WINNER._^1***WARNING***_^1* TIES WILL CAUSE SEQUENCE ERRORS UNLESS CMPKEY IS CALLED WITH_^1* (A)ENTRY = FWA OF PREVIOUS WINNER._^1* PUT1ST REPLACES JMP€€* BELOW WITH RTJ+._^1PUTSCK JMP*_!PUT1ST_'BYPASS SEQUENCE CHECK ON 1ST RECORD OF SEQ._^1* INIT REPLACES PLUG BELOW WITH FWA OF CMPKEY._^1_%ADC_"PLUG_^1_%EOR*_!(PUTYLA)_$(A)=0 IFF NO SEQUENCE ERROR._^1_%SAN_"PUTSER_'SKIP IF SEQUENCE ERROR._^1PUTSOK TRQ_"A_,(A) = FWA OF CURRENT WINNING RECORD._^1* INIT REPLACES PLUG BELOW WITH FWA OF PUTU._^1PUTPUT RTJ+_!PLUG_)OUTPUT THE RECORD._^1PU€€TP2 RAO*_!PUT_*SET UP P+2 EXIT._^1_%JMP*_!(PUT)_(TAKE P+2 EXIT._^1PUT1ST LDA*_!PUTRTJ_'(A) = RTJ+._^1* INIT REPLACES THE STA BELOW WITH NOP IF NO SEQUENCE CHECKING._^1PUTASQ STA*_!PUTSCK_'ACTIVATE SEQUENCE-CHECKING FOR NEXT WINNERS._^1_%JMP*_!PUTSOK_'SKIP SEQUENCE-CHECKING FOR CURRENT WINNER._^1PUTSER LDQ_"=XMSGSER-HERE (Q) = FWA OF SEQUENCE-ERROR MESSAGE._^1* INIT REPLACES PLUG B€€ELOW WITH FWA OF TYPOUT._^1PUTTY1 RTJ+_!PLUG_^1_%LDA*_!(PUTYLA)_$(A) = FWA OF PREVIOUS WINNER._^1_%LDQ-_!RECLTH,I_$(Q) = LENGTH OF PREVIOUS WINNER._^1* INIT REPLACES PLUG BELOW WITH FWA OF HEXDMP._^1PUTHD1 RTJ+_!PLUG_)DUMP THE PREVIOUS WINNER._^1PUTPRE LDQ_"=XMSGPRE-HERE (Q) = FWA OF MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1PUTTY2 RTJ+_!PLUG_^1_%LDA*_!(TFWA)_'(A)€€ = FWA OF CURRENT WINNING RECORD._^1_%LDQ-_!RECLTH,I_$(Q) = LENGTH OF CURRENT WINNER._^1* INIT REPLACES PLUG BELOW WITH FWA OF HEXDMP._^1PUTHD2 RTJ+_!PLUG_)DUMP THE CURRENT WINNER._^1_%SET_"A,Q_*DISABLE GORQT OPTIONAL MESSAGE._^1* INIT REPLACES PLUG BELOW WITH FWA OF GORQT._^1PUTGOQ RTJ+_!PLUG_)TELL OPERATOR. SEE WHAT HE WANTS TO DO._^1_%JMP*_!PUTQT_(OPERATOR SAYS TO DELETE NEW WIN€€NER._^1_%LDA*_!(TFWA)_'(A) = FWA OF CURRENT WINNING RECORD._^1_%JMP*_!PUTPUT_'OPERATOR SAYS TO INCLUDE NEW WINNER._^1PUTQT RAO_"DELCNT_'COUNT EACH RECORD DELETED._^1_%JMP*_!PUTP2_(DELETE THE RECORD._^1* INIT REPLACES PLUG BELOW WITH FWA OF YLAPUT._^1PUTYLA ADC_"PLUG_)(()) = FWA OF LAST RECORD PUT._^1PUTRTJ NUM_"$5400_(RTJ+. USED TO REACTIVATE SEQUENCE CHECKING._^1_%ADC_"MNDSER-MSG€€SER_^1MSGSER ALF_"/,SEQUENCE ERROR/_^1MNDSER EQU_"MNDSER(*)_^1_%ADC_"MNDPRE-MSGPRE_^1MSGPRE ALF_"/,PRECEDES/_^1MNDPRE EQU_"MNDPRE(*)_^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(A)ENTRY = SIZE IN WORDS OF EACH RSA BIN._^1*_:(Q)ENTRY = NO. OF REAL RSA BINS._^1*_:(I)ENTRY = FWA OF FIXED TABLES._^1*_:(FWARSA)ENTRY = FWA OF THE RSA._^1*_:RTJ TURNIT_^1* OUTPUTS ARE_!BINSIZ,TNITEG,G,TAGCNT,CU€€RSEQ,FWASEQ,PRETSA,OVRTSA,_^1*_.TRIAL,TFWA, SEQ. NO. ARRAY, TSA ARRAY,_^1*_.(A)EXIT = (FWARSA),_^1*_.(Q)EXIT=JUNK, (I)EXIT = (I)ENTRY._^1* THE ARRANGEMENT OF THE ARRAYS IN CORE IS RSA,SEQ,TSA FROM LOW TO HIGH._^1TURNIT NUM_"0_^1_%STA*_!BINSIZ_'SAVE RSA BIN LENGTH FOR TOURN AND TURNIT._^1* THE FOLLOWING INQ,LRS,QLS ROUND (Q) UP TO THE NEAREST EVEN INTEGER._^1_%INQ_"1_,(Q) = 1 + NO. €€OF REAL RSA BINS._^1_%LRS_"1_,(Q) = HALF OF NEAREST EVEN NO. .GE. (Q)ENTRY_^1_%STA*_!TNITEG_'(TNITEG)15=1 IF NO. OF REAL BINS IS EVEN._^1_%QLS_"1_,(Q) = NEAREST EVEN NO. .GE. (Q)ENTRY._^1_%STQ*_!G_,(G) = TOTAL NO. OF RSA BINS, PSEUDO OR REAL._^1_%INQ_"-1_+(Q) = NO. OF TSA TAGS._^1_%STQ*_!TAGCNT_^1* COMPUTE RSA SIZE BY INITIALLY ASSUMING ALL RSA BINS ARE REAL BINS,_^1* THEN, IF THER€€E WAS A PSEUDO BIN, WE SUBTRACT (BINSIZ)._^1_%LDA*_!G_^1_%MUI*_!BINSIZ_'(A) = (G)*(BINSIZ)._^1_%LDQ*_!TNITEG_'(Q)15=1 IF ALL BINS ARE REAL BINS._^1_%SQM_"TNITRX_'SKIP IF ALL BINS ARE REAL BINS._^1_%SUB*_!BINSIZ_'REPLACE A REAL BIN WITH A PSEUDO BIN._^1* WE ENTER THE NEXT LOGIC WITH (A) = NO. OF WORDS IN RSA._^1TNITRX ADD*_!FWARSA_'ADD NO. OF WORDS IN RSA TO FWA OF RSA._^1_%STA*_!FW€€ASEQ_'() = FWA OF SEQUENCE NUMBER ARRAY._^1_%ADD*_!TAGCNT_'ADD -1 + SIZE OF SEQ. NO. ARRAY._^1_%STA*_!PRETSA_'() = -1 + FWA OF TAG STORAGE AREA._^1_%ADD*_!G_,ADD 1 + SIZE OF TAG STORAGE AREA._^1_%STA*_!OVRTSA_'() = 1 + LWA OF TAG STORAGE AREA._^1* TENTATIVELY SET SEQ. NO. ARRAY AS IF NO. OF REAL BINS WERE EVEN._^1* LATER, WE WILL CHANGE THE SEQUENCE NO. OF THE LAST RSA BIN_^1* TO $€€7FFF IF THE LAST RSA BIN IS A PSEUDO BIN, I.E. IF THE NO. OF_^1* REAL BINS IS ODD._^1_%LDQ*_!TAGCNT_'(Q) = G-1._^1TNITSQ STQ*_!(FWASEQ),Q_"SET SEQ(I)=I FOR I=G-1 TO I=0 STEP -1._^1_%INQ_"-1_+DECREMENT INDEX. POINT TO NEXT SEQ. NO._^1_%SQM_"TNITAG_'SKIP IF ALL SEQ. NUMBERS ARE SET._^1_%JMP*_!TNITSQ_'SET NEXT SEQ. NO._^1TNITEG NUM_"0_,()15=1 IF NO. OF REAL BINS IS EVEN._^1TNITAG LDA_€€"G_,(A)=G SO THAT (A) MAY START = G-2 AT TNITA1._^1_%CLR_"Q_,POINT TO WORD PRECEDING 1ST TAG TO SET._^1TNITA1 INA_"-2_+(A) = (NEXT TAG)._^1_%SAM_"TNIDMY_'SKIP IF DONE WITH ALL TAGS._^1_%SAZ_"TNITA2_'SKIP IF DONE WITH NON-BASE TAGS._^1_%INQ_"1_,POINT TO NEXT TAG TO SET._^1_%STA*_!(PRETSA),Q_"SET TAGS = G-2,G-4,...,2,G-1,G-3,...,1._^1_%JMP*_!TNITA1_'SET NEXT TAG._^1TNITA2 LDA_"G_^1_%€€INA_"1_((A)=G+1 SO THAT (A) MAY START = G-1 AT TNITA1._^1_%JMP*_!TNITA1_'JMP TO DO BASE (I.E. LOWEST LEVEL) TAGS._^1* BECAUSE OF THE ABOVE LOGIC, (Q) = (TAGCNT) = (G) - 1._^1* BELOW, SET LAST SEQ. NO. TO $7FFF IF NO. OF REAL BINS IS ODD._^1TNIDMY LDA*_!TNITEG_'(A)15=1 IF NO. OF REAL BINS IS EVEN._^1_%SAM_"TNITXT_'SKIP IF NO. OF REAL BINS IS EVEN._^1_%LDA-_!HX7FFF_'A SEQ. NO. OF $7F€€FF CAUSES ETERNAL LOSER._^1_%STA_"(FWASEQ),Q_"THE CORRESPONDING PSEUDO BIN CAN]T WIN NOW._^1* MAKE IT APPEAR THAT 1ST RSA BIN WAS THE LAST WINNER._^1TNITXT CLR_"A_^1_%STA_"TRIAL_(() = INDEX OF 1ST RSA BIN._^1_%LDA_"FWARSA_'(A) = FWA OF RECORD STORAGE AREA._^1_%STA_"TFWA_)() = FWA OF 1ST RSA BIN._^1_%JMP*_!(TURNIT)_$EXIT._^1_%EJT_]_^1INIT_!NUM_"0_,() = FWA OF HERE._^1_%ENA_"3_,(A) =€€ PHASE NO. OF SMCFMG._^1_%STA-_!YPHASE,I_$TELL FIXED TABLES THAT SMCFMG IS RUNNING._^1_%STQ_"FWAFXY_'() = FWA OF FIXED TABLES._^1_%RTJ_"RELOC_(RELOCATE ALL RELOCATABLES._^1_%RTJ LINK_)RESOLVE SMCFMG REFERENCES TO SMCMON._^1* TELL USER WHAT IS STARTING._^1_%LDA-_!YDM,I_((A)15=1 IF FINAL MERGE._^1INIT83 LDQ_"=XMSGMRG-HERE (Q) = FWA OF MERGE-ONLY MESSAGE._^1_%SAP_"INIT84_'SKIP IF MER€€GE-ONLY._^1INIT81 LDQ_"=XMSGFMG-HERE (Q) = FWA OF FINAL-MERGE MESSAGE._^1_%RAO_"SMCFMG_'P+2 EXIT TELLS SMCMON IT IS FINAL MERGE._^1* LINK REPLACES PLUG BELOW WITH FWA OF TYPOUT._^1INIT84 RTJ+_!PLUG_)ANNOUNCE PURPOSE OF PHASE._^1* VERIFY THAT SMCFMG WON]T BE OVERLOADED WITH TOO MANY STRINGS._^1_%LDA-_!YFWAY,I_%(A) = MAXIMUM MERGE ORDER._^1_%SUB-_!YSQ2MG,I_$SUBTRACT NO. OF SEQUENCES €€TO MERGE._^1_%SAP_"INIT00_'SKIP IF NOT TOO MANY SEQUENCES._^1_%RTJ (WIERD)_%ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM -11_*ANNOUNCE ERROR NO.11 AND STOP THE RUN._^1* DISABLE SEQUENCE CHECKING IF USER DOESN]T WANT IT._^1INIT00 LDA-_!YKCT,I_'(A)15=1 IF SEQUENCE CHECKING._^1_%SAM_"INIT79_'SKIP IF SEQUENCE CHECKING._^1_%LDA_"=N$0B00_%(A) = NOP._^1_%STA_"PUTASQ_'DISABLE SEQUENCE CH€€ECKING._^1* ALLOCATE CORE AND INITIALIZE MTOURN._^1INIT79 LDA-_!YOFT+RECLTH,I (A) = NO. OF WORDS PER LOGICAL RECORD._^1_%STA*_!INIT07_'SAVE LOGICAL RECORD SIZE._^1INIT99 LDA_"=XFOUTBF-HERE (A) = 1 + LWA OF RESIDENT SMCFMG._^1_%STA*_!FWABUF_'() = FWA OF NEXT BUFFER TO ALLOCATE._^1_%LDA_"=XYOFT,I_$(A) = FWA OF OUTPUT FILE TABLE._^1_%STA-_!I_,TELL BUFALO WHICH FILE TABLE TO USE._^1_%R€€TJ*_!BUFALO_'ALLOCATE THE OUTPUT BUFFER._^1* LINK REPLACES PLUG BELOW WITH FWA OF CLRFT._^1INIT08 RTJ+_!PLUG_)PREPARE YOFT FOR OUTPUT._^1_%LDA_"FWAFXY_'(A) = FWA OF FIXED TABLES._^1_%STA-_!I_,RESTORE (I)ENTRY._^1_%LDA-_!YDM,I_((A)15=1 IF FINAL MERGE._^1_%SAM_"INIT98_'SKIP IF FINAL MERGE._^1_%LDA-_!YSUMIB,I_$(A) = DATA WORDS FOR MERGE-ONLY INPUT BUFS._^1_%ADD-_!YSQ2MG,I_$ALLOW FOR N€€ONDATA WORDS._^1_%JMP*_!INIT97_'FINISH COMPUTING (FWAIFT)._^1INIT98 LDA-_!YWKBSZ,I_$(A) = NO. OF DATA WORDS PER WORK BUFFER._^1_%STA*_!INIT06_'KEEP WORK-BUFFER-DATA-SIZE HANDY._^1_%INA_"1_,(A) = NO. OF WORDS PER WORK BUFFER._^1_%MUI-_!YSQ2MG,I_$NO. OF WORDS FOR INPUT WORK BUFFERS._^1INIT97 ADD*_!FWABUF_'ADD FWA OF INPUT WORK BUFFERS._^1_%STA_"FWAIFT_'() = FWA OF THE MERGE INPUT FIL€€E TABLES._^1_%STA*_!INIT90_'() = FWA OF 1ST FILE TABLE EXPANSION._^1_%STA*_!INIT05_'() = 1 + LWA OF WORK INPUT BUFFERS._^1_%ENA_"FTSIZE_'(A) = NO. OF WORDS PER FILE TABLE._^1_%MUI-_!YSQ2MG,I_$(A) = NO. OF WORDS FOR INPUT FILE TABLES._^1_%ADD_"FWAIFT_'(A) = 1 + LWA OF INPUT FILE TABLES._^1_%STA_"FWARSA_'() = FWA OF RSA FOR MTOURN._^1_%INA_"1_,(A) = FWA OF 1ST RECIPIENT OF INPUT FT F€€WA._^1_%STA*_!INIT02_'SAVE FOR ADDRESSING 2ND WORD OF EACH RSA BIN_^1_%STA*_!INIT89_'SAVE FOR ADDRESSING 2ND WORD OF EACH RSA BIN_^1_%LDA-_!YDM,I_((A)15=1 IF FINAL-MERGE, NOT MERGE-ONLY._^1_%SAM_"INIT01_'SKIP IF FINAL MERGE._^1_%JMP*_!INIT82_'JMP IF MERGE-ONLY._^1* SET THE 2ND WORD OF EACH RSA BIN TO FWA OF THE CORRESPONDING_^1* INPUT FILE TABLE._^1* ALSO SET (RECLTH),(BUFLTH),(BUF€€WA) FOR EACH INPUT WORK FILE TABLE._^1INIT01 LDA_"FWARSA_'(A) = FWA OF RSA FOR MTOURN._^1_%LDQ-_!YSQ2MG,I_$(Q) = ACTUAL MERGE ORDER._^1_%STQ_"M_,SAVE ACTUAL MERGE-ORDER._^1_%QLS_"1_,ALLOW 2 WORDS PER RSA BIN._^1INIT03 INQ_"-2_+POINT TO NEXT INPUT FT FWA RECIPIENT._^1_%SQP_"INIT04_'SKIP IF NOT YET DONE._^1INITXT LDA_"FWAFXY_'(A) = FWA OF FIXED TABLES._^1_%STA-_!I_,TELL TURNIT THE FW€€A OF FIXED TABLES._^1_%ENA_"2_,TELL TURNIT THE NO. OF WORDS PER RSA BIN._^1_%LDQ_"M_,TELL TURNIT THE NO. OF RSA BINS._^1_%RTJ_"TURNIT_'INITIALIZE MTOURN ARRAYS._^1_%JMP*_!(INIT)_'EXIT._^1INIT05 NUM_"0_,() = 1 + LWA OF NEXT LOWER INPUT BUFFER._^1INIT06 NUM_"0_,() = SIZE OF DATA PART OF WORK BUFFER._^1INIT07 NUM_"0_,() = LOGICAL RECORD SIZE._^1INIT04 INA_"-FTSIZE_%(A) = NEXT INPUT FT€€ FWA TO STORE._^1_%STA*_!(INIT02),Q_"STORE FWA OF AN INPUT FILE TABLE._^1_%STA-_!I_,(I) = FWA OF CURRENT INPUT FILE TABLE._^1_%LDA*_!INIT05_'(A) = 1 + LWA OF CORRESPONDING DATA WORDS._^1_%SUB*_!INIT06_'(A) = FWA OF CORRESPONDING DATA WORDS._^1_%STA-_!BUFWA,I_%TELL FILE TABLE WHERE ITS DATA WORDS ARE._^1_%INA_"-1_+(A) = FWA OF HEADER WORD OF CURRENT BUFFER._^1_%STA*_!INIT05_'() = 1 €€+ LWA OF NEXT LOWER INPUT BUFFER._^1_%LDA*_!INIT07_'(A) = NO. OF WORDS PER LOGICAL RECORD._^1_%STA-_!RECLTH,I_$SET RECORD LENGTH OF EACH INPUT FILE TABLE._^1_%LDA*_!INIT06_'(A) = NO. OF DATA WORDS PER WORK BUFFER._^1_%STA-_!BUFLTH,I_$TELL EACH INPUT WORK FILE TABLE._^1* LINK REPLACES PLUG BELOW WITH FWA OF GETSEQ._^1INIT75 RTJ+_!PLUG_)GET A WORK STRING._^1* LINK REPLACES PLUG BELOW€€ WITH FWA OF CLRFT._^1INIT74 RTJ+_!PLUG_)COMPLETE INITIALIZATION OF THE FILE TABLE._^1_%LDA-_!I_,(A) = FWA OF CURRENT INPUT WORK FILE TABLE._^1_%JMP*_!INIT03_'SEE IF WE ARE ALL DONE._^1INIT02 NUM_"0_,() = 1 + (FWARSA)._^1_%EJT_]_^1* THE CALLING SEQUENCE IS_!(I)ENTRY = FWA OF FILE TABLE._^1*_4(FWABUF)ENTRY = 1 + LWA OF LAST BUFFER ALLOCATED._^1*_:RTJ BUFALO_^1*_:(A)EXIT = 1 + LWA OF€€ NEW BUFFER._^1*_:(FWABUF)EXIT = (A)EXIT._^1*_:(I)EXIT = (I)ENTRY._^1*_:(BUFWA,I) = FWA OF DATA OF NEW BUFFER._^1*_:(Q)EXIT = ((LUN),I)._^1BUFALO NUM_"0_^1_%LDA*_!FWABUF_'(A) = 1 + LWA OF LAST BUFFER ALLOCATED._^1_%LDQ-_!(LUN),I_%(Q)15=0 IF DISK FILE._^1_%SQM_"BUFAL1_'SKIP IF NOT DISK FILE._^1_%INA_"1_,ALLOW FOR HEADER WORD OF NEW BUFFER._^1BUFAL1 STA-_!BUFWA,I_%() = FWA OF DATA OF€€ NEW BUFFER._^1_%ADD-_!BUFLTH,I_$ADD SIZE OF DATA PART OF NEW BUFFER._^1_%SQP_"BUFAL2_'SKIP IF DISK FILE._^1_%INA_"1_,ALLOW FOR TRAILER WORD OF NEW BUFFER._^1BUFAL2 STA*_!FWABUF_'() = 1 + LWA OF NEW BUFFER._^1_%JMP*_!(BUFALO)_$EXIT._^1FWABUF NUM_"0_,()ENTRY = 1 + LWA OF LAST BUFFER ALLOCATED._^1_%EJT_]_^1* FOR EACH MERGE-ONLY INPUT FILE, ASK THE OPERATOR WHETHER TO INCLUDE_^1* THE €€FILE IN THE RUN._^1* SET (M) = NO. OF INPUT FILES INCLUDED IN THE RUN._^1* EXPAND AND INITIALIZE THE FILE TABLE FOR EACH FILE THE OPERATOR_^1* DECIDES TO INCLUDE IN THE RUN._^1* FOR EACH FILE INCLUDED, SET THE FWA OF THE CORRESPONDING EXPANDED FILE_^1* TABLE INTO THE 2ND WORD OF THE CORRESPONDING RSA BIN FOR MTOURN._^1* FINALLY, JMP TO INITXT TO COMPLETE INITIALIZATION OF MTOURN._^€€1_%ADC_"MNDFNO-MSGFNO_^1MSGFNO ALF_"/,READY FILE/_^1MNDFNO EQU_"MNDFNO(*)_^1INIT93 NUM_"0_,() = NO. OF CURRENT FILE._^1INIT82 LDA-_!YIFTAD,I_$(A) = FWA OF UNEXPANDED INPUT FILE TABLES._^1_%STA*_!INIT91_'() = FWA OF NEXT FILE TABLE TO EXPAND._^1INIT94 RAO*_!INIT93_'SET () = NO. OF CURRENT FILE._^1_%LDA-_!YSQ2MG,I_$(A) = NO. OF PRESORTED FILES TO MERGE._^1_%SUB*_!INIT93_'(A)15=1 IF W€€E HAVE ASKED FOR EACH FILE._^1_%SAP_"INIT92_'SKIP IF MORE FILES TO ASK ABOUT._^1_%LDA_"M_,(A) = NO. OF USER FILES INCLUDED BY OPERATOR_^1_%SAZ_"INIT80_'SKIP IF ZERO FILES TO MERGE._^1_%JMP*_!INITXT_'INITIALIZE MTOURN._^1INIT80 JMP_"ENDFMG_'END THE RUN SINCE ZERO FILES TO MERGE._^1INIT89 NUM_"0_,() = FWA OF 2ND WORD OF NEXT RSA BIN._^1INIT90 NUM_"0_,() = FWA OF NEXT FILE TABLE EXPAN€€SION._^1INIT91 NUM_"0_,() = FWA OF NEXT FILE TABLE TO EXPAND._^1INIT92 LDA*_!INIT93_'(A) = NO. OF CURRENT FILE._^1INIT85 LDQ_"=XMSGFNO-HERE (Q) = FWA OF MESSAGE._^1* LINK REPLACES PLUG BELOW WITH FWA OF TPDEC._^1INIT76 RTJ+_!PLUG_)ASK OPERATOR TO READY THE FILE._^1_%SET_"A,Q_*DISABLE OPTIONAL MESSAGE FROM GORQT._^1* LINK REPLACES PLUG BELOW WITH FWA OF GORQT._^1INIT77 RTJ+_!PLUG_)S€€EE WHAT OPERATOR WANTS TO DO._^1_%JMP*_!INIT88_'GO ON TO NEXT FILE IF ]QT]._^1_%RAO_"M_,COUNT EACH FILE THAT OPERATOR SUPPLIES._^1_%LDA*_!INIT91_'(A) = FWA OF NEXT FILE TABLE TO EXPAND._^1_%STA_"MVSRCE_'TELL MOVE WHERE TO GET UNEXPANDED FILE TABLE_^1_%LDA*_!INIT90_'() = FWA OF NEXT FILE TABLE EXPANSION._^1_%STA_"MVDEST_'TELL MOVE WHERE TO EXPAND THE FILE TABLE._^1_%STA*_!(INIT89)_$€€SET (2ND WORD OF RSA BIN) = FWA OF EXPANSION_^1_%STA-_!I_,FOR BUFALO AND CLRFT CALLS BELOW._^1_%RAO*_!INIT89_'() = FWA OF 1ST WORD OF NEXT RSA BIN._^1_%RAO*_!INIT89_'() = FWA OF 2ND WORD OF NEXT RSA BIN._^1_%ENQ_"BUFWA_((Q) = LENGTH OF UNEXPANDED FILE TABLE._^1_%RTJ_"MOVE_)MOVE UNEXPANDED FILE TABLE TO EXPANSION AREA_^1_%RTJ*_!BUFALO_'ALLOCATE THE CORRESPONDING BUFFER._^1* LINK REP€€LACES PLUG BELOW WITH FWA OF CLRFT._^1INIT78 RTJ+_!PLUG_)COMPLETE INITIALIZATION OF THE FILE TABLE._^1_%LDA_"FWAFXY_'(A) = FWA OF FIXED TABLES._^1_%STA-_!I_,RESTORE (I)ENTRY._^1INIT88 LDA*_!INIT91_'(A) = FWA OF ORIGINAL OF LATEST FILE TABLE._^1_%INA_"BUFWA_(ADD SIZE OF LATEST ORIGINAL._^1_%STA*_!INIT91_'() = FWA OF NEXT ORIGINAL FILE TABLE._^1_%LDA*_!INIT90_'(A) = FWA OF EXPANSION €€OF LATEST FILE TABLE._^1_%INA_"FTSIZE_'ADD SIZE OF LATEST EXPANSION._^1_%STA*_!INIT90_'() = FWA OF NEXT FILE TABLE EXPANSION._^1_%JMP*_!INIT94_'SEE IF WE ARE DONE EXPANDING FILE TABLES._^1_%EJT_]_^1FOUTBF EQU_"FOUTBF(*)_#THE BUFFER FOR THE F-MERGE OUTPUT FILE._^1_%ADC_"MNDFMG-MSGFMG_^1MSGFMG ALF_"/,FINAL-MERGE BEGINS/_^1MNDFMG EQU_"MNDFMG(*)_^1_%ADC_"MNDMRG-MSGMRG_^1MSGMRG ALF_"/,M€€ERGE-ONLY BEGINS/_^1MNDMRG EQU_"MNDMRG(*)_^1_%EJT_]_^1* RELOC RELOCATES THE WORDS MENTIONED IN THE LIST, RELOC4._^1RELOC NUM_"0_^1_%ENQ_"RELOC3_"(Q) = NO. OF ENTRIES IN RELOC4._^1RELOC7 INQ_"-1_'(Q) = INDEX TO NEXT RELOCATEE._^1_%SQP_"RELOC6_"SKIP IF NOT DONE._^1_%JMP*_!(RELOC)_!EXIT IF DONE._^1RELOC6 LDA*_!RELOC4,Q (A) = FWA OF RELOCATEE - FWA OF HERE._^1_%ADD_"INIT_)(A) = FWA O€€F RELOCATEE._^1_%STA*_!RELOC5_"SAVE FWA OF RELOCATEE._^1_%LDA*_!(RELOC5) (A) = RELOCATEE._^1_%ADD_"INIT_)(A) = RELOCATED (RELOCATEE)._^1_%STA*_!(RELOC5) SET RELOCATEE._^1_%JMP*_!RELOC7_"JMP TO SEE IF DONE._^1RELOC5 NUM_"0_(() = FWA OF RELOCATEE._^1RELOC4 EQU_"RELOC4(*)_^1_%ADC_"ENDINE+1-HERE_^1_%ADC_"ENDMRG+1-HERE_^1_%ADC_"END002+1-HERE_^1_%ADC_"END004+1-HERE_^1_%ADC_"PUTSER+1-HE€€RE_^1_%ADC_"PUTPRE+1-HERE_^1_%ADC_"INIT83+1-HERE_^1_%ADC_"INIT81+1-HERE_^1_%ADC_"INIT99+1-HERE_^1_%ADC_"INIT85+1-HERE_^1RELOC3 EQU_"RELOC3(*-RELOC4)_^1_%EJT_]_^1LINK_!NUM_"0_^1_%LDA-_!YTYPOT,I_^1_%STA_"END001+1_^1_%STA_"PUTTY1+1_^1_%STA_"PUTTY2+1_^1_%STA_"INIT84+1_^1_%LDA-_!YBTDEC,I_^1_%STA_"END003+1_^1_%STA_"END005+1_^1_%LDA-_!YGETU,I_^1_%STA_"GETGET+1_^1_%LDA-_!YCMPKY,I_^1_%STA_"€€TRNCMP+1_^1_%STA_"PUTSCK+1_^1_%LDA-_!YCLSU,I_^1_%STA_"PUTCLS+1_^1_%LDA-_!YPUTU,I_^1_%STA_"PUTPUT+1_^1_%LDA-_!YHXDMP,I_^1_%STA_"PUTHD1+1_^1_%STA_"PUTHD2+1_^1_%LDA-_!YGORQT,I_^1_%STA_"PUTGOQ+1_^1_%STA_"INIT77+1_^1_%LDA_"=XYLAPUT,I_"(A) = FWA OF YLAPUT._^1_%STA_"PUTYLA_^1_%LDA-_!YGTSEQ,I_^1_%STA_"INIT75+1_^1_%LDA-_!YCLRFT,I_^1_%STA_"INIT08+1_^1_%STA_"INIT74+1_^1_%STA_"INIT78+1_^1_%LDA€€-_!YTPDEC,I_^1_%STA_"END006+1_^1_%STA_"INIT76+1_^1* SET YSRCNT IN CASE SMCIMG DIDN]T._^1_%LDA-_!YSRCNT+1,I_^1_%SAN_"LINK01_'SKIP IF YSRCNT ALREADY SET._^1_%LDA-_!YSRCNT,I_^1_%SAN_"LINK01_'SKIP IF YSRCNT ALREADY SET._^1_%LDA-_!YIRCNT+1,I_^1_%STA-_!YSRCNT+1,I_^1_%LDA-_!YIRCNT,I_^1_%STA-_!YSRCNT,I_^1LINK01 CLR_"A_^1_%STA-_!YIRCNT,I_$ZERO PHASE INPUT RECORD COUNT._^1_%STA-_!YIRCNT+1,I_€€^1_%STA-_!YORCNT,I_$ZERO PHASE OUTPUT RECORD COUNT._^1_%STA-_!YORCNT+1,I_^1_%LDA- YWIERD,I_$(A) = FWA OF WIERD IN SMCMON._^1_%STA* WIERD_(SAVE FWA OF WIERD._^1_%LDA-_!YFMGSZ,I_$(A) = TABULATED SIZE OF SMCFMG RESIDENT._^1_%EOR_"=XFMGSIZ_$COMPARE TABULATED TO ACTUAL._^1_%SAZ LINK02_'SKIP IF TABULATED = ACTUAL._^1_%RTJ* (WIERD)_%ANNOUNCE AND HANDLE WIERD CONDITION._^1_%NUM -12_*ANNO€ΤUNCE ERROR NO.12 AND STOP THE RUN._^1LINK02 EQU LINK02(*)_^1_%JMP*_!(LINK)_^1WIERD NUM 0_,() = FWA OF WIERD IN SMCMON._^1* SIZE OF SMCFMG RESIDENT LOGIC._^1FMGSIZ EQU_"FMGSIZ(FOUTBF-SMCFMG)_^1_%END_"SMCFMG_^__ΤPPARABN CSY/ SM7 P€1_%NAM PARABN_'DECK-ID S07 SMC 1.0_.SUMMARY-108_^1*_$NON-REENTRANT PARAMETER ABSOLUTIZATION ROUTINE_^1*_$SORT/MERGE VERSION 1.0_^1*_$SMALL SYSTEMS DIVISION. LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976._^1*_]_^1*_$BASED ON FTN 3.3 RUNTIME DECK ID G12 - PSR LEVEL 102_^1_%SPC 2_^1*_$ABSOLUTIZE A PARAMETER ADDRESS_^1*_]_^1*_$INPUT_#- A-REG CONTAINS ADDRESS OF P€€ARAMETER LIST_^1*_]_^1*_$OUTPUT_"- A-REG CONTAINS ABSOLUTE PARAMETER ADDRESS_^1*_/- UPON EXIT INTERRUPTS ARE INHIBITED_^1*_]_^1_%ENT PARABS_^1_%SPC 2_^1_%EQU EXTCOM($E9)_^1_%EQU END0V4(15)_^1_%EQU LPMSK(2)_^1_%SPC 2_^1_%BSS QSAVE_(SAVE Q-REG_^1_%BSS BACK_)SAVE USER'S PARAMETER LIST ADDRESS_^1*_]_^1PARABS NUM 0_,ENTRY POINT_^1_%STQ* QSAVE_(SAVE Q-REG_^1_%STA* BACK_)SAVE USE€€R'S PARAMETER LIST ADDRESS_^1_%LDQ- EXTCOM_'ADDRESS OF EXTENDED COMMUNICATIONS REGION_^1_%SUB- END0V4,Q_$LAST ADDRESS IN PART 0_^1_%INA -1_^1_%TRA Q_,SAVE RESULTS IN Q-REG_^1NOPART LDA* (BACK)_'LOAD PARAMETER ADDRESS IN A-REG_^1_%SQP ABS_*RETURN - USER IN PART 1_^1_%SAP ABS_*RETURN - PARAM ADDRESS IS ABSOLUTE_^1_%ADD* BACK_)ABSOLUTIZE PARAMETER ADDRESS_^1_%AND- LPMSK+15_$$7FFF_€@^1ABS_"LDQ* QSAVE_(RESTORE Q-REG_^1_%JMP* (PARABS)_^1_%END_]_^__@PFLOTN CSY/ SM8 P€1_%NAM FLOTN_(DECK-ID S08 SMC 1.0_.SUMMARY-108_^1*_$NON-REENTRANT SINGLE PRECISION FLOATING POINT PACKAGE_^1*_$SORT/MERGE VERSION 1.0_^1*_$SMALL SYSTEMS DIVISION. LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976._^1*_]_^1*_$BASED ON FTN 3.3 RUNTIME DECK ID G14 - PSR LEVEL 102_^1_%SPC 5_^1_%ENT FLOT_)ENTRY FOR OLD STYLE FLOATING POINT_^1_%ENT HFLOT_(ENTRY FOR N€€EW STYLE FLOATING POINT_^1_%SPC 2_^1_%EXT* OPERND_^1_%EXT* PROCHK_^1_%EXT* NXTOP_(ROUTINE TO GET NEXT OPCODE BYTE_^1_%EXT* SPECOP_'ROUTINE TO PROCESS 'SPEC' OP CODE_^1_%EXT* FLOFOP_'ROUTINE TO PROCESS 'FLOF' OP CODE_^1_%EXT* FIXFOP_'ROUTINE TO PROCESS 'FIXF' OP CODE_^1_%EXT* FPEROR_^1_%SPC 2_^1_%EQU ZERO($22)_KFTN 3.3_^1_%EQU ONEBIT($23)_IFTN 3.3_^1_%EQU ZROBIT($33)_IFTN 3.3_^1€€_%EQU H0003($04)_JFTN 3.3_^1_%EQU H007F($09)_^1_%EQU H00FF($0A)_^1_%EQU H7FFF($11)_JFTN 3.3_^1_%EQU HFFF8($15)_JFTN 3.3_^1_%EQU HE000($1F)_^1_%EQU H0080($2A)_JFTN 3.3_^1_%EQU H0100($2B)_JFTN 3.3_^1_%EQU H4000($31)_JFTN 3.3_^1_%EQU H8000($32)_JFTN 3.3_^1_%EJT_]_^1*_]_^1*_$FORTRAN SCRATCH EQUIVALENCE STATEMENTS_^1*_]_^1_%SPC 2_^1_%EQU G($C5)_'PSEUDO ACCUMULATOR_^1_%EQU S€€TATUS($C8)_!STATUS FLAG WORD_^1_%EQU P($C9)_'PSEUDO PROGRAM COUNTER_^1_%EQU INDEX($CA)_"INDEX REGISTER_^1_%EQU OPCODE($CB)_!CURRENT OPCODE WORD_^1_%EQU OPCNT($CC)_"OPERAND BYTE COUNTER_^1_%EQU C($CD)_^1_%EQU D($CE)_^1_%EQU DELTA($CF)_^1_%EQU A($D0)_^1_%EQU B($D1)_^1_%EQU BETA($D2)_^1_%EQU F($D3)_^1*_]_^1*_$EQUIVALENCES FOR DOUBLY USED WORDS_^1*_]_^1_%EQU SHIFCT($D3)_!NO€€RMALIZATION SHIFT COUNTER_^1*_] FTN 3.3_^1*_$EQUATES FOR AND USAGE OF STATUS WORD BITS_0FTN 3.3_^1*_] FTN 3.3_^1_%EQU MODE(15)_$15 - 1 = FTN 3.3 TYPE CALLING SEQUENCE FTN 3.3_^1*_814 - 1 = OVERFLOW FAULT_/FTN 3.3_^1*_813 - 1 = DIVIDE FAULT_1FTN 3.3_^1*_812 - 1 = UNDERFLOW FAULT_.FTN 3.3_^1_%EQU SIGN(11)_$11 - 1 = UNPACKED ACCUMULATOR IS NEGATIVE_^1_%EQU MULDIV(10)_"10 - 1 = IN€€STRUCTION IS DIVIDE (DBL PREC)_^1_%EQU RELADR(9)_#09 - 1 = RELATIVE ADDRESSING MODE_$FTN 3.3_^1*_808 -_BFTN 3.3_^1_%EQU DOUBLE(7)_#07 - 1 = DOUBLE PRECISION MODE_(FTN 3.3_^1*_806 -_BFTN 3.3_^1*_805 -_BFTN 3.3_^1*_804 -_BFTN 3.3_^1*_803 -_BFTN 3.3_^1*_802 -_BFTN 3.3_^1_%EQU UNPCKD(1)_#01 - 1 = ACCUMULATOR IS UNPACKED_%FTN 3.3_^1_%EQU IDXINH(0)_#00 - 1 = INDEXING IS INHIBITED_(FT€€N 3.3_^1_%EJT_]_^1*_$LIST OF FLOATING POINT OPERATION CODES._^1*_$0_"SPEC_)FIRST BYTE OF TWO BYTE OP CODE_^1*_$1_"FLOF_)FLOAT TO FIXED CONVERSION OF ACCUMULATOR_^1*_$2_"FIXF_)FIXED TO FLOAT CONVERSION OF INTEGER OPERAND_^1*_$3_"STRI_)STORE INDEX_^1*_$4_"FEND_)END OF CALLING SEQUENCE_^1*_$5_"CHMD_)CHANGE MODE REL/ABS_^1*_$6_"NIDX_)NO INDEX_^1*_$7_"FCOM_)COMPLEMENT_^1*_$8_"FSUB_)SUBT€€RACT_^1*_$9_"FMPY_)MULTIPLY_^1*_$A_"FDIV_)DIVIDE_^1*_$B_"FLDD_)LOAD_^1*_$C_"ADDI_)ADD TO INDEX_^1*_$D_"FLST_)STORE_^1*_$E_"FADD_)ADD_^1*_$F_"INDX_)INDEX_^1_%EJT_]_^1FLOT_!NUM 0_,ENTRY FOR OLD STYLE FLOATING POINT_^1_%LDA* FLOT_^1_%ENQ 0_^1_%JMP* FLOT00_^1HFLOT NUM 0_,ENTRY FOR NEW STYLE FLOATING POINT_^1_%LDA* HFLOT_^1_%ENQ 1_^1FLOT00 STA- P_,SAVE ADDRESS OF CALLING SEQUENCE_^€€1_%LDA- STATUS_^1_%ALS 1_^1_%AND- HE000_(SAVE ONLY FAULT BITS_^1_%LRS 1_^1_%STA- STATUS_^1_%ENA 0_^1_%STA- INDEX_^1_%ENA 3_^1_%STA- OPCNT_^1NXTOPC RTJ NXTOP_(GET NEXT OPCODE BYTE IN Q_^1EXECUT JMP* FLINS,Q_^1_%EJT_]_^1FLINS JMP* SPEC_)0=FIRST BYTE OF TWO BYTE OP CODE (JUMPS)_^1_%JMP* FLOF_)1=CONVERT ACCUMULATOR TO INTEGER FORMAT_^1_%JMP* FIXF_)2=CONVERT INTEGER TO FLOATING PO€€INT FORMAT_^1_%JMP* STRI_)3=STORE INDEX REGISTER_^1_%JMP* FEND_)4=END OF CALLING SEQUENCE_^1_%JMP* CHMD_)5=CHANGE ADDRESS MODE (RELATIVE/ABSOLUTE)_^1_%JMP* NIDX_)6=CLEAR INDEX REGISTER_^1_%JMP* FCOM_)7=COMPLEMENT FLOATING ACCUMULATOR_^1_%JMP* FSUBA_(8=FLOATING SUBTRACT_^1_%JMP* FMPYA_(9=FLOATING MULTIPLY_^1_%JMP* FDIVA_(A=FLOATING DIVIDE_^1_%JMP* FLDD_)B=LOAD FLOATING POINT ACCUMUL€€ATOR_^1_%JMP* ADDI_)C=ADD TO INDEX REGISTER_^1_%JMP* FLST_)D=STORE FLOATING ACCUMULATOR_^1_%JMP* FADDA_(E=FLOATING ADD_^1_%JMP* INDX_)F=LOAD INDEX REGISTER_^1FSUBA JMP FSUB_^1FMPYA JMP FMPY_^1FDIVA JMP FDIV_^1FADDA JMP FADD_^1_%SPC 2_^1SPEC_!RTJ SPECOP_''SPEC' PROCESSED BY COMNFP_^1_%SQP SPEC1_(SKIP IF NOT 'FEND' RETURN_^1_%JMP* FEND_^1SPEC1 JMP* NXTOPC_^1_%SPC 2_^1FLO€€F_!RTJ* REPACK_'REPACK ACCUMULATOR BEFORE CALLING FLOFOP_^1_%RTJ FLOFOP_'CONVERT ACCUMULATOR TO FIXED POINT_^1_%JMP* NXTOPC_^1_%SPC 2_^1FIXF_!RTJ FIXFOP_''FIXF' PROCESSED BY COMNFP_^1_%JMP* NXTOPC_^1_%EJT_]_^1*_]_^1*_$REVERSE RELATIVE/ABSOLUTE ADDRESSING SWITCH_^1*_]_^1CHMD_!LDA- STATUS_^1_%EOR- ONEBIT+RELADR_^1_%STA- STATUS_^1_%JMP* NXTOPC_^1*_] FTN 3.3_^1*_$CLEAR INDEX REGIST€€ER_EFTN 3.3_^1*_] FTN 3.3_^1NIDX_!ENA 0_SFTN 3.3_^1_%JMP* INDX1_OFTN 3.3_^1*_] FTN 3.3_^1*_$LOAD INDEX REGISTER_FFTN 3.3_^1*_] FTN 3.3_^1INDX_!LDA- STATUS_NFTN 3.3_^1_%EOR- ONEBIT+IDXINH INHIBIT INDEXING_6FTN 3.3_^1_%STA- STATUS_NFTN 3.3_^1_%RTJ OPERND_'GET OPERAND ADDRESS-1 IN Q_,FTN 3.3_^1_%LDA- 1,Q_*PICK UP NEW INDEX VALUE_/FTN 3.3_^1INDX1 STA- INDEX_(SAVE_^1_%JMP* NXTOPC_€€'GO GET NEXT OPCODE_4FTN 3.3_^1*_]_^1*_$ADD OPERAND TO INDEX REGISTER_^1*_]_^1ADDI_!LDA- STATUS_^1_%EOR- ONEBIT+IDXINH INHIBIT INDEXING_^1_%STA- STATUS_^1_%RTJ OPERND_(GET OPERAND ADDRESS - 1 IN Q_^1_%LDA- 1,Q_*PICK UP OPERAND_^1_%ADD- INDEX_(ADD IT TO INDEX REGISTER_^1_%STA- INDEX_(STORE NEW INDEX_^1_%JMP* NXTOPC_'GO TO NEXT OP CODE_^1*_]_^1*_$STORE THE INDEX REGISTER_^1*_]_^1STRI€€_!LDA- STATUS_^1_%EOR- ONEBIT+IDXINH INHIBIT INDEXING_^1_%STA- STATUS_^1_%RTJ OPERND_'GET OPERAND ADDRESS-1 IN Q_^1_%RTJ PROCHK_'TEST FOR PROTECT VIOLATION_^1_%LDA- INDEX_(PICK UP INDEX REGISTER_^1_%STA- 1,Q_*STORE INDEX REGISTER_^1_%JMP* NXTOPC_'GO GET NEXT INSTRUCTION_^1_%EJT_]_^1*_]_^1*_$END OF CALLING SEQUENCE_^1*_]_^1FEND_!RTJ* REPACK_'REPACK ACCUMULATOR IF UNPACKED_^1_%LDA-€€ G_,PICK UP MS WORD OF ACCUMULATOR_^1_%ARS 15_+FILL A REG WITH SIGN BIT_^1_%STA- G+2_*MAKE RESULT CORRECT FOR DOUBLE PRECISION_^1_%JMP- (P)_*RETURN TO USER_^1_%SPC 2_^1*_]_^1*_$COMPLEMENT FLOATING ACCUMULATOR_^1*_]_^1FCOM_!LDA- STATUS_^1_%AND- ONEBIT+UNPCKD GET ACCUMULATOR UNPACKED FLAG_^1_%SAN FCOM01_'SKIP IF ACCUMULATOR UNPACKED_^1_%LDA- G_^1_%TCA A_,COMPLEMENT_^1_%STA- G_^1_€€%LDA- G+1_-PACKED_^1_%TCA A_^1_%STA- G+1_0ACCUMULATOR_^1_%JMP* NXTOPC_'GO TO NEXT OPERATION_^1_%SPC 2_^1FCOM01 LDA- STATUS_^1_%EOR- ONEBIT+SIGN_!REVERSE SIGN OF UNPACKED ACCUMULATOR_^1_%STA- STATUS_^1_%JMP* NXTOPC_^1_%EJT_]_^1*_]_^1*_$STORE FLOATING POINT ACCUMULATOR_^1*_]_^1FLST_!RTJ* REPACK_'REPACK ACCUMULATOR IF UNPACKED_^1_%RTJ OPERND_'GET OPERAND ADDRESS -1 IN Q_^1_%RTJ PR€€OCHK_'CHECK FOR PROTECT VIOLATION_^1_%LDA- G_^1_%STA- 1,Q_^1_%LDA- G+1_^1_%STA- 2,Q_^1_%JMP* NXTOPC_'GO GET NEXT OP CODE_^1_%SPC 1_^1*_]_^1*_$REPACK THE ACCUMULATOR IF IT IS UNPACKED_^1*_]_^1REPACK NOP 0_^1_%LDA- STATUS_^1_%AND- ONEBIT+UNPCKD GET ACCUMULATOR UNPACKED FLAG_^1_%SAN PACK_)SKIP IF ACCUMULATOR IS UNPACKED_^1_%JMP* (REPACK)_$RETURN TO CALLER_^1_%SPC 1_^1PACK_!EOR- ST€€ATUS_'RESET ACCUMULATOR UNPACKED FLAG_^1_%STA- STATUS_^1_%LDQ- C_^1_%SQN PACK1_(SKIP IF ACCUMULATOR NOT ZERO_^1_%STQ- G_,SET PACKED ACCUMULATOR TO ZERO_^1_%STQ- G+1_^1_%JMP* (REPACK)_$RETURN TO CALLER_^1PACK1 LDA- D_^1_%ALS 1_^1_%LLS 1_^1_%STA- G+1_^1_%LDA- DELTA_^1_%AND- H00FF_^1_%EOR- H0080_^1_%ADD- G+1_^1_%LLS 7_^1_%STA- G_^1_%STQ- G+1_^1_%LDQ- STATUS_^1_%QLS 15-SIGN_%SHIF€€T SIGN TO BIT 15_^1_%SQP PACK2_^1_%TCA A_,IF SIGN NEGATIVE, COMPLEMENT ACCUMULATOR_^1_%STA- G_^1_%LDA- G+1_^1_%TCA A_^1_%STA- G+1_^1PACK2 JMP* (REPACK)_$RETURN TO CALLER_^1_%EJT_]_^1*_]_^1*_$LOAD FLOATING ACCUMULATOR_^1*_]_^1FLDD_!RTJ OPERND_(GET OPERAND ADDRESS - 1 IN Q_^1_%LDA- 2,Q_^1_%STA- G+1_^1_%LDA- 1,Q_^1_%INA 0_,ELIMINATE MINUS ZERO_^1_%STA- G_^1_%LDA- STATUS_^1_%AND- €€ZROBIT+UNPCKD CLEAR ACCUMULATOR UNPACKED FLAG_^1_%STA- STATUS_^1_%JMP NXTOPC_'GO TO NEXT OPERATION CODE_^1*_]_^1*_$UNPACK THE ACCUMULATOR IF IT IS PACKED_^1*_]_^1UNPACK NOP 0_^1_%LDA- STATUS_^1_%AND- ONEBIT+UNPCKD GET ACCUMULATOR UNPACKED FLAG_^1_%SAZ UPACK_(SKIP IF PACKED TO UNPACK_^1_%JMP* (UNPACK)_$RETURN, IT'S NOT PACKED_^1_%SPC 1_^1UPACK LDA- STATUS_^1_%EOR- ONEBIT+UNPCKD€€ SET ACCUMULATOR UNPACKED FLAG_^1_%AND- ZROBIT+SIGN_!CLEAR SIGN BIT_^1_%LDQ- G_,PICK UP ACCUMULATOR MSB_^1_%SQP UPACK0_'SKIP IF ACCUMULATOR POSITIVE_^1_%EOR- ONEBIT+SIGN_!SET SIGN MINUS_^1UPACK0 STA- STATUS_^1_%TRQ A_^1_%SAN UPACK1_'SKIP IF ACCUMULATOR NOT ZERO_^1_%RTJ* ARGZRO_'ACCUMULATOR IS ZERO_^1_%JMP* (UNPACK)_^1UPACK1 LDQ- G+1_^1_%SAP UPACK2_^1_%TCA A_^1_%TCQ Q_^1UPACK2€€ STA- C_^1_%ALS 1_,STRIP OFF SIGN BIT_^1_%EOR- H8000_(UNBIAS EXPONENT_^1_%ARS 8_,SIGN EXTEND_^1_%INA 0_,CHANGE -0 TO +0_^1_%STA- DELTA_(STORE EXPONENT_^1_%LDA- C_^1_%AND- H007F_(STRIP OFF EXPONENT_^1_%LLS 8_,FORM MS 15 BITS_^1_%STA- C_^1_%CLR A_^1_%LLS 15_+FORM LS 8 BITS_^1_%STA- D_^1_%JMP* (UNPACK)_^1_%EJT_]_^1ARGZRO NUM 0_^1_%CLR A_^1_%STA- C_^1_%STA- D_^1_%STA- DELTA_^1_€€%JMP* (ARGZRO)_$RETURN TO CALLER_^1_%SPC 3_^1ARG0_!RTJ* ARGZRO_^1_%JMP NXTOPC_^1_%EJT_]_^1*_*FLOATING POINT MULTIPLY OF F*G_^1*_]_^1FMPY_!RTJ* UNPACK_'UNPACK ACCUMULATOR IF IT'S PACKED_^1_%RTJ OPERND_'GET OPERAND ADDRESS-1 IN Q_^1_%RTJ* FLTSET_'STEPS 1,2,3 AND 4 OF MPY OR DIV_^1*_*IF F IS NEG., CHANGE SIGN._^1_%SAZ JMPOUT_^1_%SAP FLT1_^1_%LDA- STATUS_^1_%EOR- ONEBIT+SIGN_!REVE€€RSE SIGN BIT_^1_%STA- STATUS_^1*_]_^1*_*STEP 5.A._^1FLT1_!LDA- C_^1_%SAN NOZERO_^1JMPOUT JMP* ARG0_)ACCUMULATOR IS ZERO_^1NOZERO MUI- A_^1_%LLS 1_^1_%ARS 1_^1_%AND- H7FFF_^1_%STA- F+1_#C*A(LSB)_^1_%STQ- G_#C*A(MSB)_^1_%LDA- C_^1_%MUI- B_^1_%LLS 1_^1_%STQ- F_#C*B(MSB)_^1*_FSTEP 5C_^1_%LDA- A_^1_%MUI- D_^1_%LLS 1_^1_%TRQ A_^1_%LDQ- G_^1_%ADD- F_^1_%RTJ* TSTBOR_^1_%ADD- F+1_^1_%€€RTJ* TSTBOR_^1*_$ROUND AND TRUNCATE TO 23 BITS._^1ROUND ALS 1_^1_%LLS 16_^1_%STA- G_^1*_FSTEP 5E_^1NORMAL ENA 0_,NORMALIZE G AND G+1 ACCUM_^1_%STA- SHIFCT_5COMBINE EXPONENTS BETA AND DELTA_^1_%LDA- G_^1STEP6 LLS 1_^1_%SAM STEP6A_^1_%RAO- SHIFCT_^1_%JMP* STEP6_^1STEP6A LLS 15_^1_%STQ- C_:MOST SIGNIFICANT BITS_^1_%ARS 1_^1_%AND- H7FFF_^1_%STA- D_^1*_*LEAST SIGNIFICANT BITS I€€N D_^1_%LDA- DELTA_^1_%ADD- BETA_^1COMBIN SUB- SHIFCT_^1_%STA- DELTA_^1_%TRA Q_^1_%ARS 7_^1_%INA 0_^1_%SAZ COMB1_^1_%JMP* OVFUNF_^1COMB1 LDA- D_^1_%INA 64_^1_%SAM COMB2_^1_%AND* H7F80_^1_%STA- D_^1_%JMP* FMPXIT_^1COMB2 ENA 0_^1_%STA- D_^1_%LDA- C_^1_%INA 1_^1_%SAM COMB3_^1_%STA- C_^1_%JMP* FMPXIT_^1COMB3 LDA- H4000_^1_%STA- C_^1_%RAO- DELTA_^1_%LDA- DELTA_^1_%SUB- H0100€€_^1_%SAN FMPXIT_^1_%ENQ 0_^1_%JMP* OVFUNF_5OVERFLOW IF Q=+,A=0._^1*_FUNDERFLOW IF Q=-,A=0._^1FMPXIT JMP NXTOPC_^1TSTBOR 0_"0_^1_%SAP TSTB_)IF A IS NEG. CARRY INTO G_^1_%AND- H7FFF_^1_%INQ 1_^1_%SQP TSTB_)IF Q IS NEQ. END AROUND_^1_%ADQ- H7FFF_^1_%INA 1_^1TSTB_!JMP* (TSTBOR)_^1_%EJT_]_^1*_]_^1*_$UNPACK OPERAND INTO A,B, AND BETA_^1*_]_^1FLTSET 0_"0_^1_%LDA- 2,Q_^1_%STA- F+1_^€€1_%LDA- 1,Q_^1_%STA- F_^1_%LDQ- F+1_^1_%SAP STEP2A_^1_%TCA A_^1_%TCQ Q_^1STEP2A STA- A_^1*_*IF F IS ZERO, GO TO ARGFO (SET BETA,A,B=0)_^1_%SAZ ARGF0_^1_%ALS 1_^1_%EOR- H8000_OFTN 3.3_^1_%ARS 8_^1_%INA 0_^1ARGF0 STA- BETA_^1_%LDA- A_^1_%LLS 8_^1_%AND- H7FFF_OFTN 3.3_^1_%STA- A_^1_%LLS 15_^1_%AND* H7F80_^1_%STA- B_^1_%LDA- F_^1_%JMP* (FLTSET)_^1_%SPC 2_^1H7F80 NUM $7F80_€€^1_%EJT_]_^1FDIV_!RTJ UNPACK_'UNPACK ACCUMULATOR IF IT'S PACKED_^1_%RTJ OPERND_'GET OPERAND ADDRESS-1 IN Q_^1_%RTJ* FLTSET_5STEPS 1,2,3 AND 4 OF MPY OR DIV._^1*_FAND NORMALIZE_^1_%SAN A6_^1*_*IF F IS ZERO, GO TO DIVZER_^1_%JMP* DIVZER_^1A6_#SAP FLT2_^1_%LDA- STATUS_^1_%EOR- ONEBIT+SIGN_!REVERSE SIGN BIT_^1_%STA- STATUS_^1FLT2_!LDQ- C_/SHIFT C,D TO 14 BITS AND 9 BITS_^1_%LDA- D_€€/TO GUARANTEE DIVISION WITH NO_^1_%ALS 1_:OVERFLOW_^1_%LRS 1_^1_%ARS 1_^1_%STQ- C_^1_%AND- H7FFF_^1_%STA- D_^1_%LDA- BETA_^1_%TCA A_^1_%INA 1_/-BETA + 1=BETA_^1_%STA- BETA_^1_%LDA- C_/FORM -C*B_^1*_*IF C.E.0, GO TO ARGO._^1_%SAN FD2_^1_%JMP ARG0_)ACCUMULATOR IS ZERO_^1FD2_"TCA A_^1_%INA 0_^1_%MUI- B_/-C*B_^1_%DVI- A_/-C*B/A_^1_%INQ 0_^1_%LLS 16_^1_%TCA A_:(REMAINDER MUS€€T BE NEGATIVE)_^1_%ALS 1_:IF 2*R.GE.C,DECREMENT RESULT_^1_%SUB- A_/BY 1_^1_%SAM A7_^1_%INQ -1_^1A7_#TRQ A_5ROUNDED_^1_%ADD- D_/D-(C*B/A)_^1*_;FORM C+ ABOVE*2**-15_^1_%LDQ- C_^1_%SAP STEP5E_^1_%INQ -1_9IF LOWER ACC IS NEG, DECREMENT_^1_%ADD- H8000_(UPPER BY 1 AND INCREMENT_^1*_FLOWER BY_^1*_F1 TO PUT THE END AROUND_^1*_FBORROW INTO_^1*_FPROPER POSITION._^1STEP5E ALS 1_^1_%LRS€€ 1_^1_%DVI- A_^1_%INQ 0_^1_%STA- G_^1_%CLR A_^1_%LRS 1_^1_%DVI- A_^1_%INQ 0_^1_%LLS 16_^1*_8ROUND REMAINDER IN A IF A._^1*_8GE. 1/2, ROUND Q UP BY 1._^1_%ALS 1_^1_%SUB- A_^1_%SAM A8_^1_%INQ 1_^1A8_#TRQ A_^1_%LDQ- G_/ROUND,TRUNCATE AND_^1_%JMP ROUND_(NORMALIZE THE RESULTS_7+_^1_%EJT_]_^1*_]_^1*_$DETERMINE TYPE OF ERROR AND SET Q REGISTER_^1*_]_^1*_$DIVIDE CHECK WHEN DIVID€€E BY ZERO_^1DIVZER ENQ 1_^1_%JMP* SETERR_^1OVFUNF TRQ A_:OVERFLOW OR UNDERFLOW_^1*_*OVERFLOW_^1_%ENQ 0_^1_%SAP SETERR_^1*_*UNDERFLOW_^1_%ENQ 2_^1SETERR RTJ FPEROR_'SET ERROR FLAG IN STATUS_^1_%LDA* RSLTEX,Q_^1_%STA- DELTA_^1_%LDA* RSLTA,Q_^1_%STA- C_^1_%LDA* RSLTB,Q_^1_%STA- D_^1NXTOP3 JMP NXTOPC_^1_%SPC 2_^1RSLTEX NUM $007F,$007F,$FF80_^1RSLTA NUM $7FFF,$7FFF,$0000_^1RS€€LTB NUM $7F80,$7F80,$0000_^1_%EJT_]_^1*_*FLOATING POINT SUBTRACT G-F_^1FSUB_!RTJ UNPACK_'UNPACK ACCUMULATOR IF IT'S PACKED_^1_%RTJ OPERND_'GET OPERAND ADDRESS-1 IN Q_^1_%LDA- 1,Q_^1_%LDQ- 2,Q_^1_%TCA A_,CHANGE THE SIGN BDFORE_^1_%TCQ Q_,ENTERING YHE ADD ROUNTINE_^1_%JMP* FADD2_^1_%EJT_]_^1*_*FLOATING POINT ADD G+F, RESULT IN G._^1FADD_!RTJ UNPACK_'UNPACK ACCUMULATOR IF IT'S €€PACKED_^1_%RTJ OPERND_'GET OPERAND ADDRESS-1 IN Q_^1_%LDA- 1,Q_^1_%LDQ- 2,Q_^1FADD2 STQ- F+1_^1_%STA- F_^1_%SAP A10_^1_%TCA A_^1A10_"ALS 1_^1_%SAN 1_^1_%JMP* NXTOP3_$ADD 0, THUS JMP OUT_^1_%EOR- H8000_OFTN 3.3_^1_%ARS 8_^1_%INA 0_,EXTRACT BETA_^1_%STA- BETA_^1_%LDA- F_^1_%LDQ- F+1_^1_%AND =N$807F_^1_%SAP A11_^1_%ADD H7F80_^1A11_"LLS 8_5STORE A AND B_^1_%STA- A_,A=0, 15M€€SB_^1_%STQ- B_,B=8 LSB, 8 SIGN BITS_^1_%LDA- D_^1_%ALS 1_/REMOVE BIT 15 OF A REG_^1_%STA- D_^1_%LDQ- STATUS_^1_%QLS 15-SIGN_%SIGN TO BIT 15_^1_%SQP FADD21_^1_%TCA A_,COMPLEMENT C AND D IF_^1_%STA- D_,SIGN IF NEQATIVE_^1_%LDA- C_^1_%TCA A_^1_%STA- C_^1FADD21 LDA- C_(IF ACC IS ZERO( USE SECOND_^1_%SAN FA22_,VALUE AS ANSWER_^1_%LDA- BETA_^1_%STA- DELTA_^1_%LDA- B_^1_%LDQ- A_^1_%€€JMP* STOCD_^1FA22_!LDA- DELTA_^1_%SUB- BETA_^1*_]_^1*_*IF F.GE.G, GO TO ADD STEP 3 (ADDS3)._^1_%SAP ADDS3_+OTHERWISE_^1*_;EXCHANGE EXPONENTS_^1_%LDA- DELTA_^1_%LDQ- BETA_^1_%STA- BETA_^1_%STQ- DELTA_^1_%LDA- A_^1_%LDQ- C_^1_%STA- C_^1_%STQ- A_^1_%LDA- A+1_^1_%LDQ- C+1_^1_%STA- C+1_^1_%STQ- A+1_^1*_*C AND D ARE NOW THE LARGER NUMBER_^1*_*A AND B ARE NOW THE SAMLLER NUMBER_^1_%LDA- €€DELTA_^1_%SUB- BETA_^1ADDS3 TRA Q_^1_%ADD* LRSINS_^1_%STA* LRS_^1_%INQ -29_^1*_*IF SHIFT .GE. 29,_^1_%SQM AS30_^1*_*LEAVE THE LARGER NUMBER IN ACCUMULATOR AND GO ON_^1_%LDA- D_^1_%LDQ- C_^1_%JMP* STOCD_^1_%SPC 2_^1LRSINS LRS 0_^1_%SPC 2_^1*_*STEP 3_^1AS30_!LDQ- C_^1_%LDA- D_^1_%LRS 8_^1_%LLS 6_^1_%ARS 1_^1_%AND- H7FFF_OFTN 3.3_^1_%STA- D_,D=0,10LSB,5 SIGN BITS_^1_%TRQ A_€€^1_%AND- H7FFF_OFTN 3.3_^1_%STA- C_,C=0SS,13MSB_^1_%LDQ- A_^1_%LDA- B_^1_%LRS 8_^1_%LLS 6_^1_%EJT_]_^1*_*STEP 4._^1*_*SHIFT SMALLER NUMBER RIGHT (ABS.(BETA-DELTA)),_^1*_*AND SET THE SIGN OF MSB TO POSITIVE_^1*_*SHIFT LSB RIGHT 1, AND SET THE SIGN OF LSB POSITIVE._^1*_*CLEAR THE CARRY TO BIT 15 AND ADD 1 TO MSB_^1*_*POSITION THE SMALLER NUMBER_^1*_]_^1LRS_"LRS 0_^1_%ARS 1_^1_%AN€€D- H7FFF_OFTN 3.3_^1_%STA- B_^1_%TRQ A_^1_%AND- H7FFF_OFTN 3.3_^1_%STA- A_^1_%CLR Q_:STEP 5_^1_%LDA- D_^1_%ADD- B_^1_%SAP AS6_8IF A.L.0, CARRY OCCURRED_^1_%AND- H7FFF_^1*_*STEP 6._^1_%ENQ 1_^1AS6_"ADQ- A_^1_%ADQ- C_^1_%SQP AS61_^1*_*SUBTRACT END AROUND CARRY INCREASE LSB BY 1_^1_%ADQ- H7FFF_OFTN 3.3_^1_%INA 1_^1_%SAP AS61_^1_%INQ 1_^1_%AND- H7FFF_^1AS61_!ALS 1_^1_%STA- D_^€€1_%STQ- C_^1*_*IF RESULT IS MINUS ZERO, GO TO ARG0_^1*_*MINUS ZERO IS Q=7FFF, A= FFFE._^1_%ADQ- H8000_^1_%SQN AS62_^1_%INA 1_^1_%SAN AS62_^1_%JMP ARG0_)ACCUMULATOR IS ZERO_^1_%EJT_]_^1*_*STEP 7._^1*_*SAVE SIGNS AND OVERFLOW V IN BITS 1 AND 0_^1*_*IF S .E. V, THEN V IS SIGN EXTENSION_^1*_*IF S.NE.V, THEN RESULT OVERFLOWED INTO V._^1AS62_!LLS 3_^1_%AND- H0003_^1_%TRA Q_^1_%LDA-€€ D_^1_%JMP* *+1,Q_^1*_]_^1*_*SV_^1*_*00_9S=V, SHIFT LEFT 2_^1_%JMP* SHFT2_^1*_*01_9S NOT = V, NO SHIFT_^1_%JMP* SHFT1_^1*_*10_9S NOT = V, NO SHIFT_^1_%JMP* SHFT1_^1*_*11_9S=V, SHIFT LEFT 2_^1_%JMP* SHFT2_6S=V, SHIFT LEFT 2_^1SHFT2 LDQ- C_^1_%LLS 2_^1_%JMP* STOCD_^1SHFT1 RAO- DELTA_+INCREMENT THE EXPONENT_^1_%LDQ- C_^1_%LLS 1_^1*_*SAVE THE SIGN AND MAGNITUDE OF THE RESULTS._^1ST€€OCD STQ- C_^1_%SQP ADDS7A_^1_%TRA Q_,SAVE A IN Q_^1_%LDA- STATUS_^1_%AND- ZROBIT+SIGN_^1_%EOR- ONEBIT+SIGN_!SET SIGN BIT FOR NEGATIVE_^1_%STA- STATUS_^1_%TRQ A_,RESTORE A_^1_%LDQ- C_,RESTORE C_^1_%TCQ Q_^1_%TCA A_^1_%AND- HFFF8_^1_%JMP* ADDS7_^1ADDS7A TRA Q_,SAVE A IN Q_^1_%LDA- STATUS_^1_%AND- ZROBIT+SIGN_!CLEAR SIGN BIT_^1_%STA- STATUS_^1_%TRQ A_,RESTORE A_^1_%LDQ- C_^1AD€’DS7 SAN ADDS7B_^1_%SQN ADDS7B_^1_%JMP ARG0_)ACCUMULATOR IS ZERO_^1ADDS7B STQ- G_^1_%STA- G+1_^1_%TRA Q_^1_%ENA 0_^1_%STA- BETA_^1_%JMP NORMAL_^1_%END_]_^__’PCOMNFP CSY/ SM9 P€1_%NAM COMNFP_'DECK-ID S09 SMC 1.0_.SUMMARY-108_^1*_$COMMON SUBROUTINES FOR FLOTN/DFLOTN_^1*_$SORT/MERGE VERSION 1.0_^1*_$SMALL SYSTEMS DIVISION. LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976._^1*_]_^1*_$BASED ON FTN 3.3 RUNTIME DECK ID G15 - PSR LEVEL 102_^1_%SPC 5_^1_%ENT IFALT_^1_%ENT SFALT_^1_%ENT OPERND_^1_%ENT NXTOP_^1_%ENT FPEROR_^1_%ENT PROCHK_^€€1_%ENT SPECOP_^1_%ENT FLOFOP_^1_%ENT FIXFOP_^1_%EXT PARABS_^1_%SPC 2_^1************************************************************************_^1*_$FOLLOWING EQU'S MUST MATCH CORRESPONDING EQU'S IN FLOTN/DFLOTN_^1*******************************************************************$****_^1_%EQU STATUS($C8)_^1_%EQU P($C9)_^1_%EQU INDEX($CA)_^1_%EQU OPCODE($CB)_^1_%EQU OPCNT€€($CC)_^1_%EQU G($C5)_'1ST WORD OF PACKED ACCUMULATOR_^1_%EQU C($CD)_'FIRST WORD OF UNPACKED ACCUMULATOR_^1************************************************************************_^1*_] FTN 3.3_^1*_$EQUATES FOR AND USAGE OF STATUS WORD BITS_0FTN 3.3_^1*_] FTN 3.3_^1_%EQU MODE(15)_$15 - 1 = FTN 3.3 TYPE CALLING SEQUENCE FTN 3.3_^1*_814 - 1 = OVERFLOW FAULT_/FTN 3.3_^1*_813 - 1 =€€ DIVIDE FAULT_1FTN 3.3_^1*_812 - 1 = UNDERFLOW FAULT_.FTN 3.3_^1_%EQU SIGN(11)_$11 - 1 = UNPACKED ACCUMULATOR IS NEGATIVE_^1_%EQU MULDIV(10)_"10 - 1 = INSTRUCTION IS DIVIDE (DBL PREC)_^1_%EQU RELADR(9)_#09 - 1 = RELATIVE ADDRESSING MODE_$FTN 3.3_^1*_808 -_BFTN 3.3_^1_%EQU DOUBLE(7)_#07 - 1 = DOUBLE PRECISION MODE_(FTN 3.3_^1*_806 -_BFTN 3.3_^1*_805 -_BFTN 3.3_^1*_804 -_BFTN 3.3€€_^1*_803 -_BFTN 3.3_^1*_802 -_BFTN 3.3_^1_%EQU UNPCKD(1)_#01 - 1 = ACCUMULATOR IS UNPACKED_%FTN 3.3_^1_%EQU IDXINH(0)_#00 - 1 = INDEXING IS INHIBITED_(FTN 3.3_^1_%EJT_]_^1*_]_^1*_$LOCORE EQU'S_^1*_]_^1_%EQU ZERO($22)_^1_%EQU ONEBIT($23)_^1_%EQU ZROBIT($33)_^1_%EQU ERASE($41)_^1_%EQU SETBIT($31)_^1_%EQU H7FFF($11)_^1_%EQU H8000($32)_^1_%EJT_]_^1*_]_^1*_$UNPACK NEXT OPCODE B€€YTE, RETURN WITH IT IN Q_^1*_]_^1_%SPC 3_^1NXTOP NUM 0_^1_%LDA- OPCNT_(PICK UP OPERAND BYTE COUNTER_^1_%INA -3_+TEST FOR END OF WORD_^1_%SAP NXTOP2_'IT IS, GO GET NEXT WORD_^1_%RAO- OPCNT_(BUMP OPERAND BYTE COUNTER_^1_%LDA- OPCODE_^1NXTOP1 CLR Q_^1_%LLS 4_,SHIFT NEXT BYTE INTO Q_^1_%STA- OPCODE_^1_%JMP* (NXTOP)_%RETURN TO CALLER_^1_%SPC 3_^1NXTOP2 STA- OPCNT_(ZERO TO OPCNT_€€^1_%LDA- (P)_*GET NEXT OPCODE WORD_^1_%STA- OPCODE_^1_%RAO- P_,BUMP P COUNTER_^1_%JMP* NXTOP1_'GO UNPACK OPCODE_^1_%EJT_]_^1*_]_^1*_$GET ADDRESS OF NEXT OPERAND - 1 IN Q_^1*_]_^1_%SPC 2_^1OPERND NOP 0_^1_%LDQ- P_^1_%LDQ- (ZERO),Q_$PICK UP OPERAND ADDRESS_^1_%LDA- STATUS_^1_%AND- ONEBIT+RELADR GET RELATIVE ADDRESSING FLAG_^1_%SAZ OPRND2_'SKIP IF ADDRESS ABSOLUTE_^1_%LDA- STATUS_'€€CHECK MODE BIT_^1_%SAM OPRND1_'SKIP IF 16 BIT RELATIVE_^1_%QLS 1_,CHANGE 15 BIT RELATIVE TO 16 BIT RELATIVE_^1_%QRS 1_^1OPRND1 ADQ- P_,FORM ABSOLUTE ADDRESS_^1OPRND2 LDA- STATUS_^1_%AND- ONEBIT+IDXINH GET INDEX INHIBITED FLAG_^1_%SAZ OPRND3_'SKIP IF NOT INHIBITED TO ADD INDEX_^1_%EOR- STATUS_'CLEAR IDXINH BIT_^1_%STA- STATUS_^1_%JMP* OPRND4_^1OPRND3 LDA- STATUS_'CHECK MODE BIT_€€^1_%SAP OPRND5_'SKIP IF FTN 3.2_^1_%LDA- INDEX_^1_%ALS 1_,MULTIPLY INDEX BY TWO_^1_%AAQ Q_,ADD INDEX TO ADDRESS_^1OPRND4 INQ -1_+OPERAND ADDRESS - 1 TO Q_^1_%RAO- P_,BUMP PROGRAM COUNTER_^1_%JMP* (OPERND)_$RETURN TO CALLER WITH ADDRESS - 1 IN Q_^1OPRND5 ADQ- INDEX_(ADD BIASED INDEX TO ADDRESS_^1_%JMP* OPRND4_^1_%EJT_]_^1*_]_^1*_$EXECUTE INSTRUCTION FROM SECOND SET_^1*_]_^1_%SPC€€ 1_^1SPECOP NOP 0_^1_%RTJ* NXTOP_(GET NEXT OPCODE BYTE IN Q_^1_%JMP* INSTAB,Q_$EXECUTE INSTRUCTION_^1_%SPC 2_^1INSTAB JMP* FEND_)00_^1_%JMP* CACS_)01_^1_%JMP* BRAM_)02_^1_%JMP* BRAZ_)03_^1_%JMP* BRAN_)04_^1_%JMP* BRAP_)05_^1_%JMP* BRIM_)06_^1_%JMP* BRIZ_)07_^1_%JMP* BRIN_)08_^1_%JMP* BRIP_)09_^1_%JMP* FEND_)0A_^1_%JMP* FEND_)0B_^1_%JMP* FEND_)0C_^1_%JMP* FEND_)0D_^1_%JMP* FEND_)€€0E_^1_%JMP* FEND_)0F_^1_%SPC 2_^1NXTOPC CLR Q_,NORMAL RETURN_^1_%JMP* (SPECOP)_^1FEND_!SET Q_,SET Q MINUS TO INDICATE 'FEND'_^1_%JMP* (SPECOP)_^1_%EJT_]_^1CACS_!LDA- STATUS_^1_%EOR- ONEBIT+IDXINH INHIBIT INDEXING_^1_%STA- STATUS_^1_%RTJ* OPERND_'GET JUMP ADDRESS - 1_^1_%INQ 1_^1_%RTJ* PROCHK_'CHECK FOR UNPROTECTED/PROTECTED JUMP_^1_%STQ- P_,JUMP ADDRESS TO P REGISTER_^1_%ENA 3€€_^1_%STA- OPCNT_(RESET OP BYTE COUNTER_^1_%JMP* NXTOPC_'GO TO NEXT OP CODE_^1_%SPC 2_^1NOJUMP RAO- P_,BUMP P COUNTER OVER ADDRESS_^1_%JMP NXTOPC_'EXECUTE NEXT INSTRUCTION_^1_%SPC 2_^1BRAM_!RTJ* GETSGN_'GET SIGN OF ACCUMULATOR IN A_^1_%SAP BRAM1_^1_%JMP* CACS_^1BRAM1 JMP* NOJUMP_^1_%SPC 2_^1BRAP_!RTJ* GETSGN_'GET SIGN OF ACCUMULATOR IN A_^1_%SAM BRAP1_^1_%JMP* CACS_^1BRAP1 J€€MP* NOJUMP_^1_%SPC 2_^1GETSGN NOP 0_^1_%LDA- STATUS_^1_%AND- ONEBIT+UNPCKD GET ACCUMULATOR UNPACKED FLAG_^1_%SAZ GETS1_(SKIP IF ACCUMULATOR PACKED_^1_%LDA- STATUS_^1_%ALS 15-SIGN_%SIGN TO BIT 15 OF A_^1_%JMP* (GETSGN)_^1GETS1 LDA- G_^1_%JMP* (GETSGN)_^1_%SPC 2_^1BRAZ_!RTJ* GETACC_^1_%SAN BRAZ1_^1_%JMP* CACS_^1BRAZ1 JMP* NOJUMP_^1_%SPC 2_^1BRAN_!RTJ* GETACC_^1_%SAZ BRAN1_^€€1_%JMP* CACS_^1BRAN1 JMP* NOJUMP_^1_%SPC 2_^1GETACC NOP 0_^1_%LDA- STATUS_^1_%EOR- ONEBIT+IDXINH INHIBIT INDEXING_^1_%SAZ GETA1_(SKIP IF ACCUMULATOR PACKED_^1_%LDA- C_^1_%JMP* (GETACC)_^1GETA1 LDA- G_^1_%JMP* (GETACC)_^1_%SPC 2_^1BRIM_!LDA- INDEX_^1_%SAP BRIM1_^1_%JMP* CACS_^1BRIM1 JMP* NOJUMP_^1_%SPC 2_^1BRIP_!LDA- INDEX_^1_%SAM BRIP1_^1_%JMP* CACS_^1BRIP1 JMP* NOJUMP_^€€1_%SPC 2_^1BRIZ_!LDA- INDEX_^1_%SAN BRIZ1_^1_%JMP* CACS_^1BRIZ1 JMP* NOJUMP_^1_%SPC 2_^1BRIN_!LDA- INDEX_^1_%SAZ BRIN1_^1_%JMP* CACS_^1BRIN1 JMP* NOJUMP_^1_%EJT_]_^1*_]_^1*_$TEST FOR PROTECT VIOLATION_^1*_]_^1PROCHK NUM 0_^1_%STQ* OPSTAD_'OPERAND STORAGE ADDRESS_/90*3012_^1_%LDA- P_,CALLER'S ADDRESS_690*3012_^1_%LDQ- $F7_*UNPROTECTED LOW LIMIT-1_/90*3012_^1_%RTJ* ADRCMP_'ADD€€RESS COMPARE ROUTINE_/90*3012_^1_%SAN UNPRT1_'ADDRESS GT LOWER LIMIT OF UNPROTECTED 90*3012_^1_%JMP* FOK_*CALLER IS IN PROTECTED CORE_+90*3012_^1UNPRT1 LDA- $F6_*UNPROTECTED UPPER LIMIT+1_-90*3012_^1_%LDQ- P_,CALLER'S ADDRESS_690*3012_^1_%RTJ* ADRCMP_'ADDRESS COMPARE ROUTINE_/90*3012_^1_%SAN UNPRT2_N90*3012_^1_%JMP* FOK_*OK STORAGE ADDRESS_490*3012_^1*** CALLER IS UNPROTECTED -€€ STORAGE ADDRESS MUST BE UNPROTECTED 90*3012_^1UNPRT2 LDA* OPSTAD_'OPERAND STORAGE ADDRESS_/90*3012_^1_%LDQ- $F7_Q90*3012_^1_%RTJ* ADRCMP_N90*3012_^1_%SAN UNPRT3_N90*3012_^1_%JMP* FCMCHK_'ADDRESS MAY BE IN FTN COMM REGION_$90*3012_^1UNPRT3 LDA- $F6_Q90*3012_^1_%LDQ* OPSTAD_N90*3012_^1_%INQ 2_,INSURE SUFFUCIENT STORAGE LOCATIONS_"90*3012_^1_%RTJ* ADRCMP_N90*3012_^1_%SAN FOK_*OK S€€TORAGE ADDRESS_490*3012_^1_%JMP* PRTFLT_'PROTECT VIOLATION_590*3012_^1* ADDRESS MAY BE IN FORTRAN COMMUNICATION REGION ($C5 - $E5)_!90*3012_^1FCMCHK LDA* OPSTAD_'OPERAND STORAGE ADDRESS_/90*3012_^1_%SUB =N$C4_O90*3012_^1_%SAM PRTFLT_'NOT FTN COMM REGION_390*3012_^1_%LDA* OPSTAD_N90*3012_^1_%SUB =N$E4_(UPPER BOUND FTN COMM = $E5_,90*3012_^1_%SAM FOK_*OK STORAGE ADDRESS_490*301€€2_^1*** SIMULATE PROTECT VIOLATION IN CALLER ***_390*3012_^1PRTFLT LDA =N$7022_%ILLEGAL - $22 IS PROTECTED ZERO_'90*3012_^1_%STA- (P)_*PLANT VIOLATION IN CALLER_-90*3012_^1_%JMP- (P)_*GO EXECUTE INSTRUCTION_090*3012_^1FOK_"LDQ* OPSTAD_'RESTORE Q-REG_990*3012_^1_%JMP* (PROCHK)_^1_%SPC 2_^1OPSTAD NUM 0_,SAVE OPERAND STORAGE ADDRESS_*90*3012_^1_%EJT_]_^1***************************€€*** ADDRESS COMPARE ROUTINE **********90*3012_^1*_] 90*3012_^1*_$UPON ENTRY_!A-REG HAS UPPER BOUND_790*3012_^1*_2Q-REG HAS LOWER BOUND_790*3012_^1*_$A .GT. Q_7DIFFERENCE RETURNED IN A 90*3012_^1*_$A .EQ. Q OR A. LT. Q_+A EQUALS 0 UPON RETURN_"90*3012_^1*_] 90*3012_^1ADRCMP NOP 0_S90*3012_^1_%SAM AUPPER_'A IN UPPER BANK_790*3012_^1_%SQP BTHSAM_'BOTH IN LOWER BANK_490*3012_^1_%€€JMP* QBIGR_(A IN LOWER Q IN UPPER_190*3012_^1AUPPER SQM BTHSAM_'BOTH IN UPPER BANK_490*3012_^1_%TCQ Q_,A IN UPPER Q IN LOWER_190*3012_^1_%AAQ A_,GET DIFFERENCE IN A_390*3012_^1_%JMP* ABIGR_O90*3012_^1BTHSAM TCQ Q_S90*3012_^1_%AAQ A_,SUBTRACT Q FROM A_590*3012_^1_%SAP ABIGR_O90*3012_^1QBIGR CLR A_S90*3012_^1ABIGR JMP* (ADRCMP)_$RETURN TO CALLER_690*3012_^1_%EJT_]_^1FPEROR N€€OP 0_^1_%TCQ Q_,COMPLEMENT Q FOR NEGATIVE INDEXING_^1_%LDA- STATUS_^1_%AND- ERASE,Q_^1_%EOR- SETBIT,Q_^1_%STA- STATUS_^1_%TCQ Q_^1_%JMP* (FPEROR)_$RETURN TO CALLER_^1_%EJT_]_^1*_]_^1*_$CONVERT ACCUMULATOR TO FIXED POINT AND STORE_^1*_]_^1FLOFOP NOP 0_^1_%LDA- G_^1_%LDQ- G+1_^1_%SAP FX1_^1_%TCA A_,COMPLEMENT IF NEGATIVE_^1_%TCQ Q_^1FX1_"STQ- G+1_^1_%ENQ 0_^1_%LLS 2_,SIGN OF€€ EXPONENT TO Q_^1_%SQN FX2_*SKIP IF ACCUMULATOR.GT.ZERO_^1_%ENA 0_^1_%JMP* FX4_^1FX2_"ENQ 0_^1_%LLS 3_^1_%SQZ FX3_^1_%LDA- H7FFF_(ACCUM.GT.2**16-1, MAXVALUE TO A_^1_%JMP* FX3A_^1FX3_"LDQ* LLS_*CONSTRUCT A SHIFT_^1_%LLS 4_^1_%STQ* SHIFT_^1_%ENQ 0_,LOW ORDER BITS COME FROM WORD 2_^1_%LLS 7_^1_%LDA- G+1_^1_%LRS 7_^1SHIFT LLS 0_,COUNT FROM EXPONENT LOW 4 BITS_^1_%TRQ A_,ANS€€WER TO A_^1FX3A_!LDQ- G_^1_%SQP FX4_^1_%TCA A_,COMPLEMENT IF NEGATIVE_^1FX4_"INA 0_^1_%STA- G_^1_%LDA- STATUS_^1_%EOR- ONEBIT+IDXINH INHIBIT INDEXING_^1_%STA- STATUS_^1_%RTJ OPERND_'GET ADDRESS TO STORE INTO_^1_%ADQ- INDEX_^1_%RTJ* PROCHK_'CHECK FOR PROTECT VIOLATION_^1_%LDA- G_^1_%STA- 1,Q_*STORE RESULT_^1_%JMP* (FLOFOP)_^1_%SPC 3_^1LLS_"NUM $00FE_^1_%EJT_]_^1*_]_^1*_$CONVER€€T INTEGER OPERAND TO FLOATING POINT_^1*_$AND SET IN PSEUDO ACCUMULATOR_^1*_]_^1FIXFOP NOP 0_^1_%LDA- STATUS_^1_%EOR- ONEBIT+IDXINH INHIBIT INDEXING_^1_%STA- STATUS_^1_%RTJ OPERND_^1_%ADQ- INDEX_^1_%LDA- 1,Q_*OPERAND TO A_^1_%STA- G+1_*SAVE FOR LATER SIGN CHECK_^1_%SAP FL1_^1_%TCA A_,COMPLEMENT OPERAND IF NEGATIVE_^1FL1_"SAN FL2_*SKIP IF OPERAND NOT ZERO_^1_%CLR Q_^1_%JMP* FLX€€_*EXIT WITH ZERO VALUE_^1FL2_"LDQ =N$008F_%EXPONENT FOR 15 BIT INPUT_^1FL3_"ALS 1_^1_%SAM FL4_*SKIP IF BIT 15 SET_^1_%INQ -1_+DECREASE EXPONENT BY 1_^1_%JMP* FL3_*TRY AGAIN_^1FL4_"LLS 7_,MOST SIGNIFICANT 7 BITS TO Q_^1_%STQ- G_^1_%LDQ- G+1_^1_%SQM FL5_*SKIP IF ORIGINAL OPERAND NEGATIVE_^1_%LDQ- G_^1_%JMP* FLX_^1FL5_"TCA A_,COMPLEMENT IF ORIGINAL OPERAND NEGATIVE_^1_%LDQ- G_^€€1_%TCQ Q_^1FLX_"STQ- G_^1_%STA- G+1_^1_%QRS 15_^1_%STQ- G+2_*SET 3RD WORD TO ALL SIGN BITS_^1_%LDA- STATUS_^1_%AND- ZROBIT+UNPCKD CLEAR ACCUMULATOR UNPACKED FLAG_^1_%STA- STATUS_^1_%JMP* (FIXFOP)_^1_%EJT_]_^1*_$TEST AND RESET FLOATING POINT FAULT CONDITION_^1_%SPC 2_^1IFALT NOP 0_^1_%STQ* QSAVE_^1_%LDA* IFALT_(PICK UP ADDRESS OF PARAMETER_^1_%RTJ* GETBIT_'GET REQUESTED ERROR B€€ITS_^1_%LDA- STATUS_^1_%LAQ Q_^1_%EAQ A_^1_%STA- STATUS_^1_%ENA 1_^1_%SQN IFALT1_^1_%INA 1_^1IFALT1 LDQ* QSAVE_^1_%RAO* IFALT_^1_%JMP* (IFALT)_^1_%SPC 2_^1GETBIT NOP 0_^1_%RTJ PARABS_'ABSOLUTIZE PARAMETER ADDRESS_^1_%TRA Q_^1_%LDQ- (ZERO),Q_$GET USER PARAMETER_^1_%TRQ A_^1_%INA -3_+TEST FOR ALL ERRORS REQUEST_^1_%SAZ GTBIT2_'SKIP IF IT IS_^1_%TCQ Q_,COMPLEMENT Q FOR NE€^GATIVE INDEXING_^1_%LDQ- ONEBIT+14,Q_^1_%JMP* (GETBIT)_^1GTBIT2 LDQ* H7000_^1_%JMP* (GETBIT)_^1_%SPC 2_^1SFALT NOP 0_^1_%STQ* QSAVE_^1_%LDA* SFALT_^1_%RTJ* GETBIT_^1_%LDA- STATUS_^1_%TCQ Q_^1_%LAQ A_^1_%TCQ Q_^1_%EAQ A_^1_%STA- STATUS_^1_%LDQ* QSAVE_^1_%RAO* SFALT_^1_%JMP* (SFALT)_^1_%SPC 2_^1H7000 NUM $7000_^1QSAVE NUM 0_^1_%END_]_^__ ^ END/