.REMARK / * * * * *** ******* * * * * * ******* "WHEN YOU CARE ENOUGH TO PROGRAM THE VERY BEST" ZGRASS V4.00000001 by Tom Defanti, Nola Donato, and Jay Fenton (C) 1978 / ;THIS MODULE CONTAINS ALL THE SYSTEM EQUATES ;EQUATES PREFACED BY $ SIGNS ARE GENERALLY OFFSETS ;MACRO INVOCATION BLOCK (MIB) EQUATES: $TYPE=0 ;TYPE BYTE $LENGTH=1 ;LENGTH BYTE (FILLED BY ALLOC) $FLAGS=2 ;FLAGS BYTE $STRPTR=3 ;POINTER TO STRING CONTAINING MACRO (2 BYTES) $LINPTR=5 ;POINTER TO CURRENT LINE IN ABOVE STRING $XYLIN=7 ;LAST X & Y COORD FOR LINE CMD $LOCPTR=9 ;POINTER TO LOCAL VARIABLE LIST $FORPTR=11 ;POINTER TO FOR BLOCK LIST $CALLERPTR=13 ;POINTER TO CALLING MIB $BGPTR=15 ;POINTER TO BACKGROUND MACRO LIST $ARGPTR=17 ;POINTER TO ARG LIST IN CALLING MACRO $RVSTUFF=19 ;RETURN VALUE BYTES (3) FOR RETURN COMMAND $ONENUM=19 ;ONERROR NUMBER STUFFED HERE $ONELPT=20 ;ONERROR LINE POINTER STUFFED HERE $ONELAB=22 ;ONERROR STUFFS LABEL ADDR HERE $ARGNUM=24 ;HOLDS ARG ERROR NUM ;NOTE! 25 FREE NOW $GOSUB=26 ;GOSUB COUNTER BYTE $MIBEND=27 ;ONE PAST LAST LOC IN MIB CP.MXARG=12 ;MAX NUMBER OF ARGS PASSABLE CP.LOB=CP.MXARG*E.SIZ+$MIBEND+1 ;WHERE TO PUT ;LOCALS IN MIB FOR CPLS $LOCSIZ=9 ;SIZE OF LOCAL NAME IN CPL ;NAME BLOCK EQUATES (NOTE THAT $TYPE, $LENGTH & $FLAGS ARE ;ALWAYS THE SAME VALUE FOR EACH TYPE OF BLOCK $NLINK=3 ;NAMES LINK POINTER TO FWA OF NEXT NAME IN LIST $NVALUE=5 ;POINTER TO STRING OR VALUE (FOR INTEGER) ASSOCIATED ;WITH THIS NAME $NASCII=9 ;BEGINNING OF ASCII NAME IN THIS BLOCK ;STRING BLOCK EQUATES ARE SIMILAR TO NAME BLOCK EQUATES: ;$SSEARCH=5 ;POINTER FOR STRING MANIPULATION ROUTINES $USE=5 ;USECOUNT ;NOTE: BYTE 8 IS ALWAYS ZERO (ANCHOR) $SLEN = 6 ;LENGTH OF STRING $SASCII=10 ;STRING ASCII START ;FLAG EQUATES SO FAR: CP.ARG=1 ;BIT 0 SET MEANS CMD DOES OWN PARSING OR DOES NOT ;CALL ARG CP.NO=2 ;BIT 1 SET MEANS DON'T COMPILE THIS ONE $DOLDEL=1 ; BIT 0 MEANS DELETE THIS DOLOOPED MIB WHEN WE CAN $NDEL=200Q ;BIT 7 IN FLAGS MEANS DON'T ALLOW USER TO DELETE ;(USED MAINLY FOR SYSTEM VARIABLES) $DOLOOP=2 ;BIT 1 MEANS IS DOLOOPED MIB $BNDL=7 ;BIT CORRESP TO $NDEL FOR BIT NSTR ; EQUATES FOR CHARACTER WINDOW GOODIES: C.ST=0 ; STATUS BYTE C.X=2 ; X CENTER OF WINDOW C.Y=4 ; Y CENTER OF WINDOW C.XS=6 ; X SIZE OF WINDOW C.YS=8 ; Y SIZE OF WINDOW C.CX=0AH ; X CURSOR C.CY=0CH ; Y CURSOR C.XF=0EH ; X FRAME SIZE C.YF=10H ; Y FRAME SIZE C.C0=12H ; FOREGROUND COLOR OF CHAR C.C1=14H ; BACKGROUND COLOR OF CHAR C.DP=16H ; DISPLAY PROCEDURE ; STUFF IN STATUS BYTE NBLKB=0 ; NO BLANK BIT NBLKM=1 ; MASK TO SET NO BLANK ERABIT=2 ; ERASE BIT SCNEED=4 ; SCROLL NEEDED STATUS BIT RUBACK=5 ; RUBOUT BACKED UP BEFORE THIS LINE STATUS BIT ;TYPE EQUATES FOUND IN FIRST BYTE OF ALLOCATED STORAGE ITEMS ;AND USED TO REQUEST AND RECEIVE STUFF FROM ARG (IN SUB). ;EQUATE VALUE MEANING $ANYNAM= -4 ;RETURN ANY NAMEBLOCK OR SPECIAL $ANYVAL= -2 ;RETURN ANY VALUE (EVAL) $TAF= 0 ;END OF LIST $DVAL= 0 ;TYPE FOR DOUBLE INTS (EVAL ONLY) $NULL= 2 ;TYPE FOR NULL $LOCAL= 3 ;LOCAL REFERENCE $IVAL= 4 ;IS INTEGER VALUE $ADDRI= 5 ;SPECIAL INT ADDR $FVAL= 6 ;IS FLOAT VALUE $ADDRF= 7 ;SPECIAL FLT ADDR $STRADR= 8 ;IS STRING BLOCK $ADDRS= 9 ;SPECIAL STRING ADDR $NAMADR= 10 ;IS NAMEBLOCK $IADR= 12 ;IS INTEGER NAME BLOCK $FADR= 14 ;IS FLOAT NAME BLOCK $AADR= 16 ;IS ARRAY $CPLADR= 18 ;COMPILED MACRO $CMDADR= 24 ;IS COMMAND ;PLUS THE FOLLOWING SPECIAL TAGS FOR ARG: $ANY= 26 ;TAKE ANY OF FOLLOWING ;TILL $END $END= 28 ;TERMINATES $ANY LIST $REPEAT= 30 ;REPEAT PREV ARG $SAME= 32 ;FOR ARG INTERNAL USE $NAME= $NAMADR ;TEMPORARY KLUDGE ;PLUS THE FOLLOWING TAGS USED FOR ADDITIONAL ALLOCATION TYPES: $MIBBLK= 34 ;IS MACRO INVOCATION BLOCK $FORBLK= 36 ;IS FOR BLOCK $KEYBLK= 38 ;IS MIB FOR KEYBOARD $CSBLOK= 40 ;IS MIB FOR ^S & ERRORS $CPLMIB= 42 ;IS MIB FOR CPLS ;NOW COME SYSTEM ASSEMBLY CONDITIONALS: ZGIM2=1 ; TURN ON INTERRUPT MODE TWO ;ADDON= 1 ; TURN ON ADDON CODE HIRES=1 ; TURN ON HI RESOLUTION MODE ;PATBRD=1 ; TURN ON PATTERN BOARD CODE SCRUNCH=1 ; TURN OFF UNNEEDED COMMANDS ;+++ ; ; OPERAND STACK EQUATES ; USED IN EVAL AND FOR ARGUMENTS RETURNED BY ARG ; ;--- E.TYP = 0 ;OFFSET OF TYPE E.VAL = 1 ;OFFSET OF VALUE E.LVAL = E.VAL ;OFFSET OF LO-ORDER VALUE E.HVAL = 2 ;OFFSET OF HI-ORDER VALUE E.SIZ = 5 ;SIZE OF ENTRIES ;NOW SOME EQUATES FOR COMPILER CP.MXR=20 ;MAX NUMBER OF GOTOS/SKIPS CP.MXL=128 ;MAX LENGTH OF BUFFER/2 ;NOW CHARACTER EQUATES FOR UNPRINTABLES: NL=012Q ;LINEFEED BLANK=' ' ;BLANK TAB=' ' ;TAB AASN='=' ;ARITHMETIC ASSIGNMENT OPERATOR EXTDEL='.' ;SWITCH DELIMITER CNTRL='L'-40H ;^L CNTRLU='U'-40H ;^U RUBOUT=177Q CR=015Q ;CRETURN LF=NL ;AND SOME ERROR EQUATES: ER.CHN=2 ;FWDPTR IS ZERO& SHOULDN'T BE ER.IMP=3 ;IMPOSSIBLE ERROR ER.STK=4 ;STACK OFLO OR UFLO ;NEXT ARE USER SYNTAX TYPE ERRORS ER.OPN=20 ;OPERAND EXPECTED HERE ER.ASN=21 ;ASSIGNMENT TO NOT NAME ER.CNV=22 ;CANT CONVERT ER.OFLO=23 ;ARITH OFLO ER.DIV=24 ;DIV BY 0 ER.DSK=25 ;DISK FILE NOT FOUND ER.BOX=26 ;BOX ERROR ER.COR=27 ;OUT OF CORE ER.FNF=28 ;JAY'S UNEXPLAINED ERROR ER.NXT=29 ;NEXT COMMAND ERROR ER.OVER=30 ;TOO MUCH FOR COMMAND TO HANDLE ER.CMD=31 ;FUNNY SYNTAX ER.TERM=32 ;NO TERMY AT END OF COMMAND ER.SEP=33 ;FUNNY SEPARATOR AFTER FIRST WORD ER.MAC=34 ;NOT A MACRO ER.NOTF=35 ;NAME NOT FOUND ER.RET=36 ;RETURN ERROR ER.LAB=37 ;LABEL NOT FOUND ER.DEL=38 ;NDEL SET ER.UNF=39 ;UNDERFED ER.FOR=40 ;FOR ERROR ER.NAME=41 ;NAME ERROR ER.PAR=42 ;UNBAL PARENS ER.NUM=43 ;NUMMIE EXPECTED HERE ER.REN=44 ;CANNOT RENAME THIS ONE ER.NAE=45 ;NAME ALREADY EXISTS ER.SPC=46 ;NOT A SPECIAL VAR NAME ER.ARA=47 ;ARRAY OUT OF BOUNDS ER.DIM=48 ;TOO MANY DIMENSIONS SPECIFIED ER.SNP=49 ; SNAP OFFSCREEN ER.SW=50 ;NO SUCH SWITCH ER.UFLO=51 ;ARITH UFLO ER.ARG=52 ;BAD FLOAT ARGUMENT ER.EDT=53 ;EDIT'S FOR STRINGS ONLY ER.CTL=54 ;BAD CHAR (NON A-Z) IN ER.DP=55 ;0-6 DIGITS ONLY ALLOWED AFTER DECIMAL POINT ER.FMT=56 ;NUMBER TOO SMALL OR LARGE FOR FORMAT FIELD ER.NULS=57 ;NULL STRING NOT ALLOWED HERE ER.NEG=58 ;NEGATIVE ARGUMENT NOT ALLOWED HERE ER.CPL=59 ;CANNOT COMPILE THIS COMMAND ER.DUP=60 ;DUPLICATE LABEL ER.SKP=61 ;INTEGERS ONLY FOR COMPILED SKIPS ER.TML=62 ;TOO MANY LINES FOR COMPILER ER.LBS=63 ;ILLEGAL LABEL SYNTAX ER.ONE=64 ;ONERROR IN LOOP ER.LOO=65 ;LOOP MAX EXCEEDED ER.USE=66 ;USE COUNT TOO BIG ER.IY=67 ;NO MORE IY STACK SPACE ER.NXT=68 ;NEXT MISSING ER.INM=69 ;MUST BE IN MACRO ER.NSIZ=70 ;CANNOT COMPARE ARRAYS OF DIFFERENT SIZES E.MSG=0 ;PUT IN ERROR MESSAGE ASCIZ'S ;END OF ERRORS ;HERE COME THE ZGRASS MACROS .DEFINE AFIX[A]= [("A"-101Q)*16+FSTINT] .DEFINE ERROR[EQU]= [ CALL ERRPGM .BYTE EQU ] ;+ ; TOM'S ERROR MACROS ;- .DEFINE ZERROR[EQU,%RET]= [ JRNZ %RET CALL ERRPGM .BYTE EQU %RET:] .DEFINE NZERROR[EQU,%RET]= [ JRZ %RET CALL ERRPGM .BYTE EQU %RET:] .DEFINE CERROR[EQU,%RET]= [ JRNC %RET CALL ERRPGM .BYTE EQU %RET:] .DEFINE NCERROR[EQU,%RET]= [ JRC %RET CALL ERRPGM .BYTE EQU %RET:] .DEFINE M.CMD[NAME,LASTLOC,FLAGS,NXTCMD,ARGLST,FIRSTLOC]= [ NAME: .BYTE $CMDADR .BYTE (LASTLOC-NAME)/16+1 ;;LENGTH .BYTE FLAGS .WORD NXTCMD .WORD FIRSTLOC .WORD ARGLST .ASCIZ /NAME/ ] .DEFINE M.SWITCH[SWITCH,ENTRY,ARGLIST]= [ .WORD ENTRY .WORD ARGLIST .ASCIZ /SWITCH/ ] ;NOTE TO USERS OF M.CMD AND M.SWITCH: ; THE FINAL ASCIZ SHOULD BE DOUBLE ; NULLED SO NAMADR CAN TELL WHEN TO STOP .END