To paraphrase the Great and Powerful Oz, "Pay no attention to that man behind
the macro."
I had made a bunch of clean-up to this macro, renaming operands to be more
meaningful, and mistakenly sent out a partially-updated copy. A fully-updated
copy is attached. I cleaned up the MEXIT and &A errors and also added a few
comments indicating that general register 0 shouldn't be used for the pointer
or length, and dropped the fifth operand off the RISBGT instruction (since it's
optional and defaults to zero).
MACRO
&LABEL WIF &P=1,&L=,&C=,&S=0,&OK=,&NFG=
.*
.* Will It Fit?
.*
.* Given the following:
.* 1. Register "P" pointing to the next available location in an
.* integral buffer (i.e., the size and alignment are a power of
.* two);
.* 2. Register "L" containing the length of a prospective object to
.* be added to the buffer; and
.* 3. Characteristic C, where C represents the integral boundary as
.* a power of two;
.* Will the prospective object fit within the buffer?
.*
.* Operands:
.* P: Starting address; default is general register 1.
.* L: Length of object in a general register; no default.
.* C: Characteristic (i.e., power of two) representing the
.* integral boundary (e.g., C=8 means a 256-byte boundary).
.* S: Scratch register; default is general register 0.
.* OK: Branch location if the object fits; no default.
.* NFG: Branch location if the object does not fit; no default.
.*
.* A PSW condittion code of zero indicates the object fits, and may be
.* used in place of the OK and/or NFG operands.
.*
.* Note: For proper operation, both P and L should designate a general
.* register other than 0.
.*
AIF (&C GT 64).BAD_C
&LABEL LAY &S,-1(&L,&P) Point at last prospective byte.
RXSBGT &S,&P,0,63-&C Carry past boundary?
AIF ('&OK' EQ '').SKIP_OK
JZ &OK No; prospective object fits.
.SKIP_OK ANOP
AIF ('&NFG' EQ '').SKIP_NFG
JNZ &NFG Yes; prospective object doesn't fit.
.SKIP_NFG MEXIT
.BAD_C MNOTE 8,'C must be between 0 and 63.'
MEND