; MAC-CHAL.Z80
; A solution to the Jay Sage/Ben Grey "Macro Challenge"
; R. A. Freed, 26 May 1989
;_______________________________________________________________________
;
; This is an INCLUDE file for use with SLR Systems' Z80ASM+ macro
; assembler.  It has not been tested with SLR's Z80ASM or Microsoft's
; M80, but it should work with those also.
;
; The author submits this bit of fluff for its intellectual curiosity
; value only.  He certainly would not advocate use of such an obscure
; macro parameter convention.  Mainly, he can't resist a good
; programming puzzle.  (The original "challenge" message from Jay
; Sage's Newton Centre Z-Node, 617/965-7259, is reproduced below.)
;_______________________________________________________________________
;
; Preliminaries
;
; The macro MSTR builds a string argument for an assembler pseudo-op.
; The macro MCHR adds the next character to the string (if OP is MSTR),
;  or it generates the final pseudo-op (specified by OP).
; The major "trick" here is that MCHR is defined by MSTR.  Hence, MCHR
;  causes its own redefinition when invoked with OP=MSTR.

MSTR    MACRO   STR
MCHR    MACRO   OP,CHR
       OP      STR&&CHR        ;; see note below
       ENDM
       ENDM

; Note the double ampersands above:  The first is stripped during the
; expansion of MSTR (definition of MCHR); the second is stripped
; during the expansion of MCHR.
;_______________________________________________________________________
;
; The "Solution"
;
; The macro DWB generates either a DW or DB, depending upon the first
; character of its single arbitrary parameter string.  If the leading
; character of STR is a pound sign (#), it is stripped and a DW is
; generated using the remaining characters of STR.  Otherwise, a DB is
; generated.

DWB     MACRO   STR
FIRST   DEFL    NOT 0
 IRPC CHR,<STR>
   IF FIRST
     IFDIF <CHR>,<#>
       DB      STR
       EXITM
     ELSE
FIRST   DEFL    0
       MSTR
     ENDIF
   ELSE
       MCHR    MSTR,<CHR>
   ENDIF
 ENDM
 IF NOT FIRST
       MCHR    DW
 ENDIF
ENDM
;_______________________________________________________________________
;
; The "Challenge"
;
       .COMMENT        |

Msg 382 is 18 line(s) on 05/24/89 from JAY SAGE
to ALL about MACRO CHALLENGE

Here is a challenge for macro assembler programmers.  It was posed to me
by Ben Grey.  So far I have not come up with a solution.

A macro is to be passed a parameter which is a number with or without a
leading "#" character.  If the "#" is present, one thing is to be done
with the remaining numerical part (e.g., make it the argument of a DB).
If the "#" is absent, then something else will be done with the number,
such as making it the argument of a DW.

This is all part of a more general problem of coming up with a macro that
can be passed a string that the macro splits into two parts.

Any ideas?

P.S.  I think I can solve the problem if I know that the numerical part
of the parameter is a DECIMAL number, but I cannot figure out how to
handle the general case, where it might be hex or binary or even a general
symbolic token.


Msg 388 is 08 line(s) on 05/25/89 from BOB FREED
to JAY SAGE about MACRO CHALLENGE

Unfortunately, most Z80 assemblers (notably M80 and Z80ASM) lack the
necessary assembly-time string processing operations that would make this
sort of thing easy (if not at all possible) to do.  SLR's MS-DOS
assembler OPTASM allows text equates via certain forms of the EQU
pseudo-op, that makes the solution a snap.  Lacking such a feature, I
think I may have a somewhat complex (and certainly inelegant) way to
solve the challenge for the general case you described.  (I can't resist
a puzzle.)  I'll let you know after I have a chance to test it out.....

|
;_______________________________________________________________________