; NASM macro set to make interfacing to 16-bit programs easier -*- nasm -*- %imacro proc 1 ; begin a procedure definition %push proc global %1 %1: push bp mov bp,sp %ifdef FARCODE PASCAL ; arguments may start at bp+4 or bp+6 %assign %$arg 6 %define %$firstarg 6 %else %assign %$arg 4 %define %$firstarg 4 %endif %define %$procname %1 %endmacro %imacro arg 0-1 2 ; used with the argument name as a label %00 equ %$arg ; we could possibly be adding some ; debug information at this point...? %assign %$arg %1+%$arg %endmacro %imacro endproc 0 %ifnctx proc %error Mismatched `endproc'/`proc' %else mov sp,bp pop bp %ifdef PASCAL retf %$arg - %$firstarg %elifdef FARCODE retf %else retn %endif __end_%$procname: ; useful for calculating function size %pop %endif %endmacro