Here there are two macro implementations for a user-defined disassembler:
(disasm-recursive times
? $0 == 0 ; check if arg0 == 0
?? () ; if matches break
pd 1 ; disassemble 1 opcode
s +$$$ ; seek curseek+opcodesize
.(disasm-recursive $0-1)) ; recursive call to me
The problem with the recursive implementation is that will easily eat the stack if you plan to feed the macro with a large number as argument.
It is also possible to write the same loop in an iterative format:
(disasm-iterative x
f foo @ $0 ; foo = arg0
label: ; define label
pd 1 ; disasm 1 opcode
s +$$$ ; seek to next opcode
f foo @ foo-1 ; foo--
? foo != 0 ; if (foo != 0)
??.label: ; goto label
)
I know that this syntax looks like a mix of lisp, perl and brainfuck :) cool huh? ;)