.FLAGS INDEX .FLAGS CAPIT .LOWER CASE .PAPER SIZE 58,72 .SPACING 2 .TITLE TULIP.RND .BLANK 2 .CENTER ^DEDICATION .SPACING 1 .FILL .LEFT MARGIN 0 .PARAGRAPH ^THIS MANUAL IS DEDICATED TO ^ED ^TAFT WHO WROTE BLISS PROGRAMS IN TULIP.DOC PRODUCED BY <>RUNOFF TO PROVIDE COMPLETE DOCUMENTATION. .LEFT MARGIN 0 .PARAGRAPH ^ONE TECHNIQUE THAT MOST PROGRAMMERS OVERLOOK OR ARE AFRAID TO .INDEX START - ^ACTUALLY A WDEC LENGTH,ADDR - ^OUTPUTS AN UNSIGNED DECIMAL NUMBER FROM LOCATION _ IN A FIELD AT LEAST _ CHARACTERS LONG. ^FOR NOW, ASSUME THAT ALL BE ZERO, OR BY LEAVING IT OUT ALTOGETHER AS IS USUALLY THE CASE. .BLANK 1 .INDENT -6 <>WDECI LENGTH,NUMBER - ^LIKE <>WDEC BUT PRINTS THE NUMBER IN THE ADDRESS FIELD OF THE WOCT AND <>WOCTI - ^NOT USED, BUT LIKE <>WDEC AND WCHI CHARACTER - ^OUTPUTS THE CHARACTER GIVEN BY THE EFFECTIVE ADDRESS FIELD OF THE INSTRUCTION. .BLANK 1 .INDENT -6 <>W2CHI _^B28+_ - ^OUTPUTS THE TWO RIGHT JUSTIFIED CHARACTERS GIVEN BY THE EFFECTIVE ADDRESS FIELD. ^THE SYMBOL <>CRLF IS DEFINED IN <>TULIP.MAC AND PROVIDES THE MAIN USE FOR WCH AND <>W2CH - ^NOT USED, BUT ACTS LIKE <>WCHI AND . .BLANK 1 .INDENT -6 <>WNAME ADDR - ^PRINTS THE WITHOUT TRAILING SPACES. ^GOOD FOR OUTPUTING DEVICE NAMES. .BLANK 1 .INDENT -6 <>DISIX [NEXT,,[^^SIXBIT\\_\STRING_\] .INDENT -6 INST 1 .INDENT -6 INST 2 .INDENT -6 ........ .INDENT -6 INST N] - ^OUTPUTS A _# ^OUTPUT A CRLF IN $ ^OUTPUT A TAB. (^NO <>TAB EITHER!) .BLANK 1 .INDENT -6 .INDEX ^CASE CONVERSION >_& ^SWITCH CURRENT CASE CONVERSION. ^STRING OUTPUT IS INITIALLY IN UPPER CASE MODE, BUT MAY BE SHIFTED TO LOWER AND BACK AGAIN WITH THIS CHARACTER. ^THIS ALLOWS YOU TO WRITE A PROGRAM ON A TERMINAL NO SMARTER THAN A MODEL 33 % ^EXECUTE THE NEXT INSTRUCTION IN THE _ LIST, WHICH WILL NORMALLY BE A " ^QUOTING CHARACTER. ^OUTPUT THE NEXT CHARACTER AS IS WITH NO SPECIAL PROCESSING. ^NEEDED TO PRINT ANY OF THE CHARACTERS IN THIS LIST. .BLANK 1 .INDENT -6 .INDEX ^END OF STRING >! ^END OF STRING. ^NEEDED BECAUSE <>NULL IN OR WILL BE IMMEDIATELY AFTER THE <>DISIX IF _ IS OMITTED. .BLANK 1 .INDENT -6 .INDEX DIASC [....] - ^NOT USED, BUT ACTS LIKE % DOES IN CRLF ALL THAT NEED BE DONE IS TO ADD A _# JUST BEFORE THE ! IN THE <>DISIX EDIT STRING. .PARAGRAPH ^SECTION 4 AS PROMISED PRINTS THE TIME, PRETTY MUCH THE SAME WAY AS THE DATE PRINTER WORKS, BUT USING A COUPLE EXTRA FEATURES. ^HERE WE START USING THE <>C.MAC MACROS, BOTH FOR ARITHMETIC USE AND FLAG MANIPULATION. (^TO THOSE WHO THINK THE <>IDIVX MACRO IS A BIT TOO MUCH, COMPARE 60*60*1000 WITH 2_^18!) <>LZEFLG IS THE ONLY FLAG DEFINED IN THE WDEC TO FORMAT NOT ONLY THE HOURS, MINUTES, AND SECONDS IN THE STANDARD TWO CHARACTERS EACH FORMAT, BUT ALSO TO PRINT THE THOUSANTHS WHICH NEEDS THE LEADING ZEROS. .PARAGRAPH ^THERE ISN'T MUCH TO SAY ABOUT SECTION 5. ^FROM HERE OUT IT'S PRETTY STANDARD. ^THE <>MAKLST MACRO DESERVES A LITTLE STUDY, AS IT USES THE WSIX LEN,ADDR - ^THIS FORM OUTPUTS A CHARACTERS LONG STARTING FROM LOCATION _. .INDEX WSIX ADDR - ^THIS FORM OUTPUTS AN INDEFINITE LENGTH STRING STARTING AT LOCATION _. ^ALL EDITING CHARACTERS WILL APPLY, INCLUDING >% WHICH WILL PROBABLY CAUSE THE PROGRAM TO BOMB. ^DON'T TRY IT! .B 1;.I -6;WASC ADDR - ^OUTPUT AN . .INDEX DISIX CPOPJ WHEN .INDEX C.MAC AND NOT IN <>TULIP.MAC AS ^I HAD THOUGHT. ^I HEREBY PRESENT THIS WITH THE HOPE IT WILL ACT AS A SEED FOR THE DOCUMENTATION OF WID (MASK) - ^RETURNS THE WIDTH OF MASK IN BITS. [POS (MASK) - ^RETURNS THE POSITION OF THE RIGHTMOST BIT IN MASK. [POINTR (ADDR,MASK) - ^GENERATES A BYTE POINTER VIA .BREAK FILE MACRO, .INDEX FREL FILE MACRO: .LEFT MARGIN 6 .BLANK 1 .INDENT -6 <>FILE CHAN,DIR,LOBLK,_ - ^ASSOCIATED WITH EACH FILE IS ONE OR TWO DEV (N) [NAME (N) [BLANK] ^FILE NAME. .BLANK 1 .INDENT -6 <>EXT (N) [BLANK] ^EXTENSION. .BLANK 1 .INDENT -6 <>PPN (N) [0] ^PROJECT - PROGRAMMER NUMBER. ^COMMAS CANNOT BE USED IN _ BECAUSE THE MACRO WILL THINK THEY MARK THE END OF THAT PARAMETER, SO TO SPECIFY [1,4], YOU MUST USE A FORM LIKE STATUS (N) [0] ^INITIAL FILE STATUS. .BLANK 1 .INDENT -6 .INDEX INST (_)_> [I1BYTE OR OTHER (L) [NONE] ^ADDRESS OF THE OPPOSITE DIRECTION LOSEG BLOCK, AND IS NECESSARY IF BOTH INPUT AND OUTPUT ARE DONE ON THIS CHANNEL. .BLANK 1 .INDENT -6 .INDEX OPEN (L) [OPEN ERROR. .BLANK 1 .INDENT -6 .INDEX LOOKUP AND <>ENTER (L) [<>ILERI2 AND LOOKUP AND <>ENTER FAILURE ADDRESS. .BLANK 1 .INDENT -6 .INDEX INPUT AND <>OUTPUT (L) [<>ILERI3 AND EOF (L) [FILE MACRO GOES THE CORRESPONDING LOSEG BLOCK, <>FBSIZE WORDS LONG, WHICH IS WHERE RUNTIME INFORMATION SUCH AS THE FILE DCHN,I,DSKFIL,_ .BREAK DSKFOH: <>FILE DCHN,O,DSKFOL_ .BLANK 1 DSKFIL: BLOCK FBSIZE .BREAK DSKFOL: BLOCK FBSIZE\\ .PARAGRAPH ^THE ADDRESS FIELD OF ALL THE FILE UTILITY FSETUP - ^GENERATE THE LOSEG BLOCK FROM THE DEFAULT DATA IN THE HISEG BLOCK. .BLANK 1 .INDENT -6 <>FIGET AND <>FOGET - ^DOES AN <>OPEN ON THE DEVICE IN THE LOSEG FILE BLOCK. .BLANK 1 .INDENT -6 <>FLOOK AND <>FENT - ^DOES A <>LOOKUP OR <>ENTER ON THE FILE IN THE LOSEG BLOCK. .BLANK 1 .INDENT -6 .INDEX FIOPEN AND <>FOOPEN - ^DOES BOTH <>OPEN AND EITHER <>LOOKUP OR FICLS AND <>FOCLS - ^DOES <>CLOSE ON CHANNEL. .BLANK 1 .INDENT -6 <>FREL - ^DOES <>RELEASE ON CHANNEL. .BLANK 1 .INDENT -6 <>FICLOS AND <>FOCLOS - ^DOES <>CLOSE AND <>RELEASE ON CHANNEL. .LEFT MARGIN 0 .PARAGRAPH ^SO, TO HANDLE THE FSETUP DSKFIH ;READY THE LOSEG FILE BLOCKS <>FSETUP DSKFOH <>FIOPEN DSKFIL ;OPEN, LOOKUP <>FENT DSKFOL ;ENTER TO GET INTO UPDATE MODE ##;DO ALL IO <>FICLOS DSKFIL ;CLOSE UP\\ .FILL .PARAGRAPH ^THE <>FILE MACRO AS DESCRIBED ONLY SETS UP DEFAULTS IN THE LOSEG BLOCK. ^TO DO ANYTHING OTHER THAN THAT REQUIRES THAT THE PROGRAM SET UP THE PERTINENT DATA ITSELF. ^THE COMPLETE LIST IS IN THE REFERENCE MANUAL, BUT THE MORE IMPORTANT LOCATIONS ARE: .BLANK 1 .NOFILL <>FILDEV - ^DEVICE NAME <>FILNAM - ^FILE NAME <>FILEXT - ^EXTENSION <>FILPPN - ^PROJECT - PROGRAMMER NUMBER OF THE FILE'S DISK AREA .FILL .PAGE .HL 1 ^REGISTER CONVENTIONS .FILL .PARAGRAPH ^PROGRAM 2 ALSO STARTED TO MAKE COMPLEX USE OF REGISTERS, SO THIS IS A GOOD PLACE TO GIVE THE FULL DESCRIPTION. ^MOST OF THE SAVE AND <>RESTORE MACROS MAKE THE LATTER EASIER TO DO. ^BOTH TAKE AN ANGLE BRACKETED LIST OF REGISTERS OR MEMORY LOCATIONS; <>SAVE WILL PUSH THEIR DATA ON THE STACK AND <>RESTORE WILL POP IT BACK. ^THE PARAMETER LIST TO <>RESTORE MUST BE OPPOSITE THAT USED FOR SAVE#_< IS DONE, <>RESTORE#_< MUST BE USED TO RESTORE THEM IN THE RIGHT ORDER. ^AS A SPECIAL (AND NOT VERY NECESSARY) FRILL, THE <>CALL AND <>RETURN MACROS ARE AVAILABLE TO REPLACE ^^PUSHJ#P,\\ AND ^^POPJ#P,\\ MAKING THEM USEFUL MAINLY FOR EX-MCALL, HAS BEEN DEFINED FOR THOSE CASES WHERE THE C.MAC PROVIDES AN INTERESTING INSTRUCTION, PJRST WELL, AND ^I HAVE SEEN SOME PROGRAMS RECENTLY THAT MISUSE IT. <>PJRST SAYS, "^THIS ROUTINE IS DONE AND HAS NO MORE TO DO EXCEPT CALL ANOTHER, SO ^I WILL SIMPLY JUMP THERE AND ITS ' SHOULD BE USED WHENEVER IT CAN REPLACE THE FOLLOWING SEQUENCE: .NOFILL .BLANK 1 .TEST PAGE 4 .TAB STOPS 9,17 ^^PUSHJ P,\\ADDR^^ ##POPJ P, AOS (P) POPJ P,\\ .FILL .B 1 ^THEREFORE, <>PJRST IS NOT MEANT TO TRANSFER TO A 'SUBROUTINE' THAT EXPECTS DATA ON THE TOP OF THE STACK INSTEAD OF A ^^PC\\WORD (AS IF A PJRST MAY GO TO CODE THAT REFERENCES SOLELY THE STACK, EITHER TO PREPARE FOR A SKIP RETURN OR TO RESTORE REGISTERS. ^GENERALLY THESE ROUTINES HAVE 'CPOPJ AND INST SUBMACRO, IT MUST ACCESS OR PASS DATA, AND THESE REGISTERS ARE SET UP AS FOLLOWS: .NOFILL .TAB STOPS 9,17 .BLANK 1 ^U1 ^HOLDS BYTE (EITHER SET OR READ BY ROUTINE). ^U2 ^HOLDS ADDRESS OF FILE BLOCK FOR THIS OPERATION. ^U3 ^UNUSED, MAY BE USED BY ROUTINE. .FILL .PARAGRAPH ^THE UNASSIGNED REGISTERS 11-13 ARE AVAILABLE TO THE PROGRAMMER FOR ANY USE HE HAS, WHICH GENERALLY IS TO ACCESS A GLOBAL DATA STRUCTURE. .PARAGRAPH .INDEX ^FLAG REGISTER .INDEX FLAG MACRO. <>FLAG REQUIRES A LIST OF SYMBOL NAMES AND WILL ASSIGN A BIT FROM 1^B35 TO 1^B0 TO EACH SYMBOL, REQUIRING THAT THEY BE ACCESSED VIA THE <>C.MAC MACROS (RCH ^READ THE NEXT CHARACTER (OR ANY SIZE BYTE) INTO _. .BLANK 1 .INDENT -6 <>CCH ^REREAD THE CURRENT CHARACTER (RETURNED BY THE LAST . .BLANK 1 .INDENT -6 <>LCH ^REREAD THE LAST CHARACTER (RETURNED BY THE NEXT TO LAST . ^INPUT MAY NOT BE BACKED UP MORE THAN ONE CHARACTER; ATTEMPTS TO DO SO WILL BE IGNORED. .BLANK 1 .INDENT -9 ^THE FOLLOWING RFLG ^PUT THE CHARACTER FLAGS (BELOW) FOR THE CHARACTER IN _ INTO _+1. .BLANK 1 .INDENT -6 .INDEX LCHF - ^ACT LIKE AND THE FLAGS INTO _+1. .LEFT MARGIN 0 .PARAGRAPH ^SINCE THERE ARE SEVERAL CHARACTERS THAT CANNOT BE USED AS PARAMETERS TO A MACRO BECAUSE THEY WILL CONFUSE PARAMETER DECODING, THE FOLLOWING SYMBOLS ARE DEFINED SO THEY MAY BE EASILY USED: .TEST PAGE 6 .TAB STOPS 12 .BLANK 1 .NOFILL .LEFT MARGIN 3 <>NULL ^NULL (0) <>BELL ^CONTROL-^G (7) <>TAB ^TAB (11) <>LF ^LINEFEED (12) <>VT ^VERTICAL TAB (13) <>FF ^FORMFEED (14) <>CR ^CARRIAGE RETURN (15) <>CTRLZ ^CONTROL-^Z (32) <>ESC ^ESCAPE (33) <>ALT ^ALTMODE (33) [^LONG PAST TIME TO BURY 175 AND 176!] <>DBLQ ^DOUBLE QUOTE (") <>SNGLQ ^SINGLE QUOTE (') <>LPAREN ^LEFT PARENTHESIS '(' <>RPAREN ^RIGHT PARENTHESIS ')' <>COMMA ^COMMA (,) <>SEMI ^SEMI-COLON (;) <>LANGLE ^LEFT ANGLE BRACKET (_<) <>RANGLE ^RIGHT ANGLE BRACKET (_>) <>LSQUAR ^LEFT SQUARE BRACKET ([) <>RSQUAR ^RIGHT SQUARE BRACKET (]) <>RUBOUT ^YES (177) <>CRLF B28+LF) .FILL .LEFT MARGIN 0 .PARAGRAPH ^ASSOCIATED WITH MOST LETTER ^A-^Z, UPPER AND LOWER CASE. <>DIGIT 0-9. <>BLANK ^SPACE AND TAB. <>BREAK ^LINEFEED, VERT. TAB, FORMFEED, ESCAPE, LGLSIX ^CODES 40-137. (^VALID VERSION (VERSION,UPDATE,EDIT,WHO) - ^THIS PUTS THE PROGRAM VERSION IN LOCATION <>.JBVER USING THE STANDARD %VWHO ARE ALL DEFINED WITH THE APPROPRIATE DATA. .INDEX <%%%TLP TULIP.MAC ARE USED. ^THIS IS DONE AS A WARNING IF NEW TO BE THE ASSEMBLED VALUE AND IS PRIMARILY MEANT TO BE USED WITHIN LIBRARIES SINCE <.JBVER MAY NOT. ^IN THIS MANNER, <>TULLIB.MAC DEFINES <>%UUO AND <>%LEXINT TO BE THE VERSIONS OF THOSE TWO MODULES. .BLANK 1 .INDENT -3 <>VERSTR - ^DEFINED BY XX MACRO (BELOW) USING SAME PARAMETERS AS WERE USED FOR XX VER,UPD,EDIT,WHO - ^DEFINED IN THE PROGRAM, THIS MACRO ALLOWS IT TO MAKE PRINTABLE STRINGS OR PRETTY <>TITLE AND <>SUBTTL STATEMENTS CONTAINING THE VERSION NUMBER. ^THIS NEED NOT BE AT THE BEGINNING AS IS DONE IN PROGRAM 3, BUT MAY BE ANYWHERE. ^IN FACT, FOR THE PURISTS, ONE COULD DEFINE <>XX AT THE BEGINNING OF THE PROGRAM AND CALL VIA <>VERSTR TO SET UP THE PROGRAM TITLE, THEN REDFINE <>XX LATER IN THE CONSTANTS AREA TO PUT THE VERSION MESSAGE THERE! ^IF USING THREE MACROS SEEMS A LITTLE MORE COMPLICATED THAN NECESSARY, IT IS DONE TO ALLOW THE VERSION NUMBER TO BE CHANGED BY MODIFYING ONLY ONE LINE IN THE PROGRAM. .LEFT MARGIN 0 .PARAGRAPH .INDEX FSETUP AND TTCALL FISEL#0 AND <>FOSEL#0 WILL DO THE JOB. <>FOSEL IS USED HERE BECAUSE <>FIGET HAS ALREADY DONE THE FOOPEN WOULD. ^THERE IS A SECOND OUTPUT STREAM WHICH MAY BE USED WITH A SPECIAL SUBSET OF TTCALL TTCALL MENTIONED A COUPLE OF SECTIONS AGO. ^IT IS ESPECIALLY HANDY FOR PROGRAMS THAT MAY OUTPUT TO ANY DEVICE (INCLUDING FISEL AND <>FOSEL DO IS SIMPLY PUT THEIR ADDRESS FIELDS .INDEX IFILE AND TULLIB AND NORMALLY WILL BE OF LITTLE INTEREST TO PROGRAMMERS. ^HOWEVER, AT TIMES THEY ARE MOST USEFUL AS IN SAVING THE CONTENTS OF EITHER OF THEM TO ALLOW A SUBROUTINE TO TEMPORARILY REDIRECT DATA FLOW AND RESTORE IT BEFORE RETURNING TO THE CALLER. ^ALSO, WHEN DEBUGGING PROGRAMS, THERE ARE MANY INSTANCES WHERE IT IS VERY HANDY TO REDIRECT OUTPUT TO <>TTCALL SO YOU CAN SEE WHAT THE BEAST IS DOING. <>DDT MAKES FOR A VERY SIMPLE MEANS OF MANUALLY CLEARING <>OFILE TO DO EXACTLY THAT. .INDEX EWSIX AND <>EWASC - ^LIKE <>WSIX AND EDISIX AND <>EDIASC - ^LIKE <>DISIX AND WDEC AND FRIENDS. .LEFT MARGIN 0 .TEST PAGE 9 .PARAGRAPH ^FURTHERMORE, THERE ARE TEN ' . ;FOR <>OPEN FAILURES OR .I 3 '? _:_._[_] (_)' . ;FOR ALL OTHERS. ^THE REST PRINT ON THE NORMAL OUTPUT DEVICE WITHOUT THE MESSAGE HEADER. .INDEX WERIOP AND .INDENT -3 .INDEX WEROOP .BREAK ^CURRENTLY THE TWO PAIRS ARE IDENTICAL SINCE AN <>OPEN FAILURE IS DIRECTION INDEPENDENT. .TEST PAGE 4 .INDENT -3 ^ASSOCIATED MESSAGES: .BLANK 1 .TAB STOPS 6 NOT AVAILABLE .BREAK DOES NOT EXIST .BLANK 2 .TP 3 .INDENT -3 .INDEX LOOKUP ERRORS: WERLK AND .INDENT -3 .INDEX ENTER ERRORS: WERENT - ^DIFFERENT PROCESSING IS DONE FOR ERROR TYPE (ERRLK AND <>WERLK MAY ALSO BE USED TO REPORT <>GETSEG AND .INDEX INPUT ERRORS: WERIN AND .INDENT -3 .INDEX OUTPUT ERRORS: WEROUT - ^THE ENTIRE 18 BIT FILE STATUS IS PRINTED FOLLOWED BY THE APPROPRIATE ERROR MESSAGE. ^SHOULD MORE THAN ONE ERROR BIT BE SET, ONLY THE FIRST APPLICABLE MESSAGE IN THE LIST WILL BE PRINTED. ^AGAIN, DIFFERENT PROCESSING IS DONE AS IN THE LEXINT TO DO THE PARSE, A PRODUCTION TABLE TO DRIVE <>LEXINT WHICH DESCRIBES HOW TO PARSE THE INPUT STREAM, AND A SET OF ACTION ROUTINES WHICH MANIPULATE THE PARSED DATA. ^THE HEART AND MOST INTERESTING PIECE IS THE PRODUCTION TABLE WHICH IS SET UP WITH THE AID OF THREE MACROS: .LEFT MARGIN 6 .BLANK 1 .INDENT -3 <>TBLBEG LABEL - ^THIS MUST BE AT THE BEGINNING OF A PRODUCTION TABLE AND IS USED TO INITIALIZE INTERNAL SYMBOLS THAT ARE OF NO INTEREST TO US. _<^LABEL_> WILL BE DEFINED TO BE THE ADDRESS OF THE PRODUCTION TABLE AND IS USED FOR IDENTIFICATION. .BLANK 1 .INDENT -3 <>TBLEND - ^THIS MUST APPEAR AT THE END OF THE PRODUCTION TABLE AND GENERATES A DISPATCH TABLE TO THE ACTION ROUTINES. ^IF YOU FORGET IT, (TWO TAB STOPS), 4 FOR _, 1 FOR _, 6 FOR _ AND A TAB FOR COMMENTS AFTER ')'. ^TRAILING BLANKS (TABS FOR _) SHOULD BE USED INSTEAD OF PRECEDING BLANKS. ^THE PARAMETERS ARE: .INDEX ^LEXICAL ANALYSIS .LEFT MARGIN 9 .BLANK 1 .INDENT -3 CHAR SPEC - ^THIS MAY BE A CHARACTER (E.#G_. "^M" OR OR <_), NEGATED CHARACTERS (E.#G_. -"^M" OR -). ^THIS PARAMETER DEFINES THE MATCH CONDITION FOR THE PRODUCTION. ^IF THE MATCH FAILS, THE REST OF THE PRODUCTION IS IGNORED, AND THE NEXT ONE IS PROCESSED USING THE SAME CHARACTER. ^HOWEVER, SHOULD IT SUCCEED, THE REST OF THE PRODUCTION IS PROCESSED AS DESCRIBED BELOW TO HANDLE THE PARSED DATA. .INDEX IS A SPECIAL _ AVAILABLE THAT WILL ALWAYS MATCH AND IS USED EITHER FOR AN UNCONDITIONAL BRANCH OR TO FORCE A CALL TO AN ACTION ROUTINE. ^DUE TO A SLIGHT MISUNDERSTANDING BETWEEN . .BLANK 1 ^ONE IMPLEMENTATION DETAIL IS IMPORTANT HERE. ^AS MIGHT BE EXPECTED, PROCESSING THESE CHARACTERS RESULTS IN .INDEX LCHF PROD MACRO CALL MAY BE LABELED). ^IF THE FIELD IS BLANK, THE NEXT PRODUCTION WILL BE ASSUMED. .INDEX ^LEXICAL ANALYSIS .INDEX ^ACTION ROUTINES .LEFT MARGIN 0 .PARAGRAPH ^THE ACTION ROUTINES ALLOW US TO DO SOMETHING WITH THE DATA PARSED. ^WITHOUT THEM, WE COULDN'T EVEN STOP <>LEXINT EXCEPT VIA AN LEXINT PASSES DATA TO THE ACTION ROUTINE IN THE PERMANENT REGISTERS: .LEFT MARGIN 3 .BLANK 1 ^P1 - ^RELATIVE ADDRESS IN PRODUCTION TABLE OF THIS ONE. .BLANK 1 ^P2 - ^CURRENT CHARACTER UNDER SCAN. .BLANK 1 ^P3 - ^CHARACTER FLAGS FOR THIS CHARACTER. .BLANK 1 ^P4 - ^P1,,ADDRESS OF PRODUCTION TABLE. .LEFT MARGIN 0 .BLANK 1 ^OF THESE, ONLY ^P2 AND ^P3 HAVE DATA NORMALLY USED. .TEST PAGE 5 .BLANK 1 ^FOUR SPECIAL ACTION ROUTINES ARE SUPPLIED IN SRET - ^PERFORM A SKIP RETURN FROM RET - ^PERFORM A NON-SKIP RETURN, NORMALLY INDICATING AN UNSUCCESSFUL PARSING. .BLANK 1 .INDENT -3 <>CALL - <>LEXINT USES A STACK SUBROUTINE CALLING CONVENTION FOR REPEATED PARSINGS OF DATA LIKE NUMBERS, FILE SPECIFIERS, ETC. ^TAKE THE NEXT PRODUCTION SPECIFIED BY _, BUT WHEN <>RET IS CALLED IT WILL DO A SUBROUTINE RETURN AND THE NEXT PRODUCTION EXECUTED WILL BE THE ONE IMMEDIATELY AFTER THE SRET MAY ALSO BE USED TO CAUSE A SKIP RETURN FOR SUBROUTINES NEEDING AN ERROR/SUCCESS INDICATION. .BLANK 1 .INDENT -3 <>JUMP - ^NORMALLY ONLY CALLED (BY A JUMP ROUTINE, YOU NEED A TBLBEG MACRO DOES A LEXINT WITH THE RIGHT HALF OF ^T1 POINTING TO THE TABLE AND THE LEFT HALF POINTING TO THE RELATIVE ADDRESS OF THE FIRST PRODUCTION (WHICH IS NORMALLY ZERO, SO A LEXINT IF THE LAST PRODUCTION CALLED <>RET AS THE ACTION ROUTINE, THE SKIP RETURN IF <>SRET WAS THE ACTION ROUTINE. .INDEX ^ACTION ROUTINE .PARAGRAPH ^WHEW. ^WITH THAT BEHIND US, LET'S LOOK AT ^PROGRAM 3 AND SEE JUST HOW WE USE ALL THIS. ^ON PAGE 2, LEXINT WILL ALWAYS DO A NON-SKIP RETURN. ^PAGE 5 HAS BOTH THE PRODUCTION TABLE AND THE TWO ACTION ROUTINES NEEDED BY THE PROGRAM. <>TBLBEG HEADS THE PRODUCTION TABLE, AND FIELD), THROWING AWAY ANY NULLS LEFT IN THE BUFFER AFTER THE PREVIOUS COMMAND, IF ANY. ^THE SECOND PRODUCTION CALLS MATCHES ANY CHARACTER) WHICH IS CODED AFTER THE TABLE AT LEXINT TO SCAN IT WILL RESULT IN READING ANOTHER CHARACTER FOR THE NEXT PRODUCTION, WHICH WE DO NOT WANT TO HAPPEN. .PAGE .HL 1 ^P\\ROGRAM 4 - THE LAST ONE .PARAGRAPH ^PROGRAM 4 STARTED OUT AS A PROGRAM IMPROVING MOSTLY ON THE LEXICAL ANALYSIS PORTION TO PROVIDE REAL COMMAND SCANNING. ^HOWEVER, IT GOT A LITTLE CARRIED AWAY, AND WOUND UP HAVING A FEW MULTI CHARACTER SWITCHES AND EVEN COMMAND FILES (NESTED, OF COURSE). ^AT LEAST, IT HAS GIVEN ME A CHANCE TO WRITE THE SAVE1 HANDLES THE RESTORE ACTION ITSELF, WE ARE FREE TO TRANSFER CONTROL TO IFILE IN SIXSRC IS IN TWO PIECES - THE MAIN ROUTINE, CALLED TO SEARCH A TABLE, AND A PURE COROUTINE THAT REMEMBERS HOW MANY PARTIAL MATCHES HAVE BEEN MADE. ^A COROUTINE DIFFERS FROM A SUBROUTINE IN THAT WHEREAS A SUBROUTINE IS ALWAYS ENTERED AT ITS START, A COROUTINE PICKS UP WHERE IT LEFT OFF FROM THE LAST CALL. ^THE EFFECT IS NOT SO MUCH LIKE A CALL TO A COROUTINE AS IT IS A SIXSRC ITSELF IS A SUBROUTINE. ^EACH CALL ENTERS IT FROM THE TOP AND IT RETURNS AFTER A LIST IS SCANNED. ^HOWEVER, INTERNALLY IT IS A COROUTINE, TRADING CONTROL BACK AND FORTH BETWEEN ITSELF AND SIXSRC DOES A SKIP TRANSFER WHEN IT HAS REACHED THE END OF THE LIST AND NEEDS TO KNOW WHAT <>SIXMAT FOUND CHECKING THE NUMBER OF MATCHES. LEXINT AND PAGE 22 HAS THE ROUTINES REFERENCED IN THE FILE BLOCKS. ^ON PAGE 21, LEXINT MUST USE THE FIRST CHARACTER OF THE COMMAND FILE, THE PRODUCTION THAT GOT US HERE HAS A '*' IN THE _ FIELD TO FORCE IT TO BE READ IN. ^IF IT DID NOT, PARSING WOULD CONTINUE WITH THE LAST CHARACTER READ VIA THAT FILE BLOCK, WHICH WOULD CLEARLY BE WRONG. ^TO 'POP' BACK UP TO THE PREVIOUS LEVEL, WE MUST NOT ONLY CHANGE THE INPUT STREAM, BUT WE MUST ALSO READ THE CURRENT CHARACTER. ^THINK ABOUT IT - IT REALLY DOES WORK! (^I THINK.) .PARAGRAPH ^PAGE 22 HAS ALL THE ROUTINES REFERENCED IN THE FILE BLOCK (PLUS AN ERROR ROUTINE CALLED FROM LEXINT WITHOUT ANY TRACKS FOR US TO FOLLOW BACK TO REATTEMPT EXECUTION OF THE PFILE LOSEG,INST,DATA - ^DEFINES A HIGH SEGMENT PSEUDO FILE BLOCK WHICH DIFFERS FROM A NORMAL FILE BLOCK IN THAT IT HAS NO DEVICE RELATED INFORMATION ASSOCIATED WITH IT. ^MEANT TO PROVIDE A MEANS OF DOING 'PFILE AND <>FILE IS THAT SINCE NONE OF THE DEVICE DATA IS NECESSARY, <>PFILE IS ALMOST A REASONABLE MACRO WITH A MERE THREE ARGUMENTS: .LM 6 .BLANK 1 .INDENT -3 LOSEG - ^THE ADDRESS OF THE CORRESPONDING LOW SEGMENT PSEUDO FILE BLOCK, WHICH IS <>PBSIZE WORDS LONG. .BLANK 1 .INDENT -3 INST - ^THE INSTRUCTION WHICH WILL BE USED TO TRANSFER ALL THE DATA. ^U1 AND ^U2 HAVE DATA AS DESCRIBED IN THE REGISTER CONVENTIONS SECTION A LONG TIME AGO. ^NORMALLY THIS WILL BE EITHER A FILCHN OF THE LOSEG BLOCK WHEN <>FSETUP IS EXECUTED. ^BASICALLY, IT ALLOWS THE STRING ROUTINES TO BE REENTRANT, OPERATING ON A NUMBER OF THEM AT ONCE. .LM 3 .B 1;.I -3;<>GLOBAL (SYM1,SYM2,...,SYMN) . ;^THIS MACRO WILL TAKE THE LIST OF SYMBOLS SUPPLIED AND MAKE THEM ALL GLOBAL (EITHER INTERNAL OR EXTERNAL). ^IT ACTS VERY MUCH LIKE THE <>GLOB MACRO IN <>C.MAC EXCEPT IT PERFORMS SLIGHTLY DIFFERENTLY TO HANDLE A FEW SPECIAL CASES. .B 1;.I -3;<>HWDGEN (NAME,MACRO,SUBMAC,PREFIX) . ;^THIS MACRO IS USED TO GENERATE A HALFWORD DISPATCH TABLE BASED UPON A DATA STRUCTURE PASSED TO IT AS MACROS. .LM 6;.B 1 .I -3;NAME - ^OPTIONAL. ^IF SPECIFIED, DEFINE IT TO BE THE ADDRESS OF THE TABLE. .I -3;MACRO - ^NAME OF THE MACRO THAT HOLDS THE DATA STRUCTURE. ^IT CONSISTS OF A SERIES OF CALLS ON _, BELOW. .I -3;SUBMAC - ^THE NAME OF A MACRO HAVING ONE ARGUMENT, A LABEL THAT IS TO BE PUT INTO THE DISPATCH TABLE. ^THIS MACRO IS DEFINED BY <>HWDGEN TO DO THE ACTUAL WORK. .I -3;PREFIX - ^OPTIONAL. ^A PREFIX TO BE CONCATENATED WITH THE DATA PASSED TO _. ^THIS ALLOWS THE ENTIRE STRUCTURE TO BE USED TO GENERATE SEVERAL DIFFERENT TYPES OF DATA. .LM 0;.P ^NORMALLY THE SUBMACRO PARAMETERS INCLUDE A COMMAND NAME AND USUALLY ASSCOCIATED FLAGS BESIDES THE TRANSFER ADDRESS. <>HWDGEN WILL WORK ON THIS FORM TOO, IF A THIRD LEVEL MACRO IS PASSED TO <>HWDGEN THAT IS CALLED BY THE REAL SUBMACRO THAT EXTRACTS ONLY THE DATA. ^FOR EXAMPLE, IN ^PROGRAM 4 THE HWDGEN TO GENERATE A TABLE BY REPLACING THE LAST TWO LINES WITH: .TS 3,11,25 .B 1; ^^DEFINE XX(A,B,C)_ . ; ^^HWDGEN (SWITDP,SWITCH,XX)\\ .B 1 ^SEE <>TULLIB FOR SOME EVEN BETTER EXAMPLES! ^THE CODE TO DO THE SWITCH DISPATCH ON PAGE 20 WOULD REPLACE THE .B 1 ; ^^SKIPA T1,SWITDP(T3)\\ . ;WITH: . ; ^^ROT T3,-1 ;DIVIDE BY 2, BUT KEEP THE REMAINDER . ; JUMPGE T3,.+2 ;IF EVEN, USE THE LEFT HAND SIDE . ; SKIPA T1,SWITDP(T3) ;IF ODD GET THE RIGHT HAND SIDE . ; MOVS T1,SWITDP(T3) ;GET THE LEFT SIDE IF IT WAS EVEN . ; TLZA T1,-1 ;CLEAR LEFT TO ISOLATE TRANSFER ADDRESS\\ .B 1;^IN MANY APPLICATIONS, THIS ROUTINE MAY BE WRITTEN TO USE ONLY ONE REGISTER. .PAGE .HL 1 ^FUTURE PLANS AND POSSIBILITIES .P ^SO, WHERE DOES .BLANK 1 .INDENT -6 7 ^ROUTINES ( .BLANK 1 .INDENT -6 8 .BLANK 1 .INDENT -6 8.3 ^OUTPUT WITH FIELD WIDTH (LF ^LINEFEED (12) <>VT ^VERTICAL TAB (13) <>FF ^FORMFEED (14) <>CR ^CARRIAGE RETURN (15) <>CTRLZ ^CONTROL-^Z (32) <>ESC ^ESCAPE (33) <>ALT ^ALTMODE (33) [^LONG PAST TIME TO BURY 175 AND 176!] <>DBLQ ^DOUBLE QUOTE (") <>SNGLQ ^SINGLE QUOTE (') <>LPAREN ^LEFT PARENTHESIS '(' <>RPAREN ^RIGHT PARENTHESIS ')' <>COMMA ^COMMA (,) <>SEMI ^SEMI-COLON (;) <>LANGLE ^LEFT ANGLE BRACKET (_<) <>RANGLE ^RIGHT ANGLE BRACKET (_>) <>LSQUAR ^LEFT SQUARE BRACKET ([) <>RSQUAR ^RIGHT SQUARE BRACKET (]) <>RUBOUT ^YES (177) .INDEX CRLF LF RIGHT JUSTIFIED (_<^B28+LF). .FILL .BLANK 1 .TP 8 ^CHARACTER CLASS DEFINITIONS RETURNED AS BIT FLAGS BY <>RFLG AND RELATED LETTER ^A-^Z, UPPER AND LOWER CASE. <>DIGIT 0-9. <>BLANK ^SPACE AND TAB. <>BREAK ^LINEFEED, VERT. TAB, FORMFEED, ESCAPE, LGLSIX ^CODES 40-137. (^VALID LZEFLG ^FORCE NUMERIC OUTPUT PFILE LOSEG BLOCK,INSTRUCTION,DATA .BLANK 1 .LEFT MARGIN 6 .INDENT -3 ^LOSEG BLOCK - ^THE ADDRESS OF THE CORRESPONDING LOW SEGMENT <>PFILE BLOCK. (^SEE ^DATA STRUCTURES FOR FORMAT.) .BLANK 1 .INDENT -3 ^INSTRUCTION - ^THE INSTRUCTION ALL 'FILCHN WITHIN THE LOW SEGMENT <>PFILE BLOCK. .BLANK 1 .I -6 .INDENT -3 CHAN - - ^A LIST OF SPECIAL ARGUMENTS AND IS A LIST COMPOSED FROM: .TS 20,30;.B 1 .NOFILL <>DEV (N) [NAME (N) [BLANK] ^FILE NAME. <>EXT (N) [BLANK] ^EXTENSION. <>STATUS (N) [0] ^STATUS (ALL 36 BITS ARE AVAILABLE). .INDEX INST (_)_> [I1BYTE OR OTHER (N) [NONE] ^ADDRESS OF MATCHING LOSEG FILE BLOCK. .INDEX OPEN (ADDR) [LOOKUP (ADDR) [ENTER (ADDR) [INPUT (ADDR) [OUTPUT (ADDR) [EOF (ADDR) [INST MACRO. .HL 1 ^DATA STRUCTURES .HL 2 ^LOSEG FILE BLOCK .P ^BOTH FILE AND PSEUDO FILE BLOCKS USE THE SAME DATA STRUCTURE BELOW, .INDEX PFILE MACRO IS STORED. ^TWO SYMBOLS ARE USED TO RESERVE STORAGE FOR THEM: .BLANK 1 <>FBSIZE - ^LENGTH OF FILE BLOCK . <>PBSIZE - ^LENGTH OF PSEUDO FILE BLOCK .BLANK 1 .TAB STOPS 4,12 .NOFILL ^LOC #NAME CONTENTS 0 <>FILXCT FILBAK ^CHARACTER (BYTE) BEFORE LAST (FOR <>LCH FILCUR ^CURRENT CHARACTER (FOR <>CCH FILCHN ^CHANNEL NUMBER IN FILSTS ^OPEN BLOCK - ^INITIAL FILE STATUS 5 <>FILDEV ##^DEVICE NAME 6 <>FILHDP ##^BUFFER HEADER ADDRESSES 7 <>FILNAM FILEXT ##^EXTENSION (ET AL) 11 <>FILDAT ##^FILE DATA (CREATION DATA, PROTECTION, ETC.) 12 <>FILPP1 ##FILPPN ^COPIED TO <>FILPP1 BEFORE EACH FILHDR ^BUFFER HEADER - ^ADDRESS OF CURRENT BUFFER 15 <>FILPTR ##^BYTE POINTER TO CURRENT BUFFER 16 <>FILCTR ##^COUNT OF BYTES LEFT IN CURRENT BUFFER 17 <>FILER1 FILER2 WID (MASK) - ^RETURN WIDTH OF SUPPLIED MASK IN BITS. .I -3;<>POS (MASK) - ^RETURN BIT POSITION OF LAST BIT IN MASK. .I -3;<>POINTR (ADDR,MASK) - ^MAKE BYTE POINTER TO THAT BYTE. .BLANK 1 .I -3 ^FLAG MACRO .B 1 .I -3;<>FLAG (SYMBOL) - ^ASSIGNS A BIT VALUE TO SYMBOL, STARTING AT BIT 34 AND WORKING TO THE LEFT. ^THERE MAY BE A LIST OF SYMBOLS AS AN ARGUMENT. .B 1;.I -3 ^VERSION MACROS .B 1;.I -3 <>VERSION (VERSION,UPDATE,EDIT,WHO,SYMBOL) ^IF _ IS OMITTED, THIS SETS LOCATION <.JBVER TO BE THE VERSION NUMBER. ^IF _ IS SUPPLIED, THIS DEFINES IT TO BE THE VERSION NUMBER. ^SPECIAL SYMBOLS %VERSTR . ;IS DEFINED TO BE SIMPLY .INDENT -3 <>XX (VERSION,UPDATE,EDIT,WHO) . ;WHICH IS MEANT TO BE CALLED BY THE PROGRAMMER ONCE HE DEFINES <>XX SO SOMETHING USEFUL IS DONE WITH IT. .B 1;.I -3 ^STACK MANIPULATERS .B 1;.I -3 <>SAVE _ - ^SAVE THE SPECIFIED LOCATIONS ON THE STACK. .B 1;.I -3 <>RESTORE _ - ^RESTORE THE SPECIFIED LOCATIONS FROM THE STACK. ^NOTE THAT THE ORDER OF THE LIST IS REVERSED! .B 1;.TP 4;.I -3 ^MISCELLANEOUS MACROS .B 1;.I -3 <>START - ^INITIALIZE RESET CONC (A,B,C,D) - ^CONCATENATES UP TO FOUR PARAMETERS INTO A SINGLE HWDGEN (NAME,MACRO,SUBMAC,PREFIX) - ^GENERATE HALF WORD DISPATCH. .B 1;.I -3;NAME - ^BECOMES THE ADDRESS OF THE TABLE. .I -3;MACRO - ^CONSISTS OF CALLS TO _, ONE FOR EACH DISPATCH GENERATED. .I -3;SUBMAC - ^TAKES ONE ARGUMENT, THE LABEL TO TRANSFER TO FOR THIS INDEX. ^THIS MACRO ALLOWS FURTHER PROCESSING TO BE DONE ON THE LABELS AND IS DEFINED BY <>HWDGEN (AND ANY OTHER USERS OF THIS DATA STRUCTURE). .I -3;PREFIX - ^OPTIONAL. ^THIS WILL BE CONCATENATED WITH _ TO ALLOW SEPARATION BETWEEN OTHER MACRO GENERATED NAMES. .LM 0;.B 1 ^THE GENERATED TABLE WILL BE IN 18 BIT BYTE FORMAT (ENTRIES START AT LEFT, GO TO RIGHT AND DOWN). .B 1;MCALL CALL RETURN RCH LOC ^READS NEXT CHARACTER INTO _. .I -17;<>CCH LOC ^READS CURRENT CHARACTER INTO _. .I -17;<>LCH LOC ^READS LAST CHARACTER INTO _. ^NEXT <>RCH WILL REREAD THE CURRENT CHARACTER. ^NOTE: <>LCH CANNOT BE USED TO BACK UP MORE THAN ONE CHARACTER. ^ATTEMPTS TO DO SO WILL BE IGNORED. .I -17;<>RFLG LOC ^READS FLAGS FOR CHARACTER IN LOC INTO _+1. .I -17;LCHF ^ACT AS LCH .INDEX DISIX ELIST ^OUTPUT USING . .I -17;<>DIASC ELIST ^OUTPUT USING . .I -17;<>WASC ADDR ^OUTPUT . .I -17;<>WCH ADDR ^OUTPUT CHARACTER FROM _. .I -17;<>WCHI CHAR ^OUTPUT CHARACTER IN ADDRESS FIELD. .I -17;<>W2CH ADDR ^OUTPUT TWO CHARACTERS RIGHT JUSTIFIED IN _. .I -17;<>W2CHI CHARS ^OUTPUT TWO CHARACTERS RIGHT JUSTIFIED IN ADDRESS FIELD. .I -17;<>WNAME ADDR ^OUTPUT , NO TRAILING SPACES. .I -17;<>WPPN ADDR ^OUTPUT . (^WITHOUT BRACKETS.) .I -17;<>WNAMX ADDR ^OUTPUT ' AND _+1. .I -17;<>WFNAME FILE ^OUTPUT '. ^IF THE EXTENSION IS 'WSIX W,ADDR ^WRITE FROM . ^IF _ IS BLANK THEN OUTPUT WILL BE CONTROLLED BY THE EDIT CHARACTERS (DO NOT USE '%'!), OTHERWISE ONLY _ CHARACTERS WILL BE WRITTEN. .I -17;<>WDEC W,ADDR ^WRITE A DECIMAL NUMBER AT LEAST _ CHARACTERS LONG. ^IF <>LZEFLG IS SET IN ^F, THEN IT WILL BE PRECEDED WITH LEADING ZEROS. .I -17;<>WDECI W,NUM ^LIKE WOCT W,ADDR ^LIKE WOCTI W,NUM ^LIKE EDISIX ELIST ^WRITE EDIASC ELIST ^WRITE EWSIX ADDR ^DO <>WSIX TO THE ERROR STREAM. .I -17;<>EWASC ADDR ^DO <>WASC TO THE ERROR STREAM. .LM 0;.HL 2 ^FILE BLOCK ^ALL IFILE (A LOCATION IN THE FSETUP ^INITIALIZE LOSEG FILE BLOCK FROM HISEG BLOCK AT FILE. . ;<>FISEL ^SELECT INPUT STREAM TO BE THROUGH FILE. . ;<>FOSEL ^SELECT OUTPUT STREAM TO BE THROUGH FILE. . ;<>FIOPEN ^SELECT INPUT, LOOKUP FILE. . ;<>FOOPEN ^SELECT OUTPUT, ENTER FILE. . ;<>FIGET ^SELECT INPUT AND <>OPEN FILE. . ;<>FOGET ^SELECT OUTPUT AND <>OPEN FILE. . ;<>FLOOK ^SELECT INPUT AND <>LOOKUP FILE. . ;<>FENT ^SELECT OUTPUT AND <>ENTER FILE. . ;<>FICLS ^SELECT INPUT AND <>CLOSE FILE. . ;<>FOCLS ^SELECT OUTPUT AND <>CLOSE FILE. . ;<>FICLOS ^SELECT INPUT, RELEASE FILE. . ;<>FOCLOS ^SELECT OUTPUT, RELEASE FILE. . ;<>FREL <>RELEASE FILE (DON'T SELECT). .HL 2 ^FILE ERRORS. ^ALL OPEN ERROR MESSAGE. .INDEX ENTER ERROR MESSAGE. .INDEX INPUT ERROR MESSAGE. .INDEX OUTPUT ERROR MESSAGE. .LM 0 .HL 1 LEXICAL ANALYSIS .INDEX ^LEXICAL ANALYSIS ^TO PERFORM LEXICAL ANALYSIS, A ROUTINE (TBLBEG (SYMBOL) - ^DEFINES SYMBOL TO BE THE ADDRESS OF THE PRODUCTION TABLE AND INITIALIZES DATA FOR THE OTHER MACROS. .B 1;.I -3 .INDEX TBLEND - ^THIS MARKS THE END OF A PRODUCTION TABLE, GENERATING A HALF WORD TABLE FOR USE BY <>LEXINT TO DISPATCH TO ACTION ROUTINES. .LM 0 .HL 1 SOURCE FILES .LM 12;.B 1;.TS 13 .I -12;<>C.MAC ^PROVIDED BY TULIP.MAC ^A UNIVERSAL FILE PROVIDING ALL TULLIB.MAC ^LIBRARY THAT MUST BE SEARCHED TO LOAD THE TULIP.RND ^A <>RUNOFF FILE (VERSION 10) THAT GENERATES THIS DOCUMENT. .I -12;<>EXAMPL.MAC ^A LIBRARY OF SAMPLE PROGRAMS DISCUSSED BY THE PRIMER. .LM 0 .HL 1 RESERVED SYMBOLS .B 1;^THE FOLLOWING SYMBOLS MAY BE USEFUL: .TS 9,17 . ;^NAME VALUE FUNCTION . ;<>FTDBUG 0 -1 IF A DEBUG VERSION OF FTCREF 0 -1 IF PRGRAMMER WANTS FULL FTCMU 0 -1 AT FTIMP 0 -1 AT ^HARVARD AND $FLAGN - ^BIT LOCATION OF LAST DEFINED FLAG. . ;<>$NCHFL - ^NON ZERO IF CHARACTER CLASSES ARE DEFINED. . ;<>$UUON - ^VALUE OF THE LAST FHDBTS 0 #^MARK BITS INDICATING WHICH WORDS ARE NON-ZERO. . ;<>FHDLOC 1 #FHDOFS 2 #^OFFSET OF FIRST REAL DATA WORD IN $HDW . ;^SYMBOLS <>ZZ .B 1;^THE FOLLOWING ARE USED OR DEFINED BY THE LEXICAL ANALYSIS MACROS: . ;^MACROS ^^$NWACT, %TBLFN, $ACT\\ . ;^SYMBOLS ^^$ACTN, $ANG, $TESTF, $NEXT, N$POPJ, N$????, ZZ\\ . ; ##(???? ARE THE NAMES OF ACTION ROUTINES USED) .B 1;^MISCELLANEOUS MACROS: . ;TULLIB.MAC TO CREATE THE CHARACTER CLASS TABLE. . ;TSTANG - ^USED BY LEXICAL ANALYSIS MACROS. ^MUST NOT BE REDEFINED. .SUBTITLE ^INDEX .PAGE .INDEX INDEX .PX