home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / PASCAL / MTASK211 / SM86.INC < prev    next >
Text File  |  1991-02-15  |  14KB  |  729 lines

  1. ;; SM86 Structured Macros V1.1
  2. ;; Joe Moldovan, Sydney Australia
  3. ;; Copyright (c) 1988-91
  4.  
  5.     .xlist
  6.  
  7. ifdef    ??version
  8.     %noincl
  9.     masm51
  10.     quirks
  11.     nowarn    res
  12. endif
  13.  
  14. .xcref    ??sp,??lb,??sh,??mv,??sc,??st,??il,??lf,??tf,??ty,??tx,??tm,??tn,??fy,??fx,??nf,??uw,??wb
  15. .xcref    .not,.flag1,.flag2,.floop,.flagc,.flagb,.fbot,.tfor,.tif,.twh,.tdo,.tsw,.tbrk,.tcon
  16. .xcref    jnna,jnnae,jnnb,jnnbe,jnnc,jnne,jnng,jnnge,jnnl,jnnle,jnno,jnnp,jnns,jnnz,jnpe,jnpo,jnin,jnnotin,jin,jnotin
  17. .xcref    _emit,_push,_pop,_bug,_nextl,_continue,_break,_jmpc,_scans
  18. .xcref    .sm86,.long,.forc,.for,.break,.continue,.if,.,.else,.while,.do,.loop,.switch,.case,.default,.end,.endsm86
  19.  
  20. if1
  21.  
  22. ifdef    ??version
  23.     %out    **** Assembling under TASM ****
  24. else
  25.     %out    **** Assembling under MASM ****
  26. endif
  27.  
  28. .sm86    macro    $1,$2
  29.     .sfcond
  30.     .sall
  31.  
  32.     ??sp    =    0    ;; Stack pointer
  33.     ??lb    =    0    ;; Current label number
  34.     ??sh    =    0    ;; Temporary stack pointer storage
  35.     ??mv    =    0    ;; Multiple argument counter for .CASE and .DO
  36.     ??sc    =    0    ;; Structure construct flag for the "." macro
  37.     ??st    =    0    ;; Structure type flag for the "." macro
  38.     ??il    =    0    ;; Label value for the "." macro
  39.     ??lf    =    0    ;; Long jump flag
  40.     ??nf    =    0    ;; NOT condition active flag
  41.     ??wb    =    0    ;; While break label flag
  42.     ??ty    =    0    ;; Temporary type storage
  43.     ??tx    =    0    ;; Temporary type storage
  44.     ??tm    =    0    ;; Temporary value storage
  45.     ??tn    =    0    ;; Temporary value storage
  46.     ??fy    =    0    ;; Temporary flag storage
  47.     ??fx    =    0    ;; Temporary flag storage
  48.     ??tf    =    0    ;; Temporary flag storage
  49.  
  50.     ??uw    EQU    < >    ;; .if unwind macro
  51.  
  52.     .not    =    1
  53.     .flag1    =    1
  54.     .flag2    =    2
  55.     .floop    =    4
  56.     .flagc    =    8
  57.     .flagb    =    10h
  58.     .fbot    =    .floop or .flagb
  59.     .tfor    =    1
  60.     .tif    =    2
  61.     .twh    =    3
  62.     .tdo    =    4
  63.     .tsw    =    5
  64.     .tbrk    =    6
  65.     .tcon    =    7
  66.  
  67. jnna    macro    $3
  68.     ja    $3
  69. endm
  70. jnnae    macro    $3
  71.     jae    $3
  72. endm
  73. jnnb    macro    $3
  74.     jb    $3
  75. endm
  76. jnnbe    macro    $3
  77.     jbe    $3
  78. endm
  79. jnnc    macro    $3
  80.     jc    $3
  81. endm
  82. jnne    macro    $3
  83.     je    $3
  84. endm
  85. jnng    macro    $3
  86.     jg    $3
  87. endm
  88. jnnge    macro    $3
  89.     jge    $3
  90. endm
  91. jnnl    macro    $3
  92.     jl    $3
  93. endm
  94. jnnle    macro    $3
  95.     jle    $3
  96. endm
  97. jnno    macro    $3
  98.     jo    $3
  99. endm
  100. jnnp    macro    $3
  101.     jp    $3
  102. endm
  103. jnns    macro    $3
  104.     js    $3
  105. endm
  106. jnnz    macro    $3
  107.     jz    $3
  108. endm
  109. jnpe    macro    $3
  110.     jpo    $3
  111. endm
  112. jnpo    macro    $3
  113.     jpe    $3
  114. endm
  115. jnin    macro    $3
  116.     je    $3
  117. endm
  118. jnnotin    macro    $3
  119.     jne    $3
  120. endm
  121. jin    macro    $3
  122.     jne    $3
  123. endm
  124. jnotin    macro    $3
  125.     je    $3
  126. endm
  127.  
  128.     ifidn    <$1>,<LIST>
  129.         .xall
  130.     elseifidn    <$1>,<DEBUG>
  131.         .lall
  132.         ifidn    <$2>,<ALL>
  133.             .lfcond
  134.         endif
  135.     endif
  136. endm
  137.  
  138. _emit    macro    $1,$2,$3
  139.     $1&$2&$3
  140. endm
  141.  
  142. _push    macro    $1,$2,$3,$4,$5
  143.     ifb    <$5>
  144.         ??sp    =    ??sp + 1
  145.         _push    $1,$2,$3,<$4>,%??sp
  146.         exitm
  147.     endif
  148.     ifnb    <$4>
  149.         ??m&$5    macro    $6
  150.             $4 $6
  151.         endm
  152.     endif
  153.     ??d&$5    =    $1
  154.     ??f&$5    =    $2 or ($3 shl 8)
  155. endm
  156.  
  157. _pop    macro    $1,$2,$3,$4,$5
  158.     ifb    <$5>
  159.         _pop    $1,$2,$3,$4,%??sp
  160.         ??sp    =    ??sp - 1
  161.         exitm
  162.     endif
  163.     ife    $5
  164.         _bug    <Stack underflow at %??lb>
  165.     endif
  166.     $1    =    ??d&$5
  167.     $2    =    ??f&$5 and 00ffh
  168.     $3    =    ??f&$5 shr 8
  169.     ifnb    <$4>
  170.         if    $2 ne $4
  171.             _bug    <Invalid nesting at %??lb>
  172.         endif
  173.     endif
  174. endm
  175.  
  176. _bug    macro    $1
  177.     %out    sm86 says: $1
  178. endm
  179.  
  180. _nextl    macro
  181.     ??lb    =    ??lb + 1
  182. endm
  183.  
  184. _continue    macro    $1,$2
  185.     if    $2 and .flagc
  186.         ??cn&$1&:
  187.     endif
  188. endm
  189.  
  190. _break    macro    $1,$2
  191.     if    $2 and .flagb
  192.         ??if&$1&:
  193.     endif
  194. endm
  195.  
  196. _jmpc    macro    $1,$2,$3
  197.     ife    ??lf
  198.         ife    ($3 xor ??nf)
  199.             J&$1    $2
  200.         else
  201.             JN&$1    $2
  202.         endif
  203.     else
  204.         ife    ($3 xor ??nf)
  205.             JN&$1    $+5
  206.         else
  207.             J&$1    $+5
  208.         endif
  209.         jmp    $2
  210.     endif
  211.     ??nf    =    0
  212. endm
  213.  
  214. _scans    macro    $1,$2,$3
  215.     ifb    <$3>
  216.         ??sh    =    ??sp
  217.     else
  218.         if    (??f&$3 shr 8) and .floop
  219.             ??f&$3    =    ??f&$3 or ($2 shl 8) or (.flagb shl 8)
  220.             $1    =    ??d&$3
  221.             exitm
  222.         else
  223.             ??sh    =    ??sh - 1
  224.             ife    ??sh
  225.                 _bug    <.break or .continue not in loop at %??lb>
  226.                 exitm
  227.             endif
  228.         endif
  229.     endif
  230.     _scans    $1,$2,%??sh
  231. endm
  232.  
  233. .long    macro    $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17
  234.     ??lf    =    1
  235.     ifdif    <$1>,<.>
  236.         .&$1    <$2>,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>,<$17>
  237.     else
  238.         .    <$2>,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>,<$17>
  239.     endif
  240.     ??lf    =    0
  241. endm
  242.  
  243. .forc    macro    $1,$2,$3
  244.     $1
  245.  
  246.     _emit    ??it%??lb,:
  247.     ??tf    =    0
  248.  
  249.     ifnb    <$2>
  250.         ??tf    =    .fbot
  251.     endif
  252.  
  253.     ifnb    <$3>
  254.         _push    ??lb,.tfor,??tf,<$3>
  255.     else
  256.         _push    ??lb,.tfor,%(??tf or .flag1)
  257.     endif
  258.  
  259.     ifb    <$2>
  260.         _nextl
  261.     else
  262.         ??st    =    .tfor
  263.         ??il    =    ??lb
  264.         .    $2
  265.     endif
  266. endm
  267.  
  268. .for    macro    $1,$2,$3,$4,$5,$6,$7
  269.     ??ty    =    0
  270.  
  271.     ifdif    <$2>,<:=>
  272.         ??ty    =    1
  273.     elseifdif    <$4>,<to>
  274.         ifdif    <$4>,<downto>
  275.             ??ty    =    1
  276.         endif
  277.     elseifnb    <$6>
  278.         ifdif    <$6>,<by>
  279.             ??ty    =    1
  280.         endif
  281.     endif
  282.  
  283.     if    ??ty
  284.         _bug    <Invalid keyword in .for at %??lb>
  285.     endif
  286.  
  287.     if    ((((.type $1) and 10h) ne 0) and (((.type $3) and 04h) ne 0))
  288.         ife    $3
  289.             xor    $1,$1
  290.         else
  291.             mov    $1,$3
  292.         endif
  293.     else
  294.         mov    $1,$3
  295.     endif
  296.  
  297.     _emit    ??it%??lb,:
  298.     cmp    $1,$5
  299.  
  300.     ifidn    <$4>,<to>
  301.         _jmpc    A,??if%??lb,0
  302.     else
  303.         _jmpc    B,??if%??lb,0
  304.     endif
  305.  
  306.     ifb    <$6>
  307.         ifidn    <$4>,<to>
  308.             _push    ??lb,.tfor,.fbot,<inc    $1>
  309.         else
  310.             _push    ??lb,.tfor,.fbot,<dec    $1>
  311.         endif
  312.     elseif    ((.type $7) and 04h)
  313.         if    ($7 eq 1)
  314.             ifidn    <$4>,<to>
  315.                 _push    ??lb,.tfor,.fbot,<inc    $1>
  316.             else
  317.                 _push    ??lb,.tfor,.fbot,<dec    $1>
  318.             endif
  319.         elseifidn    <$4>,<to>
  320.             _push    ??lb,.tfor,.fbot,<add    $1,$7>
  321.         else
  322.             _push    ??lb,.tfor,.fbot,<sub    $1,$7>
  323.         endif
  324.     elseifidn    <$4>,<to>
  325.         _push    ??lb,.tfor,.fbot,<add    $1,$7>
  326.     else
  327.         _push    ??lb,.tfor,.fbot,<sub    $1,$7>
  328.     endif
  329.  
  330.     _nextl
  331. endm
  332.  
  333. .break    macro    $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16
  334.     _scans    ??il,0
  335.  
  336.     ifb    <$1>
  337.         ife    ??lf
  338.             _emit    <jmp    short ??if%??il>
  339.         else
  340.             _emit    <jmp    ??if%??il>
  341.         endif
  342.     else
  343.         ??st    =    .tbrk
  344.         .    <$2>,$3,<$4>,$5,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  345.     endif
  346. endm
  347.  
  348. .continue    macro    $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16
  349.     _scans    ??il,.flagc
  350.     ifb    <$1>
  351.         ife    ??lf
  352.             _emit    <jmp    short ??cn%??il>
  353.         else
  354.             _emit    <jmp    ??cn%??il>
  355.         endif
  356.     else
  357.         ??st    =    .tcon
  358.         .    <$2>,$3,<$4>,$5,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  359.     endif
  360. endm
  361.  
  362. .if    macro    $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16
  363.     ??st    =    .tif
  364.     _push    ??lb,.tif,.flagb
  365.     ??il    =    ??lb
  366.     .    <$1>,$2,<$3>,$4,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  367. endm
  368.  
  369. .    macro    $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16
  370.     ifb    <$1>
  371.         exitm
  372.     endif
  373.  
  374.     ifidn    <$1>,<}>
  375. %        .    #STATUS,??uw,<$2>,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  376.         exitm
  377.     elseifidn    <$1>,<TRUE>
  378.         .    #STATUS,NE,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  379.         exitm
  380.     elseifidn    <$1>,<FALSE>
  381.         .    #STATUS,E,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  382.         exitm
  383.     elseifidn    <$1>,<NOT>
  384.         ??nf    =    1
  385.         .    <$2>,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  386.         exitm
  387.     elseifidn    <$1>,<CARRY>
  388.         .    #STATUS,C,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  389.         exitm
  390.     elseifidn    <$1>,<NOCARRY>
  391.         .    #STATUS,NC,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  392.         exitm
  393.     elseifidn    <$1>,<OVERFLOW>
  394.         .    #STATUS,O,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  395.         exitm
  396.     elseifidn    <$1>,<NOVERFLOW>
  397.         .    #STATUS,NO,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  398.         exitm
  399.     elseifidn    <$1>,<PARITY>
  400.         .    #STATUS,P,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  401.         exitm
  402.     elseifidn    <$1>,<NOPARITY>
  403.         .    #STATUS,NP,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  404.         exitm
  405.     elseifidn    <$1>,<NEGATIVE>
  406.         .    #STATUS,S,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  407.         exitm
  408.     elseifidn    <$1>,<POSITIVE>
  409.         .    #STATUS,NS,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  410.         exitm
  411.     elseifidn    <$2>,<TRUE>
  412.         .    <$1>,NE,0,$3,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  413.         exitm
  414.     elseifidn    <$2>,<FALSE>
  415.         .    <$1>,E,0,$3,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  416.         exitm
  417.     elseifidn    <$2>,<ON>
  418.         .    <$1>,NE,0,$3,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  419.         exitm
  420.     elseifidn    <$2>,<OFF>
  421.         .    <$1>,E,0,$3,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  422.         exitm
  423.     elseifidn    <$2>,<NOT>
  424.         .    <$1>,NE,$3,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  425.         exitm
  426.     elseifidn    <$2>,<==>
  427.         .    <$1>,E,$3,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  428.         exitm
  429.     elseifidn    <$2>,<|=>
  430.         .    <$1>,NE,$3,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  431.         exitm
  432.     elseifidn    <$2>,<AND>
  433.         .    <$1>,NE,0,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  434.         exitm
  435.     elseifidn    <$2>,<OR>
  436.         .    <$1>,NE,0,$2,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  437.         exitm
  438.     elseifb        <$2>
  439.         .    <$1>,NE,0
  440.         exitm
  441.     endif
  442.  
  443.     ifdif    <$1>,<#STATUS>
  444.         ifdif    <$2>,<IN>
  445.             ifdif    <$2>,<NOTIN>
  446.                 if    ((.type $1) and 10h) ne 0
  447.                     ifb    <$3>
  448.                         or    $1,$1
  449.                     elseif ((.type $3) and 04h) ne 0
  450.                         ife    $3
  451.                             or    $1,$1
  452.                         else
  453.                             cmp    $1,$3
  454.                         endif
  455.                     else
  456.                         cmp    $1,$3
  457.                     endif
  458.                 else
  459.                     cmp    $1,$3
  460.                 endif
  461.             else
  462.                 test    $3,$1
  463.             endif
  464.         else
  465.             test    $3,$1
  466.         endif
  467.     else
  468.         ifnb    <$3>
  469.             .    #STATUS,$2,,$3,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  470.             exitm
  471.         endif
  472.     endif
  473.  
  474.     ifidn    <$4>,<AND>
  475.         if    (??st eq .tif) or (??st eq .twh) or (??st eq .tdo) or (??st eq .tfor)
  476.             _jmpc    $2,??if%??il,.not
  477.             ??wb    =    .flagb
  478.             .    <$5>,$6,<$7>,$8,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  479.             exitm
  480.         elseif    ??st eq .tbrk
  481.             _jmpc    $2,??bk%??lb,.not
  482.             ??sc    =    .flag2
  483.             .    <$5>,$6,<$7>,$8,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  484.             exitm
  485.         elseif    ??st eq .tcon
  486.             _jmpc    $2,??co%??lb,.not
  487.             ??sc    =    .flag2
  488.         endif
  489.     elseifidn    <$4>,<OR>
  490.         if    (??st eq .tif) or (??st eq .twh) or (??st eq .tdo)
  491.             _jmpc    $2,??it%??il,0
  492.             ??sc    =    .flag1
  493.         elseif    ??st eq .tbrk
  494.             _jmpc    $2,??if%??il,0
  495.         elseif    ??st eq .tcon
  496.             _jmpc    $2,??cn%??il,0
  497.         elseif    ??st eq .tfor
  498.             _jmpc    $2,??lp%??lb,0
  499.             ??sc    =    .flag1
  500.         endif
  501.     elseifidn    <$4>,<{>
  502.         ??uw equ <$2>
  503.         exitm
  504.     else
  505.         if    (??st eq .tif) or (??st eq .twh)
  506.             _jmpc    $2,??if%??il,.not
  507.             if    ??sc
  508.                 _emit    ??it%??il,:
  509.             endif
  510.             _nextl
  511.         elseif    ??st eq .tdo
  512.             _jmpc    $2,??it%??il,0
  513.             _break    %??il,%??wb
  514.             ??wb    =    0
  515.         elseif    ??st eq .tbrk
  516.             _jmpc    $2,??if%??il,0
  517.             if    ??sc
  518.                 _emit    ??bk%??lb,:
  519.             endif
  520.             _nextl
  521.         elseif    ??st eq .tcon
  522.             _jmpc    $2,??cn%??il,0
  523.             if    ??sc
  524.                 _emit    ??co%??lb,:
  525.             endif
  526.             _nextl
  527.         elseif    ??st eq .tfor
  528.             _jmpc    $2,??if%??lb,.not
  529.             if    ??sc eq .flag1
  530.                 _emit    ??lp%??lb,:
  531.             endif
  532.             _nextl
  533.         endif
  534.  
  535.         ??st    =    0
  536.         ??sc    =    0
  537.     endif
  538.  
  539.     .    <$5>,$6,<$7>,$8,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  540. endm
  541.  
  542. .else    macro     $1
  543.     _pop    ??tm,??ty,??fy,.tif
  544.     _push    ??tm,??ty,%(.flag1 or .flagb)
  545.  
  546.     ife    ??lf
  547.         _emit    <jmp    short ??ie%??tm>
  548.     else
  549.         _emit    <jmp    ??ie%??tm>
  550.     endif
  551.  
  552.     _emit    ??if%??tm,:
  553. endm
  554.  
  555. .while    macro    $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16
  556.     if    ??sp
  557.         _pop    ??il,??ty,??wb
  558.         if ??ty eq .tdo
  559.             _continue    %??il,%??wb
  560.             ??st    =    .tdo
  561.             .    <$1>,$2,<$3>,$4,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  562.             exitm
  563.         endif
  564.         _push    ??il,??ty,??wb
  565.     endif
  566.  
  567.     _emit    ??cn%??lb,:
  568.  
  569.     ??st    =    .twh
  570.     ??il    =    ??lb
  571.  
  572.     _push    ??lb,.twh,.fbot
  573.     ifnb    <$1>
  574.         .    <$1>,$2,<$3>,$4,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  575.     else
  576.         _nextl
  577.     endif
  578. endm
  579.  
  580. .do    macro    $1,$2,$3
  581.     ife    ??mv
  582.         ??fx    =    .floop
  583.         ??mv    =    .flag1
  584.     endif
  585.  
  586.     ifnb    <$1>
  587.         ifidn    <$1>,<SAVE>
  588.             push    cx
  589.             ??fx    =    ??fx or .flag1
  590.         elseifidn    <$1>,<NZ>
  591.             ??fx    =    ??fx or .flagb
  592.         else
  593.             mov    cx,$1
  594.         endif
  595.  
  596.         .do    $2,$3
  597.         exitm
  598.     endif
  599.  
  600.     if    ??fx and .flagb
  601.         _emit    <jcxz    ??if%??lb>
  602.     endif
  603.  
  604.     _push    ??lb,.tdo,??fx
  605.     _emit    ??it%??lb,:
  606.     _nextl
  607.     ??mv    =    0
  608.     endm
  609.  
  610. .loop    macro    $1
  611.     _pop    ??tm,??ty,??fy,.tdo
  612.     _continue    %??tm,%??fy
  613.     _emit    <LOOP&$1    ??it%??tm>
  614.     _break    %??tm,%??fy
  615.  
  616.     if    ??fy and .flag1
  617.         pop    cx
  618.     endif
  619. endm
  620.  
  621. .switch    macro    $1
  622.     if ((.type $1) and 04h)
  623.         _bug <Constant selector in .switch at %??lb>
  624.     endif
  625.     _push    ??lb,.tsw,.floop
  626.     _push    ??lb,.tsw,0,<cmp    $1,>
  627. endm
  628.  
  629. .case    macro    $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16
  630.     ifb    <$1>
  631.         if    ??mv gt 1
  632.             _emit    ??ct%??lb,:
  633.         endif
  634.  
  635.         ??mv    =    0
  636.         _nextl
  637.         exitm
  638.     endif
  639.  
  640.     ife    ??mv
  641.         _pop    ??tm,??ty,??fy,.tsw
  642.         if    ??fy and .flag1
  643.             _emit    ??cf%??tm,:
  644.         endif
  645.         _push    ??lb,.tsw,.flag1
  646.     endif
  647.  
  648.     ??mv    =    ??mv + 1
  649.     _emit    ??m%??sp,<<$1>>
  650.  
  651.     ifidn    <$2>,<->
  652.         ifb    <$4>
  653.             _jmpc    L,??cf%??lb,0
  654.             _emit    ??m%??sp,<<$3>>
  655.             _jmpc    G,??cf%??lb,0
  656.         else
  657.             _jmpc    L,??cc%((??lb * 10) + ??mv),0
  658.             _emit    ??m%??sp,<<$3>>
  659.             _jmpc    L,??ct%??lb,0
  660.             _emit    ??cc%((??lb * 10) + ??mv),:
  661.         endif
  662.  
  663.         .case    <$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  664.     else
  665.         ifnb    <$2>
  666.             _jmpc    E,??ct%??lb,0
  667.         else
  668.             _jmpc    NE,??cf%??lb,0
  669.         endif
  670.  
  671.         ife ((.type $1) and 04h)
  672.             _bug <Variable .case value at %??lb>
  673.         endif
  674.  
  675.         .case    <$2>,<$3>,<$4>,<$5>,<$6>,<$7>,<$8>,<$9>,<$10>,<$11>,<$12>,<$13>,<$14>,<$15>,<$16>
  676.     endif
  677. endm
  678.  
  679. .default    macro
  680.     _pop    ??tm,??ty,??fy,.tsw
  681.     if    ??fy and .flag1
  682.         _emit    ??cf%??tm,:
  683.     endif
  684.  
  685.     _push    ??tm,.tsw,.flag2
  686. endm
  687.  
  688. .endsm86    macro
  689.     if    ??sp
  690.         _bug    <Incomplete nesting at end>
  691.     endif
  692. endm
  693.  
  694. .end    macro    $1
  695.     _pop    ??tm,??ty,??fy
  696.  
  697.     if    ??ty eq .tfor
  698.         _continue    %??tm,%??fy
  699.         ife    ??fy and .flag1
  700.             _emit    ??m%(??sp + 1)
  701.         endif
  702.         _emit    <jmp    ??it%??tm>
  703.     elseif    ??ty eq .tsw
  704.         ife    ??fy and .flag2
  705.             _emit    ??cf%??tm,:
  706.         endif
  707.         _pop    ??tm,??ty,??fy,.tsw
  708.     elseif    ??ty eq .twh
  709.         _emit    <jmp    ??cn%??tm>
  710.     elseif    ??ty eq .tif
  711.         if    ??fy and .flag1
  712.             _emit    ??ie%??tm,:
  713.             exitm
  714.         endif
  715.     endif
  716.  
  717.     _break    %??tm,%??fy
  718. endm
  719.  
  720. endif
  721.  
  722. ifdef    ??version
  723.     warn
  724.     %incl
  725. endif
  726.  
  727.     .list
  728.  
  729.