; UPD ID= 3443 on 3/9/81 at 8:41 PM by NIXON TITLE CLEANC FOR COBOL V12C SUBTTL CLEANUP AFTER PHASE C W.NEELY/CAM SEARCH COPYRT SALL COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1974, 1985 ;ALL RIGHTS RESERVED. ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. SEARCH P %%P==:%%P ISAM==:ISAM RPW==:RPW ;EDITS ;NAME DATE ; ;JEH 16-MAY-84 [1533] Fix edit 1501, jrst back to new label ;JEH 28-MAR-84 [1520] Give error if 'DEPENDING ON D-N' and D-N ; is subscripted ;JEH 24-OCT-83 [1502] Give warning on records that are smaller than ; maximum record size ;JEH 11-OCT-83 [1501] Syntax error if alternate key is variable length ;JEH 10-OCT-83 [1500] Warning if high/low -values on numeric item ;SMI 27-OCT-82 [1427] 68274 Gives warning SHOULD BE UNSIGNED INTEGER ; when data item is an unsigned integer. ;SMI 15-OCT-82 [1417] FIX 68274 CONVERSION OF WRITE ;DMN 12-MAR-82 [1340] 68274 converter does not flag JUSTIFIED clause ; in VALUE ;JEH 02-FEB-82 [1335] Declare DATAB entries for all indexes if ; REPORT SECTION is scanned for their use by REPORT ; WRITER stmts ;DAW 14-Nov-80 [1072] Make VALUE clause work correctly for EBCDIC ; signed numeric items ;DAW 29-OCT-80 [1066] BETTER ERROR RECOVERY FOR CONTAB-- PREVENTS ; "?ILL MEM REF.." IN PHASE E WHEN PGM HAS SYNTAX ERRORS ;DAW 8-FEB-80 [770] REPLACE EDIT 742: GENERATE AN ERROR MESSAGE ; IF AN ITEM IN "INDEXED BY" CLAUSE WAS ALSO DEFINED ; AS AN INDEPENDENT ITEM. ;V12A**************** ; ;DMN 28-FEB-79 [644] MORE ERROR RECOVERY IN CONTAB ;V12***************** ;V10***************** ; 15-DEC-76 [454] FIX RECOVERY FOR ERROR IN CONTAB ; 10-AUG-76 [434] FOR REPORT WRITER SO SUM COUNTERS OF GT 10 DIGITS ARE HANDLED PROPERLY ; 31-MAR-76 [415] FOR REPORT WRITER SORT THE SUM COUNTER CODE SO THAT LOWEST LEVEL DONE FIRST ; 31-MAR-76 [415] REPORT WRITER DO THE SUM CODE IN ORDER OF LOWEST TO HIGHEST LEVL OF CID ;ACK 12-JAN-75 FILE STATUS CODE - REPLACE THE HLDTAB LINKS BY ; DATAB LINKS. ;ACK 12-MAR-75 MODIFY ROUTINE WHICH ADJUSTS LITERALS SO THAT ; THEY HANDLE COMP-3/EBCIDC LITERALS. ;******************** ; EDIT 335 REPORT WRITER ERROR CHECKING ; EDIT 315 REPORT WRITER FIXES SEE P.MAC ; EDIT 300 FLAG AS ERROR SYMBOLIC KEY, OR RECORD KEY IN LINKAGE SECTION ; EDIT 164A FIX TO 164 ; EDIT 164 FLAG AS FATAL ANY DEPENDING ITEM NOT 1-WORD COMP OR SUBSCRIPTED OR IN LINK SECTION. ; EDIT 162 GIVE WARNING THE FOLLOWING MAY NOT BE IN LINKAGE SECTION ; VALUE OF ID, DATE-WRITTEN, OR USER-NAME ; FILE-LIMITS, ACTUAL-KEY OR SYMBOLIC-KEY ; EDIT 152 FIXES ILLEGAL MEM REF FOR UNDEFINED VALUES OF ID DATE-WRITTEN, AND PPN. TWOSEG .COPYRIGHT ;Put standard copyright statement in REL file SALL RELOC 400000 IFN RPW, EXTERN TEMLOC,CURTEM,HL.CID,HL.RD ; [415] %HLDCD==1 ; [415] MEANS THIS HLDTAB THING DONE, SETS MSD OF CODE TO 1 EXTERN HL.FCD,HL.COD ENTRY CLEANC,GETCHR,ADJUST ENTRY CLNHLD ;[1335] ;GENERATE LITERALS FOR FILE TABLES CLEANC: PUSH PP,TA ;[1417] MOVE TA,FILLOC ;[1417] GET LOCATION OF FILE ENTRY CAMN TA,FILNXT ;[1417] ANY FILTAB ENTRIES ? JRST CLNAC2 ;[1417] NO HRRZI TA,SZ.DEV ;[1417] SET UP ABSOLUTE ADDRESS TO FILTAB ADDM TA,FILTBL## ;[1417] HRRZI TA,CD.FIL*1B20+1 ;[1417] CLNACC: HRLZM TA,CURFIL ;[1417] PUSHJ PP,LNKSET ;[1417] HRRM TA,CURFIL ;[1417] LDB TB,FI.ACC ;[1417] GET FILE ACCESS MODE CAIE TB,%%ACC ;[1417] ACCESS SPECIFIED ? JRST CLNAC1 ;[1417] YES HRRZI TB,%ACC.S ;[1417] NO, ASSUME SEQUENTIAL DPB TB,FI.ACC ;[1417] STORE ACCESS MODE CLNAC1: LDB TA,FI.NXT ;[1417] GET NEXT FILTAB ENTRY JUMPN TA,CLNACC ;[1417] FINISHED ? CLNAC2: POP PP,TA ;[1417] YES IFN ANS74,< SKIPE TA,COLSEQ## ;IF COLLATING SEQ. SET TRNE TA,700000 ;IS IT NAMTAB ENTRY? JRST CLNDSQ ;NO ADD TA,NAMLOC SKIPN TA,0(TA) ;GET SPECIAL-NAME JRST [HRRZI DW,E.718 ;NOT DEFINED HLRZ LN,COLNCP## ;RESTORE LN HRRZ CP,COLNCP ;AND CP PUSHJ PP,FATAL ;GIVE ERROR MESSAGE SETZM COLSEQ ;NO COLATING SEQUENCE JRST CLNDSQ] ;AND CONTINUE PUSHJ PP,LNKSET MOVE TA,1(TA) ;GET 2ND WORD TLNE TA,(1B6) ;MAKE SURE ITS ALPHABET NAME TRNN TA,%AN.AS!%AN.EB ;AND NOT A LITERAL JRST CLNDSQ ;NO, LEAVE AS IS HRRZM TA,COLSEQ ;YES, REPLACE BY WHAT IT IS CLNDSQ:> MOVE TA,[ XWD RPTSRT,RPTSRT+1] ; [415] CLEAR SETZM RPTSRT ; [415] THE REPORT WRITER BLT TA,RPTFIN ; [415] DATA HRRZ TA,HLDLOC## ;START OF HLDTAB AOJ TA, MOVEM TA,CURHLD## ;PTR TO 1ST ENTRY CLNHLD: HRRZ TA,CURHLD ;NEXT HLDTAB ENTRY HRRZ TB,HLDNXT## ;PTR TO END CAILE TA,(TB) ;PAST THE END YET? JRST [SKIPE BLDIX## ;[1335] IF JUST BUILDING INDEXES, POPJ PP, ;[1335] EXIT SKIPN RPTRPT ; [415] END OF HLDTAB ANY REPORT CF TO DO? JRST CLNFIL ;NO RDS,, ALL DONE JRST CLRPTP ] ; [415] DO LEFT OVER REPRT LDB TC,HL.FCD ; [415] CAIN TC,%HL.IX ;20: CK FOR "MAKE INDEX" CODE JRST CLHIDX IFN RPW,< SKIPE BLDIX ;[1335] IF JUST BUILDING INDEXES, JRST CLNHLL ;[1335] LOOP BACK CAIN TC,%HL.SC ;14: CK FOR "BUILD-SUM-CTR" CODE JRST CLNRPX ; [415] YES CAIN TC,%HL.GI ; [315] G.I. ITEM JRST CLHGIT ; [315] YES CAIL TC,%HL.SL ; [415] FOR SUM IDS CAILE TC,%HL.UP ; [415] SKIPA ; [415] NORMAL STUFF JRST CLNHLL ; [415] SUM ID HANDLE DIFFERENTLY > LDB TB,HLSCOD ; [415] GET MOST SIGN DIGIT OF HL.COD CAIN TB,%HLDCD ; [415] SEE ALREADY DONE? JRST CLNHLL ; [415] GO TO NEXT ONE PUSHJ PP,CLNHLQ ; [415] DO QUALIFIER CHECKS XCT .(TC) ;DO ACTION FOR TYPE JRST CLHACK ;1: STORE ACTUAL KEY DATAB LINK JRST CLHVID ;2: STORE VALUE OF IDENTIFICATION DATAB LINK JRST CLHVDW ;3: STORE VALUE OF DATE-WRITTEN DATAB LINK JRST CLHVPP ;4: STORE VALUE OF PROJ-PROG # DATAB LINK JRST CLHLFL ;5: STORE LOW FILE-LIMIT DATAB LINK JRST CLHHFL ;6: STORE HIGH FILE-LIMIT DATAB LINK JRST CLHDOC ;7: STORE DEPENDING FOR OCCURS DATAB LINK JRST CLHKOC ;10: STORE ASCN. KEY FOR OCCURS DATAB LINK IFN RPW,< JRST CLHSML ;11: STORE SUM ID DATAB LINK IN LEFT HALF JRST CLHSMR ;12: STORE SUM ID DATAB LINK IN RIGHT HALF JRST CLHUPN ;13: STORE SUM-UPON DATAB LINK 0 ;14: (EXECUTED 1ST IF SEEN) > IFE RPW,> IFN ISAM,< JRST CLHSKY ;15: STORE SYMBOLIC KEY DATAB LINK JRST CLHRKY ;16: STORE RECORD KEY DATAB LINK > IFE ISAM,> JRST CLHDKY ;17: STORE DESC. KEY FOR OCC. DATAB LINK 0 ;20: (EXECUTED 1ST IF SEEN) JRST CLHERS ;21: PUT NAMTAB LINKS IN FILE STATUS ; ENTRIES OF THE FILE TABLE. 0 ;22: (EXECUTED 1ST IF SEEN) IFN ISAM&ANS74, ;23: STORE ALTERNATE KEY LINK IFE ISAM&ANS74,<0> ; HANDLE THE QUALIFIERS CLNHLQ: SETZM TBLOCK## ; [415] CLR TBLOCK MOVE TC,[TBLOCK,,TBLOCK+1] BLT TC,TBLOCK+24 MOVE TC,(TA) ;GET 1ST WORD OF HLDTAB ENTRY (ESSENTIALLY W2) MOVEM TC,TBLOCK+4 ;& PUT IT IN TBLOCK SETUP LDB TC,HL.QAL## ;GET # OF QUALS JUMPE TC,CLNHL8 ;THERE AREN'T ANY MOVEM TC,CTR## CLNHL5: AOS TB,TBLOCK+1 ;INDEX TO NEXT QUALIFIER CAMLE TB,CTR ;DONE ALL? JRST CLNHL3 ;YES ADDI TB,3 ;AIM AT THAT QUALIFIER ROT TB,-1 ADDI TB,(TA) HLRZ TD,(TB) ;GET QUALIFIER (ASSUMING INDEX ODD) TLNE TB,400000 ;IF INDEX EVEN, GET RIGHT QUALIFIER HRRZ TD,(TB) ;TD=NAMTAB LINK FOR QUALIFIER MOVE TB,TBLOCK+1 ;CTR IS INDEX TO QUALIFIER STORAGE MOVEM TD,TBLOCK+4(TB) ;STORE QUALIFIER JRST CLNHL5 ;GET NEXT QUALIFIER CLNHL3: SOS TBLOCK+1 ;ADJUST QUAL CTR CLNHL8: PUSHJ PP,FINDAT## ;FIND DATAB LINK FOR ITEM JUMPE DW,CLNHL7 ;NO ERROR PUSHJ PP,CLHBA1 ;GIVE ERROR MESSAGE JRST CLNHL4 ;LEAVE TBLOCK+4 NON-ZERO CLNHL7: SETZM TBLOCK+4 ;CLR UNDEFINED FLAG CLNHL4: HRRZ TA,CURHLD ;GET HLDTAB PTR LDB TB,HL.LNK## ;LINK TO PLACE WHERE DATA LINK WANTED ANDI TB,077777 ;MASK OFF TABLE BITS LDB TC,HL.FCD ; [415] TYPE OF THIS HLDTAB ITEM MOVEI TA,(TB) ADD TA,FILLOC## ;ASSUME IT'S A FILTAB REFERENCE POPJ PP, ; [415] CLNHL9: MOVE TA,CURHLD ;GET HLDTAB PTR MOVEI TC,%HLDCD ; [415] MARK AS DPB TC,HLMCOD ; [415] DONE CLNHLL: MOVE TA,CURHLD ; [415] GET BACK HLDTAB POINTER LDB TB,HL.QAL ;NUMBER OF QUALIFIERS MOVEM TB,CTR ADDI TB,5 ;ROUND UP + STANDARD # OF HALFWORDS LSH TB,-1 ;DIVIDED BY 2 ADDM TB,CURHLD ;AIM AT NEXT HLDTAB ENTRY JRST CLNHLD IFN RPW,< TEMNRD==1 ; FIRST PASS OF SUM IDS THRU HLDTAB ; FOR EACH RD SET UP IN TEMPTAB ; 0 [ RD LINK,,LINK TO HLDTAB FOR FIRST SUM CTR ; 1 [ # OF IDS,,TEMTAB LINK TO NEST RD] ; FOR EACH ID LEVEL ONE WORD IN TEMTAB ; [ LEVEL #,,HLDTAB LINK TO FIRST SUM CTR THIS ID] CLNRPX: SKIPE RPWERR ; [415] UNRECOVERABLE REPORT ERROR? JRST CLNHL9 ; [415] YES SKIP OVER LDB TB,HL.RD ; [415] GET RD LINK CAME TB,RPTRPT ; [415] SAME RD? PUSHJ PP,CLRDOD ; [415] NEW ONE HRRZ TA,CURHLD ; [415] GET CURRENT HLDTAB LOC LDB TC,HL.CID ; [415] GET LEVEL NUMBER CAMN TC,RPTCID ; [415] SAME ID? JRST CLNHLL ; [415] YES , SKIP THIS MOVEM TC,RPTCID ; [415] SAVE NEW LEVEL NUMBER AOS RPTNID ; [415] COUNT NEW ID MOVE TA,[CD.TEM,,SZ.TEM]; [415] GET TEMTAB LOCATION PUSHJ PP,GETENT ; [415] MOVEM TA,CURTEM ; [415] MOVE TB,RPTCID ; [415] GET BACK NEW ID LEVEL # HRLZM TB,0(TA) ; [415] STORE THE NEW ID LEVEL NUMBER INTO TEMTAB HRRZ TB,CURHLD ; [415] CONVER CURRENT HLDTAB HRRZ TC,HLDLOC ; [415] TO RELATIVE SUB TB,TC ; [415] LINK LOCATION HRRM TB,0(TA) ; [415] STORE START HLDTAB LINK INTO TEMTAB JRST CLNHLL ; [415] GO TO NEXT HLDTAB ; NEW RD FOUND- FINISH UP LINKAGE CLRDOD: MOVEM TB,RPTNEW ; [415] STORE NEW RD MOVE TA,[CD.TEM,,SZ.TM2] ; [415] GET TEMTAB FOR NEW PUSHJ PP,GETENT ; [415] RD HEADER MOVEM TA,RPTNHT ; [415] SAVE IT SKIPN RPTRPT ; [415] FIRST ONE? JRST CLRDOX ; [415] YES GO ON HLRZ TA,RPTRHT ;[415] GET CURRENT TEMTAB POINTER HRRZ TB,TEMLOC ; [415] CONVERT TO REAL ADDI TA,(TB) ; [415] ADDRESS HLRZ TB,RPTNHT ; [415] GET BACK NEW TEMTAB LINK HRRZM TB,TEMNRD(TA) ; [415] STORE INTO CURRENT NEXT LNIK POINTER MOVE TC,RPTNID ; [415] GET NUMBER OF ID FOR CURRENT HRLM TC,TEMNRD(TA) ; [415] STORE IN CURRENT HEADER MOVE TA,RPTNHT ; [415] GET NEW TEMTAB HDR POINTER CLRDOX: MOVE TB,RPTNEW ; [415] GET NEW RD LINK MOVEM TA,RPTRHT ; [415] MAKE NEW RD CURRENT ONE HRLZM TB,0(TA) ; [415] STORE INTO NEW TEMTAB HDR MOVE TD,RPTNEW ; [415] MAKE NEW POINTER CURRENT MOVEM TD,RPTRPT ; [415] SETZM RPTNID ; [415] START # OF IDS OVER SETOM RPTCID ; [415] SET LEVEL CNT TO NONE HRRZ TB,CURHLD ; [415] GET CURRENT HLDTAB HRRZ TC,HLDLOC ; [415] CONVERT SUB TB,TC ; [415] TO REL ADDRESS HRRM TB,(TA) ; [415] STORE INTO HEADER POPJ PP, ; [415] RETURN END OF NEW RD HLMCOD: POINT 1,1(16),0 ; [415] MSD OF HL.COD HLSCOD: POINT 1,TC,27 ; [415] WHERE TO PUT MSD OF HL.COD FOR TESTING ; END OF HLDTAB FIRST PASS - FIRST FINISH UP CURREENT RD CLRPTP: HLRZ TA,RPTRHT ; [415] GET CURRENT RD IN TEMTAB HRRZ TB,TEMLOC ; [415] CONVERT ADDI TA,(TB) ; [415] TO REAL HRLZ TB,RPTNID ; [415] GET NUMBER OF IDS MOVEM TB,TEMNRD(TA) ; [415] STORE IT AND ZERO NEXT RD POINTER ; PROCESS THE SUM COUNTER HLDTAB MOVSI TA,1 ; [415] START AT MOVEM TA,RPTRHT ; [415] POINT TO HEAD OF FIRST RD HRR TA,TEMLOC ; [415] TOP AOS TA ; [415] OF TEMTAB ; DO FOR EACH RD ; TA AND RPTRHT HAVE POINTER TO HEAD OF RD IN TEMTAB CLRRD: HLRZ TB,(TA) ; [415] GET RD LINK MOVEM TB,RPTRPT ; [415] SAVE AS NEW RD HLRZ TE,TEMNRD(TA) ; [415] GET # OF CID'S IN THIS RD MOVEM TE,RPTNID ; [415] SAVE ADDI TA,2 ; [415] NOW POINT TO FIRST SUM ID THIS RD MOVEM TA,CURTEM ; [415] SAVE FIRST LEVEL HRRZM TA,TB ; [415] GET 1ST LEVEL TEMTAB LOC HRRZ TC,TEMLOC ; [415] COMPUTE ITS SUBI TB,(TC) ; [415] RELATIVE LOCATION HRLZM TB,RPTCIT ; [415] KEEP FOR NEXT ID ; ; DO FOR EACH ID ; SEARCH THRU THE TEMP TABLE FOR LOWEST LEVEL ID LEFT TO PROCESS ; CURTEM POINTS TO FIRST LEVEL SEEN IN THIS RD CLNRDS: MOVEI TB,777777 ; [415] SET ID TO HIGH TO START MOVEM TB,RPTCID ; [415] RPTCID HOLDS CURRENT LOWEST ID LEVEL # CLNRD1: HLRZ TB,(TA) ; [415] GET LEVEL NUMBER THIS ID TRNE TB,400000 ; [415] ALREADY DONE THIS ID? JRST CLNRDL ; [415] YES GO TO NEXT LEVEL CAML TB,RPTCID ; [415] CHOOSE LOWER OF CURRENT ID VS LOWEST JRST CLNRDL ; [415] CURRENT ONE NOT LOWER MOVEM TB,RPTCID ; [415] KEEP NEW ID LEVEL HRRZ TC,(TA) ; [415] GET HLTAB POINTER FOR THIS ID MOVEM TA,CURTEM ; [415] KEEP TEMTAB LOC OF LOWEST ID CLNRDL: SOSLE TE ; [415] ANY MORE ID THIS TABLE? AOJA TA,CLNRD1 ; [415] YES GO TO NEXT ; ; TC HAS THE HLDTAB LINK POINTER TO START PROCESSING ; !!!!! NOW PROCESS !!!!!! PUSHJ PP,RPTDO ; [415] PROCESS THIS ID LLEVEL SOSG RPTNID ; [415] ANY MORE IDS JRST CLRNND ; [415] ALL DONE THIS RD DO NEXT HRRZ TA,CURTEM ; [415] GET TEMTAB LOCATION FOR LOWEST ID MOVSI TB,777777 ; [415] SET LEVEL PROCESSED TO HIGH HLLM TB,0(TA) ; [415] SET HLRZ TA,RPTCIT ; [415] GET FIRST ID LOCATION IN TEMTAB HRRZ TB,TEMLOC ; [415] CONVERT TO REAL ADDI TA,(TB) ; [415] TEMTAB LOCATION MOVEM TA,CURTEM ; [415] KEEP AS CURRENT TEMTAB POINTER HLRZ TE,-1(TA) ; [415} GET BACK ORIGINAL # OF IDS JRST CLNRDS ; [415] GO SEARCH AND DO NEXT ID ; END DO FOR EACH ID ; ; FINISHED THIS RD DO NEXT RD IF ANY CLRNND: HLRZ TA,RPTRHT ; [415] GET HEADER ADDRESS OF THIS RD HRRZ TB,TEMLOC ; [415] CONVERT TO REAL ADDI TA,(TB) ; [415] REAL HRRZ TA,TEMNRD(TA) ; [415] GET LINK TO NEXT RD JUMPE TA,CLNFIL ; [415] THERE IS NO MORE ALL DONE HRLZM TA,RPTRHT ; [415] SAVE LINK HEADING LINK FOR NEW RD ADDI TA,(TB) ; [415] CONVERT LINK TO REAL JRST CLRRD ; [415] DO NEXT RD ; DO THE LOWEST LEVEL SUM ID IN THIS REPORT ; TC HAS THE HLDTAB LINK TO START PROCESSING, RPTCID HAS THE LEVEL NUMBER RPTDO: HRRZ TA,HLDLOC ; [415] GET REAL ADDRESS ADDI TA,(TC) ; [415] MOVEM TA,CURHLD ; [415] MAKE IT CURRENT HLDTAB POINTER LDB TB,HL.FCD ; [415] ALREADY DONE? TRNE TB,400 ; [415] IF SO POPJ PP, ; [415] EXIT NOW JRST CLHSCT ; [415] DO TYPE 14 (BUILD SUM COUNTER) RPTDOL: HRRZ TA,CURHLD ; [415] GET CURRENT HLDTAB POINTER HRRZ TB,HLDNXT ; [415] END OF HLDTAB? CAILE TA,(TB) ; [415] CHECK POPJ PP, ; [415] RETURN LDB TC,HL.FCD ; [415] GET FULL HL CODE LDB TB,HLSCOD ; [415] GET MOST SIGN DIGIT OF HL.COD CAIN TB,%HLDCD ; [415] SEE ALREADY DONE? JRST RPTDOE ; [415] YES GO TO NEXT ONE CAIN TC,%HL.SC ; [415] ANOTHER SUM ID JRST RPTSCT ; [415] YES,CHECK IF OKAY CAIN TC,%HL.SL ; [415] SUM ID LEFT HALF? JRST CLHSML ; [415] YES DO IT CAIN TC,%HL.SR ; [415] SUM ID RIGHT HALF? JRST CLHSMR ; [415] YES DO IT CAIN TC,%HL.UP ; [415] SUM UPON? JRST CLHUPN ; [415] YES DO IT POPJ PP, ; [415] SOME OTHER CODE RETURN RPTST1: LDB TB,TC ; [415] SEE IF ALREADY STORED SKIPE TB ; [415] PUSHJ PP,CLHDUP ; [415] YES GIVE DUPLICATE ERROR DPB TE,TC ; [415] STORE THE NEW ITEM RPTDOE: MOVE TA,CURHLD ; [415] GET BACK CURRENT HLDTAB POINTER MOVEI TC,%HLDCD ; [415] MARK AS DPB TC,HLMCOD ; [415] DONE LDB TB,HL.QAL ; [415] GET NNUMBER OF QUALIFIERS MOVEM TB,CTR ; [415] KEEP TRACK OF THEM ADDI TB,5 ; [415] GO FIND NEXT HLDTAB LSH TB,-1 ; [415] POINTER ADDM TB,CURHLD ; [415] JRST RPTDOL ; [415] GO DO THE NEXT ITEM RPTSCT: LDB TB,HL.RD ; [415] IS THIS SAME RD? CAME TB,RPTRPT ; [415] POPJ PP, ; [415] EXIT LDB TB,HL.CID ; [415} IS IT SAME CAME TB,RPTCID ; [415] ID LEVEL? POPJ PP, ; [415] NO ,EXIT JRST CLHSCT ; [415] GO PROCESS SUM CTR ;STORE INDIVIDUAL LINKS IN APPROPRIATE TABLES IFN RPW,< CLHSML: SKIPGE RPWERR## ; [335] FATAL REPORT GENERATOR ERROR JRST RPTDOE ; [415] CANT GO ON PUSHJ PP,CLNHLQ ; [415] PICK UP ANY QUALIFIERS SUB TA,FILLOC ADD TA,RPWLOC## PUSHJ PP,SUMCK ;SEE THAT ITEM IS A SUM CTR PUSHJ PP,CLHSME ;ERROR HRLM TE,(TA) ;STORE DATAB LINK TO SUM ADDEND IN LEFT HALF JRST RPTDOE ; [415] RETURN CLHSMR: SKIPGE RPWERR ; [335] FATAL REPORT GENERATOR ERROR JRST RPTDOE ; [415] CANT GO ON PUSHJ PP,CLNHLQ ; [415] PICK UP ANY QUALIFIERS SUB TA,FILLOC ADD TA,RPWLOC PUSHJ PP,SUMCK ;SEE THAT ITEM IS A SUM CTR PUSHJ PP,CLHSME ;ERROR HRRM TE,(TA) ;STORE DATAB LINK TO SUM ADDEND IN RIGHT HALF JRST RPTDOE ; [415] RETURN CLHSME: HRRZI DW,E.358 ;NOT A TYPE DETAIL OR CONTROL-FOOTING JRST CLHBA1 CLHUPN: PUSHJ PP,CLNHLQ ; [415] PICK UP ANY QUALIFIERS SUB TA,FILLOC ;NOT FILTAB REF. BUT RPWTAB ADD TA,RPWLOC PUSH PP,TE ;SAVE AC'S PUSH PP,TA ;SAVE RPWTAB PTR HRRZI TA,(TE) ;MAKE PTR TO DATA ITEM PUSHJ PP,LNKSET## LDB TB,DA.RPW ;GET LINK TO CORRESP RPW ITEM HRRZ TA,RPWLOC ;MAKE PTR TO RPWTAB ENTRY ADDI TA,(TB) LDB TB,RW.TYP## ;MUST BE TYPE DETAIL CAIE TB,%RG.DE PUSHJ PP,CLHUPE ;IT'S NOT SETO TB, ;SET REFERENCED-BY-SUM-UPON BIT DPB TB,RW.RSU## POP PP,TA ;GET BACK AC'S POP PP,TE MOVE TC,RW.UPN## ;GET PTR TO UPON CLAUSE LINK JRST RPTST1 ; [415] PUT LINK IN RPWTAB 'UPON' CLHUPE: HRRZI DW,E.364 ;?SUM UPON MUST REF. TYPE DETAIL JRST CLHBA1 ;MAKE A SUM COUNTER FOR DATAB ITEM CLHSCT: SKIPGE RPWERR ; [335] FATAL REPORT GENERATOR ERROR JRST RPTDOE ; [415] CANT GO ON LDB TE,HL.LNK ;GET DATAB LINK PUSHJ PP,SUMCTR ;GIVE ITEM A SUM-CTR JRST RPTDOE ; [415] RETURN ; GROUP INDICATE ITEM HAVING A VALUE CLAUSE- CONVERT TO ITEM WITH ; SOURCE CLAUSE BY CREATING A DATAB ITEM WITH A VALUE CLAUSE ; THEN THIS NEWLY CREATED ITEM BECOMES THE SOURCE ITEM ; FOR THE ORIGINAL ONE CLHGIT: SKIPGE RPWERR ; [335] FATAL REPORT GENERATOR ERROR JRST CLNHL9 ; [335] CANT GO ON LDB TA,HL.LNK ; [315] GET THE ORIG DATAB ITEM WITH THE VALUE CLAUSE HRRZM TA,SAVDAT## ; [315] SAVE IT MOVEI TYPE,1000 ; [315] SET TYPE TO USER-NAME FOR NEW ITEM PUSHJ PP,RPWDAT## ; [315] GO CREATE NEW ITEM USING THE CURRENT ONE ON PUSH-DOWN STACK FOR PARAMETERS MOVE TA,CURHLD ; [315] GET BACK HLDTAB POINTER LDB TB,HL.NAM ; [315] GET THE VALUE LINK ADDI TB,B20 ; [315] POINT IN LITAB TABLE ID MOVE TA,CURDAT ; [315] GET ADDRESS OF NEWLY CREATED ITEM DPB TB,DA.VAL## ; [315] STORE VALUE PTR TO THIS NEW ITEM PUSHJ PP,D54.NJ## ; [315] SET ASIDE RUN TIME SPACE FOR NEW ITEM WTIH ITS VALUE HRRZ TA,SAVDAT ; [315] GET BACK ORIGINAL DATAB ITEM LDB TB,DA.RPW ; [315] GET ORIGNAL REPORT ITEM POINTER HRRZ TA,RPWLOC ; [315] CONVERT LINKAGE TO REAL ADDI TA,(TB) ; [315] ADDRESS HLRZ TB,CURDAT ; [315] GET LINK ADDRESS OF NEW ITEM DPB TB,RW.SLK ; [315] AND MAKE IT THE SOURCE ITEM FOR REPORT ITEM JRST CLNHL9 ; [315] GO TO NEXT HLDTAB ITEM ;CK THAT SUM-ID IS A SUM-CTR ;IF NOT, MAKE ONE FOR THE ITEM SUMCK: PUSH PP,TA ;SAVE CRUCIAL AC'S MOVEM TE,(SAVPTR) HRRZI TA,(TE) ;MAKE PTR TO DATA ITEM PUSHJ PP,LNKSET LDB TB,DA.SCT## ;IS THIS A SUM-CTR? JUMPE TB,SUMCKB ;NO DPB TB,DA.RBS## ;YES, SET REF'D BY SUM BIT JRST SUMCKX SUMCKB: LDB TB,DA.RPW## ;NO, GET PTR TO CORRESP RPW ENTRY JUMPE TB,SUMCKA ;MUST BE A SOURCE ITEM HRRZ TA,RPWLOC ADDI TA,(TB) LDB TB,RW.TYP ;GET TYPE CAIN TB,%RG.CF ;CONTROL-FOOTING? JRST SUMCKS ;YES, MUST MAKE A SUM-CTR FOR IT JRST SUMCKE ;NOT A CF & NOT A SOURCE FOR DETAIL SUMCKA: LDB TB,DA.RDS## ;GET SOURCE FOR DETAIL BIT JUMPE TB,SUMCKE ;NOT ON DPB TB,DA.RBS ;SET REFERENCED BY SUM BIT JRST SUMCKX ;EXIT SUMCKS: HRRZ TE,(SAVPTR) ;MAKE A SUM-CTR FOR CF ITEM PUSHJ PP,SUMCTR HRRZI TA,(TB) ;GET PTR TO SUM CTR SETO TB, ;SET REF'D BY SUM BIT DPB TB,DA.RBS JRST SUMCKY SUMCKX: MOVE TE,(SAVPTR) ;RESTORE TE SUMCKY: AOS -1(PP) ;SKIP RETURN SUMCKE: POP PP,TA ;RESTORE TA POPJ PP, ;MAKE A SUM-CTR FOR A DATA ITEM (WHOSE LINK IS IN TE) SUMCTR: HRRZ TA,DATLOC ;MAKE LINK & PTR TO ITEM'S DATAB ENTRY ADDI TA,(TE) HRLI TA,(TE) SUBI TA,TC.DAT## ;SUBTRACT TABLE CODE BITS MOVEM TA,CURDAT## PUSHJ PP,RPWNAM## ;MAKE A NAME FOR THE GROUP ITEM ("RWITM...") MOVE TA,[CD.DAT,,SZ.DAT] ;MAKE A DATAB ENTRY FOR SUM CTR PUSHJ PP,GETENT## MOVEM TA,(SAVPTR) ;SAVE LINK & PTR TO SUM CTR DATAB ENTRY HRRZ TA,CURDAT ;MAKE PTR TO CORRESP RPWTAB ENTRY LDB TB,DA.RPW HRRZ TA,RPWLOC ADDI TA,(TB) HLRZ TB,(SAVPTR) ;PUT SUM CTR DATAB LINK IN RPWTAB DPB TB,RW.SLK## HRRZ TA,CURDAT ;GET GROUP ITEMS SAME NAME LINK LDB TB,DA.SNL## SETZ TC, ;& PUT 0 WHERE IT WAS DPB TC,DA.SNL SETO TC, ;& SET FAKE NAME BIT ON GP ITEM DPB TC,DA.FAK## LDB TD,DA.LNC## ;ALSO GET GROUP ITEM'S LINE POSITION LDB TE,DA.INS## ;& SIZE LDB TC,DA.NDP## ;& # OF DECIMAL PLACES HRRZ TA,(SAVPTR) ;MOVE GROUP ITEMS SNL TO SUM CTRS SNL SLOT DPB TB,DA.SNL DPB TD,DA.LNC ;PUT GP ITEM'S LINE POS. IN SUM CTR ENTRY DPB TE,DA.INS ; " SIZE DPB TE,DA.EXS## DPB TC,DA.NDP ; " # DEC. PLACES HRRZ TA,CURDAT ; [315] GET DATA ITEM ADDRESS LDB TB,DA.FAL ; [315] GET IS FATHER LDB TC,DA.POP## ; [315] AND ITS POINTER HRRZ TA,(SAVPTR) ; [315] GET SUM-CTR ITEM DPB TB,DA.FAL ; [315] COPY ORIGINAL FATHER DPB TC,DA.POP ; [315] AND ITS LINK INTO IT HRRZ TD,EAS1PC## ;GET NEXT FREE DATA LOC DPB TD,DA.LOC## ;STORE ASSIGNED LOC AOJ TD, ;INCREMENT FOR 1-WORD SUM-CTR CAILE TE,^D10 ;SUM CTR MORE THAN 10 DIGITS? AOJ TD, ;YES, NEED A 2-WORD CTR MOVEM TD,EAS1PC ;& SAVE LAST USED HRRZI TB,%CL.NU ;SET NUMERIC CLASS IN DATAB DPB TB,DA.CLA HRRZI TB,%US.1C ;& 1-WORD COMP USAGE CAILE TE,^D10 ;[434] IS IT 2-WORD COMP HRRZI TB,%US.2C ;[434] YES DPB TB,DA.USG HRRZI TB,CD.DAT ;SET DATAB CODE DPB TB,[POINT 3,(TA),2] HRRZI TB,LVL.77 ;MAKE SUM-CTR LEVEL 77 DPB TB,DA.LVL## DPB TB,DA.PIC## ;SET PIC SEEN BIT DPB TB,DA.SGN ;& SIGNED BIT DPB TB,DA.SCT ;& SUM-CTR BIT DPB TB,DA.DEF## ;& DEFINED BIT HRRZ TB,NAMADR## ;PUT GROUP ITEMS DATAB LINK IN 'RWITM' NAMTAB ENTRY MOVE TA,CURDAT HLRM TA,(TB) LDB TC,DA.NAM## ;GET GP ITEMS NAMTAB LINK HLRZ TD,NAMADR ;& PUT LINK TO 'RWITM' IN ITS PLACE DPB TD,DA.NAM HRRZ TA,(SAVPTR) ;MOVE GP ITEMS NAMTAB LINK TO SUM CTR DPB TC,DA.NAM HLRZ TE,CURDAT ;NOW SUBSTITUTE SUM CTR FOR GP ITEM IN SNL CHAIN HRRZ TA,NAMLOC## ADDI TA,(TC) HRRZ TB,(TA) CAIN TB,(TE) JRST DA103X DA103L: HRRZI TC,(TB) ANDI TC,077777 HRRZ TA,DATLOC ADDI TA,(TC) HRRZ TB,(TA) CAIE TB,(TE) JRST DA103L DA103X: MOVE TB,(SAVPTR) HLRM TB,(TA) POPJ PP, >;END IFN RPW CLHDOC: SUB TA,FILLOC ;NOT A FILTAB REFERENCE ADD TA,DATLOC ;BUT A DATAB REFERENCE SETZ TC, DPB TC,DA.DLL## ;CLEAR DEPENDING AT LOWER LEVEL SINCE ITS NOT PUSHJ PP,CLHSUB ;GET PTR TO DATA ITEM SKIPE TBLOCK+4 ;UNDEFINED? JRST CLHDOX ;YES IFN ANS74,< LDB TB,DA.CLA ;CK CLASS OF ITEM CAIE TB,2 ;NUMERIC? PUSHJ PP,CLE264 ;NO LDB TB,DA.USG ;GET USAGE CAIE TB,%US.1C ;NO CONVERSION IF 1-WORD COMP CAIN TB,%US.IN ;OR INDEX JRST CLHDOD ;OK SETOB TB,RELKEY ;NO, SIGNAL CONVERSION REQUIRED EXCH TA,TBLOCK+1 DPB TB,DA.DCR## EXCH TA,TBLOCK+1 CLHDOD:> IFN ANS68,< LDB TB,DA.USG ;[164] GET USAGE CAIE TB,%US.1C ;[164] LEGAL ONLY IF 1-WORD COMP CAIN TB,%US.IN ;[164] OR INDEXED CAIA ;[164] OK PUSHJ PP,CLE347 ;[164] ERROR > LDB TB,DA.SUB## ;[1520][164] SEE IF SUBSCIPTED SKIPE TB ;[164] ILLEGAL IF SO PUSHJ PP,CLE275 ;[164] ERROR LDB TC,DA.DPR## ;DECIMAL PT. TO RIGHT? JUMPN TC,CLHDOX ;YES, OK LDB TB,DA.NDP ;[164A] NUMBER OF DECIMAL PLACES JUMPE TB,CLHDOX PUSHJ PP,CLE264 ;NOT AN INTEGER CLHDOX: MOVE TC,DA.DEP## ;GET DEP-FOR-OCC PTR JRST CLNSTO CLHKOC: TLZA TE,-1 ;0 = ASC. KEY FLAG CLHDKY: HRLI TE,400000 ;DESC. KEY FLAG SUB TA,FILLOC ADD TA,DATLOC MOVEM TE,(TA) ;PUT KEY LINK & FLAG IN DATAB ENTRY WORD JRST CLNHL9 IFN ISAM,< CLHSKY: PUSHJ PP,CLHLNK ; [300] SEE IF IN LINKAGE SECTION MOVE TC,FI.SKY## ;GET FILTAB SYMBOLIC KEY PTR JRST CLNSTO ; [300] STORE POINTER CLHRKY: PUSHJ PP,CLHLNK ; [300] SEE IF IN LINKAGE SECTION MOVE TC,FI.RKY## ;GET FILTAB RECORD KEY PTR JRST CLNSTO ; [300] STORE POINTER ;ALTERNATE KEY ENTRY IFN ANS74,< CLHAKY: HRRZ TA,CURHLD ;GET CURRENT HLDTAB PTR LDB TB,HL.LNK## ;LINK TO PLACE WHERE DATA LINK WANTED HRLZM TB,CURAKT## ;STORE CURRENT PTR ADD TB,AKTLOC## ;(THAT'S IN ALTERNATE KEY TABLE) MOVEI TA,(TB) ;GET ABS. LOC OF TABLE ENTRY DPB TE,AK.DLK## ;STORE DATAB LINK ;IF THIS IS FIRST ENTRY FOR THIS FILE, STORE FILTAB LINK TO THIS ; AKTTAB ENTRY LDB TA,AK.FLK## ;GET FILTAB LINK HRLZM TA,CURFIL## ;REMEMBER THAT ADD TA,FILLOC## ;GET ABS ADDR. LDB TC,FI.ALK## ;IS LINK ALREADY SETUP FOR THIS FILE? JUMPN TC,CLHAK1 ;YES HLRZ TC,CURAKT ;NO, MAKE IT POINT TO THIS ENTRY DPB TC,FI.ALK## ;MAKE SURE IT IS DEFINED IN A RECORD FOR THIS FILE ;LH (CURFIL) NOW CONTAINS THE FILTAB ENTRY OFFSET. CLHAK1: MOVE TA,TE ;GET LINK TO DATA ITEM PUSHJ PP,LNKSET ;LOOK AT DATAB ENTRY LDB TB,DA.DFS## ;IS IT DEFINED IN THE FILE SECTION? JUMPE TB,CLHAKE ;NO, GIVE ERROR CLHAK2: LDB TB,DA.DLL ;[1501] IS THERE A 'DEPENDING' CLAUSE? JUMPE TB,CLHK2A ;[1501] NO, NO PROBLEM HRRZI DW,E.612 ;[1501] YES, ERROR PUSHJ PP,CLHBA1 ;[1501] SET UP HLTAB LN,CP; CALL FATAL CLHK2A: LDB TB,DA.POP## ;FIND FILENAME LDB TD,[POINT 3,TB,20] ;GET TYPE CAIN TD,CD.FIL ;FILENAME? JRST CLHAK3 ;YES - SEE IF IT'S THE ONE MOVE TA,TB ;NOT AT TOP YET PUSHJ PP,LNKSET ;UP TO NEXT LEVEL.. JRST CLHK2A ;[1533] LOOP UNTIL WE GET TO FILE CLHAK3: HLRZ TA,CURFIL ;GET CURRENT FILE CAMN TA,TB ;SAME FILE? JRST CLNHL9 ;YES, GO ON ;NOT DEFINED IN THIS FILE--GIVE ERROR CLHAKE: HRRZI DW,E.379 ;"RECORD KEY NOT IN RECORD" HLRZ TA,CURFIL ADD TA,FILLOC## LDB LN,FI.LN ;POINT TO FILENAME LDB CP,FI.CP PUSHJ PP,FATAL## ;FATAL ERROR JRST CLNHL9 ;GO BACK FOR NEXT HLDTAB ENTRY >;END IFN ANS74 >;END IFN ISAM CLHLNK: MOVEM TA,TBLOCK+1 ; [300] SAVE STORAGE PTR SKIPE TBLOCK+4 ; [300] UNDEFINED ? POPJ PP, ; [300] YES RETURN PUSH PP,TE ; [300] SAVE ADDRESS OF KEY PUSHJ PP,CLHSUB ; [300] CHECK IF IN LINKAGE SECTION-FLAG IF SO POP PP,TE ; [300] RESTORE KEY ADDRESS POPJ PP, ; [300] RETURN ;ACTUAL/RELATIVE KEY CLHACK: MOVEM TA,TBLOCK+1 ; SAVE STORAGE PTR [264] SKIPE TBLOCK+4 ;UNDEFINED? JRST CLHACX ;YES MOVEM TA,CURFIL ;SAVE FILTAB PTR PUSHJ PP,CLHSUB ;GET USAGE OF DATA ITEM IFN ANS68,< MOVE TA,CURFIL ;RESTORE FILTAB PTR CAIE TB,%US.1C ;1-WORD COMP? PUSHJ PP,CLHBAD ;NO CAILE TC,^D10 ;10 DIGITS OR LESS? PUSHJ PP,CLHSIZ ;NO > IFN ANS74!FT68274,< PUSH PP,TE IFN FT68274,< ;[1427] PUSHJ PP,CLHSUB ;[1427] GET USAGE OF DATA ITEM > ;[1427] LDB TE,DA.SGN ;SEE IF SIGNED LDB TA,DA.NDP ;OR NOT INTEGER SKIPN TE SKIPE TA PUSHJ PP,CLHE40 ;SHOULD BE UNSIGNED INTEGER POP PP,TE MOVE TA,CURFIL ;RESTORE FILTAB PTR > IFN ANS74,< CAIN TB,%US.1C ;1-WORD COMP CAILE TC,^D10 CAIA ;NO JRST CLHACX ;OK DPB TE,FI.CKA## ;STORE REAL KEY SETOM RELKEY## ;SIGNAL CONVERSION REQUIRED MOVEI TE,AS.MSC## ;MARK AS MISC. FOR LATER INCR. TO %PARAM > CLHACX: MOVE TC,FI.ACK## ;ACT-KEY PTR JRST CLNSTO ;REPLACE THE HLDTAB LINKS IN THE FILE STATUS ENTRIES OF A FILE TABLE ; BY DATAB LINKS. ;ENTRY CONDITIONS: ; (TA) ABS ADR OF FILE TABLE. ; (TBLOCK+4) 0 IF THE ITEM IS UNIQUELY DEFINED. ; (TE) DATAB LINK. CLHERS: MOVE TB, FI.SPT## ;GET POINTER TO FILE STATUS LINKS. MOVEM TB, TBLOCK HRREI TB, -10 ;-MAXIMUM NUMBER OF LINKS. MOVEM TB, TBLOCK+1 HRRZ TB, CURHLD ;CURRENT HLDTAB ADDRESS. CLHER1: ILDB TC, TBLOCK ;GET A FILE STATUS LINK. JUMPE TC, CLHER2 ;IF ITS ZERO SKIP IT. LDB TD, [POINT 3,TC,20] ;GET THE TABLE CODE. CAIN TD, CD.DAT ;DATAB? JRST CLHER2 ;YES, SKIP IT. ADD TC, HLDLOC ;MAKE IT ABSOLUTE. CAIE TB, (TC) ;IS THIS THE ONE? (IT SHOULD BE.) JRST CLHER2 ;NO, NEXT LINK. ;FOUND THE LINK - NOW WHAT TO DO WITH IT. SKIPN TBLOCK+4 ;WAS THE NAME OK? JRST CLHER4 ;YES, GO CHECK IT OUT. SETZ TB, ;FLUSH THE LINK. DPB TB, TBLOCK JRST CLNHL9 ;GO LOOK AT THE NEXT HLDTAB ENTRY. CLHER2: AOSGE TBLOCK+1 ;ANY MORE LINKS? JRST CLHER1 ;YES, GO LOOK AT THE NEXT ONE. JRST CLNHL9 ;OTHERWISE GO LOOK AT THE NEXT HLDTAB ENTRY. ;COME HERE WHEN WE FIND A GOOD LINK. CLHER4: DPB TE, TBLOCK ;ASSUME THAT THE DATA IS GOOD. PUSH PP, TA ;BUT SAVE THE FILE TABLE ADDRESS ; JUST IN CASE IT ISN'T. HRRI TA, (TE) ;SET UP TO LOOK AT DATAB. LDB TB, LNKCOD## ;MAKE SURE IT'S DATAB. CAIE TB, CD.DAT JRST CLHE23 ;IT ISN'T - COMPLAIN. ANDI TA, 077777 ;GET OFFSET. ADD TA, DATLOC ;MAKE IT ABSOLUTE. ;SEE WHERE TO GO NEXT. MOVE TB, TBLOCK+1 JRST @.+11(TB) EXP CLHE4A ;DISPLAY. EXP CLHE4A ;DISPLAY. EXP CLHER9 ;INDEX. EXP CLHE4A ;DISPLAY. EXP CLHER9 ;INDEX. EXP CLHER9 ;INDEX. EXP CLHE4A ;DISPLAY. EXP CLHER9 ;INDEX. ;CHECK THINGS THAT ALL DISPLAY ITEMS MUST HAVE - NO SIGN, DECIMAL PLACES, ETC. ;MACROS TO MAKE LIFE EASIER. DEFINE AECK1 (FIELD, LOC)< LDB TB, FIELD'## JUMPN TB, LOC > DEFINE AECK2 (LOC, NUM)< LOC': MOVEI DW, E.'NUM JRST CLHE30 > CLHE4A: AECK1 DA.SGN,CLHE22 ;SIGNED? AECK1 DA.BWZ,CLHE21 ;BLANK WHEN ZERO? AECK1 DA.SUB,CLHE20 ;SUBSCRIPTED? AECK1 DA.EDT,CLHE19 ;EDITED? AECK1 DA.JST,CLHE18 ;JUSTIFIED? AECK1 DA.DFS,CLHE17 ;FILE SECTION? AECK1 DA.LKS,CLHE16 ;LINKAGE SECTION? AECK1 DA.NDP,CLHE15 ;DECIMAL PLACES? ;NOW CHECK THINGS SPECIFIC TO EACH ITEM. DEFINE AECK3 (SIZE, RTN) MOVE TB, TBLOCK+1 ;BET YOU THOUGHT I FORGOT ABOUT TBLOCK+1. JRST @.+11(TB) CLHER5: IFN ANS68,< AECK3 2,CLHER6 ;NUMERIC DISPLAY, 2 CHARS. > IFN ANS74,< AECK3 2,CLHE68 ;ALPHANUMERIC OR NUMERIC DISPLAY, 2 CHARS. > AECK3 12,CLHER6 ;NUMERIC DISPLAY, 10 CHARS. EXP KILL## ;INDEX, CAN'T GET HERE. AECK3 11,CLHER8 ;ALPHANUMERIC DISPLAY, 9 CHARS. EXP KILL## ;INDEX, CAN'T GET HERE. EXP KILL## ;INDEX, CAN'T GET HERE. AECK3 36,CLHER8 ;ALPHANUMERIC DISPLAY, 30 CHARS. ;CHECK FOR NUMERIC DISPLAY. CLHER6: LDB TC,DA.CLA ;GET CLASS. CAIE TC,%CL.NU ;NUMERIC? JRST CLHE14 ;NO. CLHER7: LDB TC,DA.USG ;GET USAGE. CAIE TC,%%US ;SKIP IF NO USAGE ASSIGNED. CAILE TC,%US.DS ; FALL IF NOT SOME KIND OF DISPLAY. JRST CLHE13 ;IT ISN'T DISPLAY LDB TC,DA.EXS ;GET ITS SIZE. LDB TB,[POINT 11,CLHER5+10(TB),10] ;GET THE RIGHT SIZE. CAIE TB,(TC) ;SAME SIZE? JRST CLHE12 ;NO. ;EVERYTHING CHECKS OUT. CLHE7E: POP PP,TA ;RESTORE THE STACK. JRST CLNHL9 ;GO LOOK FOR MORE HLDTAB ITEMS. IFN ANS74,< ;CHECK FOR EITHER NUMERIC OR ALPHANUMERIC CLHE68: LDB TC,DA.CLA ;GET THE CLASS CAIN TC,%CL.NU ;NUMERIC? JRST CLHER7 ;YES. ;NO, TEST FOR ALPHANUMERIC > ;CHECK FOR ALPHANUMERIC. CLHER8: LDB TC,DA.CLA ;GET THE CLASS. CAIE TC,%CL.AN ;SKIP IF ALPHANUMERIC. JRST CLHE11 ;NOPE - ERROR. JRST CLHER7 ;GO LOOK AT USAGE. ;CHECK FOR INDEX. CLHER9: LDB TC,DA.USG ;GET USAGE. CAIN TC,%US.IN ;INDEX? JRST CLHE7E ;YES. ;FALL INTO ERROR CODE.. ;COME HERE ON ERRORS. AECK2 CLHE10,551 ;USAGE MUST BE INDEX. AECK2 CLHE11,552 ;MUST BE ALPHANUMERIC. AECK2 CLHE12,553 ;WRONG SIZE. AECK2 CLHE13,554 ;MUST BE DISPLAY AECK2 CLHE14,555 ;MUST BE NUMERIC. AECK2 CLHE15,556 ;CAN'T HAVE DECIMAL PLACES. AECK2 CLHE16,557 ;CAN'T BE IN LINKAGE SECTION. AECK2 CLHE17,558 ;CAN'T BE IN FILE SECTION. AECK2 CLHE18,559 ;CAN'T BE JUSTIFIED. AECK2 CLHE19,560 ;CAN'T BE EDITED. AECK2 CLHE20,561 ;CAN'T BE SUBSRCRIPTED. AECK2 CLHE21,562 ;BLANK WHEN ZERO NOT ALLOWED. AECK2 CLHE22,563 ;CAN'T BE SIGNED. AECK2 CLHE23,564 ;IT ISN'T DATAB!!! ;PUT OUT AN ERROR MSG. CLHE30: HRRZ TA, CURHLD ;GET THE HLDTAB ENTRY. LDB LN, HL.LN## ;SET UP FOR ERROR. LDB CP, HL.CP## PUSHJ PP, FATAL## ;FATAL ERROR. POP PP, TA ;GET FILE TABLE LOC BACK. SETZ TB, ;CLEAR THE LINK IN FILTAB. DPB TB, TBLOCK JRST CLNHL9 ;AND GO LOOK FOR MORE. IFN ANS74!FT68274,< CLHE40: HRRZI DW,E.723 HRRZ TA,CURHLD ;GET THE HLDTAB ENTRY. LDB LN,HL.LN## ;SET UP FOR ERROR. LDB CP,HL.CP## PJRST WARN## > ;MAKE INDEX ENTRY IN DATAB & LINK ITEM INDEXED TO IT CLHIDX: LDB TB,HL.NAM## ;STASH HLDTAB INFO IN TBLOCK MOVEM TB,TBLOCK ;NAMTAB LINK OF INDEX LDB TB,HL.LNK MOVEM TB,TBLOCK+1 ;DATAB LINK OF INDEXED ITEM LDB TB,HL.LNC## MOVEM TB,TBLOCK+2 ;LINE&CHAR POS. OF INDEX HRRZ TA,TBLOCK ;LOOK FOR ITEM ALREADY IN DATAB HRRZI TB,CD.DAT PUSHJ PP,FNDLNK## JRST CLHID2 ;NONE -- MAKE ONE HRRZI TA,(TB) ;GET DATAB LINK HLRM TB,TBLOCK+4 ;SAVE A COPY LDB TB,DA.IDX## ;IS THIS AN INDEX? JUMPN TB,CLHID3 ;[770] YES HRRZI DW,E.297 ;ILLEGAL INDEX LDB LN,[POINT 13,TBLOCK+2,28] LDB CP,[POINT 7,TBLOCK+2,35] PUSHJ PP,FATAL## MOVEI TB,1 ;[770] GET A DUMMY DATA ITEM HRRZ TA,CURHLD ;[770] CHANGE NAMTAB LINK OF INDEX ITEM DPB TB,HL.NAM ;[770] IN HLDTAB TO DATAB LINK JRST CLNHL9 CLHID2: MOVE TA,[XWD CD.DAT,SZ.DAT] ;MAKE INDEX PUSHJ PP,GETENT HLRZM TA,TBLOCK+4 ;SAVE LINK TO INDEX MOVE TB,TBLOCK ;GET NAMTAB LINK OF INDEX DPB TB,DA.NAM HRRZI TB,CD.DAT DPB TB,[POINT 3,(TA),2] HRRZI TB,LVL.77 DPB TB,DA.LVL HRRZI TB,%CL.NU DPB TB,DA.CLA## HRRZI TB,5 DPB TB,DA.INS DPB TB,DA.EXS SETO TB, DPB TB,DA.SGN DPB TB,DA.PIC DPB TB,DA.IDX ;SET INDEX BIT HRRZI TB,%US.IN DPB TB,DA.USG## MOVE TB,TBLOCK+2 ;SAVE LINE & CHAR POS. DPB TB,DA.LNC HRRZ TB,EAS1PC ;ALLOCATE WORD IN AS1FIL FOR INDEX DPB TB,DA.LOC HRRZI TB,44 DPB TB,DA.RES SETO TB, DPB TB,DA.DEF AOS EAS1PC LDB TB,DA.NAM HRRI TA,(TB) PUSHJ PP,PUTLNK## CLHID3: HRRZ TA,CURHLD ;CHANGE NAMTAB LINK OF INDEX ITEM MOVE TB,TBLOCK+4 ; IN HLDTAB TO DATAB LINK DPB TB,HL.NAM JRST CLNHL9 CLHVID: MOVEM TA,TBLOCK+1 ;[152] SAVE STORAGE PTR SKIPE TBLOCK+4 ;UNDEFINED? JRST CLHVIX ;YES PUSHJ PP,CLHSUB ;GET USAGE OF DATA ITEM CAIE TB,%%US ;USAGE MUST BE DISPLAY CAILE TB,%US.DS PUSHJ PP,CLHBAD ;WRONG USAGE CAIE TC,^D9 ;9 CHARS? PUSHJ PP,CLHSIZ ;NO CLHVIX: MOVE TC,FI.VID## ;VAL-OF-ID PTR JRST CLNSTO CLHVDW: MOVEM TA,TBLOCK+1 ;[152] SAVE STORAGE PTR SKIPE TBLOCK+4 ;UNDEFINED? JRST CLHVDX ;YES PUSHJ PP,CLHSUB ;GET USAGE OF DATA ITEM CAIE TB,%%US ;MUST BE DISPLAY CAILE TB,%US.DS ;SKIP IF IT IS PUSHJ PP,CLHBAD ;WRONG USAGE CAIE TC,6 ;6 DIGITS? PUSHJ PP,CLHSIZ ;NO CLHVDX: MOVE TC,FI.VDW## ;VAL-OF-DATE-WRITTEN PTR JRST CLNSTO CLHVPP: MOVEM TA,TBLOCK+1 ;[152] SAVE STORAGE PTR SKIPE TBLOCK+4 ;UNDEFINED? JRST CLHVPX ;YES PUSHJ PP,CLHSUB ;GET USAGE OF DATA ITEM CAIE TB,%US.1C ;1-WORD COMP? PUSHJ PP,CLHBAD ;NO CAILE TC,^D10 ;10 DIGITS OR LESS? PUSHJ PP,CLHSIZ ;NO CLHVPX: MOVE TC,FI.VPP## ;VAL-OF-PROJ-PROG PTR CLNSTO: MOVE TA,TBLOCK+1 ;GET BACK STORAGE PTR CLNST1: LDB TB,TC ;SEE IF ITEM ALREADY STORED JUMPE TB,CLNST2 PUSHJ PP,CLHDUP ;YES, DUPLICATE CLAUSE CLNST2: DPB TE,TC ;NO, STORE ITEM JRST CLNHL9 ;GO BACK FOR NEXT HLDTAB ENTRY CLHLFL: SKIPE TBLOCK+4 ;UNDEFINED? JRST CLHLFX ;YES PUSHJ PP,CLHSUB ;GET USAGE OF DATA ITEM CAIE TB,%US.1C ;1-WORD COMP? PUSHJ PP,CLHBAD ;NO CAILE TC,^D10 ;10 DIGITS OR LESS? PUSHJ PP,CLHSIZ ;NO MOVE TA,TBLOCK+1 ;GET BACK STORAGE PTR CLHLFX: HRLM TE,(TA) ;STORE DATAB LINK JRST CLNHL9 ;GO BACK FOR NEXT HLDTAB ENTRY CLHHFL: SKIPE TBLOCK+4 ;UNDEFINED? JRST CLHHFX ;YES PUSHJ PP,CLHSUB ;GET USAGE OF DATA ITEM CAIE TB,%US.1C ;1-WORD COMP? PUSHJ PP,CLHBAD ;NO CAILE TC,^D10 ;10 DIGITS OR LESS? PUSHJ PP,CLHSIZ ;NO MOVE TA,TBLOCK+1 ;GET BACK STORAGE PTR CLHHFX: HRRM TE,(TA) ;STORE DATAB LINK JRST CLNHL9 ;GO BACK FOR NEXT HLDTAB ENTRY CLHSUB: MOVEM TA,TBLOCK+1 ;SAVE STORAGE PTR HRRZ TA,CURHLD ;[162] GET HLDTAB CODE LDB TC,HL.COD ;[162] TO TC MOVE TA,TE ;GET ITEM DATAB LINK ANDI TA,77777 ;MAKE DATAB PTR ADD TA,DATLOC## LDB TB,DA.LKS## ;[162] GET LINKAGE SECTION FLAG CAIE TC,15 ;[162] IF FLAG ON AND CODE IS SYM-KEY CAIG TC,6 ;[162] ACT-KEY, FIL-LIM, VAL-OF-ID, DW OR PPN JUMPN TB,CLHLER ;[162] GIVE ERROR MESSAGE CLHSU2: LDB TB,DA.USG ;[162] GET USAGE LDB TC,DA.EXS ;& SIZE POPJ PP, CLHLER: PUSH PP,TA ;[162] SAVE DATAB PTR HRRZI DW,E.493 ;[162] NOT ALLOWED IN LINKAGE SECT. PUSHJ PP,CLHBA1 ;[162] COMPLAIN POP PP,TA ;[162] RESTORE JRST CLHSU2 ;[162] CONTINUE CLHBAD: HRRZI DW,E.373 ;WRONG USAGE CLHBA1: PUSH PP,TA ;[164] SAVE DATA-POINTER HRRZ TA,CURHLD ;HLDTAB ADDR LDB LN,HL.LN## ;GET LINE POSITION LDB CP,HL.CP## PUSHJ PP,FATAL ;GIVE ERROR MESSAGE MOVEI TE,B20+1 ;AIM AT DUMMY DATAB ENTRY POP PP,TA ;[164] RESTORE DATA-POINTER POPJ PP, CLHDUP: HRRZI DW,E.16 ;DUPLICATE CLAUSE MESSAGE JRST CLHBA1 CLHSIZ: HRRZI DW,E.340 ;WRONG SIZE JRST CLHBA1 CLE264: HRRZI DW,E.264 ;WRONG CLASS JRST CLHBA1 CLE275: HRRZI DW,E.275 ;[164] NO SUBSCRIPTING ALLOWED JRST CLHBA1 ;[164] IFN ANS68,< CLE347: HRRZI DW,E.347 ;[164] DEPEND ITEM MUST BE COMP JRST CLHBA1 ;[164] > CLNFIL: MOVE TA,AS2BUF## ;SET MOVEM TA,.JBFF## ; UP OUTBUF AS2,2 ; AS2FIL MOVE TA,FILLOC CAMN TA,FILNXT## JRST CLNCON ;CLEAN UP CONTAB LITERALS HRRZI TA,CD.FIL*1B20+1 CLNC: HRLZM TA,CURFIL## PUSHJ PP,LNKSET HRRM TA,CURFIL LDB TB,FI.DRL ;ANY DATA RECORD? JUMPN TB,CLNC0 ;YES IFN RPW,< LDB TB,FI.RPG## ;NO - REPORT FILE? JUMPN TB,CLNCRP ;YES > MOVEI TB,B20+1 ;NO, AIM AT DUMMY ENTRY DPB TB,FI.DRL LDB TB,FI.FDD## ;IS THERE ANY FD? JUMPE TB,CLNC0 ;NO, THAT'S WHY WE DIDN'T FIND A DATA RECORD. ; DON'T GIVE THIS ERROR AND THAT ONE TOO. HRRZI DW,E.38 ;?NO DATA RECORD LDB LN,FI.FLN## ;POINT TO FD LDB CP,FI.FCP## PUSHJ PP,FATAL JRST CLNC0 ;CONTINUE CLNCRP: IFN RPW,< PUSHJ PP,RPWNAM ;MAKE A NAME FOR REPORT RECORD MOVE TA,[CD.DAT,,SZ.DAT] PUSHJ PP,GETENT MOVEI TB,%US.D7 ;DISPLAY-7 USAGE IN CORE DPB TB,DA.USG MOVEI TB,^D132 ;RECORD SIZE = 132 CHARS. DPB TB,DA.INS DPB TB,DA.EXS MOVEI TB,^D36 ;BYTE RESIDUE DPB TB,DA.RES MOVEI TB,1 ;LEVEL 01 DPB TB,DA.LVL DPB TB,DA.PIC ;SAY PIC SEEN DPB TB,DA.DFS## ;DEFINED IN FILE SECTION DPB TB,DA.DRC## ;DATA RECORD DPB TB,DA.DEF ;SAY DEFINED DPB TB,DA.FAK ;SAY FAKE NAME DPB TB,DA.FAL## ;SET FATHER LINK BIT (FILE IS FATHER) HLRZ TB,NAMADR ;STORE NAMTAB LINK TO DATA ENTRY DPB TB,DA.NAM MOVEI TB,%CL.AN ;ALPHANUMERIC CLASS DPB TB,DA.CLA HLRZ TB,CURFIL ;FILE = FATHER LINK DPB TB,DA.BRO## HRRZ TB,NAMADR ;PUT LINK TO DATA ENTRY IN NAMTAB HLRM TA,(TB) MOVS TC,TA ;LINK FILE TO NEW DATA RECORD HRRZ TA,CURFIL DPB TC,FI.DRL MOVEI TB,^D132 ;RECORD SIZE DPB TB,FI.MRS## MOVEI TB,%RM.7B ;ASCII RECORDING MODE DPB TB,FI.ERM## DPB TB,FI.IRM## MOVEI TB,1 ;RECORDING MODE DECLARED DPB TB,FI.RM2## LDB TB,FI.LNC## ;GET FILE DEFINITION LINE POSITION MOVS TA,TC ;GET BACK PTR TO DATAB ENTRY DPB TB,DA.LNC ;RECORD DEFN POSITION = FILE DEF. POS. > CLNC0: HRRZ TA,CURFIL IFN ANS74,< ;SET DEFAULT ACCESS MODE ; THIS WILL INSURE THAT ALL CODE GENERATION AND PHASE D PROCESSING ;TREATS UNSPECIFIED ACCESS MODE AS IF THE USER HAD SAID "ACCESS MODE ;IS SEQUENTIAL". LDB TB,FI.FAM## ;FILE ACCESS MODE CAIE TB,%FAM.U ;UNSPECIFIED? JRST .+3 ;NO, USE VALUE GIVEN MOVEI TB,%FAM.S ; DEFAULT TO SEQUENTIAL ALWAYS DPB TB,FI.FAM## ; NOW CHECK FOR MISSING "ORGANIZATION" CLAUSE. THIS WILL DEFAULT ;TO SEQUENTIAL,DI UNLESS WE CAN GUESS THAT THE USER MEANT SOMETHING ELSE. ;HE SPECIFIED ALTERNATE KEYS WE WILL COMPLAIN AND SET THE ORGANIZATION TO "INDEXED". LDB TB,FI.ORG ;GET ORGANIZATION CAIE TB,%%ACC ;UNSPECIFIED? JRST CLNC1 ;NO, SKIP THIS LDB TC,FI.AKS## ;WERE ALTERNATE KEYS SPECIFIED? JUMPN TC,CLNC0A ;YES, GIVE WARNING & SET TO "INDEXED" LDB TC,FI.RKY ;DO WE HAVE A RECORD KEY? JUMPN TC,CLNC0I ;YES, THEN ASSUME "INDEXED" LDB TC,FI.ACK ;DO WE HAVE A RELATIVE KEY? JUMPN TC,CLNC0R ;YES, THEN ASSUME "RELATIVE" LDB TC,FI.FAM ;GET FILE ACCESS MODE CAIN TC,%FAM.S ;SEQUENTIAL? JRST CLNC0S ;YES, MAKE ORGANIZATION SEQUENTIAL MOVEI DW,E.205 ;MUST BE REL OR INDEX ORG MOVEI TB,%ACC.S ;BUT MAKE IT SEQUENTIAL SINCE WE DON'T KNOW WHICH JRST CLNC0E CLNC0R: MOVEI DW,E.743 ;MUST BE RELATIVE IF RECORD KEY SEEN MOVEI TB,%ACC.R ;SET IT JRST CLNC0E CLNC0A: SKIPA DW,[E.736] ;ALTERNATE KEYS ONLY ALLOWED WITH INDEXED FILES CLNC0I: MOVEI DW,E.744 ;MUST BE INDEXED IF RECORD KEY SEEN MOVEI TB,%ACC.I ;SET TO DEFAULT "INDEXED" CLNC0E: DPB TB,FI.ACC## LDB LN,FI.LN## ;POINT TO "SELECT" CLAUSE LDB CP,FI.CP## PUSHJ PP,FATAL ;PRESERVES TA JRST CLNC1 CLNC0S: MOVEI TB,%ACC.S ;SET TO DEFAULT "SEQUENTIAL" DPB TB,FI.ORG CLNC1: >;END IFN ANS74 LDB TB,FI.NDV## ;NUMBER OF DEVICES JUMPLE TB,PFL ;NONE MOVEM TB,NDEV## SETZM (SAVPTR) ;CLR FLAG CAIE TB,1 ;ONLY ONE DEVICE NAMED? JRST CLNC2 ;NO, FORGET THIS STUFF IFN ANS68, LDB TC,FI.ACC## ;INDEXED? IFN ANS74, LDB TC,FI.ORG## CAIE TC,%ACC.I JRST CLNC2 ;NO SETOM (SAVPTR) ;YES, SET FLAG DPB TC,FI.NDV ;SAY 2 DEVICES CLNC2: LDB TB,FI.VAL## JUMPE TB,PFL ;LINK IS NULL HRLZM TB,CURVAL## HRRZ TA,TB PUSHJ PP,LNKSET HRRM TA,CURVAL PUSHJ PP,GETTAG## HRRZ TA,CURFIL DPB CH,FI.VAL PUSHJ PP,PUTTAG MOVE TA,CURVAL ;SAVE CURVAL IN CASE WE NEED SAME DEV TWICE MOVEM TA,1(SAVPTR) PDEV: SETZ TA, PUSHJ PP,PUTVAL AOSE (SAVPTR) ;INDEXED FILE WITH ONLY ONE DEVICE? JRST PDEV2 ;NO MOVE TA,1(SAVPTR) ;YES, REPEAT SAME DEVICE MOVEM TA,CURVAL JRST PDEV PDEV2: SOSLE NDEV JRST PDEV HRRZ TA,CURFIL PFL: IFN ANS68,< LDB TB,FI.NFL## JUMPLE TB,CHID ;NO FILE LIMITS ASH TB,1 MOVEM TB,CFLM## ADDI TA,SZ.FIL HRLI TA,442200 MOVEM TA,PNTS## PFL1: ILDB TA,PNTS SETZ TE, JUMPE TA,PFCNT LDB TB,[POINT 3,TA,20] CAIE TB,CD.VAL JRST PFC1 PUSHJ PP,GETTAG MOVEM CH,TBLOCK+12 PUSHJ PP,PUTTAG HRLZM TA,CURVAL PUSHJ PP,LNKSET HRRM TA,CURVAL HRRZI TA,1 PUSHJ PP,PUTVAL MOVE TE,TBLOCK+12 PFCNT: DPB TE,PNTS PFC1: SOSLE CFLM JRST PFL1 > IFN ANS74,< ;HERE FOR LINAGE-COUNTER PLC: LDB TB,FI.LCP## JUMPE TB,CHID ;NO LINAGE-COUNTER FOR THIS FILE MOVE TB,[[SIXBIT /LINAGE:COUNTER/],,NAMWRD##] BLT TB,NAMWRD+2 SETZM NAMWRD+3 SETZM NAMWRD+4 ;SETUP NAME PUSHJ PP,TRYNAM## HALT ;MUST BE THERE! MOVE TB,(TA) ;GET TYPE HLLZ TA,TA ;ASSUME FIRST TIME TLO TA,AS.DAT## ;TURN ON DATAB BIT PUSH PP,TA ;SAVE POINTER TO NAMTAB TLNN TB,NAMRSV/1000000 ;FIRST TIME = RESERVED WORD HRRM TB,0(PP) ;NO, SAVE CURRENT DATAB MOVE TA,[CD.DAT,,SZ.DAT+SZ.DOC+SZ.MSK] PUSHJ PP,GETENT ;GET SPACE FOR IT POP PP,(TA) ;SAVE POINTER TO NAMTAB HLRZ TB,CURFIL ;GET PTR. TO FILTAB DPB TB,DA.POP MOVEI TB,%US.1C ;MAKE IT 1-WORD COMP DPB TB,DA.USG MOVEI TB,%CL.NU ;AND NUMERIC DPB TB,DA.CLA SETO TB, DPB TB,DA.FAL ;LINK IS TO FATHER DPB TB,DA.DEF ;DEFINED MOVEI TB,^D10 ;MAX. SIZE DPB TB,DA.EXS ;EXTERNAL SIZE DPB TB,DA.INS ;INTERNAL SIZE PUSH PP,TA ;SAVE LINK PUSHJ PP,TRYNAM ;GET NAME LINK AGAIN JFCL POP PP,TB HLRZM TB,(TA) ;CHANGE TO DATAB ENTRY HRRZ TA,CURFIL HLRZ TB,TB DPB TB,FI.LCP ;MAKE FILE POINT TO DATAB > CHID: HRRZ TA,CURFIL LDB TB,FI.VID JUMPE TB,CHID2 ;NO VALUE-OF-ID LDB TC,[POINT 3,TB,20] CAIE TC,CD.VAL JRST CHID.1 ;NOT A LITERAL HRLZM TB,CURVAL HRRZ TA,TB PUSHJ PP,LNKSET HRRM TA,CURVAL PUSHJ PP,GETTAG HRRZ TA,CURFIL DPB CH,FI.VID PUSHJ PP,PUTTAG SETZ TA, PUSHJ PP,PUTVAL JRST CHID2 CHID.1: CAIE TC,CD.DAT JRST CHID2 HRRZI TA,(TB) PUSHJ PP,LNKSET LDB TB,DA.DEF JUMPE TB,CHID2 ;[270] NOT DEFINED LDB TB,DA.USG CAIE TB,%%US ;CHECK FOR LEGAL DISPLAY USAGE CAILE TB,%US.DS ;SKIP IF SOME KIND OF DISPLAY.. JRST CHIDE2 ;NO, GIVE ERROR CHID.3: LDB TB,DA.EXS CAIN TB,^D9 ;MUST BE NINE CHARACTERS JRST CHID2 ;OK, GO CHECK VALUE OF PROJ-PROG ;VALUE-OF-ID WAS NOT A DISPLAY ITEM 9 CHARACTERS IN LENGTH CHIDE2: HRRZI DW,E.62 PUSHJ PP,FATALE ;CHECK VALUE OF PROJ-PROG CHID2: HRRZ TA,CURFIL LDB TB,FI.VPP JUMPE TB,CHID3 ;NONE SPECIFIED LDB TC,[POINT 3,TB,20] CAIE TC,CD.VAL JRST CHID.5 ;NOT A LITERAL HRLZM TB,CURVAL HRRZI TA,(TB) PUSHJ PP,LNKSET HRRM TA,CURVAL CHID.6: PUSHJ PP,GETTAG HRRZ TA,CURFIL DPB CH,FI.VPP PUSHJ PP,PUTTAG HRLZI CH,AS.XWD## HRRI CH,1 PUSHJ PP,PUTAS2## AOS EAS2PC## PUSHJ PP,PUTOCT PUSHJ PP,PUTOCT JRST CHID3 CHID.5: CAIE TC,CD.DAT JRST CHID3 HRRZI TA,(TB) PUSHJ PP,LNKSET LDB TB,DA.USG CAIN TB,%US.1C JRST CHID3 HRRZI DW,E.366 ;?PPN MUST BE 1-WORD COMP HRRZ TA,CURFIL LDB LN,FI.LN## LDB CP,FI.CP## ;[270] MAKE SOURCE CHAR POS EXT PUSHJ PP,WARN## JRST CHID.6 CHID3: HRRZ TA,CURFIL LDB TB,FI.VDW JUMPE TB,CHDATS ;NO VALUE-OF-DATE-WRITTEN LDB TC,[POINT 3,TB,20] CAIE TC,CD.VAL JRST CHDATS ;NOT A LITERAL HRLZM TB,CURVAL HRRZ TA,TB PUSHJ PP,LNKSET HRRM TA,CURVAL LDB TB,[POINT 7,(TA),6] CAIN TB,6 ;SKIP IF NOT SIX CHARACTERS JRST CH2.1 CAILE TB,6 ;IF LESS THAN SIX, HRRZI TB,6 ;PRETEND IT IS SIX DPB TB,[POINT 7,(TA),6] HRRZI DW,E.63 HRRZ TA,CURFIL LDB LN,FI.LN LDB CP,FI.CP PUSHJ PP,WARN CH2.1: PUSHJ PP,GETTAG HRRZ TA,CURFIL DPB CH,FI.VDW PUSHJ PP,PUTTAG SETZ TA, PUSHJ PP,PUTVAL ;CHECK TO INSURE ALL RECORDS FOR THIS FILE ARE < 4096 CHARACTERS ;AND THAT OCCURS DOES NOT APPEAR AT 01 LEVEL CHDATS: SETZM RUSAGE## ;CLEAR USAGE FLAG HRRZ TA,CURFIL ;GET ADDRESS OF FILTAB ENTRY LDB TA,FI.DRL## ;GET RECORD LINK JUMPE TA,CLNCUP ;IF ZERO--FORGET IT CHDA.1: PUSHJ PP,LNKSET ;GET RECORD ADDRESS MOVEM TA,CURDAT ;[1502] SAVE OFFSET LDB TE,DA.USG ;GET USAGE OF RECORD CAIE TE,%US.D7 ;DISPLAY-7? HRRZI TE,%US.D6 ;NO, ASSUME DISPLAY-6 SKIPN RUSAGE ;SEEN 1ST RECORD BEFORE THIS? MOVEM TE,RUSAGE ;NO, SAVE USAGE OF 1ST CAMN TE,RUSAGE ;YES, THIS USAGE CONFLICT WITH 1ST RECORD? JRST CHDA.5 ;[1502] NO MOVEI DW,E.33 ;YES, ERROR HRRM TA,CURDAT ;SAVE DATAB PTR HRRZ TA,CURFIL ;GET FILTAB PTR LDB LN,FI.LN LDB CP,FI.CP PUSHJ PP,FATAL HRRZ TA,CURDAT ;GET BACK DATAB PTR CHDA.5: LDB TE,DA.EXS ;[1502] GET EXTERNAL SIZE CAIG TE,MAXFSS## ;GREATER THAN LARGEST ALLOWED SIZE? JRST CHDA.4 ;[1502] NO MOVEI DW,E.322 ;YES PUSHJ PP,FATALE ; PUT OUT DIAGNOSTIC JRST CHDA.3 ;[1502] CHDA.4: HRRZ TA,CURFIL ;[1502] LDB TD,FI.MRS ;[1502] GET MAX RECORD SIZE HRRZ TA,CURDAT ;[1502] RESTORE HERE CAML TE,TD ;[1502] IS CURRENT 01 LEVEL SMALLER JRST CHDA.3 ;[1502] THAN MAX FOUND? MOVEI DW,E.660 ;[1502] YES, GIVE WARNING LDB LN,DA.LN ;[1502] SET UP LINE NBR LDB CP,DA.CP ;[1502] AND CHARACTER POSITION PUSHJ PP,WARN ;[1502] CHDA.3: LDB TE,DA.OCC## ;OCCURS AT 01 LEVEL? JUMPE TE,CHDA.2 ;NO MOVEI DW,E.325 ;YES, FLAG IT PUSHJ PP,FATALE CHDA.2: LDB TE,DA.FAL ;IS BROTHER/FATHER LINK JUMPN TE,CLNCUP ; A FATHER? LDB TA,DA.BRO ;NO--LOOK AT NEXT RECORD JUMPN TA,CHDA.1 CLNCUP: HRRZ TA,CURFIL LDB TA,FI.NXT## JUMPN TA,CLNC ;NEXT FILE TABLE CLNCON: MOVE TA,CONLOC## CAMN TA,CONNXT## POPJ PP, HRRZI TA,CD.CON*1B20+1 HRLZM TA,CURCON## PUSHJ PP,LNKSET C0.: HRRM TA,CURCON LDB TB,CO.NVL LDB TA,CO.DAT## LSH TB,1 HRRZM TB,TBLOCK+1 JUMPE TA,C3. CAIN TA,CD.DAT*1B20+1 ;[644] TEST FOR DUMMY DATAB ENTRY JRST C3B. ;[1066] [644] WHICH IS SET IF ERROR IN 01 LEVEL JUMPE TB,C3. ;[454] IF NO LITERAL ENTRIES DUE TO ERROR GO ON HRLZM TA,CURDAT PUSHJ PP,LNKSET HRRM TA,CURDAT LDB LN,DA.LN ;PREPARE TO POINT TO THE DATA ITEM (NOT LDB CP,DA.CP ; THE LEVEL 88 ITEM) IF ERRORS FOUND MOVE TE,[POINT 18,SZ.CON(TA)] MOVEM TE,PNTS## C1.: HRRZ TA,CURCON ILDB TA,PNTS ;GET ADDRESS OF LITTAB ENTRY ANDI TA,077777 ;JUST GET OFFSET JUMPE TA,C2. ;?MUST BE NON-ZERO, ; ENTRY IS SCREWED UP, FORGET IT IORI TA,CD.LIT*1B20 ;LOOK AT LITAB ENTRY HRLZM TA,CURLIT PUSHJ PP,LNKSET HRRM TA,CURLIT ;CURLIT SET UP TO POINT TO LITAB ENTRY ;31-DEC-80 /DAW: There is a check that should be made here at some later ; date. Now, there is one user error that gets through undiagnosed: ; If there is a group item usage INDEX, and a subordinate item has 88 level ; items with value clauses, they were not checked for the correct ; class in COBOLC since the class had not been determined yet at that ; point (see edit 1106 in COBOLC). ; What should be done is to check the consistancy of the item's usage ;now, and if it is not consistant, and a father of the item is usage ;INDEX, then DIAG 241 or 236 should be given and should point to ;the value literal for the each 88 item in error. Note this requires ;that CONTAB or LITAB be expanded to contain the LN and CP of the clause. PUSHJ PP,ADJUST ;CREATE LITERAL OF PROPER SIZE FOR ITEM HRRZ TA,CURLIT LDB TB,LI.FGC JUMPE TB,C1.5 LDB TC,LI.FCC HRRZ TA,CURCON LDB TB,PNTS ANDI TB,400000 TRO TB,200000 CAIN TC,SPACE. TRO TB,040000 CAIN TC,ZERO. TRO TB,20000 CAIN TC,QUOTE. TRO TB,10000 CAIN TC,HIVAL. TRO TB,4000 CAIN TC,LOVAL. TRO TB,2000 DPB TB,PNTS JRST C2. C1.5: PUSHJ PP,GETTAG HRRZ TA,CURCON LDB TB,PNTS ANDI TB,7B20 HRRZI TC,(CH) ANDI TC,077777 IORI TB,(TC) DPB TB,PNTS PUSHJ PP,PUTTAG PUSHJ PP,PUTLIT C2.: SOSLE TBLOCK+1 JRST C1. C3.: HRRZ TA,CURCON LDB TB,CO.NVL## C3A.: ADDI TA,SZ.CON(TB) ;[1066] NEW LABEL HRRZ TC,CONNXT CAIG TA,(TC) ;SKIP IF WE ARE DONE ALL ENTRIES IN CONTAB JRST C0. POPJ PP, ;[1066] THIS PREVENTS "?ILL MEM REF" IN PHASE E, BY TELLING ;[1066] IFCGEN THAT THERE ARE NO "VALUE" ITEMS (ACTUALLY THERE ;[1066] ARE, BUT THE CONVERSION CODE ABOVE DID NOT GET EXECUTED ;[1066] SO THE CONTAB ENTRY WOULD BE MESSED UP). NO CODE GENERATION ;[1066] IS THEN ATTEMPTED. C3B.: HRRZ TA,CURCON ;[1066] LDB TB,CO.NVL## ;[1066] NUMBER OF WORDS TO FOLLOW SETZ TC, ;[1066] SET NUMBER OF VALUE ITEMS TO 0 DPB TC,CO.NVL## ;[1066] SO PHASE E KNOWS THIS IS A BOGUS ENTRY JRST C3A. ;[1066] GO ON TO NEXT CONTAB ENTRY PUTLIT: HRRZ TA,CURDAT LDB TB,DA.USG JRST .+1(TB) POPJ PP, JRST PTLDSP ;DISPLAY-6 JRST PTLDSP ;DISPLAY-7 JRST PTLDSP ;DISPLAY-9 JRST PTL1WC ;1-WORD COMP JRST PTL2WC ;2-WORD COMP JRST PTLC1 ;COMP-1 JRST PTL1WC ;INDEX JRST PTLDSP ;COMP-3 (PRETEND IT'S DISPLAY-9) JRST PTLC2 ;COMP-2 ;MAKE SURE THE ABOVE TABLE DOESN'T GET MESSED UP. N==<%%US>!<%US.D6-1>!<%US.D7-2>!<%US.EB-3>!<%US.1C-4> N==N!<%US.2C-5>!<%US.C1-6>!<%US.IN-7>!<%US.C3-10>!<%US.C2-11> IFN N,< PRINTX %PUTLIT - TABLE IS MESSED UP. > PTL1WC: MOVE CH,[XWD 600000+ASCD1,1] PUSHJ PP,PUTAS2 MOVE CH,VALUE2 AOS EAS2PC JRST PUTAS2 PTL2WC: MOVE CH,[XWD 600000+ASCD2,2] PUSHJ PP,PUTAS2 MOVE CH,VALUE1## AOS EAS2PC PUSHJ PP,PUTAS2 MOVE CH,VALUE2## AOS EAS2PC JRST PUTAS2 PTLC2: MOVE CH,[XWD 600000+ASCF2,2] PUSHJ PP,PUTAS2 MOVE CH,VALUE1 PUSHJ PP,PUTAS2 MOVE CH,VALUE2 AOS EAS2PC AOS EAS2PC JRST PUTAS2 PTLC1: MOVE CH,[XWD 600000+ASCFLT,2] PUSHJ PP,PUTAS2 MOVE CH,VALUE1 PUSHJ PP,PUTAS2 MOVE CH,VALUE2 AOS EAS2PC JRST PUTAS2 PTLDSP: SKIPG TC,NCHITM## POPJ PP, ADD TC,NCHWRD## HRRZI TC,-1(TC) IDIV TC,NCHWRD MOVE CH, CONVR2## HRL CH, ASCDS(CH) HRRI CH,(TC) TRNA P2.: AOS EAS2PC PUSHJ PP,PUTAS2 SETZ CH, HRRZ TA,CURLIT## MOVE TE, CONVR2## HLL TE, LHPTRS(TE) HRRI TE, CH P1.: SOSGE NCHITM JRST P3. PUSHJ PP,GETCHR IDPB TC,TE TLNE TE,760000 JRST P1. JRST P2. P3.: LDB TB,[POINT 6,TE,5] CAIN TB,44 POPJ PP, AOS EAS2PC JRST PUTAS2 ;THE FOLLOWING TABLE CONTAINS: ; LH THE LEFT HALF OF THE POINTER FOR PUTTING CHARACTERS IN CH. ; RH THE ASSEMBLY CODE FOR THE ITEM. ; INDEX BY CONVR2. LHPTRS: ASCDS: POINT 9,AS.EBC## ;COMP-3. POINT 6,AS.SIX## ;SIXBIT. POINT 7,AS.ASC## ;ASCII. POINT 9,AS.EBC## ;EBCDIC. ;PUT ASCII # ON AS2 AS A BINARY CONSTANT PUTOCT: HRRZ TA,CURVAL HRLI TA,440700 ILDB TD,TA MOVEM TD,CTR SETZ TC, PUTOC1: SOJL TD,PUTOC2 ILDB TB,TA IMULI TC,10 ADDI TC,-60(TB) JRST PUTOC1 PUTOC2: AOJ TA, HRRM TA,CURVAL HRLZI CH,(TC) HRRI CH,AS.CNB## JRST PUTAS2 PUTVAL: JUMPL TA,PVOUT CAILE TA,1 JRST PVOUT HRLZI TB,440700 HRR TB,CURVAL MOVEM TB,PNTR## ILDB TC,PNTR MOVEM TC,CTR JRST .+1(TA) JRST PV.SXB MOVE CH,[XWD 610000,1] PUSHJ PP,PUTAS2 MOVE TD,PNTR PUSHJ PP,GETV2## MOVE CH,TC PUSHJ PP,PUTAS2 AOS EAS2PC POPJ PP, PV.SXB: ADDI TC,5 IDIVI TC,6 MOVEM TC,TBLOCK+1 HRLZI CH,620000 HRR CH,TC PV.1: PUSHJ PP,PUTAS2 MOVE TA,[POINT 6,CH] SETZ CH, HRRZI TE,6 PV.2: ILDB TB,PNTR CAIN TB,":" HRRZI TB,"-" CAIN TB,";" HRRZI TB,"." SUBI TB,40 IDPB TB,TA SOSG CTR JRST PV.3 SOJG TE,PV.2 JRST PV.1 PV.3: PUSHJ PP,PUTAS2 MOVE TA,CURVAL LDB TC,[POINT 7,(TA),6] ADDI TC,5 IDIVI TC,5 HLRZS TA ADD TA,TC HRLZM TA,CURVAL PUSHJ PP,LNKSET HRRM TA,CURVAL MOVE TB,EAS2PC ADD TB,TBLOCK+1 MOVEM TB,EAS2PC POPJ PP, PVOUT: MOVE CH,[XWD 610000,1] PUSHJ PP,PUTAS2 SETZ CH, JRST PUTAS2 PUTTAG: ANDI CH,077777 IORI CH,CD.TAG*1B20 HRLI CH,720000 PUSHJ PP,PUTAS2 MOVE TE,EAS2PC TRZ TE,1B18 ANDI CH,077777 ADD CH,TAGLOC## HRRM TE,(CH) POPJ PP, ;ADJUST NON-NUMERIC LITERALS ADJUST: SETZM NPADL ;INITIALIZE. SETZM NPADR SETZM NCHLIT## SETZM NCHLI2 SETZM NCHITM SETZM ITMLOC## SETZM ITMRES## SETZM SIGNED SETZM VALUE1 SETZM VALUE2 MOVE TB,[POINT 7,SZ.LIT(TA)] MOVEM TB,BYTEPT## MOVEM TB,BYTEP2## SKIPN TA,CURDAT POPJ PP, LDB LN,DA.LN ;ASSUME THAT WE WILL HAVE AN ERROR. LDB CP,DA.CP IFN ANS74,< LDB TB,DA.SSC## ;SEE IF SEPARATE SIGN MOVEM TB,SEPSGN## ;STORE RESULT LDB TB,DA.LSC## ;SEE IF LEADING SIGN MOVEM TB,LDNSGN## ;STORE RESULT > SKIPN TA,CURLIT POPJ PP, LDB TB,LI.NLT## ;IF THE LITERAL IS NUMERIC, GO WORRY OVER IT. JUMPN TB,ADJNUM ;LITERAL IS NON NUMERIC. SKIPN TA,CURDAT CPOPJ: POPJ PP, LDB TB,DA.LOC ;SET LOCATION. HRRZM TB,ITMLOC LDB TB,DA.RES## ;SET RESIDUE. HRRZM TB,ITMRES LDB TB,DA.EXS ;SET NUMBER OF CHARS IN THE ITEM. HRRZM TB,NCHITM IFN FT68274,< LDB TC,DA.JST ;[1340] MOVEI DW,E.768 ;[1340] SKIPE TC ;[1340] SKIP IF NO "JUSTIFIED" CLAUSE PUSHJ PP,WARN ;[1340] OTHERWISE WARN USER OF DIFFERENCE > IFN ANS68, LDB TC,DA.JST## IFN ANS74, SETZ TC, ;[ANS74] IGNORE JUSTIFICATION WHEN ;PUTTING VALUES IN DATA ITEMS LDB TD,DA.USG SETO TE, CAIN TD,%US.D6 ;IS IT DISPLAY-6. MOVEI TE,1 ;YES. CAIN TD,%US.D7 ;IS IT DISPLAY-7. MOVEI TE,2 ;YES. CAIN TD,%US.EB ;IS IT DISPLAY-9. MOVEI TE,3 ;YES. JUMPLE TE,ADJNND ;IF THE ITEM ISN'T DISPLAY, LEAVE. MOVEM TE,CONVR2## ;SET THE CONVERSION INDEX. HLL TE,PADCHS(TE) ;GET THE APPROPRIATE PADD CHAR. HLRZM TE,PADCHR ;REMEMBER IT. HRL TE,CHSPWD(TE) ;GET THE NUMBER OF CHARS PER WORD. HLRZM TE,NCHWRD ;REMEMBER IT. SKIPN TA,CURLIT POPJ PP, LDB TD,LI.FGC## ;IF IT IS A FIGURATIVE CONSTANT, JUMPN TD,AJNN.6 ; GO WORRY OVER IT. LDB TD,LI.NCH## ;SET THE NUMBER OF CHARS IN THE LITERAL. HRRZM TD,NCHLIT CAIN TD,(TB) ;IF THE LITERAL IS THE SAME SIZE JRST AJNN.X ; AS THE ITEM, GO ON. CAIL TD,(TB) ;IF THE LITERAL IS LARGER THAN JRST AJNN.4 ;THE ITEM, GO ON. SUBI TB,(TD) ;SEE HOW MUCH SMALLER IT IS. LDB TD,LI.ALL## SETOM NPADR JUMPE TD,AJNN.2 JRST AJNN.1 ADJNND: SKIPN TA,CURLIT ;POINT AT THE LITERAL. POPJ PP, LDB TB,LI.FGC## ;IF IT ISN'T A FIGURATIVE CONSTANT leave. JUMPE TB,CPOPJ ;THE ERROR SHOULD HAVE been detected ; BY THE SYNTAX scan. LDB TB,LI.FCC## ;SEE WHICH ONE IT IS. JRST ADJNM5 ;GO SEE WHAT TO DO WITH IT. ;ALL WAS SPECIFIED AND THE LITERAL IS SMALLER THAN THE ITEM. ; (TC) = 1 IF THE ITEM IS JUSTIFIED RIGHT ; 0 OTHERWISE. AJNN.1: JUMPE TC, AJNN.X ;IF THE ITEM IS NOT JUSTIFIED ; RIGHT, GO ON. PUSHJ PP, ADJALP ;GO SEE IF THE ITEM IS ALPHABETIC. MOVE TB, NCHLIT ;NUMBER OF CHARS IN THE LITERAL. MOVEM TB, NCHLI2 ;NUMBER OF CHARS IN THE 2ND THROUGH ; NTH REPITITIONS OF THE LITERAL. MOVE TC, NCHITM ;NUMBER OF CHARS IN THE ITEM. IDIVI TC, (TB) ;(TB) = # OF CHARS IN THE FIRST ; REPITITION OF THE LITERAL. MOVE TC, BYTEPT ;BYTE POINTER TO THE LITERAL. MOVEM TC, BYTEP2 ;BYTE POINTER FOR 2ND THROUGH ; NTH REPITITIONS OF THE LITERAL JUMPE TB, CPOPJ ;IF THERE ARE NO CHARS IN THE FIRST ; REPITITION, LEAVE. EXCH TB, NCHLIT SUB TB, NCHLIT ;(TB) = # OF CHARS TO SKIP THE ; FIRST TIME. IBP TC ;SKIP OVER SOME CHARS. SOJG TB, .-1 MOVEM TC, BYTEPT ;BYTE POINTER FOR FIRST REPITITION ; OF THE LITERAL. POPJ PP, ;RETURN. ;LITERAL IS SMALLER THAN THE ITEM AND ALL WAS NOT SPECIFIED. AJNN.2: JUMPE TC,AJNN.3 ;IF THE LITERAL SHOULD BE RIGHT HRRZM TB,NPADL## ; JUSTIFIED, PADD ON THE LEFT. JRST AJNN.X AJNN.3: HRRZM TB,NPADR## ;OTHERWISE, PADD ON THE RIGHT. JRST AJNN.X ;LITERAL IS LARGER THAN THE ITEM. AJNN.4: HRRZM TB,NCHLIT ;MAKE THE LITERAL THE SAME SIZE ; AS THE ITEM. JUMPE TC,AJNN.5 ;IF THE LITERAL SHOULD BE RIGHT SUBI TD,(TB) ; JUSTIFIED SKIP SOME CHARACTERS IBP BYTEPT ; SO THAT IT WILL BE TRUNCATED SOJG TD,.-1 ; ON THE LEFT. AJNN.5: HRRZI DW,E.238 ;COMPLAIN ABOUT THE SIZE. PUSHJ PP,WARN JRST AJNN.X ;THE LITERAL IS A FIGURATIVE CONSTANT. AJNN.6: HRRZM TB,NPADL ;PADD THE WHOLE ITEM WITH IT. LDB TD,LI.FCC## ;SEE WHICH ONE IT IS. SETZ TC, ;IF IT ISN'T VALID WE WILL USE NULLS. SUBI TD,HIVAL. IFN ANS68,< CAIE TD,TALLY-HIVAL. ;SPECIAL CASE TALLY (SEE TABLE "FIGC".) > CAILE TD,5 JRST AJNN.7 IMULI TD,3 IFN ANS74,< SKIPE COLSEQ ;PROGRAM COL. SEQ.? CAILE TD,3* ;YES, AND EITHER LOW OR HIGH VALUE JRST AJNN.8 ;NO ADD TD,CONVR2 HRRZ TC,COHVLV##-1(TD) ;GET RIGHT CHARACTER JRST AJNN.7 AJNN.8:> ADD TD,CONVR2## HRRZ TC,FIGC-1(TD) AJNN.7: HRRZM TC,PADCHR## AJNN.X: PUSHJ PP,ADJALP MOVE TA,BYTEPT MOVEM TA,BYTEP2 MOVE TA,NCHLIT MOVEM TA,NCHLI2## POPJ PP, ;ROUTINE TO SEE IF IN ITEM IS ALPHABETIC AND IF IT IS, CHECK TO MAKE ; SURE THAT THE LITERAL CONTAINS ONLY ALPHABETIC CHARACTERS. ADJALP: SKIPN TA, CURDAT ;POINT AT THE ITEM. POPJ PP, ;IF THERE IS NONE, LEAVE. LDB TB, DA.CLA## ;GET ITS CLASS. CAIE TB, %CL.AB ;IS IT ALPHABETIC? JRST ADJNBR ;[1500] NO, NUMERIC SETZM TBLOCK SKIPG TD, NCHLIT ;GET THE NUMBER OF CHARS IN THE ; LITERAL. JRST ADJAL6 ;IF IT'S ZERO, IT'S PROBABLY A ; FIGURATIVE CONSTANT. HRRZ TA, CURLIT ;POINT AT THE LITERAL. MOVE TE, BYTEPT ADJAL1: ILDB TB, TE ;GET A CHAR. CAIN TB, " " ;SPACE? JRST ADJAL2 ;YES. CAIL TB, "A" ;LETTER? CAILE TB, "Z" JRST ADJAL8 ;NO, GO SEE IF IT'S LOWER CASE. ADJAL2: SOJG TD, ADJAL1 ;IF THERE ARE MORE CHARS, LOOP. SKIPN TBLOCK ;IF THERE WERE NO NON ALPHABETIC POPJ PP, ; CHARACTERS, RETURN. ADJAL4: HRRZI DW, E.298 ;OTHERWISE, COMPLAIN. PJRST WARN## ;LITERAL IS A FIGURATIVE CONSTANT - MAKE SURE IT IS SPACES. ADJAL6: MOVE TB, CONVR2## ;GET THE CONVERSION INDEX. HLRZ TB, PADCHS(TB) ;SEE WHAT A SPACE LOOKS LIKE. CAMN TB, PADCHR ;DOES THE FIGURATIVE CONSTANT ; LOOK LIKE A SPACE? POPJ PP, ;YES, ALL IS WELL, RETURN. MOVEM TB, PADCHR ;MAKE THE FIGURATIVE CONSTANT ; A SPACE. JRST ADJAL4 ;GO COMPLAIN. ;THERE MAY BE A NON ALPHABETIC CHARACTER IN THE LITERAL. ADJAL8: CAIL TB, "a" ;IS IT A LOWER CASE LETTER? CAILE TB, "z" CAIA ;NO, ERROR. JRST ADJAL2 SETOM TBLOCK ;REMEMBER THAT WE HAD AN ERROR. MOVEI TB, " " ;REPLACE THE CHARACTER BY A SPACE. DPB TB, TE JRST ADJAL2 ;GO SCAN THE REST OF THE LITERAL. ;VALUE CLAUSE IS FOR A NUMERIC FIELD, SEE IF FIGURATIVE CONSTANT ; AND WARN IF NOT ZERO ADJNBR: HRRZ TA,CURDAT ;[1500] LDB TB,DA.CLA ;[1500] GET THE CLASS CAIE TB,%CL.NUM ;[1500] IF IT'S NOT NUMERIC, POPJ PP, ;[1500] EXIT LDB TC,DA.USG ;[1500] STORE OFF ITS USAGE HRRZ TA,CURLIT ;[1500] GET THE LITERAL'S ADDRESS LDB TB,LI.FGC ;[1500] GET LITERAL CODE JUMPE TB,CPOPJ ;[1500] NOT A FIGURATIVE CONSTANT LDB TB,LI.FCC ;[1500] FIND OUT WHAT KIND OF FIG CONST CAIN TB,ZERO. ;[1500] IF IT'S A ZERO - OK POPJ PP, ;[1500] ALLOWED BY ANSI STANDARD HRRZI DW,E.657 ;[1500] OTHERWISE GIVE WARNING CAIE TB,HIVAL. ;[1500] JRST WARN## ;[1500] HRRZI DW,E.655 ;[1500] HIGH-VALUES DISPLAY MODE CAILE TC,%US.DS ;[1500] HRRZI DW,E.656 ;[1500] HIGH-VALUES NON-DISPLAY MODE JRST WARN## ;[1500] ;TABLE OF FIGURATIVE CONSTANTS. FIGC: OCT 77 ;HIGH VALUES. OCT 177 OCT 377 OCT 0 ;LOW VALUES. OCT 0 OCT 0 EXP '"' ;QUOTES. OCT 42 OCT 177 EXP ' ' ;SPACES. EXP " " OCT 100 OCT 0 ;TALLY (TO MAKE INDEXING INTO THE TABLE EASIER.) OCT 0 PADCHZ: OCT 360 EXP '0' ;ZEROES. EXP "0" OCT 360 ;TABLE OF PADD CHARACTERS (LEFT HALF) AND CHARACTERS PER WORD (RIGHT ; HALF). INDEX BY CONVERSION INDEX. PADCHS: CHSPWD: XWD 0,4 ;COMP-3. XWD ' ',6 ;SIXBIT. XWD " ",5 ;ASCII. XWD 100,4 ;EBCDIC. COMMENT \ ROUTINE TO GET A CHARACTER FROM A LITERAL. CALL: PUSHJ PP, GETCHR ENTRY CONDITIONS: (NPADL) REMAINING NUMBER OF CHARACTERS TO PADD ON THE LEFT. (NCHLIT) NUMBER OF CHARACTERS REMAINING IN THE LITERAL. (NCHLI2) NUMBER OF CHARACTERS IN THE LITERAL. (CURLIT) ADDRESS OF THE LITAB ENTRY CONTAINING THE LITERAL. (BYTEPT) BYTE POINTER TO THE NEXT CHAR IN THE LITERAL. (BYTEP2) BYTE POINTER TO THE FIRST CHAR IN THE LITERAL. (NPADR) IF LESS THAN ZERO "ALL" WAS SPECIFIED FOR THE LITERAL OTHERWISE RETURN PADD CHARS IF THERE ARE NO MORE CHARS IN THE LITERAL. (NCHITM) NUMBER OF CHARACTERS REMAINING IN THE ITEM. (CONVR2) CONVERSION INDEX: 0 ==> CONVERT TO COMP-3. 1 ==> CONVERT TO SIXBIT. 2 ==> NO CONVERSION. 3 ==> CONVERT TO EBCDIC. EXIT CONDITIONS: (TC) = THE CHARACTER. NOTES: 1. NPADL, BYTEPT, ETC ARE UPDATED BEFORE RETURNING. 2. WHEN CONVERTING TO COMP-3 TWO CHARACTERS FROM THE LITERAL ARE RETURNED PACKED RIGHT JUSTIFIED IN A NINE BIT BYTE. 3. TA AND TC ARE DESTROYED. \ GETCHR: SKIPN CONVR2## ;IF THE ITEM IS COMP-3 GO GET TWO JRST GETCH9 ; CHARS FROM THE LITERAL AND RETURN ; ONE NINE BIT BYTE. IFN ANS74,< SKIPE SEPSGN## ;SEPARATE SIGN SKIPN LDNSGN## ;AND LEADING JRST GETCH1 ;NO GETCH0: MOVE TC,SIGNED ;GET SIGN OF LITERAL MOVE TC,[EXP "-","+","+"]+1(TC) ;GET RIGHT SIGN SETZM SIGNED ;SO WE DON'T DO IT AGAIN SETZM SEPSGN SETZM LDNSGN JRST GETCH4 ;CONVERT AND RETURN > ;THE ITEM IS DISPLAY. GETCH1: SOSL NPADL ;ARE WE PADDING ON THE lEFT? JRST GETCH6 ;YES, GO RETURN A PADD CHAR. SOSL NCHLIT ;ANY CHARS LEFT IN THE LITERAL? JRST GETCH2 ;YES, GO GET A CHAR FROM IT. SKIPL NPADR ;WAS "ALL" SPECIFIED? JRST GETCH6 ;NO, GO PADD ON THE RIGHT. ;"ALL" WAS SPECIFIED FOR THE LITERAL, REPEAT THE LITERAL. MOVE TA, BYTEP2 ;POINT AT THE BEGINNING OF THE LITERAL. MOVEM TA, BYTEPT SKIPG TA, NCHLI2 ;IF THERE ARE NO CHARS IN THE LITERAL JRST GETCH6 ; IT MUST BE A FIGURATIVE CONSTANT ; GO RETURN A PADD CHAR. MOVEM TA, NCHLIT ;SET THE NUMBER OF CHARS IN THE LITERAL. SOS NCHLIT ;LESS ONE FOR THE ONE WE ARE ABOUT ; TO RETURN. ;GET A CHAR FROM THE LITERAL. GETCH2: HRRZ TA, CURLIT ;POINT AT THE LITERAL. ILDB TC, BYTEPT ;GET A CHAR. IFN ANS74,< SKIPLE NCHITM ;IF NOT LAST CHARACTER JRST [SKIPE LDNSGN ;CHECK FOR LEADING SIGN SKIPL SIGNED ;AND NEGATIVE JRST GETCH4 ;NO SETZM LDNSGN SETZM SIGNED JRST GETCH3] ;MAKE LEADING CHAR NEGATIVE SKIPE SIGNED ;SIGNED? SKIPN TA,SEPSGN ;AND SEPARATE CHAR? JRST .+3 ;NO MOVE TC,[EXP "-","+","+"]+1(TA) ;GET SIGN JRST GETCH4 ;AND RETURN IT > SKIPGE SIGNED ;IF THE LITERAL WAS NOT NEGATIVE SKIPLE NCHITM ; OR THIS IS NOT THE LAST CHAR, JRST GETCH4 ; GO ON. ;THE LITERAL WAS NEGATIVE AND THIS IS THE LAST CHAR. IMBED A "-" OVERPUNCH. GETCH3: CAIN TC, "0" JRST GETCN0 ;OVERPUNCH 0 IS SPECIAL ADDI TC, "J"-"1" ;CONVERT THE CHAR IF NECESSARY. GETCH4: MOVE TA, CONVR2## ;GET THE CONVERSION INDEX. XCT GETCH5(TA) ;CONVERT THE CHAR. POPJ PP, ;RETURN (COULD ELIMINATE THIS ; INSTR BY CHANGING THE XQT TO ; A JRST BUT IT WOULD PROBABLY ; MAKE THINGS MORE OBSCURE.) ;TABLE TO HANDLE CONVERSIONS - INDEX BY CONVR2. GETCH5: JRST GETCH7 ;COMP-3, RETURN AN EBCDIC CHAR. SUBI TC, 40 ;SIXBIT, WILL ALWAYS WORK BECAUSE ; WE HAVE ALREADY CHECKED THE LITERAL. POPJ PP, ;ASCII, NO CONVERSION NECESSARY. JRST GETC7A ;[1072] EBCDIC. ;RETURN A PADD CHAR. GETCH6: HRRZ TC, PADCHR ;GET A PADD CHAR. IFN ANS74,< SKIPE LDNSGN ;REQUIRE LEADING SIGN? SKIPL SIGNED ;AND NEGATIVE? JRST .+4 ;NO SETZM SIGNED SETZM LDNSGN JRST GETCN0 ;YES, -0 SKIPLE NCHITM ;IF NOT LAST CHAR. POPJ PP, ;RETURN SKIPE SEPSGN ;STILL NEEDING SEPARATE SIGN? JRST GETCH0 ;YES > SKIPGE SIGNED ;IF THE LITERAL WAS NOT NEGATIVE SKIPLE NCHITM ;OR THIS IS NOT THE LAST CHAR, POPJ PP, ; RETURN. SKIPN CONVR2## ;IF IT'S NOT COMP-3 OR THE CAIE TC, 371 ; CHAR ISN'T AN EBCDIC 9, JRST GETCN0 ; RETURN A "-0". MOVEI TC, 331 ;OTHERWISE, RETURN A "-9". POPJ PP, ;RETURN AN OVERPUNCHED 0 GETCN0: MOVE TA,CONVR2 ;GET CONVERSION INDEX MOVE TC,[EXP 320,']',"}",320](TA) ;GET RIGHT 0 POPJ PP, ;CONVERT THE CHARACTER IN TC TO EBCDIC. GETCH7: PUSH PP, TB ;SAVE TB. IDIVI TC, 4 ;FORM THE INDICES. LDB TC, GETCH8(TB) ;CONVERT THE CHAR. POP PP, TB ;RESTORE TB. POPJ PP, ;RETURN. ;[1072] Convert character to EBCDIC. If this is the last character, ;[1072] and the item is signed, and literal is positive, overpunch ;[1072] a "+". GETC7A: IDIVI TC,4 ;[1072] FORM THE INDICES LDB TC,GETCH8(TB) ;[1072] CONVERT THE CHAR TO EBCDIC. SKIPN NCHITM ;[1072] IS THIS THE LAST CHARACTER? SKIPGE SIGNED ;[1072] YES, AND IS LITERAL POSITIVE? POPJ PP, ;[1072] NO, RETURN HRRZ TA,CURDAT## ;[1072] IS ITEM SIGNED? LDB TA,DA.SGN## ;[1072] JUMPE TA,CPOPJ ;[1072] NO, RETURN POSITIVE DIGIT TRZ TC,60 ;[1072] OVERPUNCH A "+" POPJ PP, ;[1072] RETURN ;TABLE OF POINTERS TO THE ASCII TO EBCDIC CONVERSION TABLE - INDEX BY ; THE LOW ORDER TWO BITS OF THE ASCII CHARACTER WITH THE HIGH ORDER FIVE ; BITS IN TC. GETCH8: POINT 9,ASEBC.##(TC),8 POINT 9,ASEBC.##(TC),17 POINT 9,ASEBC.##(TC),26 POINT 9,ASEBC.##(TC),35 ;COME HERE IF THE ITEM IS COMP-3. GETCH9: PUSHJ PP, GETCH1 ;GO GET AN EBCDIC CHAR. SKIPLE NCHITM ;IF THIS IS NOT THE LAST CHAR IN JRST GETC10 ; THE ITEM, GO ON. ;THIS IS THE LAST CHAR, WE HAVE TO RETURN A SIGN ALSO. LDB TA, [POINT 4,TC,31] ;GET THE SIGN. LSH TC, 4 ;POSITION THE DIGIT. TRO TC, (TA) ;COMBINE THE SIGN AND THE DIGIT. ANDI TC, 377 ;GET RID OF ANY JUNK. HRRZ TA, CURDAT## ;SEE IT THE ITEM IS LDB TA, DA.SGN## ; SIGNED. JUMPE TA, CPOPJ ;IF IT ISN'T, RETURN. TRNE TC, 2 ;IF THE LITERAL IS NEGATIVE ; DO NOTHING. TRZ TC, 3 ;OTHERWISE MAKE THE VALUE POPJ PP, ; POSITIVE RATHER THAN UNSIGNED. ;RETURN TWO DIGITS IN A NINE BIT BYTE. GETC10: ANDI TC, 17 ;ISOLATE THE FIRST DIGIT. PUSH PP, TC ;SAVE IT. PUSHJ PP, GETCH1 ;GO GET THE SECOND DIGIT. POP PP, TA ;RESTORE THE FIRST DIGIT. DPB TA, [POINT 5,TC,31] ;COMBINE THE DIGITS. POPJ PP, ;RETURN. ADJNUM: LDB TB,LI.FGC JUMPN TB,ADJNM5 ;FIGURATIVE CONSTANT LDB TB,LI.NCH HRRZM TB,NCHLIT PUSHJ PP,EXALIT SKIPN TA,CURDAT POPJ PP, LDB TB,DA.USG CAIN TB,%US.C1 JRST AJUC1 ;COMP-1 CAIN TB,%US.C2 JRST AJUC2 ;COMP-2 LDB TB,DA.INS IFN ANS74,< SKIPE SEPSGN ;SEPARATE SIGN? SUBI TB,1 ;YES, 1 LESS DATA CHAR > LDB TC,DA.NDP LDB TD,DA.DPR HRRZM TB,NCHITM SKIPN NINTGD SKIPE NFRACD## JRST ADJNM0 HRRZM TB,NPADL SETZM NCHLIT SETZM NPADR JRST ADJNM3 ADJNM0: JUMPN TD,ADJNM2 ;NDP<0 CAIGE TB,(TC) JRST ADJNM1 ;NDP>INSIZE --- P(>0)9(N) SUBI TB,(TC) CAMGE TB,NINTGD## ;INS-NDP>=NINTGD? JRST AJUE.1 ;NO---NUMBER TOO BIG SUB TB,NINTGD MOVEM TB,NPADL CAMGE TC,NFRACD JRST AJUE.2 ;NDP HRRZ TA,CURDAT LDB TC,DA.NDP MOVE TD,TB SUB TD,NINTGD ADD TD,TC JUMPL TD,AJUE.3 ;VALUE TOO LARGE MOVEM TD,NPADL ;INS+NDP-NINTGD SETZM NPADR SUBI TB,(TD) MOVEM TB,NCHLIT ADJNM3: HRRZ TA,CURDAT LDB TB,DA.SGN## JUMPN TB,ADJNM4 SKIPN SIGNED## JRST ADJNM4 HRRZI DW,E.249 ;VALUE SHOULD BE UNSIGNED PUSHJ PP,AJUC16 SETZM SIGNED ADJNM4: HRRZ TA, CURDAT## ;POINT AT THE ITEM. LDB TE, DA.USG## ;GET ITS USAGE. XCT AJNMDP(TE) ;EITHER GET THE CONVERSION INDEX ; OR DISPATCH TO A CONVERSION ROUTINE. ;CONVERSION INDEX IS IN TE. AJNM4B: HRR TB, PADCHZ(TE) ;GET THE PADD CHAR. AJNM4D: HRRZM TB, PADCHR## ;REMEMBER IT. MOVEM TE, CONVR2## ;REMEMBER THE CONVERSION INDEX. HRR TB, CHSPWD(TE) ;GET CHAR'S PER WORD. HRRZM TB, NCHWRD## ;REMEMBER IT. LDB TB, DA.LOC## ;SET THE LOCATION. HRRZM TB, ITMLOC## LDB TB, DA.RES## ;SET THE RESIDUE. HRRZM TB, ITMRES## IFN ANS74,< SKIPE SEPSGN ;SEPARATE SIGN? AOS NCHITM ;YES, ADD SIGN IN > JUMPN TE, CPOPJ ;IF THE ITEM IS NOT COMP-3, RETURN. ;THE ITEM IS COMP-3, CHANGE THE NUMBER OF CHARACTERS IN THE ITEM FROM ; THE NUMBER OF 9'S TO THE NUMBER OF 9 BIT BYTES REQUIRED TO HOLD THE ; ITEM. MOVE TB, NCHITM## ;NUMBER OF 9'S IN THE PICTURE. HRRZI TB, 2(TB) ;ADD ONE FOR THE SIGN AND ONE TO ; FORCE ROUNDING UPWARDS. LSHC TB, -1 ;NUMBER OF 9 BIT BYTES REQUIRED. MOVEM TB, NCHITM## ;SAVE THE RESULT. JUMPL TA, CPOPJ ;IF THERE WAS A REMAINDER, WE AOS NPADL## ; WILL HAVE TO PADD THE LEADING ; CHARACTER POSITION. POPJ PP, ;RETURN. ;TABLE WHICH EITHER RETURNS THE ITEM'S CONVERSION INDEX OR DISPATCHES ; TO A CONVERSION ROUTINE. ;MAKE SURE IT DOESN'T GET MESSED UP. N==<%%US>!<%US.D6-1>!<%US.D7-2>!<%US.EB-3>!<%US.1C-4> N==N!<%US.2C-5>!<%US.C1-6>!<%US.IN-7>!<%US.C3-10>!<%US.C2-11> IFN N,< PRINTX %AJNMDP - TABLE IS MESSED UP. > AJNMDP: POPJ PP, ;UNKNOWN USAGE. MOVEI TE, 1 ;DISPLAY-6. MOVEI TE, 2 ;DISPLAY-7. MOVEI TE, 3 ;DISPLAY-9. JRST AJU1WC ;1-WORD COMP. JRST AJU2WC ;2-WORD COMP. JRST AJUC1 ;COMP-1. JRST AJU1WC ;INDEX SETZ TE, ;COMP-3. JRST AJUC2 ;COMP-2. ADJNM5: CAIE TB, HIVAL. ;ONLY HIGH VALUES, CAIN TB, LOVAL. ; LOW VALUES JRST .+4 ;[1500] AND CAIE TB, ZERO. ; ZERO ARE ALLOWED. JRST AJUE.4 SKIPA ;[1500] HV AND LV ARE SORT OF PUSHJ PP, ADJNBR ;[1500] ALLOWED HRRZ TA, CURDAT LDB TC, DA.INS## HRRZM TC, NPADR HRRZM TC, NCHITM SETZM NINTGD SETZM NFRACD CAIN TB, ZERO. JRST ADJNM4 LDB TE, DA.USG## JRST @.+1(TE) EXP CPOPJ EXP ADJNM4 EXP ADJNM4 EXP ADJNM4 EXP AJCP EXP AJCP EXP AJC1 EXP AJCP EXP AJC3 EXP AJC2 AJCP: CAIE TB, HIVAL. SKIPA TD, [EXP 1B0] HRLOI TD, 377777 MOVE TC, TD JRST AJU1X2 AJC2: AJC1: CAIE TB, HIVAL. SKIPA TC, [EXP 1B0+1] HRLOI TC, 377777 JRST AJU1X2 AJC3: SETZI TE, CAIE TB, LOVAL. JRST AJC3D LDB TB, DA.SGN## JUMPE TB, AJNM4B SETOM SIGNED AJC3D: MOVEI TB, 371 JRST AJNM4D AJU2WC: AJU1WC: HRRZ TA,CURLIT SETZB TD,TC AJU1W1: SOSGE NCHLIT JRST AJU1WX ILDB TE,BYTEPT CAIL TE,"0" CAILE TE,"9" JRST AJU1W1 IMULI TD,12 MULI TC,12 ADD TD,TC MOVE TC,TB ADDI TC,-"0"(TE) TLZN TC,1B18 JRST AJU1W1 AOJA TD,AJU1W1 AJU1WX: SOSGE NPADR JRST AJ1WX1 IMULI TD,12 MULI TC,12 ADD TD,TC MOVE TC,TB TLZN TC,1B18 JRST AJU1WX AOJA TD,AJU1WX AJ1WX1: SKIPL SIGNED JRST AJU1X2 SETCA TD, MOVNS TC JUMPN TC,AJU1X2 TLO TC,1B18 AOJA TD,AJU1X2 AJU1X2: MOVEM TD,VALUE1 MOVEM TC,VALUE2 POPJ PP, AJUC2: JFCL ;SAME AS COMP-1 FOR 12B AJUC1: SKIPN TA,NINTGD SKIPE NFRACD SKIPA ;NON-ZERO DIGITS IN SOME PART POPJ PP, CAIGE TA,0 SETZ TA, MOVEM TA,VALUE1 ;EXPONENT SETZ TA, SKIPGE SIGNED HRLZI TA,740000 SETOM SIGNED ;NOTE THAT THIS IS A FLOATING POINT ; NUMBER IN A FUNNY FORMAT. MOVEM TA,VALUE2 MOVE TA,CURLIT HRRZI TB,^D8 ;NUMBER OF SIGNIFICANT DIGITS ALLOWED MOVE TD,[POINT 4,VALUE2,3] AJUC11: ILDB TE,BYTEPT CAIE TE,"0" JRST AJC121 ;NON-ZERO DIGIT SOS VALUE1 ;ZERO HERE IS A ZERO FOLLOWING THE DECIMAL ;POINT --- HENCE, DECREMENT EXPONENT SOSLE NCHLIT JRST AJUC11 POPJ PP, AJUC12: ILDB TE,BYTEPT AJC121: IDPB TE,TD SOS TC,NCHLIT SOJLE TB,AJUC13 ;NO MORE SIGNIFICANT DIGITS ALLOWED JUMPG TC,AJUC12 ;MORE DIGITS AJUC13: SKIPG NCHLIT POPJ PP, AJUC14: ILDB TE,BYTEPT CAIE TE,"0" JRST AJUC15 ;NON-ZERO DIGIT AFTER 8 PLACES USED SOSLE NCHLIT JRST AJUC14 POPJ PP, AJUC15: HRRZ TA,CURDAT HRRZI DW,E.302 ;TOO MANY DIGITS AJUC16: LDB LN,DA.LN LDB CP,DA.CP JRST WARN AJUE.1: HRRZI DW,E.245 ;HIGH-PART TRUNCATION AJUE.E: SETZM NCHITM SETZM NPADL SETZM NPADR SETZM NCHLIT JRST FATAL AJUE.2: HRRZI DW,E.246 ;LOW-PART TRUNCATION JRST AJUE.E AJUE.3: HRRZI DW,E.248 ;VALUE OUT OF RANGE JRST AJUE.E AJUE.4: HRRZI DW,E.298 JRST AJUE.E FATALE: LDB LN,DA.LN## LDB CP,DA.CP## JRST FATAL EXALIT: SETZM SIGNED SETZM NLEADZ SETZM NTRALZ## SETZM NINTGD SETZM NFRACD SKIPN TA,CURLIT POPJ PP, LDB TB,LI.NCH MOVE TE,[POINT 7,SZ.LIT(TA)] MOVE TD,TE ILDB TC,TE CAIN TC,"+" JRST EXL.1 CAIE TC,"-" JRST EXL.2 SETOM SIGNED JRST EXL.3 EXL.1: HRRZI TC,1 HRRZM TC,SIGNED JRST EXL.3 EXL.2: CAIE TC,"0" JRST EXL.4 AOS NLEADZ## EXL.3: SOS NCHLIT SOJLE TB,CPOPJ ILDB TC,TE JRST EXL.2 EXL.4: CAIN TC,"." JRST EXL.45 IDPB TC,TD AOS NINTGD SOJLE TB,CPOPJ ILDB TC,TE JRST EXL.4 EXL.45: SOS NCHLIT EXL.5: SOJLE TB,CPOPJ ILDB TC,TE IDPB TC,TD CAIE TC,"0" JRST EXL.6 AOS NTRALZ SOS NCHLIT JRST EXL.5 EXL.6: AOS TC,NTRALZ ADDM TC,NFRACD ADDM TC,NCHLIT SOS NCHLIT SETZM NTRALZ JRST EXL.5 END