home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / jsage / znode3 / asm / m80str11.lbr / STRUCT.MZC / STRUCT.MAC
Encoding:
Text File  |  1993-06-08  |  5.1 KB  |  235 lines

  1.         .Z80
  2.  
  3. ;       struct.mac      v1.10       1/20/88
  4.  
  5.         .XLIST
  6.  
  7. ;       this macro library implements some basic structured programming
  8. ;       constructs for the Microsoft M80 assembler. it was tested using
  9. ;       version 3.44 (dated 09-DEC-81 in its output listings).
  10.  
  11. ;       some initialization
  12. @iflvl  aset    0
  13. @brlvl  aset    0
  14. @caslvl aset    0
  15.  
  16. ;       "inner" macro definitions
  17.  
  18. ;       macro for versatile symbol value assignment
  19. @getput macro   symbol,val
  20. symbol  aset    val
  21.         endm
  22.  
  23. ;       push a value onto a virtual assembler stack.
  24. @push   macro   stk,val
  25.         .ifndf  stk,0
  26.         if      stk eq 0ffffh
  27. +++++++ @push_overflow stk
  28.         else
  29. stk     aset    stk+1
  30.         @getput stk%stk,val
  31.         endif
  32.         endm
  33.  
  34. ;       pop a value from a virtual assembler stack.
  35. @pop    macro   stk,symbol
  36.         .ifndf  stk,0
  37.         if      stk eq 0
  38. +++++++ @pop_underflow stk
  39.         else
  40.         @getput symbol,stk%stk
  41. stk     aset    stk-1
  42.         endif
  43.         endm
  44.  
  45. ;       perform a jump to a generated label
  46. @jump   macro   a1,a2
  47.         if      nul a2
  48.         jp      a1
  49.         else
  50.         jp      a1,a2
  51.         endif
  52.         endm
  53.  
  54. ;       perform a jump to a label with inverse condition
  55. @ijump  macro   a1,a2,a3
  56.         if      nul a2
  57.         jp      a1&a3
  58.         exitm
  59.         endif
  60.         ifidn   <a1>,<nz>
  61.         jp      z,a2&a3
  62.         exitm
  63.         endif
  64.         ifidn   <a1>,<z>
  65.         jp      nz,a2&a3
  66.         exitm
  67.         endif
  68.         ifidn   <a1>,<nc>
  69.         jp      c,a2&a3
  70.         exitm
  71.         endif
  72.         ifidn   <a1>,<c>
  73.         jp      nc,a2&a3
  74.         exitm
  75.         endif
  76.         ifidn   <a1>,<po>
  77.         jp      pe,a2&a3
  78.         exitm
  79.         endif
  80.         ifidn   <a1>,<pe>
  81.         jp      po,a2&a3
  82.         exitm
  83.         endif
  84.         ifidn   <a1>,<p>
  85.         jp      m,a2&a3
  86.         exitm
  87.         endif
  88.         ifidn   <a1>,<m>
  89.         jp      p,a2&a3
  90.         endif
  91.         endm
  92.  
  93. ;       conditional label generator
  94. @lbl    macro   a1,a2,a3
  95.         if      nul a2
  96. a1&a3:
  97.         else
  98.         if1
  99.         ifndef  a1
  100. a1&a3:
  101.         else
  102. a2&a3:
  103.         endif
  104.         else
  105.         ifndef  a2
  106. a1&a3:
  107.         else
  108. a2&a3:
  109.         endif
  110.         endif
  111.         endif
  112.         endm
  113.  
  114. ;       "in-line" macro definitions
  115.  
  116. ;       conditional symbol definition macro
  117. .ifndf  macro   var,val
  118.         ifndef  var
  119. var     aset    val
  120.         endif
  121.         endm
  122.  
  123. ;       generate code for beginning of ".if" statement.
  124. .if     macro   cond
  125.         if      nul cond
  126. +++++++ if_condition_not_specified
  127.         else
  128.         @push   @if,@iflvl
  129.         @ijump  cond,@ei1%@iflvl
  130. @iflvl  aset    @iflvl+1
  131.         endif
  132.         endm
  133.  
  134. ;       generate code for ".else" clause of ".if".
  135. .else   macro
  136.         @pop    @if,@gp
  137.         @push   @if,@gp
  138.         @ijump  @ei2%@gp
  139.         @lbl    @ei1%@gp
  140.         endm
  141.  
  142. ;       generate code for ".endif" clause of ".if".
  143. .endif  macro
  144.         @pop    @if,@gp
  145.         @lbl    @ei1%@gp,@ei2%@gp
  146.         endm
  147.  
  148. ;       generate code to begin ".do" while statement
  149. .do     macro
  150.         @push   @br,@brlvl
  151.         @lbl    @ibr%@brlvl
  152. @brlvl  aset    @brlvl+1
  153.         endm
  154.  
  155. ;       generate beginning of body of ".while" loop
  156. .while  macro   cond
  157.         if      nul cond
  158. +++++++ while_condition_not_specified
  159.         else
  160.         @pop    @br,@gp
  161.         @push   @br,@gp
  162.         @ijump  cond,@ebr%@gp
  163.         endif
  164.         endm
  165.  
  166. ;       generate code for ".until" termination of do loop
  167. .until  macro   cond
  168.         if      nul cond
  169. +++++++ until_condition_not_specified
  170.         else
  171.         @pop    @br,@gp
  172.         @ijump  cond,@ibr%@gp
  173.         @lbl    @ebr%@gp
  174.         endif
  175.         endm
  176.  
  177. ;       generate code for ".enddo" termination of do loop
  178. .enddo  macro
  179.         @pop    @br,@gp
  180.         @ijump  @ibr%@gp
  181.         @lbl    @ebr%@gp
  182.         endm
  183.  
  184. ;       generate code to start a ".switch" construct
  185. .switch macro
  186.         @push   @br,@brlvl
  187. @brlvl  aset    @brlvl+1
  188.         @push   @case,@caslvl
  189. @caslvl aset    @caslvl+1
  190.         endm
  191.  
  192. ;       generate code to start each ".case"
  193. .case   macro
  194.         @pop    @br,@gp
  195.         @push   @br,@gp
  196.         @lbl    @cas%@gp,,%@caslvl
  197. @caslvl aset    @caslvl+1
  198.         endm
  199.  
  200. ;       generate code for ".cond" conditional branch for ".case"
  201. .cond   macro   cond
  202.         if      nul cond
  203. +++++++ cond_condition_not_specified
  204.         else
  205.         @pop    @br,@gp
  206.         @push   @br,@gp
  207.         @ijump  cond,@cas%@gp,%@caslvl
  208.         endif
  209.         endm
  210.  
  211. ;       generate code for ".otherwise"
  212. .otherwise  macro
  213.         .case
  214.         endm
  215.  
  216. ;       generate code for ".endsw"
  217. .endsw  macro
  218.         @pop    @br,@gp
  219.         @lbl    @ebr%@gp
  220.         @pop    @case,@caslvl
  221.         endm
  222.  
  223. ;       generate code for ".break" termination
  224. .break  macro   cond
  225.         @pop    @br,@gp
  226.         @push   @br,@gp
  227.         if      nul cond
  228.         @jump   @ebr%@gp
  229.         else
  230.         @jump   cond,@ebr%@gp
  231.         endif
  232.         endm
  233.  
  234.         .LIST
  235.