SUBTTL IOLIB PARAMETERS AND MACROS IFNDEF %.C, VCODE==2 ;HOMEGROWN VMAJOR==5 ;MAJOR VERSION VMINOR==0 ;MINOR VERSION VEDIT==153 ;EDIT NUMBER ;DEFINE %.C TO LIST FILE ;DEFINE %.C==-1 TO ASSEMBLE IO IN BOTH PASSES ;DEFINE %.C==-2 TO ALSO INCLUDE END STATEMENT ;DEFINE %.C==-3 TO MAKE IO A UNIVERSAL FILE ;DETERMINE IF SPECIAL ASSEMBLY NEEDED IF1,<%..C==1 ;ALWAYS ASSEMBLE PASS1 IFDEF %.C, IFE %.C+3, PASS2>>> IF2,> ;SUPPLY VALUE IF USER DIDN'T %..C==%.C ;USE USER'S VALUE FOR PASS2> LIST SALL ;CLEAN EXPANSION LISTINGS IFE %..C, ;SKIP REST IF NO ASSEMBLY NEEDED $$IOMJ==VMAJOR $$IO== PURGE VCODE,VMAJOR,VMINOR,VEDIT SUBTTL REVISION HISTORY COMMENT ! REVISIONS MAKING UP VERSION 5 OF IO: 134 ADD SYMBOLS $BFSTS, $BFHDR AND $BFCNT EQUAL TO THE '.' SYMBOLS OF THE SAME NAME IN C.MAC V:6. THE PROBLEM IS THAT THE DEFINITION CHANGED BETWEEN V:6 AND V:7 THEREBY FOULING IOLIB (AND ANYONE ELSE USING THEM). 135 CORRECT DEFINITION OF THE XTUUO$, XTCAL$ AND XTDCL$ MACROS 136 add new macros WBwrd$, wcwrd$, wwwrd$ 137 CHANGE FW$$S TO REMOVE A 'V' ERROR INTRODUCED BY MACRO V:50 AND MY USAGE OF THE MOVX MACRO FROM C.MAC. 140 CHANGE MAKFD$ TO REMOVE A 'V' ERROR INTRODUCED BY MACRO V:50. THE SPEC. IS CHANGED SLIGHTLY SO THAT IF THE ACTUAL PARAMETER FOR THE ADR FIELD IS IN THE AC RANGE (0-17) IT IS NOW TREATED AS A NORMAL ADDRESS 141 ADD APEND$ AND APDWT$ MACROS 142 CORRECT UPDWT$ DEFINITION SO THAT IT MAY TAKE A T1 ARGUMENT 143 ADD NEW FIELDS TO THE FDB: ADD A PATH SPECIFICATION BLOCK AND A PATH MASK BLOCK, REMOVING THE OLD DIRECTORY MASK WORD: ADD AN EXTRA WORD TO THE BUFFER HEADERS: RESTRUCTURE BLOCK TO USE WASTED WORDS FOR 2 FUNCTIONS: ADD WORDS FOR /ABEFORE AND /ASINCE (SEE SCAN) 144 CHANGE DEFINITIONS OF MAKFD$ AND FDESC$ TO USE PATH SPEC. IN FDB 145 RESTRUCTURE IDB DEFINITIONS AND INCLUDE 2 NEW FIELDS: $IDJPT JOB'S PATH SPEC. $IDCPU CPU TYPE (CP$KAX=0 CP$KIX=1) 146 ADD A PRINTX TO THE VERSN$ MACRO TO TELL USER WHAT VERSIONS OF C.MAC AND IO.MAC ARE BEING USED IN THIS ASSEMBLY 147 GET RID OF FT$KIX 150 ADD A NEW ERROR MACRO ADVIS$ THAT TAKES THE SAME ARGUMENTS AS FATAL$ AND WARN$, BUT PTINTS ITS MESSAGE ENCLOSED WITHIN [], E.G. [DELAMB AMBIGUOUS FILESPEC.: MYPROG] REDEFINE EC$XXX SYMBOLS TO MAKE WAY FOR EC$FLG, A SEVEN BIT ASCII SEVERITY CHARACTER - ? - % - [ E.G. 151 ADD MACROS TO CALL ROUTINES TO PERFORM THE MT???. UUOS THAT CALL MTAPE 152 alter BEGIN$ so that it always generates 5 instructions that fixup CCL entry and PORTALs, and call a new routine $BEGIN. make a debugging label, $$BEG, on the first user instruction. 153 move $IDPPN within the IDB to help $INIID ! COMMENT ; THIS REVISION HISTORY BEGINS AT EDIT 120: HALFWAY THROUGH VERSION 4 120 ADD A NEW FLAG TO $FDCHN: FC$CSC (1B4) CHANNEL SET BY CALLER 121 ADD ARGUMENT TO BEGIN$ MACRO TO SPECIFY 3 CHARACTER NAME OF TEMPCORE FILE 122 ADD TWO WORDS TO IDB: $IDJNO JOB NUMBER (RH): 3 CHARACTER JOB NUMBER (LH) $IDJPP JOB PPN 123 ADD TWO NEW OPDEFS FOR LOADING AC(D): LDFD$ ADDRESS :MOVE D,ADDRESS LDFDI$ ADDRESS :MOVEI D,ADDRESS 124 CORRECT MX$ MACRO AND SLEEP$ MACRO 125 ADD NEW MACROS, XTCAL$, XTDCL$, CNVUI$, CNVIU$, CNVNU$ 126 FIX WCHAR$ MACRO TO HANDLE 'WCHAR$ ","' CORRECTLY 127 CHANGE NAMES OF SWITCH TABLES GENERATED BY SWTAB$ MACRO TO INCLUDE '$' SYMBOL 130 ADD NEW SYMBOL $ECTER FOR ERROR CODE (I.E. CODE OUT OF RANGE) 131 ALTER THE RSWIT$ MACRO, SO THAT IT ONLY CALLS 1 ENTRY POINT 132 ADD ARGUMENT TO RLEAS$ MACRO TO INDICATE NOT TO DELETE BUFFER RINGS. 133 MACROS TO CALL $SAVET AND $RESTT ; COMMENT ; PREFACE TO VERSION 4. VERSION 4 IS A REWRITE TO 1. COMPLEMENT IOL4 2. REMOVE SERIOUS DEFICIENCIES IN VERSION 3 3. EXTEND THE RANGE OF MACROS AND OPDEFS AVAILABLE ; COMMENT ; IO CONTAINS: 1. DEFINITIONS OF SYMBOLS NEEDED BY PROGRAMMERS USING THE IOLIB LIBRARY OF SUBROUTINES 2. DEFINITIONS OF OPDEFS USEFUL TO PROGRAMMERS USING IOLIB 3. ESSENTIAL MACROS FOR IOLIB USERS (BEGIN$) 4. USEFUL MACROS FOR IOLIB USERS ; COMMENT ; IO SYMBOL NAMING CONVENTIONS: IO FOLLOWS THE PATTERN ESTABLISHED BY DEC IN THE PARAMETER FILE C.MAC DEC USES THE SPECIAL CHARACTERS '.' AND '%' IN ALL SYMBOLS IN C.MAC TO SHOW THAT THE SYMBOL HAS A SPECIAL SIGNIFICANCE. DEC HAS RESERVED THE CHARACTER '$' FOR CUSTOMER USE, SO IO USES THAT CHARACTER IN THE SAME WAY THAT DEC USES '.' AND '%'. PATTERN USE $GGSSS NUMBER OF GENERAL CATEGORY 'GG', SPECIFIC USE 'SSS' GG$SSS BYTE OF GENERAL CATEGORY 'GG', SPECIFIC USE 'SSS' MMMMM$ MACRO, OPDEF, UUO OR SPECIAL ERROR SYMBOL E.G. $FDXXX WORD IN THE FILE DESCRIPTOR BLOCK FC$XXX BIT IN THE FILE DESCRIPTOR CHANNEL WORD FATAL$ FATAL ERROR REPORTING MACRO ERIMP$ IMPROPER MODE IO ERROR ; SUBTTL FEATURE TEST SWITCHES ND FT$DBG,0 ;-1 INVOKES DEBUG FEATURES ND FT$SFD,6 ;NONZERO IS NUMBER OF DIRECTORY LEVELS ;[147] ND FT$KIX,-1 ;0 FOR KA10, NONZERO FOR KI10 ND FT$CCL,0 ;NONZERO FOR CCL ENTRY POINT ND FT$2SG,0 ;NONZERO FOR TWO SEGMENTS ND FT$ALC,-1 ;NONZERO FOR DYNAMIC CORE ALLOCATION SUBTTL ACCUMULATOR DEFINITIONS ; 5 TEMPORARIES T0=0 ;UNUSED BY IOLIB. ALSO DEFINED AS F (FLAG) T1=1 ;4 DESTROYED BY IOLIB ROUTINES T2=2 ; EXCEPT FOR THE BASIC IO T3=3 ; MODULE. T4=4 ; ; 4 PRESERVED P1=5 ;4 PRESERVED BY ALL IOLIB ROUTINES P2=6 ; AND SHOULD BE PRESERVED BY ALL P3=7 ; USER SUBROUTINES BEFORE USING P4=10 ; THEM. ; 7 GLOBALS G1=11 ;4 TOTALLY UNUSED BY THE IOLIB SYSTEM G2=12 ; AND FREE FOR USE BY THE USER IN ANY WAY G3=13 ; HE WISHES G4=14 ; G5=15 ;ALSO DEFINED AS D, AND HEAVILY USED BY IOLIB IO G6=16 ;ALSO DEFINED AS L AND I. USED BY IOLIB G7=17 ;ALMOST INVARIABLY THE GENERAL STACK POINTER ; REDEFINE 4 ACS FOR SPECIAL PURPOSES F=0 ;FLAG AC (SINCE NON-INDEX) D=15 ;FILE DESCRIPTOR BLOCK POINTER I=16 ;IOLIB DATA BLOCK POINTER L=16 ;LINK AC FOR DEC STANDARD S/R CALLING SEQUENCE P=17 ;PUSH-DOWN STACK POINTER COMMENT ; THE CONFLICT BETWEEN I AND L MUST BE RESOLVED BY THE USER OF IOLIB. IOLIB ROUTINES DO NOT USE THE L=LINK CONVENTION AND SOME EXPECT THAT A POINT TO THE IOLIB DATA BLOCK IS IN AC(I). USER ROUTINES USING L AS A LINK MUST BE CAREFUL TO SETUP I BEFORE CALLING ANY IOLIB ROUTINE. D, I AND P ARE LOADED BY THE BEGIN$ MACRO ; SUBTTL FILE DESCRIPTOR BLOCK LOC 0 $FDFPT: BLOCK 1 ;FORWARD POINT FOR LINKING CHAINS OF FDBS $FDCHN: BLOCK 1 ;STATUS BITS (0-12) CHANNEL NUMBER (27-30) FC$OPN==1B0 ;OPEN UUO DONE FC$LUK==1B1 ;LOOKUP UUO DONE FC$ENT==1B2 ;ENTER UUO DONE FC$TCI==1B3 ;INPUT IS FROM TEMPCORE FC$CSC==1B4 ;CHANNEL SET BY CALLER FC$CHN==17B30 ;CHANNEL NUMBER $FDTYP: BLOCK 1 ;DEVTYP UUO WORD $FDNBK: BLOCK 1 ;LAST BLOCK NUMBER,,THIS BLOCK NUMBER $FDBUF: BLOCK 1 ;NUMBER OF BUFFERS,,BUFFER SIZE $FDIOW: BLOCK 1 ;POINT TO IOWD BLOCK OR NEXT BUFFER $FDOPN: ;3 WORD OPEN BLOCK $FDSTS: BLOCK 1 ;CHANNEL STATUS $FDDEV: BLOCK 1 ;DEVICE NAME IN SIXBIT $FDBHD: BLOCK 1 ;BUFFER HEADER POINTERS $FDPTH: BLOCK FT$SFD+3 ;PATH SPECIFICATION BLOCK $FDOBH: BLOCK 4 ;OUTPUT BUFFER HEADER (INCL. MPX) $FDIBH: BLOCK 4 ;INPUT BUFFER HEADER (INCL. MPX) $FDMOD: BLOCK 1 ;MODIFIER WORD $FDMOM: BLOCK 1 ;MODIFIER MASK $FDBFR: BLOCK 1 ;/BEFORE $FDSNC: BLOCK 1 ;/SINCE $FDABF: BLOCK 1 ;/ABEFORE $FDASN: BLOCK 1 ;/ASINCE $FDRIB: ;RIB BLOCK (TO .RBVER) $FDCNT: BLOCK 1 ;COUNT OF WORDS FOLLOWING $FDPPN: BLOCK 1 ;POINT TO $FDPTH $FDNAM: BLOCK 1 ;FILE NAME IN SIXBIT $FDEXT: BLOCK 1 ;EXTENSION IN SIXBIT $FDPRV: BLOCK 1 ;PRIVILEDGE WORD $FDSIZ: BLOCK 1 ;FILE SIZE $FDVER: BLOCK 1 ;VERSION NUMBER $LNFDB==.-$FDFPT ;LENGTH $ENFDB==$LNFDB-1 ;END COMMENT ; SYMBOLS FOR ELEMENTS OF AN EXTENDED FDB TO ACCOMODATE THE REST OF AN EXTENDED RIB ARE NOT DEFINED WITH $FDXXX SYMBOLS. THE USER MAY DEFINE HIS OWN, OR REFER TO THE RELATIVE TO $FDRIB USING .RBXXX SYMBOLS. SEE OVER FOR FURTHER FDB DEFINITIONS......../ ; ; DEFINITIONS OF BYTES IN THE MODIFIER WORD FM$NDV==1B0 ;NULL DEVICE SPEC. FM$NUL==1B1 ;NULL EXTENSION FM$DIR==1B2 ;DIRECTORY SPEC. FM$PHY==1B3 ;/PHYSICAL FM$NOM==1B4 ;/OKNONE FM$DFX==1B5 ;WILD FIXUP UNNEC. FOR DIRECTORY FM$ADD==1B6 ;SPEC. TERMINATED BY '+' (OBSOLETE) FM$TRM==7B8 ;CODE FOR SPEC. TERMINATOR $FMTRA==1 ;& - AND $FMTRO==2 ;! - OR $FMTRN==3 ;- - NOT $FMTRC==4 ;+ - CONCATENATION FM$STR==1B9 ;/STRS FM$PAR==1B24 ;/PARITY FM$DEN==3B26 ;/DENSITY FM$PRO==777B35 ;/PROTECTION ; MASKS USED IN WILD CARD DECODING. ; THESE SYMBOLS FALL IN THE BUFFER HEADERS AND WILL BE OVRWRITTEN ; AS SOON AS IO IS PERFORMED WITH THESE FDB'S. USERS ARE NOT ; RECOMMENDED TO ATTEMPT IO WITH WILD FILES! LOC $FDPTH BLOCK 2 $FDPPP: BLOCK 1 ;PATH PPN $FDSFD: BLOCK FT$SFD ;PATH SFD NAMES IN SIXBIT LOC $FDOBH $FDPTM: BLOCK FT$SFD ;PATH MASK (SHARED WITH $FDXBH) $FDNMM: BLOCK 1 ;NAME MASK ; BITS RETURNED BY $RFILE IN AC(T2) TO SHOW SOME FACTS ABOUT ; THE INPUT FILENAME FF$NUL==1B0 ;NO FILENAME FF$WLD==1B1 ;SOME PART OF THE FILENAME WAS WILD SUBTTL IOLIB DATA BLOCK DEFINITIONS LOC 0 $IDDYC: BLOCK 1 ;POINT TO CHAIN OF CORE CHUNKS ON HEAP $IDTOP: BLOCK 1 ;USER DEFINED LIMIT TO LOW CORE USAGE $IDLAC: BLOCK 1 ;LOOKAHEAD CHARACTER (COMMAND SCANNER) $IDCPC: BLOCK 1 ;COMMAND COROUTINE PC $IDLSC: BLOCK 1 ;LAST CHARACTER READ (COMMAND SCANNER) $IDNXC: BLOCK 1 ;NEXT CHARACTER TO BE READ (COMMAND SCANNER) $IDPNM: BLOCK 1 ;PROGRAM NAME $IDPPN: BLOCK 1 ;program ppn $IDPEX: BLOCK 1 ;PROGRAM LOW EXTENSION $IDPDV: BLOCK 1 ;PROGRAM DEVICE $IDIFD: BLOCK 1 ;COMMAND INPUT FDB POINT $IDOFD: BLOCK 1 ;LOG OUTPUT FDB POINTER $IDEFD: BLOCK 1 ;ERROR MESSAGE FDB $IDCCL: BLOCK 1 ;CCL ENTRY POINT FLAG $IDSWT: BLOCK 1 ;POINT TO TABLE OF USER SWITCH TABLES $IDRUN: BLOCK 1 ;RUNOFFSET,,RUN FDB $IDECD: BLOCK 1 ;ERROR CODE IN SIXBIT $IDHNM: BLOCK 1 ;FILE NAME FOR HELP $IDDFD: BLOCK 1 ;FDB HOLDING DEFAULTS FOR FILENAME DECODING $IDJNO: BLOCK 1 ;[122] JOB NUMBER (SIXBIT),,JOB NUMBER $IDJPP: BLOCK 1 ;[122] JOB PPN $IDJPT: BLOCK FT$SFD+3 ;[145] JOB'S PATH SPEC. $IDCPU: BLOCK 1 ;[145] CPU WE ARE RUNNING ON $LNIDB==.-$IDDYC ;LENGTH OF FDB $ENIDB==$LNIDB-1 ;END OF IDB SUBTTL CHARACTER DEFINITIONS COMMENT ; C.MAC DEFINES ALL THE SYMBOLS FOR THE ASCII CHARACTERS AS .CHXXX THESE SYMBOLS DEFINE CHARACTERS DUMMIED UP BY THE CHARACTER READING ROUTINES TO SHOW THE VARIOUS FLAVOURS OF ENDLINE. THEY CAN BE WRITTEN BY THE $WFCHA (WRITE A FUNNY CHARACTER) ROUTINE. ; $CHALX==0 ;ALL FLAVOURS OF ESCAPE OR ALTMODE $CHEOL==-1 ;ENDLINE $CHEOF==-2 ;ENDFILE COMMENT ! REDEFINE SYMBOLS FOR 3 WORD HEADER OF BUFFERS TO CONFORM TO THE C V:6 STANDARD, BUT MAKE IO INDEPENDANT OF V:6 OR V:7. ! $BFSTS==-1 ;STATUS WORD $BFHDR==0 ;POINT TO NEXT BUFFER $BFCNT==1 ;3RD WORD (SOMEWHAT DEVICE DEPENDANT) SUBTTL ERROR CODES FOR IO ERRORS UNDEFINED BY DEC ; CODE DEFINING WHICH UUO HAD THE IO ERROR UUUUO$==0 ;UNDEFINED UUO UUOPN$==1 ;OPEN UUENT$==2 ;ENTER UULUK$==3 ;LOOKUP UUREN$==4 ;RENAME UUINP$==5 ;INPUT UUOUT$==6 ;OUTPUT UURUN$==7 ;RUN UUGET$==10 ;GETSEG UUCLO$==11 ;CLOSE UUTMP$==12 ;TMPCOR ; ADDITIONAL IO ERROR CODES PRODUCED BY $OPEN, $INPUT, $OUTPUT EREOF$==-1 ;ENDFILE (COULD BE AN ERROR) ERBKT$==-2 ;BLOCK TOO LARGE ERDTE$==-3 ;DATA ERROR ERDER$==-4 ;DEVICE ERROR ERIMP$==-5 ;IMPROPER MODE ERQTA$==-6 ;NO ROOM OR QUOTA EXCEEDED ERRSD$==-7 ;RESTRICTED DEVICE ERNFC$==-10 ;NO FREE IO SOFTWARE CHANNEL ERUNK$==-11 ;UNKNOWN ERROR CODE ; FIELDS IN LH(T1) ON CALL TO $ERROR EC$IND==1B0 ;[150] RH(T1) POINTS TO POINT EC$UUO==1B1 ;[150] AC(T3) CONTAINS UUO NAME ;[150] BITS 2,3,4 ARE FREE AND RESERVED EC$FLG==177B11 ;[150] SEVERITY FLAG CHARACTER IN ASCII EC$TYP==77B17 ;[150] VALUE TYPE CODE $ECTER==0 ;[130] ERROR $ECTNO==0 ;NONE $ECTCH==1 ;CHARACTER $ECTDE==2 ;DECIMAL $ECTFI==3 ;FILE $ECTOC==4 ;OCTAL $ECTTE==5 ;TEXT $ECTWO==6 ;WORD SUBTTL SWITCH TABLE INDEX NAMES ; THERE ARE 4 TABLES ASSOCIATED WITH SWITCHES AND A BLOCK ; OF 4 WORDS USED TO POINT TO THESE TABLES. THESE SYMBOLS DEFINE ; INDICES WITHIN THE 4 WORD BLOCK $STNAM==0 ;IOWD TO TABLE OF SWITCH NAMES $STPNT==1 ;P1,,POINT TO TABLE OF BYTE POINTERS $STMAX==2 ;P1,,POINT TO TABLE OF MAX,,PROC ; OR IOWDS TO KEYWORD TABLES $STDFT==3 ;P1,,POINT TO TABLE OF FLAGS,,DEFAULTS SUBTTL SOME USEFUL OPDEFS ; OK, SOME PEOPLE USE JUMPA OPDEF PJUMPA [JRST] ; SET THE CURRENT FDB POINTER TO STANDARD FDBS OPDEF CMDFD$ [MOVE D,$IDIFD(I)] OPDEF MSGFD$ [MOVE D,$IDOFD(I)] OPDEF ERRFD$ [MOVE D,$IDEFD(I)] OPDEF TRMFD$ [MOVEI D,0] OPDEF LDFD$ [MOVE D,] ;[123] ADDRESS OF FDB OPDEF LDFDI$ [MOVEI D,] ;[123] ADDRESS OF FDB IMMEDIATE SUBTTL MACROS TO CALL BASIC IO ROUTINES ;MACRO TO DEFINE A CALL TO AN IOLIB ROUTINE AND TO MAKE THE ;SYMBOL INTERNAL OR EXTERNAL ACCORDING TO WHETHER IT IS DEFINED IN ;THIS MODULE OR NOT DEFINE MM$$(SYM),< IF2,> PUSHJ P,$'SYM> ;MACRO TO DEFINE A CALL TO ONE OF TWO IOLIB ROUTINES DEPENDING ON ;WHETHER AN ARGUMENT WAS SUPPLIED. THE TWO ROUTINES ARE NORMALLY ;DIFFERENT ENTRY POINTS TO THE SAME ROUTINE. ;IF THE ARGUMENT IS OTHER THAN 'T1', THE ARGUMENT IS LOADED FROM ;THE GIVEN ADDRESS INTO T1. DEFINE MR$$(ADR,SYM1,SYM2),< IFB ,< MM$$ SYM1> IFNB ,< IFN <-T1>,< MOVE T1,> MM$$ SYM2>> ; MACROS TO CALL THE FORMATTED WRITE ROUTINES DEFINE WCHAR$(CHR,X),< IFNB ,< MOVEI T1,","> IFB ,< IFNB ,< MOVEI T1,CHR>> MM$$ $WCHR> DEFINE WTEXT$(TXT),< IFNB ,< MOVEI T1,[ASCIZ `'TXT'`]> MM$$ WTEXT> DEFINE WLINE$(TXT),< IFNB ,< MOVEI T1,[ASCIZ `'TXT' `]> MM$$ WTEXT> DEFINE WDECL$(NUM),< IFNB ,< MOVEI T1,^D'NUM> MM$$ WDECL> DEFINE WOCTL$(NUM),< IFNB ,< MOVEI T1,NUM> MM$$ WOCTL> DEFINE WREAL$(NUM),< IFNB ,< MOVE T1,[NUM]> MM$$ WREAL> DEFINE WWORD$(WOR),< IFNB ,< MOVX T1,> MM$$ WWORD> DEFINE WPWOR$(CHR,WOR),< IFNB ,< MOVEI T1,CHR> IFNB ,< MOVX T2,> MM$$ WPWOR> ; BASIC IO ROUTINES DEFINE INPUT$, DEFINE OUTPU$, DEFINE OUTIN$, DEFINE USETI$, DEFINE USETO$, DEFINE GETST$, DEFINE SETST$, DEFINE DELET$, DEFINE RENAM$, DEFINE LUKUP$, DEFINE ENTER$(ADR), DEFINE OPEN$, DEFINE MKBUF$, DEFINE DLBUF$, DEFINE CLOSE$(BIT),< IFNB ,< MOVEI T1, MM$$ CLOS0> IFB ,< MM$$ CLOSE>> DEFINE RLEAS$(ADR), DEFINE FRCHN$, DEFINE MX$$(UUO,SYM),< ;[124,135] CORRECT ARGUMENT ORDER, AND SYMBOL NAMES IFNB ,< MOVX T1,> MM$$ SYM> DEFINE XTUUO$(UUO), DEFINE XTDCL$(UUO), DEFINE XTCDV$(UUO), ;[125] OBSOLETE DEFINE XTCAL$(UUO), DEFINE XTCLI$(UUO), ;[125] OBSOLETE DEFINE APEND$, DEFINE UPDAT$, DEFINE SAVE1$, DEFINE SAVE2$, DEFINE SAVE3$, DEFINE SAVE4$, DEFINE SAVET$, DEFINE RESTT$, DEFINE ALLOC$, DEFINE DEALC$, DEFINE CLRFD$(ADR), DEFINE LOSFD$, DEFINE FDTTY$, DEFINE APDWT$(ADR), DEFINE UPDWT$(ADR), ; MACROS TO CALL THE MTAPE UUO DEFINE MT$$(OP),< PUSHJ P,$MT'OP'##> DEFINE MTWAT$, DEFINE MTREW$, DEFINE MTEOF$, DEFINE MTSKR$, DEFINE MTBSR$, DEFINE MTEOT$, DEFINE MTUNL$, DEFINE MTBLK$, DEFINE MTSKF$, DEFINE MTBSF$, DEFINE MTDEC$, DEFINE MTIND$, ; FORMATTED WRITE MACROS DEFINE WRITE$, DEFINE WBYTE$, DEFINE WCRLF$, DEFINE WRADX$, DEFINE WXWD$, DEFINE WFILE$, DEFINE WNAME$, DEFINE WDVIC$, DEFINE WPATH$, DEFINE WFCHA$, DEFINE W2FIL$, DEFINE W2FL0$, DEFINE W2FLB$, DEFINE WCASH$, DEFINE WADDR$, DEFINE WDATE$, DEFINE WDNOW$, DEFINE WTIME$, DEFINE WTIMS$, DEFINE WTMTS$, DEFINE WTNOW$, DEFINE WTDAY$, DEFINE WTDNW$, DEFINE WHELP$, define wbwrd$, ;[136] define wcwrd$, ;[136] define wwwrd$, ;[136] DEFINE WKWRD$, DEFINE WPWRD$, ; FORMATTED READ ROUTINES DEFINE READ$, DEFINE RBYTE$, DEFINE RCHAR$, DEFINE CKEOL$, DEFINE RCCHR$, DEFINE RCALT$, DEFINE RUCCH$(ADR), DEFINE RANCH$(ADR), DEFINE REDCH$(ADR), DEFINE RWORD$(ADR), DEFINE RNAME$(ADR), DEFINE RWNAM$(ADR), DEFINE RWNUM$(ADR), DEFINE RDECL$(ADR), DEFINE RDECM$(ADR), DEFINE ROCTL$(ADR), DEFINE ROCTM$(ADR), DEFINE RKWRD$(ADR), DEFINE RREAL$(ADR), DEFINE RTDAY$(ADR), DEFINE RDATE$(ADR), DEFINE RTIME$(ADR), DEFINE RCASH$(ADR), DEFINE RFILE$(ADR), DEFINE RDVIC$(ADR), DEFINE RPATH$(ADR), DEFINE RPPN$(ADR), DEFINE RPJPG$(ADR), DEFINE RSWIT$, ;MISCELLANEOUS ROUTINES DEFINE MONRT$, DEFINE CLLIN$, DEFINE CLBUF$, DEFINE SLEEP$(SEC),< IFNB ,< MOVEI T1,SEC MM$$ SLEE0> IFB ,< MM$$ SLEEP>> DEFINE MATCH$, DEFINE ZERO$, DEFINE BATCH$, DEFINE TMPFD$, DEFINE TMPIN$, DEFINE TMPOU$, DEFINE TMPDL$, DEFINE CNVUI$, DEFINE CNTDT$, ;[125] OBSOLETE DEFINE CNVNU$, DEFINE CNNOW$, ;[125] OBSOLETE DEFINE CNVIU$, DEFINE CNVDT$, ;[125] OBSOLETE SUBTTL ERROR REPORTING MACROS ; THE ERROR REPORTING MACROS CAN BE USED TO CALL THE ROUTINES ; $FATAL/$WARN OR ANY ROUTINES OF THE FORM $FTLXX/$WRNXX ; THE CALL ALWAYS TAKES ONE INSTRUCTION OF INLINE CODE AND ; FROM 0 TO 5 WORDS OF LITERALS. ; CALL:(E.G.) ; FATAL$ ;CALLS $FTLIO ; FATAL$ ,FD ;CALLS $FTLFD ; FATAL$ ,CHAR,TXT,SYNTAX ;CALLS $FATAL ; FIRST DEFINE A MACRO TO DEFINE THE OTHER TWO MACROS DEFINE FW$$(NAM,ABR,TXT,TYP,EID,UUO),< IFB ,< PUSHJ P,$'ABR'IO##> IFNB ,< IFB ,< EXTERN $'ABR'TYP PUSHJ P,$'ABR'TYP> IFNB ,< IFB ,< PUSHJ P,[MOVEI T1,[ASCIZ \TXT\] PJRST $'NAM'##]> IFNB ,< IFNB ,< FW$$S==EC$IND+[+[ASCIZ `'TXT'`]]> IFB ,< FW$$S==[ASCIZ `'TXT'`]> IFNB ,< FW$$S==FW$$S+EC$UUO> IFNB ,< FW$$S==FW$$S+<<$ECT'TYP>B17>> PUSHJ P,[MOVE T1,[FW$$S] IFNB ,< MOVE T3,[SIXBIT `'UUO'`]> ;[137] JRST $'NAM'##] PURGE FW$$S> >>>;DEFINE DEFINE FATAL$(TXT,TYP,EID,UUO),< FW$$ FATAL,FTL,TXT,TYP,EID,UUO> DEFINE WARN$(TXT,TYP,EID,UUO),< FW$$ WARN,WRN,TXT,TYP,EID,UUO> DEFINE ADVIS$(TXT,TYP,EID,UUO),< FW$$ ADVIS,ADV,TXT,TYP,EID,UUO> SUBTTL BEGIN MACRO COMMENT ; THIS MACRO SHOULD BE CALLED AS THE FIRST EXECUTABLE INSTRUCTION AT THE START ADDRESS. IT PERFORMS ALL PROGRAM INITIALISATION INCLUDING 1 PORTALS FOR EX ONLY KI PROGRAMS 2 SET CCL FLAG IN $IDCCL 3 INITIALISE IDB 4 RESET 5 LOAD D I AND P 6 SETUP TEMPCORE INPUT IN $IDIFD IF CCL ENTRY ; ; CALL: ; BEGIN$ DEFINE BEGIN$(TCN),< ;;[121] ARGUMENT TO BEGIN$ MACRO IFE FT$DBG, IFE FT$ALC,< $$ALLC==$CRGET## $$DALC==$CRREL##> ;STATIC CORE ALLOCATION IFN FT$DBG, ;LOAD PATCH AREA IFE FT$DBG, ;LOAD NON-DEBUG CODE PORTAL .+2 ;XCT ONLY ENTRY PORTAL .+2 ;XCT ONLY CCL ENTRY TDZA T1,T1 ;FLAG NORMAL ENTRY IFNB ,< MOVEI T1,(SIXBIT \TCN\) ;;[124] SET TEMPCORE FILE NAME> IFB ,< HLRZ T1,.SGNAM ;;[124] USE PROGRAM NAME AS TEMPCORE FILENAME> IFE FT$CCL,< JSP T0,$BEGIN## ;initialise code> IFN FT$CCL,< JSP T0,$BEGCC## ;initialise code + CCL stuff>;FT$CCL $$BEG:: >;BEGIN$ SUBTTL VERSION NUMBERING MACROS COMMENT ; THERE ARE 4 VERSION NUMBER MACROS. 1. VERSN$ DEFINES THE SYMBOLS FOR THE FOUR BASIC VERSION NUMBERS 2. PATCH$ DEFINES $N SYMBOLS FOR PATCHES AND UPDATES THE EDIT AND RELEASE NUMBERS 3. JBVER$ SETS THE VERSION NUMBERS INTO .JBVER 4. VTEXT$ CREATES AN ASCIZ STRING OUT OF THE VERSION NUMBER SUITABLE FOR PRINTING ; ; CALL: ; VERSN$ 3,105,2 ;WHERE 3 IS VMAJOR, 105 IS VEDIT AND 2 IS VWHO DEFINE VERSN$(VMJ,VED,VCD)< $VMAJ== ;;MAJOR VERSION $VMIN==0 ;;RELEASE $VEDT== ;;EDIT NUMBER $VCOD== ;;WHO LAST MODIFIED ;;PRINT OUT VERSION NUMBERS OF C AND IO ON ASSEMBLY V1$$==<<%%C&<77700,,000000>>_-^D24> V2$$==<%%C&777777> V3$$==<<$$IO&<77700,,000000>>_-^D24> V4$$==<$$IO&777777> DEFINE V$$(V1,V2,V3,V4),< IF1,< PRINTX %Assembled using C version V1(V2) and IO version V3(V4) >>;DEFINE V$$ \V1$$,\V2$$,\V3$$,\V4$$ PURGE V1$$,V2$$,V3$$,V4$$ > ; CALL: ; PATCH$ <23,24,26> ;EDIT NUMBERS BRACKETED BY RELEASE DEFINE PATCH$(PAT)< IFNB <$VMIN==$VMIN+1> IRP PAT<$VEDT==$VEDT+1 $'PAT==-1> > ; CALL: ; JBVER$ DEFINE JBVER$< .JBVER==137 LOC .JBVER BYTE (3)$VCOD(9)$VMAJ(6)$VMIN(18)$VEDT RELOC > ; CALL: ; VTEXT$ DEFINE VTEXT$,< DEFINE VTEXT$(VMJ,VMI,VED,VCD),< DEFINE ..NUM(..N),< IFN ..N>>;..NUM DEFINE ..ABC(..A),< IFN ..A<..T==..T_7+"A"+..A-1 ..WRD>>;..ABC DEFINE ..CHR(..C),< ..T==..T_7+"..C" ..WRD>;..CHR DEFINE ..WRD,< IFN <..T&..M>,<..DEP ..T==0>>;..WRD DEFINE ..DEP,< BYTE(7) <..T&<376000,,0>>_-^D28,<..T&<1770,,0>>_-^D21, <..T&<7,,740000>>_-^D14,<..T&37600>_-^D7,..T&177>;..DEP ..T==0 ..M==376000,,0 ..NUM VMJ ..ABC VMI IFN VED<..CHR <(> ..NUM VED ..CHR <)>> IFN VCD<..CHR <-> ..NUM VCD> IFE ..T> IFN ..T< DEFINE ..WRD,< ..T==..T_7 IFE <..T&..M>,<..WRD> IFN ..T<..DEP ..T==0>>>;..WRD ..WRD PURGE ..NUM,..ABC,..CHR,..WRD,..DEP,..T,..M>;VERSION VTEXT$ \$VMAJ,$VMIN,\$VEDT,\$VCOD> SUBTTL MACROS TO AID ASSEMBLY ; HISEG$ ; CHANGE RELOCATION SO THAT CODE WILL BE ASSEMBLED INTO ; THE HIGH SEGMENT. IF THE SEGMENT INDICATOR IS NOT YET ; DEFINED, DEFINE IT AND ISSUE A TWOSEG PSEUDO-OP ; CALL: ; HISEG$ DEFINE HISEG$,< IF1,< IFDEF SEG$1,< IFE SEG$1,< IFE FT$DBG, LIT RELOC IFE FT$DBG,>> IFNDEF SEG$1,< TWOSEG RELOC 400000> SEG$1==-1> IF2,< IFDEF SEG$2,< IFE SEG$2,< IFE FT$DBG, LIT RELOC IFE FT$DBG,>> IFNDEF SEG$2,< TWOSEG RELOC 400000> SEG$2==-1>> ; LOSEG$ ; CHANGE RELOCATION SO THAT CODE WILL BE ASSEMBLED INTO THE ; LOW SEGMENT. IF THE SEGMENT INDICATOR IS UNDEFINED THERE ; IS NO HIGH SEGMENT, SO DO NOTHING. ; CALL: ; LOSEG$ DEFINE LOSEG$,< IF1,< IFDEF SEG$1,< IFN SEG$1,< IFE FT$DBG, LIT RELOC SEG$1==0 IFE FT$DBG,>>> IF2,< IFDEF SEG$2,< IFN SEG$2,< IFE FT$DBG, LIT RELOC SEG$2==0 IFE FT$DBG,>>>> ; INSTK$ ; SET UP THE PUSH DOWN POINTER TO THE START OF THE STACK ; CALL: ; INSTK$ DEFINE INSTK$,< GLOB <$STACK,$LNSTK,$PTSTK> MOVE P,$PTSTK> ; JBREN$ ; LOAD .JBREN WITH THE ADDRESS OF THE REENTRY ROUTINE. USES ; AN AC OF THE USER'S CHOICE ; CALL: ; JBREN$ T1,RENTER DEFINE JBREN$(AC,ADR),< .JBREN==124 MOVEI AC,ADR HRRM AC,.JBREN> ; CHNNO$ ; LOAD THE CHANNEL NUMBER FOR THE CURRENT FILE INTO THE ; GIVEN AC ; CALL: ; CHNNO$ AC DEFINE CHNNO$(AC),< LDB AC,[POINTR ($FDCHN(D),FC$CHN)]> SUBTTL MACROS TO BUILD SWITCH TABLES COMMENT ; THE SWITCH TABLES ARE USED BY THE COMMAND SCANNING ROUTINES TO READ AND ACT ON SWITCHES ENCOUNTERED IN THE COMMAND. THERE ARE 4 TABLES END TO END WITH ONE ENTRY PER SWITCH IN EACH TABLE. THE TABLES CONTAIN: 1. SIXBIT NAMES OF THE SWITCHES 2. BYTE POINTER TO STORE THE VALUE OF THE SWITCH 3. IF .LT.0, THEN IOWD TO TABLE OF ALLOWED KEYWORD VALUES FOR THE SWITCH IF .GE.0, THEN THE ADDRESS OF THE PROCESSOR ROUTINE FOR THE THE VALUE IS IN THE RH, AND THE MAXIMUM VALUE IS IN THE LH. 4. DEFAULT VALUE FOR THE SWITCH IN THE RH: OTHERWISE ZERO. 6 MACROS ARE USED TO BUILD THE TABLES, AND A FURTHER MACRO TO DEFINE THE MAXIMA AND DEFAULTS FOR THE SWITCHES. THE SWTAB$ MACRO BUILDS THE 4 TABLES, GIVEN A LIST OF SWITCHES DEFINED IN A USER DEFINED MACRO 'SWITCH'. SWITCH MUST CONTAIN A LIST OF SWITCHES DEFINED IN TERMS OF THE MACROS SP$, SL$, SS$. SP$ DEFINES SWITCHES WITH VALUES OTHER THAN KEYWORDS. ITS ARGUMENTS ARE THE NAME, THE STORAGE BYTE POINTER, THE NAME OF THE PROCESSOR, WHICH MUST BE ONE OF DECL OCTL WORD FILE AND THE ABBREVIATION USED IN THE 'DM$' MACRO TO DEFINE THE DEFAULTS. SL$ DEFINES SWITCHES WITH KEYWORD VALUES. THE ARGUMENTS ARE THE NAME, THE STORAGE BYTE POINTEER, A NAME OF A TABLE OF KEYWORDS AS A TWO WORD ID, AND THE DEFAULT KEYWORD AS A TWO CHARACTER SS$ DEFINES SWITCHES WHICH HAVE NO VALUE. THE ARGUMENTS ARE THE NAME THE STORAGE BYTE POINTER, AND THE VALUE TO BE STORED. OFTEN 1 FOR 1 BIT FLAG. THE STORAGE BYTE POINTER MAY BE AN ADDRESS ONLY, IF THE BYTE IS A FULL WORD. THE TABLE OF KEYWORDS ARE DEFINED BY THE KEYWD$ MACRO. MAXIMA AND DEFAULT SYMBOLS ARE DEFINED BY THE DM$ MACRO. IT DEFINES SYMBOLS MX$XXX FOR THE MAXIMUM AD$XXX FOR THE DEFAULT IF THE KEYWORD IS ABSENT PD$XXX FOR THE DEFAULT IF THE KEYWORD IS PRESENT ; DEFINE DM$(ABR,MAX,ADF,PDF),< ND MX$'ABR,MAX ND AD$'ABR,ADF ND PD$'ABR,PDF> DEFINE SP$(NAM,STO,PRO,ABR,FLG),< X NAM,PRO,,PD$'ABR,MX$'ABR,FLG> DEFINE SL$(NAM,STO,TAB,DEF,FLG),< X NAM,TAB'$T-1,,DEF,-TAB'$L,FLG> DEFINE SS$(NAM,STO,VAL,FLG),< X NAM,0,,VAL,0,FLG> DEFINE SWTAB$(NAM),< XALL ;TABLE OF POINTERS TO THE OTHER TABLES IOWD NAM'$$L,NAM'$$N ;[127] IOWD TO NAME TABLE XWD P1,NAM'$$P ;[127] POINT TO BYTE POINT TABLE XWD P1,NAM'$$M ;[127] POINT TO MAXIMA TABLE XWD P1,NAM'$$D ;[127] POINT TO DEFAULT TABLE ;;TABLE OF SIXBIT SWITCH NAMES DEFINE X(A,B,C,D,E,F),< EXP SIXBIT `A`> NAM'$$N: ;[127] TABLE OF SIXBIT SWITCH NAMES SWIT$$ NAM'$$L==.-NAM'$$N ;;TABLE OF BYTE POINTERS TO STORE RESULT IF2,< DEFINE X(A,B,C,D,E,F),< TMP$$==0 IFB ,< Z ;A TMP$$==1> IFN _-^D24,< TMP$$==C TMP$$ ;A > IFE TMP$$,< POINT 36,C,35 ;A > >> NAM'$$P: ;[127] TABLE OF POINTERS TO VALUE WORDS SWIT$$ ;;TABLE OF IF LT 0, IOWD KEY-TABLE ;; OR IF GE 0, XWD MAX,PROCESSOR MX$==0 DEFINE X(A,B,C,D,E,F),< XWD E,B ;A > NAM'$$M: ;[127] TABLE OF MAXIMA OR IOWDS SWIT$$ ;;FLAGS,,DEFAULT VALUE PD$==0 DEFINE X(A,B,C,D,E,F),< XWD 0,D ;A > NAM'$$D: ;[127] TABLE OF FLAGS AND DEFAULTS SWIT$$ PURGE MX$,PD$,TMP$$ SALL> DEFINE KEYWD$(NAM,KEY),< NAM'$L==0 NAM'$T: IRP (KEY),<*>, STOPI> IFE TMP$$, > PURGE TMP$$> SUBTTL MACROS TO BUILD FDB'S ; FDESC$ ; BUILD AN FDB IN SITU ; FIELDS THAT THE USER MAY SUPPLY ARE ; DEVICE,NAME,EXT,PPN,MODE,LENGTH ; CALL: ; FDESC$ DSKB,IO,MAC,<1,4,MACRO>,.IOBIN,<$FDRIB+.RBDEV> DEFINE FDESC$(DEV,NAM,EXT,PPN,MOD,LEN),< ; DEFINE A LENGTH SYMBOL FOR THIS FDB, WHICH MAY BE LONGER ; THEN $LNFDB, AND REMEMBER WHERE THE START IS ($$$LEN AND ; $$$LOC) IFL <-$LNFDB>,<$$$LEN==$LNFDB> ;DEFINE A LENGTH SYMBOL IFGE <-$LNFDB>,<$$$LEN==> ; $$$LOC==. ;REMEMBER WHERE WE ARE ; MAKE ZEROED WORDS FROM THE START DOWN TO $FDSTS REPEAT $FDSTS,< EXP 0 ;ZEROS TILL STATUS WORD > ; SET THE FILE IO MODE TO .IOASC OR THE GIVEN MODE IFNB ,> ;SET MODE IFB , ;DEFAULT SIXBIT `'DEV'` ;DEVICE ; CLEAR DOWN TO PPN IN PATH SPEC BLOCK REPEAT <$FDPPP-$FDBHD>,< EXP 0 ;BUFFER HEADERS AND MODE > ; IF NO PATH GIVEN, MAKE ZEROED PATH BLOCK ; IF PATH SUPPLIED, SET THIS PATH INTO THE PATH BLOCK IFB ,< ;ZERO PATH SPEC REPEAT ,< EXP 0 >;REPEAT >;IFB IFNB ,< ;CREATE PATH SPEC $$$N==0 ;PPN PARTS SEEN SO FAR IRP ,< IFE <$$$N>,<$$$PPN==PPN,,0> ;PRJ IFE <$$$N-1>,<$$$PPN==$$$PPN+PPN ;PRG EXP $$$PPN ;SET PPN >;IFE IFG <$$$N-1>,< ;THEREFORE AN SFD IFG <$$$N-FT$SFD>, SIXBIT @PPN@ ;SET SFD >;IFG $$$N==$$$N+1 >;IRP IFLE <$$$N-FT$SFD>,< REPEAT ,< EXP 0 ;FILL IN PATH BLOCK >;REPEAT >;IFLE >;IFNB EXP 0 ;END PATH SPEC ; CLEAR DOWN TO RIB BLOCK REPEAT <$FDCNT-$FDOBH>,< EXP 0 > ; .RBCNT - COUNT OF WORDS REMAINING IN FDB ; .RBPPN - POINT TO PATH SPEC. ; .RBNAM - GIVEN FILENAME ; .RBEXT - GIVEN EXTENSION ; .RBPRV-.RBVER - EMPTY EXP $$$LEN-$FDCNT-1 ;RIB WORD COUNT EXP $$$LOC+$FDPTH ;ADDRESS OF PATH SPEC ;NAME &<-1,,0> ;EXTENSION REPEAT <$$$LEN-$FDPRV>,< EXP 0 ;ZERO REST OF FDB > ; CLEAN UP TEMPORARY VARIABLES PURGE $$$LEN,$$$N,$$$PPN,$$$LOC > ; MAKFD$ ; BUILD AN FDB BY CODE INSERTING ANY FIELDS SPECIFIED. ; THE POSSIBILITIES ARE ; DEVICE,NAME,EXTENSION,PPN,MODE,LENGTH,ADDRESS OF FDB ; CALL: ; MAKFD$ DSK,FILEA,F4,<30,652>,.IOASC,,D DEFINE MAKFD$(DEV,NAM,EXT,PPN,MOD,LEN,ADR),< ; DEFINE SYMBOL, $$$LEN, FOR LENGTH OF THIS FDB, WHICH MAY BE ; LONGER THAN $LNFDB IFL <-$LNFDB>,<$$$LEN==$LNFDB> ;LENGTH OF FDB IFGE <-$LNFDB>,<$$$LEN==> ; ; CREATE INSTRUCTION TO MOVE $CLRFD ARGUMENT INTO AC(T1) ; THE ARG IS [LENGTH,,ADDRESS] WITH ADDRESS ZERO FOR A NEW ; FDB TO BE ALLOCATED IFNB ,< MOVE T1,[$$$LEN,,] ;ARGUMENTS FOR $CLRFD > IFB ,< MOVSI T1,$$$LEN ;FIND SPACE > ; S/R CALL TO CREATE (OR CLEAR) FDB. ERRORS ARE FATAL CLRFD$ T1 ; FATAL$ ; MOVE D,T1 ;SETUP D ; IF THE FILE IO MODE IS GIVEN, SET IT INTO $FDMOD IFNB ,< MOVX T1, ;SET MODE MOVEM T1,$FDSTS(D) ; > ; IF THE DEVICE SPEC. IS GIVEN, SET IT INTO $FDDEV IFNB ,< MOVX T1, ;SET DEVICE NAME MOVEM T1,$FDDEV(D) ; > ; IF THE PATH SPEC IS GIVEN, SET IT WORD BY WORD INTO THE ; PATH SPEC. BLOCK $$$N==0 ;IRP COUNT IFNB ,< IRP PPN,< IFE <$$$N>,<$$$PPN==PPN,,0> ;PRJ IFE <$$$N-1>,<$$$PPN==$$$PPN+PPN ;PRG MOVE T1,[$$$PPN] ;SET PPN MOVEM T1,$FDPPP(D) ;IN PATH SPEC. >;IFE IFG <$$$N-1>,< IFG <$$$N-FT$SFD>, MOVX T1, ; MOVEM T1,$FDPTH+1+$$$N(D) ; >;IFG $$$N==$$$N+1 ;INCREMENT IRP COUNT >;IRP >;IFNB ; INSERT FILE NAME INTO FDB IF GIVEN IFNB ,< MOVX T1, ; MOVEM T1,$FDNAM(D) ; > ; INSERT FILE EXTENSION INTO FDB IF GIVEN IFNB ,< MOVX T1, ; HLLZM T1,$FDEXT(D) ; > ; CLEAN UP TEMPORARY VARIABLES PURGE $$$LEN,$$$N,$$$PPN > IF1,< ASUPPRESS> IFDEF %.C, END>> ;BIND OFF TO GET CLEAN LISTING