home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-07-29 | 74.7 KB | 2,235 lines |
- IF1
- DISPLAY " ░▒▓█ Using ASM POWER v1.0 assembly language extension █▓▒░"
- DISPLAY " ░▒▓█ Earl Hammon, July 1996 █▓▒░"
- ENDIF
-
- _@@mcx?? = 1
- _@@orx?? = 0
- _@@ifx?? = 0
- _@@ifv?? = 1
- _@@dox?? = 0
- _@@whilex?? = 0
- _@@swx?? = 0
- _@@syntax?? = 0
- _@@uwd?? = 0
- _@@pwd?? = 0
- _@@cwd?? = 0
- _@@prct?? = 0FFFFh
- _@@use?? = 0
- _@@skip?? = 0
-
- JUMPIF MACRO cond, jumploc, syntax_chk
- _@@use?? = 0
- IFNB <syntax_chk>
- IF2
- ERR
- DISPLAY ">> ERROR - Syntax error in JUMPIF"
- IFE _@@syntax??
- DISPLAY ">> Usage: JUMPIF <expression> location"
- DISPLAY ">> See the spec file for valid expressions."
- _@@syntax?? = 1
- ENDIF
- ENDIF
- EXITM
- ENDIF
- _@@NQ@ cond, jumploc
- IF _@@go??
- IFB <cond>
- IF2
- ERR
- DISPLAY ">> ERROR - No condition specified in JUMPIF"
- IFE _@@syntax??
- DISPLAY ">> Usage: JUMPIF <expression> location"
- DISPLAY ">> See the spec file for valid expressions."
- _@@syntax?? = 1
- ENDIF
- ENDIF
- EXITM
- ENDIF
- IFB <jumploc>
- IF2
- ERR
- DISPLAY ">> ERROR - No location specified in JUMPIF"
- IFE _@@syntax??
- DISPLAY ">> Usage: JUMPIF <expression> location"
- DISPLAY ">> See the spec file for valid expressions."
- _@@syntax?? = 1
- ENDIF
- ENDIF
- EXITM
- ENDIF
- @@loc INSTR <cond>,< EQ >
- IF @@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@OZ@ e, &@@arg1, &@@arg2, <jumploc>
- EXITM
- ENDIF
- @@loc INSTR <cond>,< NE >
- IF @@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@OZ@ ne, &@@arg1, &@@arg2, <jumploc>
- EXITM
- ENDIF
- @@loc INSTR <cond>,< GT >
- IF @@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@OZ@ g, &@@arg1, &@@arg2, <jumploc>
- EXITM
- ENDIF
- @@loc INSTR <cond>,< GE >
- IF @@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@OZ@ ge, &@@arg1, &@@arg2, <jumploc>
- EXITM
- ENDIF
- @@loc INSTR <cond>,< LT >
- IF @@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@OZ@ l, &@@arg1, &@@arg2, <jumploc>
- EXITM
- ENDIF
- @@loc INSTR <cond>,< LE >
- IF &@@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@OZ@ le, &@@arg1, &@@arg2, <jumploc>
- EXITM
- ENDIF
- IFIDN <cond>, <CARRY>
- jc &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <NO CARRY>
- jnc &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <ZERO>
- jz &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <NOT ZERO>
- jnz &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <EQUAL>
- je &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <NOT EQUAL>
- jne &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <POSITIVE>
- jns &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <NEGATIVE>
- js &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <LESS>
- jl &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <LESS OR EQUAL>
- jle &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <GREATER>
- jg &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <GREATER OR EQUAL>
- jge &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <OVERFLOW>
- jo &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <NO OVERFLOW>
- jno &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <EVEN PARITY>
- jpe &jumploc
- EXITM
- ENDIF
- IFIDN <cond>, <ODD PARITY>
- jpo &jumploc
- EXITM
- ENDIF
- @@loc INSTR <cond>, <NOT >
- IF @@loc EQ 1
- @@arg SUBSTR <cond>,4
- _@@OY@ z, @@arg, <jumploc>
- ELSE
- _@@OY@ nz, cond, <jumploc>
- ENDIF
- ENDIF
- ENDM
-
- _@@NQ@ MACRO arg1, link, arg2, dest
- _@@go?? = 1
- IFIDN <link>,<AND>
- IF_ <arg1>
- JUMPIF <arg2> dest
- _@@go?? = 0
- ELSE
- IFIDN <link>,<OR>
- JUMPIF <arg1> dest
- JUMPIF <arg2> dest
- _@@go?? = 0
- ENDIF
- ENDIF
- ENDM
-
- _@@OY@ MACRO test, arg, jumploc
- IFIDN <test>,<z>
- IF (.TYPE arg) AND 16
- IF arg EQ cx
- jcxz &jumploc
- EXITM
- ENDIF
- ENDIF
- ENDIF
- IF (.TYPE arg) AND 16
- or arg, arg
- ELSE
- @@size = (TYPE arg)
- _@@KZ@ % @@size
- mov _@@use??, arg
- or _@@use??, _@@use??
- _@@KY@
- ENDIF
- j&test &jumploc
- ENDM
-
- _@@OZ@ MACRO test, arg1, arg2, jumploc
- IFIDN <test>,<e>
- IF ((.TYPE arg2) AND 20) NE 0) AND ((.TYPE arg1) AND 20) NE 0)
- IF (arg2 EQ 0 AND arg1 EQ cx) OR (arg1 EQ 0 AND arg2 EQ cx)
- jcxz &jumploc
- EXITM
- ENDIF
- ENDIF
- ENDIF
- IF ((.TYPE arg1) AND 16) OR ((.TYPE arg2) AND 16)
- cmp &arg1, &arg2
- ELSEIF ((.TYPE arg1) AND 4 EQ 0) AND ((.TYPE arg2) AND 4 EQ 4)
- cmp &arg1, &arg2
- ELSE
- @@size = (TYPE arg2)
- _@@KZ@ % @@size
- mov _@@use??, &arg1
- cmp _@@use??, &arg2
- _@@KY@
- ENDIF
- j&test &jumploc
- ENDM
-
-
- IF_ MACRO cond, syntax_chk
- _@@use?? = 0
- IFNB <syntax_chk>
- IF2
- ERR
- DISPLAY ">> ERROR - Syntax error in IF_"
- IFE _@@syntax??
- DISPLAY ">> Usage: IF_ <expression>"
- DISPLAY ">> See the spec file for valid expressions."
- _@@syntax?? = 1
- ENDIF
- ENDIF
- EXITM
- ENDIF
- _@@NR@ cond, syntax_chk
- IF _@@go??
- _@@ifx?? = _@@ifx??+1
- IFB <cond>
- IF2
- ERR
- DISPLAY ">> ERROR - No condition specified in IF_"
- IFE _@@syntax??
- DISPLAY ">> Usage: IF_ <expression>"
- DISPLAY ">> See the spec file for valid expressions."
- _@@syntax?? = 1
- ENDIF
- ENDIF
- EXITM
- ENDIF
- @@loc INSTR <cond>,< EQ >
- IF @@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@MZ@ ne, &@@arg1, &@@arg2, % _@@ifx??
- EXITM
- ENDIF
- @@loc INSTR <cond>,< NE >
- IF @@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@MZ@ e, &@@arg1, &@@arg2, % _@@ifx??
- EXITM
- ENDIF
- @@loc INSTR <cond>,< GT >
- IF @@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@MZ@ le, &@@arg1, &@@arg2, % _@@ifx??
- EXITM
- ENDIF
- @@loc INSTR <cond>,< GE >
- IF @@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@MZ@ l, &@@arg1, &@@arg2, % _@@ifx??
- EXITM
- ENDIF
- @@loc INSTR <cond>,< LT >
- IF @@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@MZ@ ge, &@@arg1, &@@arg2, % _@@ifx??
- EXITM
- ENDIF
- @@loc INSTR <cond>,< LE >
- IF &@@loc
- @@arg1 SUBSTR <cond>,1,@@loc-1
- @@arg2 SUBSTR <cond>,@@loc+4
- _@@MZ@ g, &@@arg1, &@@arg2, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <CARRY>
- _@@MX@ nc, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <NO CARRY>
- _@@MX@ c, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <ZERO>
- _@@MX@ nz, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <NOT ZERO>
- _@@MX@ z, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <EQUAL>
- _@@MX@ ne, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <NOT EQUAL>
- _@@MX@ e, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <POSITIVE>
- _@@MX@ s, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <NEGATIVE>
- _@@MX@ ns, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <LESS>
- _@@MX@ ge, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <LESS OR EQUAL>
- _@@MX@ g, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <GREATER>
- _@@MX@ le, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <GREATER OR EQUAL>
- _@@MX@ l, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <OVERFLOW>
- _@@MX@ o, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <NO OVERFLOW>
- _@@MX@ no, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <EVEN PARITY>
- _@@MX@ pe, % _@@ifx??
- EXITM
- ENDIF
- IFIDN <cond>, <ODD PARITY>
- _@@MX@ po, % _@@ifx??
- EXITM
- ENDIF
- @@loc INSTR <cond>, <NOT >
- IF @@loc EQ 1
- @@arg SUBSTR <cond>,4
- _@@MY@ nz, @@arg, % _@@ifx??
- ELSE
- _@@MY@ z, cond, % _@@ifx??
- ENDIF
- ENDIF
- ENDM
-
- _@@NR@ MACRO arg1, link, arg2
- _@@go?? = 1
- IFIDN <link>,<AND>
- IF_ <arg1>
- _@@ifv?? = 3
- IF_ <arg2>
- _@@ifv?? = 1
- _@@go?? = 0
- ELSE
- IFIDN <link>,<OR>
- _@@orx?? = _@@orx?? + 1
- _@@NS@ <arg1>, % _@@orx??, <arg2>
- _@@go?? = 0
- ENDIF
- ENDIF
- ENDM
-
- _@@NS@ MACRO cond, num, cond2
- JUMPIF <cond> _@o?&num&@
- IF_ <cond2>
- _@o?&num&@:
- ENDM
-
- _@@MX@ MACRO test, num
- IF num LT 10
- IF _@@skip??
- j&test& _@@onskip??
- ELSE
- j&test& _@a?000&num&@
- ENDIF
- _@a?000&num&?? = _@@ifv??
- IF2
- IFNDEF _@a?000&num&@
- ERR
- DISPLAY ">> ERROR - IF_ without _ENDIF or WHILE_ without _WEND"
- ENDIF
- ENDIF
- ELSEIF num LT 100
- IF _@@skip??
- j&test& _@@onskip??
- ELSE
- j&test& _@a?00&num&@
- ENDIF
- _@a?00&num&?? = _@@ifv??
- IF2
- IFNDEF _@a?00&num&@
- ERR
- DISPLAY ">> ERROR - IF_ without _ENDIF or WHILE_ without _WEND"
- ENDIF
- ENDIF
- ELSEIF num LT 1000
- IF _@@skip??
- j&test& _@@onskip??
- ELSE
- j&test& _@a?0&num&@
- ENDIF
- _@a?0&num&?? = _@@ifv??
- IF2
- IFNDEF _@a?0&num&@
- ERR
- DISPLAY ">> ERROR - IF_ without _ENDIF or WHILE_ without _WEND"
- ENDIF
- ENDIF
- ELSE
- IF _@@skip??
- j&test& _@@onskip??
- ELSE
- j&test& _@a?&num&@
- ENDIF
- _@a?&num&?? = _@@ifv??
- IF2
- IFNDEF _@a?&num&@
- ERR
- DISPLAY ">> ERROR - IF_ without _ENDIF or WHILE_ without _WEND"
- ENDIF
- ENDIF
- ENDIF
- _@@skip?? = 0
- ENDM
-
- _@@MY@ MACRO test, arg, num
- IFIDN <test>,<z>
- IF (.TYPE arg) AND 16
- IF arg EQ cx
- _@@MX@ cxz, % num
- EXITM
- ENDIF
- ENDIF
- ENDIF
- IF (.TYPE arg) AND 16
- or arg, arg
- ELSE
- _@@KZ@ % (TYPE arg)
- mov _@@use??, arg
- or _@@use??, _@@use??
- _@@KY@
- ENDIF
- _@@MX@ &test, % num
- ENDM
-
- _@@MZ@ MACRO test, arg1, arg2, num
- IFIDN <test>,<e>
- IF ((.TYPE arg2) AND 20 NE 0) AND ((.TYPE arg1) AND 20 NE 0)
- IF (arg2 EQ 0 AND arg1 EQ cx) OR (arg1 EQ 0 AND arg2 EQ cx)
- _@@MX@ cxz, % num
- EXITM
- ENDIF
- ENDIF
- ENDIF
- IF ((.TYPE arg1) AND 16) OR ((.TYPE arg2) AND 16)
- cmp &arg1, &arg2
- ELSEIF ((.TYPE arg1) AND 4 EQ 0) AND ((.TYPE arg2) AND 4 EQ 4)
- cmp &arg1, &arg2
- ELSE
- _@@KZ@ % (TYPE arg2)
- mov _@@use??, &arg1
- cmp _@@use??, &arg2
- _@@KY@
- ENDIF
- _@@MX@ test, % num
- ENDM
-
-
- _ELSE_ MACRO
- _@@QQ@ % _@@ifx??
- _ENDIF
- _@@ifx?? = _@@ifx??+1
- ENDM
-
-
- _ELSEIF_ MACRO cond, syntax_chk
- _ELSE_
- _@@ifv?? = 2
- IF_ <cond>, <syntax_chk>
- _@@ifv?? = 1
- ENDM
-
-
- _ENDIF MACRO
- _@@use?? = 0
- _@@QZ@ % _@@ifx??
- ENDM
-
- _@@QP@ MACRO num
- IF num LT 10
- _@@QR@ _@a?000&num&??
- ELSEIF num LT 100
- _@@QR@ _@a?00&num&??
- ELSEIF num LT 1000
- _@@QR@ _@a?0&num&??
- ELSE
- _@@QR@ _@a?&num&??
- ENDIF
- ENDM
-
- _@@QQ@ MACRO num
- _@@done?? = 0
- _@@try?? = num
- REPT num
- _@@QP@ % _@@try??
- IF _@@done??
- EXITM
- ENDIF
- _@@try?? = _@@try?? - 1
- ENDM
- _@@MX@ <mp>, % _@@ifx??+1
- _@@ifv?? = 1
- ENDM
-
- _@@QR@ MACRO loc
- IF (&loc EQ 1) OR (&loc EQ 2)
- _@@ifv?? = &loc
- &loc = 1
- _@@done?? = 1
- ELSEIF (&loc EQ 3)
- &loc = 2
- _@@ifv?? = 1
- _@@done?? = 1
- ENDIF
- ENDM
-
- _@@QX@ MACRO num
- IF num LT 10
- _@@QY@ _@a?000&num&
- ELSEIF num LT 100
- _@@QY@ _@a?00&num&
- ELSEIF num LT 1000
- _@@QY@ _@a?0&num&
- ELSE
- _@@QY@ _@a?&num&
- ENDIF
- ENDM
-
- _@@QY@ MACRO loc
- IF &loc&??
- &loc&@:
- IF &loc&?? EQ 1
- _@@done?? = 1
- ENDIF
- &loc&?? = 0
- ENDIF
- ENDM
-
- _@@QZ@ MACRO num
- _@@done?? = 0
- _@@try?? = num
- REPT num
- _@@QX@ % _@@try??
- IF _@@done??
- EXITM
- ENDIF
- _@@try?? = _@@try?? - 1
- ENDM
- IFE _@@done??
- IF2
- ERR
- DISPLAY "_ENDIF without IF_"
- ENDIF
- ENDIF
- ENDM
-
-
- DO_ MACRO
- _@@use?? = 0
- _@@dox?? = _@@dox?? + 1
- _@@DZ@ % _@@dox??
- ENDM
-
- _@@DZ@ MACRO num
- IF num LT 10
- _@d?000&num&@:
- _@d?000&num&?? = 0
- IF2
- IFNDEF _@d?000&num&@
- ERR
- DISPLAY ">> ERROR - DO_ without _WHILE"
- ENDIF
- ENDIF
- ELSEIF num LT 100
- _@d?00&num&@:
- _@d?00&num&?? = 0
- IF2
- IFNDEF _@d?00&num&@
- ERR
- DISPLAY ">> ERROR - DO_ without _WHILE"
- ENDIF
- ENDIF
- ELSEIF num LT 1000
- _@d?0&num&@:
- _@d?0&num&?? = 0
- IF2
- IFNDEF _@d?0&num&@
- ERR
- DISPLAY ">> ERROR - DO_ without _WHILE"
- ENDIF
- ENDIF
- ELSE
- _@d?&num&@:
- _@d?&num&?? = 0
- IF2
- IFNDEF _@d?&num&@
- ERR
- DISPLAY ">> ERROR - DO_ without _WHILE"
- ENDIF
- ENDIF
- ENDIF
- ENDM
-
-
- _WHILE MACRO cond, syntax_chk
- _@@use?? = 0
- _@@WW@ % _@@dox??
- IFE _@@done??
- IF2
- ERR
- DISPLAY ">> ERROR - _WHILE without DO_"
- ENDIF
- ELSE
- JUMPIF <cond>, _@jump??, <syntax_chk>
- ENDIF
- ENDM
-
- _@@WW@ MACRO num
- _@@done?? = 0
- _@@try?? = num
- REPT num
- _@@WX@ % _@@try??
- IF _@@done??
- EXITM
- ENDIF
- ENDM
- ENDM
-
- _@@WX@ MACRO num
- IF num LT 10
- _@@WY@ _@d?000&num&
- ELSEIF num LT 100
- _@@WY@ _@d?00&num&
- ELSEIF num LT 1000
- _@@WY@ _@d?0&num&
- ELSE
- _@@WY@ _@d?&num&
- ENDIF
- ENDM
-
- _@@WY@ MACRO loc
- IFE &loc&??
- _@jump?? = &loc&@
- &loc&?? = 1
- _@@done?? = 1
- ELSE
- _@@try?? = _@@try?? - 1
- ENDIF
- ENDM
-
- _@@WZ@ MACRO num
- IF num LT 10
- _@b?000&num&@:
- _@b?000&num&?? = 0
- ELSEIF num LT 100
- _@b?00&num&@:
- _@b?00&num&?? = 0
- ELSEIF num LT 1000
- _@b?0&num&@:
- _@b?0&num&?? = 0
- ELSE
- _@b?&num&@:
- _@b?&num&?? = 0
- ENDIF
- ENDM
-
-
- WHILE_ MACRO cond, syntax_chk
- _@@use?? = 0
- _@@whilex?? = _@@whilex?? + 1
- _@@WZ@ % _@@whilex??
- _@@ifv?? = 1
- IF_ <&cond&>, <&syntax_chk&>
- ENDM
-
-
- _WEND MACRO
- _@@PZ@ % _@@whilex??
- _ENDIF
- ENDM
-
- _@@PX@ MACRO num
- IF num LT 10
- _@@PY@ _@b?000&num&
- ELSEIF num LT 100
- _@@PY@ _@b?00&num&
- ELSEIF num LT 1000
- _@@PY@ _@b?0&num&
- ELSE
- _@@PY@ _@b?&num&
- ENDIF
- ENDM
-
- _@@PY@ MACRO check
- IFE &check&??
- &check&?? = 1
- jmp &check&@
- _@@done?? = 1
- ELSE
- _@@try?? = _@@try?? - 1
- ENDIF
- ENDM
-
- _@@PZ@ MACRO num
- _@@done?? = 0
- _@@try?? = num
- REPT num
- _@@PX@ % _@@try??
- IF _@@done??
- EXITM
- ENDIF
- ENDM
- IFE _@@done??
- IF2
- ERR
- DISPLAY "_WEND without WHILE_"
- ENDIF
- ENDIF
- ENDM
-
-
- SWITCH_ MACRO arg, syntax_chk
- _@@use?? = 0
- IFB <arg>
- IF2
- ERR
- DISPLAY ">> ERROR - No argument specified in SWITCH_"
- ENDIF
- EXITM
- ENDIF
- IFNB <syntax_chk>
- IF2
- ERR
- DISPLAY ">> ERROR - Syntax error in SWITCH_"
- ENDIF
- EXITM
- ENDIF
- _@@swx?? = _@@swx?? + 1
- _@@casex?? = 0
- _@@SE@ % _@@swx??
- IF (.TYPE arg) AND 16
- _@@sa?? = arg
- ELSE
- _@@KZ@ % (TYPE arg)
- _@@sa?? = _@@use??
- mov _@@sa??, arg
- ENDIF
- _@@break?? = $
- ENDM
-
- _@@SE@ MACRO snum
- IF2
- IF snum LT 10
- IFDEF _@s?000&snum&@
- EXITM
- ENDIF
- ELSEIF snum LT 100
- IFDEF _@s?00&snum&@
- EXITM
- ENDIF
- ELSEIF snum LT 1000
- IFDEF _@s?0&snum&@
- EXITM
- ENDIF
- ELSE
- IFDEF _@s?&snum&@
- EXITM
- ENDIF
- ENDIF
- ERR
- DISPLAY ">> ERROR - SWITCH_ without _ENDS"
- ENDIF
- ENDM
-
- CASE_ MACRO arg, syntax_chk
- local _@skip@
- _@@use?? = 0
- IFB <arg>
- IF2
- ERR
- DISPLAY ">> ERROR - No argument specified in CASE_"
- ENDIF
- EXITM
- ENDIF
- IFNB <syntax_chk>
- IF2
- ERR
- DISPLAY ">> ERROR - Syntax error in CASE_"
- ENDIF
- EXITM
- ENDIF
- IF _@@break?? NE $
- jmp short _@skip@
- ENDIF
- _@@ZZ@ % _@@swx??
- _@@casex?? = _@@casex?? + 1
- cmp _@@sa??, arg
- _@@ZY@ % _@@swx??
- _@@KY@
- _@skip@:
- ENDM
-
- JUMPCASE MACRO arg, location, syntax_chk
- local _@skip@
- _@@use?? = 0
- IFE _@@needpop??
- SENDSKIPTO <location>
- ENDIF
- IFB <arg>
- IF2
- ERR
- DISPLAY ">> ERROR - No argument specified in CASE_"
- ENDIF
- EXITM
- ENDIF
- IFNB <syntax_chk>
- IF2
- ERR
- DISPLAY ">> ERROR - Syntax error in CASE_"
- ENDIF
- EXITM
- ENDIF
- IF _@@break?? NE $
- jmp short _@skip@
- ENDIF
- _@@ZZ@ % _@@swx??
- _@@casex?? = _@@casex?? + 1
- cmp _@@sa??, arg
- _@@ZY@ % _@@swx??
- _@@KY@
- IF _@@needpop??
- jmp location
- ENDIF
- _@@break?? = $
- _@skip@:
- ENDM
-
- MULTICASE_ MACRO arg, syntax
- _@@ZQ@ % _@@mcx??
- IFE _@@needpop??
- CASE_ <arg>, syntax
- _ENDCASE
- ELSE
- _@@needpop?? = 0
- CASE_ <arg>, syntax
- _ENDCASE
- _@@needpop?? = 1
- ENDIF
- ENDM
-
- LASTCASE_ MACRO arg, syntax
- local _@skip@
- _@@use?? = 0
- IFB <arg>
- IF2
- ERR
- DISPLAY ">> ERROR - No argument specified in LASTCASE_"
- ENDIF
- EXITM
- ENDIF
- IFNB <syntax>
- IF2
- ERR
- DISPLAY ">> ERROR - Syntax error in LASTCASE_"
- ENDIF
- EXITM
- ENDIF
- IF _@@break?? NE $
- jmp short _@skip@
- ENDIF
- _@@ZZ@ % _@@swx??
- _@@casex?? = _@@casex?? + 1
- cmp _@@sa??, arg
- _@@ZY@ % _@@swx??
- _@@ZR@ % _@@mcx??
- _@@KY@
- _@skip@:
- ENDM
-
- _@@ZQ@ MACRO num
- IF2
- IFNDEF _@mc?&num&@
- ERR
- DISPLAY ">> ERROR - MULTICASE_ without LASTCASE_"
- ENDIF
- ELSE
- SENDSKIPTO _@mc?&num&@
- ENDIF
- ENDM
-
- _@@ZR@ MACRO num
- _@mc?&num&@:
- _@@mcx?? = num+1
- ENDM
-
- _@@ZW@ MACRO spart, cnum
- IF _@@skip??
- je _@@onskip??
- _@@skip?? = 0
- ELSE
- IF cnum LT 10
- jne &spart&c?000&cnum&@
- ELSEIF cnum LT 100
- jne &spart&c?00&cnum&@
- ELSEIF cnum LT 1000
- jne &spart&c?0&cnum&@
- ELSE
- jne &spart&c?&cnum&@
- ENDIF
- ENDIF
- ENDM
-
- _@@ZX@ MACRO spart, cnum
- IF cnum LT 10
- &spart&c?000&cnum&@:
- ELSEIF cnum LT 100
- &spart&c?00&cnum&@:
- ELSEIF cnum LT 1000
- &spart&c?0&cnum&@:
- ELSE
- &spart&c?&cnum&@:
- ENDIF
- ENDM
-
- _@@ZY@ MACRO snum
- IF snum LT 10
- _@@ZW@ _@s?000&snum&, % _@@casex??
- ELSEIF snum LT 100
- _@@ZW@ _@s?00&snum&, % _@@casex??
- ELSEIF snum LT 1000
- _@@ZW@ _@s?0&snum&, % _@@casex??
- ELSE
- _@@ZW@ _@s?&snum&, % _@@casex??
- ENDIF
- ENDM
-
- _@@ZZ@ MACRO snum
- IF snum LT 10
- _@@ZX@ _@s?000&snum&, % _@@casex??
- ELSEIF snum LT 100
- _@@ZX@ _@s?00&snum&, % _@@casex??
- ELSEIF snum LT 1000
- _@@ZX@ _@s?0&snum&, % _@@casex??
- ELSE
- _@@ZX@ _@s?&snum&, % _@@casex??
- ENDIF
- ENDM
-
-
- _ENDCASE MACRO
- _@@use?? = 0
- _@@break?? = $
- ENDM
-
-
- _BREAK MACRO
- _@@use?? = 0
- _@@YZ@ % _@@swx??
- _@@break?? = $
- ENDM
-
- _@@YZ@ MACRO snum
- IF snum LT 10
- jmp _@s?000&snum&@
- ELSEIF snum LT 100
- jmp _@s?00&snum&@
- ELSEIF snum LT 1000
- jmp _@s?0&snum&@
- ELSE
- jmp _@s?&snum&@
- ENDIF
- ENDM
-
-
- DEFAULT_ MACRO
- LOCAL _@skip@
- _@@use?? = 0
- IF _@@break?? NE $
- jmp short _@skip@
- ENDIF
- _@@ZZ@ % _@@swx??
- _@@casex?? = _@@casex?? + 1
- _@@KY@
- _@skip@:
- ENDM
-
-
- _ENDS MACRO
- LOCAL _@skip@
- _@@use?? = 0
- IF _@@break?? NE $
- jmp short _@skip@
- ENDIF
- _@@KY@
- _@skip@:
- _@@XZ@ % _@@swx??
- _@@ZZ@ % _@@swx??
- ENDM
-
- _@@XZ@ MACRO snum
- IF snum LT 10
- _@s?000&snum&@:
- _@s?000&snum&?? = 1
- ELSEIF snum LT 100
- _@s?000&snum&@:
- _@s?00&snum&?? = 1
- ELSEIF snum LT 1000
- _@s?000&snum&@:
- _@s?0&snum&?? = 1
- ELSE
- _@s?000&snum&@:
- _@s?&snum&?? = 1
- ENDIF
- ENDM
-
-
- _@@KY@ MACRO
- IF _@@needpop??
- IF _@@use?? EQ al
- pop ax
- ELSEIF _@@use?? EQ ax
- pop ax
- ELSEIF @Cpu AND 8
- IF _@@use?? EQ eax
- pop eax
- ENDIF
- ELSE
- IF2
- DISPLAY ">> ERROR - Need to pop unknown register."
- _@@IM@
- ENDIF
- ENDIF
- ENDIF
- ENDM
-
- _@@KZ@ MACRO size
- _@@needpop?? = 0
- IF (size EQ 1)
- _@@try?? = 0000000000000001b
- IRP use, <al,ah,cl,ch,bl,bh,dl,dh>
- IFE _@@prct?? AND _@@try??
- _@@use?? = use
- EXITM
- ENDIF
- _@@try?? = _@@try?? SHL 1
- ENDM
- IF _@@try?? EQ 100000000b
- push ax
- _@@needpop?? = 1
- _@@use?? = al
- ENDIF
- ELSEIF size EQ 2
- _@@try?? = 0000000000000011b
- IRP use, <ax,cx,bx,dx,si,di,bp>
- IFE _@@prct?? AND _@@try??
- _@@use?? = use
- EXITM
- ENDIF
- _@@try?? = _@@try?? SHL 2
- ENDM
- IF _@@try?? EQ 1100000000000000b
- push ax
- _@@needpop?? = 1
- _@@use?? = ax
- ENDIF
- ELSEIF size EQ 4
- IRP use, <eax,ecx,ebx,edx,ebp,edi,esi>
- IFE _@@prct?? AND _@@try??
- _@@use?? = use
- EXITM
- ENDIF
- _@@try?? = _@@try?? SHL 2
- ENDM
- IF _@@try?? EQ 1100000000000000b
- push eax
- _@@needpop?? = 1
- _@@use?? = eax
- ENDIF
- ELSE
- IF2
- ERR
- DISPLAY ">> ERROR - Bad data size: must be byte, word, or dword"
- ENDIF
- ENDIF
- PROTECT _@@use??
- ENDM
-
-
- PROTECT MACRO reglist
- IFIDN <reglist>,<ALL>
- _@@prct?? = 1111111111111111b
- EXITM
- ELSE
- IFIDN <reglist>,<NONE>
- _@@prct?? = 0000000000000000b
- EXITM
- ENDIF
- ENDIF
- IRP save, <reglist>
- IFE (.TYPE save) AND 16
- IF2
- ERR
- DISPLAY ">> ERROR - Argument to PROTECT must be <register list>, ALL, or NONE"
- ENDIF
- EXITM
- ENDIF
- _@@done?? = 0
- _@@try?? = 0000000000000011b
- IRP reg, <ax,cx,bx,dx,si,di,bp>
- IF save EQ reg
- _@@prct?? = _@@prct?? OR _@@try??
- _@@done?? = 1
- EXITM
- ENDIF
- _@@try?? = _@@try?? SHL 2
- ENDM
- IF @Cpu AND 8
- IFE _@@done??
- _@@try?? = 0000000000000011b
- IRP reg, <eax,ecx,ebx,edx,esi,edi,ebp>
- IF save EQ reg
- _@@prct?? = _@@prct?? OR _@@try??
- _@@done?? = 1
- EXITM
- ENDIF
- _@@try?? = _@@try?? SHL 2
- ENDM
- ENDIF
- ENDIF
- IFE _@@done??
- _@@try?? = 0000000000000001b
- IRP reg, <al,ah,cl,ch,bl,bh,dl,dh>
- IF save EQ reg
- _@@prct?? = _@@prct?? OR _@@try??
- _@@done?? = 1
- EXITM
- ENDIF
- _@@try?? = _@@try?? SHL 1
- ENDM
- ENDIF
- IFE _@@done??
- IF2
- DISPLAY ">> WARNING - register in PROTECT ignored"
- IFE _@@pwd??
- DISPLAY ">> PROTECT only recognizes EAX, ECX, EBX, EDX, ESI, EDI, and EBP"
- DISPLAY ">> PROTECT can also be used with just part of a register (e.g., AH, BP)."
- DISPLAY ">> These are the only registers ever used by a USE directive."
- _@@pwd?? = 1
- ENDIF
- ENDIF
- ENDIF
- ENDM
- ENDM
-
-
- USE MACRO register
- PROTECT ALL
- CANUSE register
- ENDM
-
- CANUSE MACRO reglist
- _@@use?? = 0
- IFIDN <reglist>,<ALL>
- _@@prct?? = 0000000000000000b
- EXITM
- ELSE
- IFIDN <reglist>,<NONE>
- _@@prct?? = 1111111111111111b
- EXITM
- ENDIF
- ENDIF
- IRP save, <reglist>
- IFE (.TYPE save) AND 16
- IF2
- ERR
- DISPLAY ">> ERROR - Argument to USE must be <register list>, ALL, or NONE"
- ENDIF
- EXITM
- ENDIF
- _@@done?? = 0
- _@@try?? = 1111111111111100b
- IRP reg, <ax,cx,bx,dx,si,di,bp>
- IF save EQ reg
- _@@prct?? = _@@prct?? AND _@@try??
- _@@done?? = 1
- EXITM
- ENDIF
- _@@try?? = (_@@try?? SHL 2) OR 0000000000000011b
- ENDM
- IF @Cpu AND 8
- IFE _@@done??
- _@@try?? = 1111111111111100b
- IRP reg, <eax,ecx,ebx,edx,esi,edi,ebp>
- IF save EQ reg
- _@@prct?? = _@@prct?? AND _@@try??
- _@@done?? = 1
- EXITM
- ENDIF
- _@@try?? = (_@@try?? SHL 2) OR 0000000000000011b
- ENDM
- ENDIF
- ENDIF
- IFE _@@done??
- _@@try?? = 1111111111111110b
- IRP reg, <al,ah,cl,ch,bl,bh,dl,dh>
- IF save EQ reg
- _@@prct?? = _@@prct?? AND _@@try??
- _@@done?? = 1
- EXITM
- ENDIF
- _@@try?? = (_@@try?? SHL 1) OR 0000000000000001b
- ENDM
- ENDIF
- IFE _@@done??
- IF2
- DISPLAY ">> WARNING - register in USE ignored"
- IFE _@@uwd??
- DISPLAY ">> USE only utilizes EAX, ECX, EBX, EDX, ESI, EDI, and EBP"
- DISPLAY ">> USE can also use just part of a register (e.g., AH, BP)."
- _@@uwd?? = 1
- ENDIF
- ENDIF
- ENDIF
- ENDM
- ENDM
-
-
- SENDSKIPTO MACRO dest, syntax
- _@@use?? = 0
- IFNB <syntax>
- IF2
- ERR
- DISPLAY ">> ERROR - Syntax error in SENDSKIPTO"
- ENDIF
- ENDIF
- _@@onskip?? = dest
- _@@skip?? = 1
- ENDM
-
-
- DECLARE MACRO rtp, name, arglist, spec1, spec2
- _@@use?? = 0
- IF1
- IFDEF _@@&name&??
- ERR
- %OUT >> ERROR - Function "&name&" already defined
- ENDIF
- IFIDN <spec1>,<near>
- IFIDN <spec2>,<pascal>
- GLOBAL &name&:near
- ELSE
- GLOBAL _&name&:near
- ENDIF
- ELSE
- IFIDN <spec2>,<near>
- IFIDN <spec1>,<pascal>
- GLOBAL &name&:near
- ELSE
- GLOBAL _&name&:near
- ENDIF
- ELSE
- IFIDN <spec2>,<far>
- IFIDN <spec1>,<pascal>
- GLOBAL &name&:near
- ELSE
- GLOBAL _&name&:near
- ENDIF
- ELSE
- IFIDN <spec1>,<far>
- IFIDN <spec2>,<pascal>
- GLOBAL &name&:far
- ELSE
- GLOBAL _&name&:far
- ENDIF
- ELSE
- IFIDN <spec2>,<pascal>
- GLOBAL &name&:near
- ELSE
- GLOBAL _&name&:near
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- IFIDN <rtp>,<void>
- _@@r_&name&?? = 0
- ELSE
- IFIDN <rtp>,<byte>
- _@@r_&name&?? = 1
- ELSE
- IFIDN <rtp>,<char>
- _@@r_&name&?? = 1
- ELSE
- IFIDN <rtp>,<word>
- _@@r_&name&?? = 2
- ELSE
- IFIDN <rtp>,<dword>
- _@@r_&name&?? = 4
- ELSE
- IFIDN <rtp>,<near>
- _@@r_&name&?? = @WordSize
- ELSE
- IFIDN <rtp>,<far>
- _@@r_&name&?? = 2+@WordSize
- ELSE
- ERR
- %OUT >> ERROR - Bad return type for function "&name&"
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- _@q?? = 0
- _@@s_&name&?? = 0
- IRP q, <arglist>
- @@pos INSTR <q>, <static >
- @@pos0 INSTR <q>, <byte >
- @@pos1 INSTR <q>, <char >
- @@pos2 INSTR <q>, <word >
- @@pos3 INSTR <q>, <near >
- @@pos4 INSTR <q>, <dword >
- IF @@pos4
- @@pos2 = 0
- ENDIF
- IF @@pos
- @@pos = 6
- ENDIF
- @@pos5 INSTR <q>, <far >
- @@pos6 INSTR <q>, <=>
- IF @@pos6
- IF @@pos0
- @@lab SUBSTR <q>, @@pos0+5, @@pos6-@@pos0-5
- ELSEIF @@pos1
- @@lab SUBSTR <q>, @@pos1+5, @@pos6-@@pos1-5
- ELSEIF @@pos2
- @@lab SUBSTR <q>, @@pos2+5, @@pos6-@@pos2-5
- ELSEIF @@pos3
- @@lab SUBSTR <q>, @@pos3+5, @@pos6-@@pos3-5
- ELSEIF @@pos4
- @@lab SUBSTR <q>, @@pos4+6, @@pos6-@@pos4-6
- ELSEIF @@pos5
- @@lab SUBSTR <q>, @@pos5+4, @@pos6-@@pos5-4
- ELSE
- @@lab SUBSTR <q>, 1, @@pos6-1
- IFE (.TYPE @@lab) AND 16
- _@@DA@ % _@q??+1, &name
- ENDIF
- ENDIF
- ELSE
- IF @@pos0
- @@lab SUBSTR <q>, @@pos0+5
- ELSEIF @@pos1
- @@lab SUBSTR <q>, @@pos1+5
- ELSEIF @@pos2
- @@lab SUBSTR <q>, @@pos2+5
- ELSEIF @@pos3
- @@lab SUBSTR <q>, @@pos3+5
- ELSEIF @@pos4
- @@lab SUBSTR <q>, @@pos4+6
- ELSEIF @@pos5
- @@lab SUBSTR <q>, @@pos5+3
- ELSE
- @@lab SUBSTR <q>, 1,80
- IFE (.TYPE @@lab) AND 16
- _@@DA@ % _@q??+1, &name
- ENDIF
- ENDIF
- ENDIF
- IF (.TYPE @@lab) AND 16
- IRP r,<al,ah,bl,bh,cl,ch,dl,dh>
- IF r EQ @@lab
- _@r?? = 1
- EXITM
- ENDIF
- ENDM
- IRP r,<ax,bx,cx,dx,si,di,sp,bp,cs,ds,es,ss>
- IF r EQ @@lab
- _@r?? = 2
- EXITM
- ENDIF
- ENDM
- IF @WordSize EQ 4
- IF r EQ fs OR r EQ gs
- _@r?? = 2
- ELSE
- _@r?? = 4
- ENDIF
- ENDIF
- IF (_@r?? EQ 1)
- IF @@pos2 OR @@pos3 OR @@pos4 OR @@pos5
- DISPLAY ":) STUPIDITY - register size different from declared size!!"
- DISPLAY ":) Register size used."
- ENDIF
- ELSEIF (_@r?? EQ 2)
- IF @@pos0 OR @@pos1 OR (@@pos3 NE 0 AND @WordSize NE 2) OR @@pos4 OR @@pos5
- DISPLAY ":) STUPIDITY - register size different from declared size!!"
- DISPLAY ":) Register size used."
- ENDIF
- ELSE
- IF @@pos0 OR @@pos1 OR @@pos2 OR (@@pos3 NE 0 AND @WordSize NE 4) OR (@@pos5 NE 0 AND @WordSize NE 2)
- DISPLAY ":) STUPIDITY - register size different from declared size!!"
- DISPLAY ":) Register size used."
- ENDIF
- ENDIF
- ELSEIF @@pos0 OR @@pos1
- _@r?? = 1
- ELSEIF @@pos2
- _@r?? = 2
- ELSEIF @@pos3
- _@r?? = @WordSize
- ELSEIF @@pos4
- _@r?? = 4
- ELSEIF @@pos5
- _@r?? = 2+@WordSize
- ELSE
- _@@DA@ % _@q?? + 1, &name
- ENDIF
- IF @@pos OR ((.TYPE @@lab) AND 16)
- _@r?? = _@r??+8
- _@@DQ@ name, % _@q??, @@lab
- ELSE
- _@@s_&name&?? = _@@s_&name&?? + _@r??
- ENDIF
- @@pos INSTR <q>, <=>
- IF @@pos
- _@r?? = _@r?? + 16
- @@val SUBSTR <q>, @@pos+1
- _@@DY@ name, % _@q??, @@val
- ENDIF
- _@@DW@ name, % _@q??, % _@r??
- _@q?? = _@q?? + 1
- ENDM
- _@@&name&?? = _@q??
-
- IFIDN <spec1>,<pascal>
- _&name&_c_ = 0
- @&name MACRO args
- _@@use?? = 0
- _@q?? = 0
- IRP q, <args>
- _@@FZ@ name, % _@q??
- _@@DX@ _@r??, name, % _@q??, &q
- _@q?? = _@q?? + 1
- ENDM
- IF _@@&name&?? GT _@q??
- REPT _@@&name&?? - _@q??
- _@@FZ@ name, % _@q??
- _@@DR@ _@r??, name, % _@q??
- _@q?? = _@q?? + 1
- ENDM
- ENDIF
- call &name
- ENDM
- ELSE
- IFIDN <spec2>,<pascal>
- _&name&_c_ = 0
- @&name MACRO args
- _@@use?? = 0
- _@q?? = 0
- IRP q, <args>
- _@@FZ@ name, % _@q??
- _@@DX@ _@r??, name, % _@q??, &q
- _@q?? = _@q?? + 1
- ENDM
- IF _@@&name&?? GT _@q??
- REPT _@@&name&?? - _@q??
- _@@FZ@ name, % _@q??
- _@@DR@ _@r??, name, % _@q??
- _@q?? = _@q?? + 1
- ENDM
- ENDIF
- call &name
- ENDM
- ELSE
- _&name&_c_ = 1
- &name MACRO args
- _@@use?? = 0
- _@q?? = 0
- IRP q,<args>
- _@q?? = _@q??+1
- ENDM
- _@@qq?? = _@q??
- IF _@@&name&?? GT _@q??
- _@q?? = _@@&name&??
- REPT _@@&name&??-_@@qq??
- _@q?? = _@q??-1
- _@@FZ@ name, % _@q??
- _@@DR@ _@r??, name, % _@q??
- ENDM
- ENDIF
- _@@qq?? = _@q??
- REPT _@@qq??
- _@@qq?? = _@@qq??-1
- _@q?? = 0
- IRP q,<args>
- IF _@q?? EQ _@@qq??
- _@@FZ@ name, % _@q??
- _@@DX@ _@r??, name, % _@q??, &q
- ENDIF
- _@q?? = _@q?? + 1
- ENDM
- ENDM
- call _&name
- IF @WordSize EQ 2
- add sp, _@@s_&name&??
- ELSE
- add esp, _@@s_&name&??
- ENDIF
- ENDM
- ENDIF
- ENDIF
- ENDIF
- ENDM
-
- _@@DA@ MACRO num, name
- ERR
- %OUT >> ERROR - Bad or missing type for argument &num of function "&name&"
- ENDM
-
- _@@DQ@ MACRO name, num, lab
- _@@&name&?&num&@ EQU lab
- ENDM
-
- _@@DR@ MACRO mode, name, num
- IF _@@&name&?&num&?? AND 16
- def = _@@d_&name&?&num&??
- _@@DX@ mode, name, num, def
- ELSE
- _@@MA@ % num+1, &name
- ENDIF
- ENDM
-
- _@@MA@ MACRO num, name
- IF2
- ERR
- %OUT >> ERROR - Missing argument &num to function "&name&"
- ENDIF
- ENDM
-
- _@@DW@ MACRO name, num, val
- _@@&name&?&num&?? EQU val
- ENDM
-
- _@@DX@ MACRO mode, name, num, arg
- @@loc INSTR <arg>,<|>
- IF (mode AND 8)
- IFE @@loc
- IF (.TYPE _@@&name&?&num&@) EQ (.TYPE arg)
- IF _@@&name&?&num&@ EQ arg
- EXITM
- ENDIF
- ENDIF
- ENDIF
- IF (@@loc NE 0) AND ((_@@&name&?&num&?? AND 7) EQ 4)
- arg1 SUBSTR <arg>,1,@@loc-1
- arg2 SUBSTR <arg>,@@loc+1
- mov word ptr [2+offset ds:_@@&name&?&num&@], arg1
- mov word ptr [offset ds:_@@&name&?&num&@], arg2
- ELSEIF (@@loc NE 0) AND ((_@@&name&?&num&?? AND 7) EQ 6)
- arg1 SUBSTR <arg>,1,@@loc-1
- arg2 SUBSTR <arg>,@@loc+1
- mov word ptr [2+offset ds:_@@&name&?&num&@], arg1
- mov dword ptr [offset ds:_@@&name&?&num&@], arg2
- ELSEIF (.TYPE arg) AND 2
- _@@size?? = mode AND 7
- IF @WordSize LT _@@size??
- _@@size?? = @WordSize
- ENDIF
- _@@KZ@ % _@@size??
- IF _@@needpop??
- IF2
- ERR
- %OUT >> ERROR - Need a free register to call function "&name&"
- IFE _@@cwd??
- %OUT >> Use "USE reg" to specify which register to use
- %OUT >> See the spec file for more detailed information
- _@@cwd?? = 1
- ENDIF
- ENDIF
- ELSEIF (mode AND 7) LE @WordSize
- mov _@@use??, arg
- mov _@@&name&?&num&@, _@@use??
- USE _@@use??
- ELSE
- mov _@@use??, word ptr arg
- mov word ptr [offset ds:_@@&name&?&num&@], _@@use??
- mov _@@use??, word ptr (2+offset ds:arg)
- mov word ptr [2+offset ds:_@@&name&?&num&@], _@@use??
- USE _@@use??
- ENDIF
- ELSE
- mov _@@&name&?&num&@, arg
- ENDIF
- ELSEIF (@Cpu AND 0FEh)
- IF (@@loc NE 0) AND ((mode AND 7) EQ 4)
- arg1 SUBSTR <arg>,1,@@loc-1
- arg2 SUBSTR <arg>,@@loc+1
- push arg1
- push arg2
- ELSEIF (mode AND 7) EQ 1
- IF (.TYPE arg) AND 16
- IF (arg EQ al) OR (arg EQ ah)
- push ax
- ELSEIF (arg EQ bl) OR (arg EQ bh)
- push bx
- ELSEIF (arg EQ cl) OR (arg EQ ch)
- push cx
- ELSEIF (arg EQ dl) OR (arg EQ dh)
- push dx
- ELSEIF @WordSize EQ 2
- push arg
- IF2
- %OUT >> WARNING - register size mismatch, high byte ignored
- ENDIF
- ENDIF
- ELSE
- push word ptr arg
- ENDIF
- ELSEIF (mode AND 7) LE @WordSize
- push arg
- ELSEIF (.TYPE arg) AND 4
- push word ptr ((arg SHR 16) AND 0FFFFh)
- push word ptr (arg AND 0FFFFh)
- ELSE
- push word ptr [2+offset ds:arg]
- push word ptr [offset ds:arg]
- ENDIF
- ELSE
- _@@KZ@ 2
- IF _@@needpop??
- IF2
- ERR
- %OUT >> ERROR - Need a free register to call function "&name&"
- IFE _@@cwd??
- %OUT >> Use "USE reg" to specify which register to use
- %OUT >> See the spec file for more detailed information
- _@@cwd?? = 1
- ENDIF
- ENDIF
- ELSE
- mov _@@use??, word ptr (2+offset ds:arg)
- push _@@use??
- mov _@@use??, word ptr arg
- push _@@use??
- USE _@@use??
- ENDIF
- ENDIF
- ENDM
-
- _@@DY@ MACRO name, num, val
- _@@d_&name&?&num&?? = val
- ENDM
-
-
- FUNCTION_ MACRO rtp, name, args, spec1, spec2
- _@@use?? = 0
- IFNDEF _@@&name&??
- DECLARE rtp name <args> spec1 spec2
- ENDIF
- IFIDN <spec1>,<far>
- _@@base?? = 2+@WordSize*2
- ELSE
- IFIDN <spec2>,<far>
- _@@base?? = 2+@WordSize*2
- ELSE
- _@@base?? = @WordSize*2
- ENDIF
- ENDIF
- _@@colleen?? = _@@base??
- IF _&name&_c_
- _@q?? = 0
- IRP q, <args>
- _@@FX@ &name, % _@q??, % _@@base??, & q
- ENDM
- _@@cf?? = 1
- IFIDN <spec1>,<far>
- _&name PROC FAR
- ELSE
- IFIDN <spec2>,<far>
- _&name PROC FAR
- ELSE
- _&name PROC NEAR
- ENDIF
- ENDIF
- ELSE
- _@@qq?? = _@@&name&??
- REPT _@@qq??
- _@@qq?? = _@@qq?? - 1
- _@q?? = 0
- IRP q, <args>
- IF _@q?? EQ _@@qq??
- _@@FX@ &name, % _@q??, % _@@base??, & q
- ENDIF
- _@q?? = _@q?? + 1
- ENDM
- ENDM
- _@@cf?? = 0
- IFIDN <spec1>,<far>
- &name PROC FAR
- ELSE
- IFIDN <spec2>,<far>
- &name PROC FAR
- ELSE
- &name PROC NEAR
- ENDIF
- ENDIF
- ENDIF
- _@@rs?? = _@@r_&name&??
- IF _@@colleen?? NE _@@base??
- IF @WordSize EQ 2
- push bp
- mov bp, sp
- ELSE
- push ebp
- mov ebp, esp
- ENDIF
- ENDIF
- ENDM
-
- _@@FE@ MACRO name, num
- IF2
- ERR
- %OUT >> ERROR - Bad or missing data size for argument &num& from declaration of "&name&"
- ENDIF
- ENDM
-
- _@@IM@ MACRO
- DISPLAY "└─────????"
- DISPLAY "░▒▓█ CONGRATULATIONS - YOU'VE JUST DONE THE IMPOSSIBLE! █▓▒░"
- DISPLAY "░▒▓█ Please contact me so I can (hopefully) make it impossible again. █▓▒░"
- DISPLAY ""
- ENDM
-
- _@@FX@ MACRO name, num, off, mask1, mask2, mask3
- IFIDN <mask1>, <static>
- IF1
- IFNDEF mask3
- _@@d_&mask3&@ = 1
- IFIDN <mask2>,<byte>
- mask3 DB ?
- ELSE
- IFIDN <mask2>,<char>
- mask3 DB ?
- ELSE
- IFIDN <mask2>,<word>
- mask3 DW ?
- ELSE
- IFIDN <mask2>,<dword>
- mask3 DD ?
- ELSE
- IFIDN <mask2>,<near>
- IF @WordSize EQ 2
- mask3 DW ?
- ELSE
- mask3 DD ?
- ENDIF
- ELSE
- IFIDN <mask2>,<far>
- IF @WordSize EQ 2
- mask3 DD ?
- ELSE
- mask3 DW ?
- DD ?
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ELSE
- IFDEF _@@d_&mask3&@
- IFIDN <mask2>,<byte>
- mask3 DB ?
- ELSE
- IFIDN <mask2>,<char>
- mask3 DB ?
- ELSE
- IFIDN <mask2>,<word>
- mask3 DW ?
- ELSE
- IFIDN <mask2>,<dword>
- mask3 DD ?
- ELSE
- IFIDN <mask2>,<near>
- IF @WordSize EQ 2
- mask3 DW ?
- ELSE
- mask3 DD ?
- ENDIF
- ELSE
- IFIDN <mask2>,<far>
- IF @WordSize EQ 2
- mask3 DD ?
- ELSE
- mask3 DW ?
- DD ?
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ELSEIF ((.TYPE mask1) AND 16) EQ 0
- _@@FY@ name, num, off, mask2
- ENDIF
- ENDM
-
- _@@FY@ MACRO name, num, off, mask
- IF (_@@&name&?&num&?? AND 8)
- mask = _@@&name&?&num&??
- ELSE
- IF (_@@&name&?&num&?? AND 7) EQ 4
- IF @WordSize EQ 2
- mask = (dword ptr [bp+off])
- ELSE
- mask = dword ptr [ebp+off]
- ENDIF
- ELSEIF (_@@&name&?&num&?? AND 7) EQ 2
- IF @WordSize EQ 2
- mask = word ptr [bp+off]
- ELSE
- mask = word ptr [ebp+off]
- ENDIF
- ELSEIF (_@@&name&?&num&?? AND 7) EQ 1
- IF @WordSize EQ 2
- mask = byte ptr [bp+off]
- ELSE
- mask = byte ptr [ebp+off]
- ENDIF
- ELSE
- _@@FE@ &name, % num + 1
- ENDIF
- _@@base?? = off + (_@@&name&?&num&?? AND 6) + (_@@&name&?&num&?? AND 1)*2
- ENDIF
- ENDM
-
- _@@FZ@ MACRO name, num
- IF num LT _@@&name&??
- _@r?? = _@@&name&?&num&??
- ELSEIF num EQ _@@&name&??
- IF2
- ERR
- %OUT >> ERROR - Too many arguments to function "&name&"
- ENDIF
- ENDIF
- ENDM
-
-
- RETURN MACRO val
- _@@use?? = 0
- IFDIF <val>,<NOTHING>
- _@@RC@ val
- ENDIF
- IF _@@colleen?? NE _@@base??
- IF @WordSize EQ 2
- pop bp
- ELSE
- pop ebp
- ENDIF
- ENDIF
- IF (_@@cf?? NE 0) OR (_@@colleen?? EQ _@@base??)
- ret
- ELSE
- ret _@@base??-_@@colleen??
- ENDIF
- _@@ra?? = $
- ENDM
-
- _@@RC@ MACRO val
- IFNB <val>
- IF _@@rs?? EQ 0
- IF2
- %OUT :) STUPIDITY - "void" functions don't return values!!
- %OUT :) Return value ignored
- ENDIF
- ELSEIF _@@rs?? EQ 1
- IF ((.TYPE val) AND 16) EQ 0
- mov al, val
- ELSEIF val NE al
- IFIDN <val>,<0>
- xor al, al
- ELSE
- mov al, val
- ENDIF
- ENDIF
- ELSEIF _@@rs?? EQ 2
- IF ((.TYPE val) AND 16) EQ 0
- IFIDN <val>,<0>
- xor ax, ax
- ELSE
- mov ax, val
- ENDIF
- ELSEIF (val NE ax)
- mov ax, val
- ENDIF
- ELSEIF _@@rs?? EQ 4
- IF @WordSize EQ 2
- @@loc INSTR <val>,<|>
- IF @@loc
- arg1 SUBSTR <val>,1,@@loc-1
- arg2 SUBSTR <val>,@@loc+1
- IF ((.TYPE arg2) AND 16)
- IF arg2 EQ dx
- IF ((.TYPE arg1) AND 16)
- IF arg1 EQ ax
- xchg ax, dx
- ELSE
- mov ax, dx
- ENDIF
- ELSE
- mov ax, dx
- ENDIF
- ENDIF
- ENDIF
- IF ((.TYPE arg1) AND 4) EQ 4 AND (arg1 EQ 0)
- xor dx, dx
- ELSEIF ((.TYPE arg2) AND 16)
- IF arg1 NE dx AND arg1 NE ax
- mov dx, arg1
- ELSEIF arg1 EQ ax
- IFE ((.TYPE arg2) AND 16)
- mov dx, arg1
- ELSEIF arg2 NE dx
- mov dx, arg1
- ENDIF
- ENDIF
- ELSE
- mov dx, arg1
- ENDIF
- IF ((.TYPE arg2) AND 4) EQ 4
- IF arg2 EQ 0
- xor ax, ax
- ELSE
- mov ax, arg2
- ENDIF
- ELSEIF ((.TYPE arg2) AND 16)
- IF arg2 NE ax AND arg2 NE dx
- mov ax, arg2
- ENDIF
- ELSE
- mov ax, arg2
- ENDIF
- ELSEIF (.TYPE val) AND 4
- @@loc INSTR <val>,<:>
- IF @@loc
- mov dx, word ptr [2+val]
- mov ax, word ptr [val]
- ELSE
- IF ((val SHR 16) AND 0FFFFh)
- mov dx, (val SHR 16) AND 0FFFFh
- ELSE
- xor dx, dx
- ENDIF
- IF (val AND 0FFFFh)
- mov ax, val AND 0FFFFh
- ELSE
- xor ax, ax
- ENDIF
- ENDIF
- ELSEIF (.TYPE val) AND 2
- @@loc INSTR <val>,<:>
- IFE @@loc
- mov dx, word ptr [2+offset ds:val]
- mov ax, word ptr [offset ds:val]
- ELSE
- mov dx, word ptr [2+offset val]
- mov ax, word ptr [offset val]
- ENDIF
- ELSE
- IF2
- ERR
- %OUT >> ERROR - Bad or missing data type for return value
- ENDIF
- ENDIF
- ELSE
- IFE (.TYPE val) AND 16
- IF (.TYPE val) AND 4
- IFE val
- xor eax, eax
- ELSE
- mov eax, val
- ENDIF
- ELSE
- mov eax, val
- ENDIF
- ELSEIF val NE eax
- mov eax, val
- ENDIF
- ENDIF
- ELSEIF _@@rs?? EQ 6
- IF @WordSize EQ 4
- @@loc INSTR <val>,<|>
- IF @@loc
- arg1 SUBSTR <val>,1,@@loc-1
- arg2 SUBSTR <val>,@@loc+1
- IF (.TYPE arg2) AND (.TYPE arg1) AND 16
- IF arg2 EQ edx AND arg1 EQ ax
- xchg eax, edx
- ELSEIF arg2 EQ edx
- mov eax, edx
- ENDIF
- ENDIF
- IF ((.TYPE arg1) AND 4) EQ 4 AND (arg1 EQ 0)
- xor dx, dx
- ELSEIF ((.TYPE arg2) AND 16)
- IF arg1 NE dx AND arg1 NE ax
- mov dx, arg1
- ELSEIF arg1 EQ ax
- IFE ((.TYPE arg2) AND 16)
- mov dx, arg1
- ELSEIF arg2 NE edx
- mov dx, arg1
- ENDIF
- ENDIF
- ELSE
- mov dx, arg1
- ENDIF
- IF ((.TYPE arg2) AND 4) EQ 4
- IF arg2 EQ 0
- xor eax, eax
- ELSE
- mov eax, arg2
- ENDIF
- ELSEIF ((.TYPE arg2) AND 16)
- IF arg2 NE eax AND arg2 NE edx
- mov eax, arg2
- ENDIF
- ELSE
- mov eax, arg2
- ENDIF
- ELSEIF (.TYPE val) AND 4
- @@loc INSTR <val>,<:>
- IF @@loc
- mov dx, word ptr [4+val]
- mov eax, dword ptr [val]
- ELSE
- xor dx, dx
- IF val
- mov ax, val
- ELSE
- xor ax, ax
- ENDIF
- ENDIF
- ELSEIF (.TYPE val) AND 2
- @@loc INSTR <val>,<:>
- IFE @@loc
- mov dx, word ptr [4+offset ds:val]
- mov eax, dword ptr [offset ds:val]
- ELSE
- mov dx, word ptr [4+offset val]
- mov eax, dword ptr [offset val]
- ENDIF
- ELSE
- IF2
- ERR
- %OUT >> ERROR - Bad or missing data type for return value
- ENDIF
- ENDIF
- ELSE
- IFE (.TYPE val) AND 16
- IF (.TYPE val) AND 4
- IFE val
- xor eax, eax
- ELSE
- mov eax, val
- ENDIF
- ELSE
- mov eax, val
- ENDIF
- ELSEIF val NE eax
- mov eax, val
- ENDIF
- ENDIF
- ENDIF
- ELSEIF _@@rs??
- IF2
- DISPLAY ">> WARNING - function should return a value"
- ENDIF
- ENDIF
- ENDM
-
- _ENDFUNC MACRO name
- _@@use?? = 0
- IF _@@ra?? NE $
- RETURN NOTHING
- ENDIF
- IFB <name>
- ENDP
- ELSEIF _@@cf??
- _&name ENDP
- ELSE
- &name ENDP
- ENDIF
- ENDM
-
- DISP MACRO arg1, arg2
- IFB <arg2>
- DISPLAY "&arg1&"
- ELSE
- DISPLAY "&arg1& = &arg2&"
- ENDIF
- ENDM
-
-
- FLAG MACRO text
- IF2
- IFE (.TYPE _@@use??) AND 16
- %OUT &text&: no reg, no stack
- ELSEIF _@@needpop??
- IF _@@use?? EQ al
- %OUT &text&: reg AL, stack AX
- ELSEIF _@@use?? EQ ax
- %OUT &text&: reg AX, stack AX
- ELSEIF @WordSize EQ 4
- IF _@@use?? EQ eax
- %OUT &text&: reg EAX, stack EAX
- ELSE
- %OUT &text&: reg unknown, stack unknown
- _@@IM@
- ENDIF
- ELSE
- %OUT &text&: reg unknown, stack AX
- _@@IM@
- ENDIF
- ELSE
- IF _@@use?? EQ al
- %OUT &text&: reg AL, no stack
- ELSEIF _@@use?? EQ ah
- %OUT &text&: reg AH, no stack
- ELSEIF _@@use?? EQ bl
- %OUT &text&: reg BL, no stack
- ELSEIF _@@use?? EQ bh
- %OUT &text&: reg BH, no stack
- ELSEIF _@@use?? EQ cl
- %OUT &text&: reg CL, no stack
- ELSEIF _@@use?? EQ ch
- %OUT &text&: reg CH, no stack
- ELSEIF _@@use?? EQ dl
- %OUT &text&: reg DL, no stack
- ELSEIF _@@use?? EQ dh
- %OUT &text&: reg DH, no stack
- ELSEIF _@@use?? EQ ax
- %OUT &text&: reg AX, no stack
- ELSEIF _@@use?? EQ bx
- %OUT &text&: reg BX, no stack
- ELSEIF _@@use?? EQ cx
- %OUT &text&: reg CX, no stack
- ELSEIF _@@use?? EQ dx
- %OUT &text&: reg DX, no stack
- ELSEIF _@@use?? EQ si
- %OUT &text&: reg SI, no stack
- ELSEIF _@@use?? EQ di
- %OUT &text&: reg DI, no stack
- ELSEIF _@@use?? EQ bp
- %OUT &text&: reg BP, no stack
- ELSEIF @WordSize EQ 4
- IF _@@use?? EQ eax
- %OUT &text&: reg EAX, no stack
- ELSEIF _@@use?? EQ ebx
- %OUT &text&: reg EBX, no stack
- ELSEIF _@@use?? EQ ecx
- %OUT &text&: reg ECX, no stack
- ELSEIF _@@use?? EQ edx
- %OUT &text&: reg EDX, no stack
- ELSEIF _@@use?? EQ esi
- %OUT &text&: reg ESI, no stack
- ELSEIF _@@use?? EQ edi
- %OUT &text&: reg EDI, no stack
- ELSEIF _@@use?? EQ ebp
- %OUT &text&: reg EBP, no stack
- ELSE
- %OUT &text&: reg unknown, no stack
- _@@IM@
- ENDIF
- ELSE
- %OUT &text&: reg unknown, no stack
- _@@IM@
- ENDIF
- ENDIF
- ENDIF
- ENDM
-