home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / asmutil / struca86.zip / STRUCA86.ASM next >
Assembly Source File  |  1989-12-29  |  13KB  |  622 lines

  1. _if            equ     0
  2. _else          equ     1
  3. _case          equ     2
  4. _when          equ     3
  5. _otherwise     equ     4
  6. _loop          equ     5
  7. _repeat        equ     6
  8. _do            equ     7
  9. _while         equ     8
  10. _package       equ     9
  11. _procedure     equ     10
  12. _task          equ     11
  13. _begin         equ     12
  14. _exit          equ     13
  15. _declare       equ     14
  16. _table         equ     15
  17. _byte          equ     1
  18. _int           equ     2
  19. _dint          equ     4
  20. _byte_type     equ     BYTE
  21. _int_type      equ     WORD
  22. _dint_type     equ     DWORD
  23. ZERO            equ     0
  24. NOT_ZERO        equ     NOT(ZERO)
  25. CARRY           equ     1
  26. NO_CARRY        equ     2
  27. PLUS            equ     3
  28. MINUS           equ     4
  29. PARITY_EVEN     equ     5
  30. PARITY_ODD      equ     6
  31. ABOVE           equ     7
  32. ABOVE_OR_EQUAL  equ     8
  33. BELOW_OR_EQUAL  equ     9
  34. BELOW           equ     10
  35. GREATER_THAN    equ     11
  36. GREATER_OR_EQUAL        equ     12
  37. LESS_OR_EQUAL   equ     13
  38. LESS_THAN       equ     14
  39. _JMP           equ     15
  40. _JNE           equ     16
  41. OVERFLOW        equ     17
  42. NO_OVERFLOW     equ     18
  43. EQUAL           equ     ZERO
  44. NOT_EQUAL       equ     NOT_ZERO
  45. FALSE           equ     ZERO
  46. TRUE            equ     NOT_ZERO
  47. _IFCNT          =       0
  48. _CASECNT        =       0
  49. _WHENCNT        =       0
  50. _LOOPCNT        =       0
  51. _REPEATCNT      =       0
  52. _DOCNT          =       0
  53. _PROCCNT        =       0
  54. _TASKCNT        =       0
  55. _BEGINCNT       =       0
  56. _PACKCNT        =       0
  57. _CURIF          =       0
  58. _CURCASE        =       0
  59. _CURLOOP        =       0
  60. _CURREPEAT      =       0
  61. _CURDO          =       0
  62. _VAR_OFFSET     =       0
  63. _SP             =       0
  64.  
  65.  
  66. _MAKEJP         MACRO
  67.         ##IF (#1 EQ _JMP)
  68.            JMP #2
  69.            #EX
  70.         ##ENDIF
  71.         ##IF (#1 EQ _JNE)
  72.            JNE #2
  73.            #EX
  74.         ##ENDIF
  75.         ##IF (#1 EQ ZERO)
  76.            JNZ #2
  77.            #EX
  78.         ##ENDIF
  79.         ##IF (#1 EQ NOT_ZERO)
  80.            JZ #2
  81.            #EX
  82.         ##ENDIF
  83.         ##IF (#1 EQ CARRY)
  84.            JNC #2
  85.            #EX
  86.         ##ENDIF
  87.         ##IF (#1 EQ NO_CARRY)
  88.            JC #2
  89.            #EX
  90.         ##ENDIF
  91.         ##IF (#1 EQ PLUS)
  92.            JS #2
  93.            #EX
  94.         ##ENDIF
  95.         ##IF (#1 EQ MINUS)
  96.            JNS #2
  97.            #EX
  98.         ##ENDIF
  99.         ##IF (#1 EQ PARITY_EVEN)
  100.            JPO #2
  101.            #EX
  102.         ##ENDIF
  103.         ##IF (#1 EQ PARITY_ODD)
  104.            JPE #2
  105.            #EX
  106.         ##ENDIF
  107.         ##IF (#1 EQ OVERFLOW)
  108.            JNO #2
  109.            #EX
  110.         ##ENDIF
  111.         ##IF (#1 EQ NO_OVERFLOW)
  112.            JO #2
  113.            #EX
  114.         ##ENDIF
  115.         ##IF (#1 EQ ABOVE)
  116.            JNA #2
  117.            #EX
  118.         ##ENDIF
  119.         ##IF (#1 EQ ABOVE_OR_EQUAL)
  120.            JNAE #2
  121.            #EX
  122.         ##ENDIF
  123.         ##IF (#1 EQ BELOW_OR_EQUAL)
  124.            JNBE #2
  125.            #EX
  126.         ##ENDIF
  127.         ##IF (#1 EQ BELOW)
  128.            JNB #2
  129.            #EX
  130.         ##ENDIF
  131.         ##IF (#1 EQ GREATER_THAN)
  132.            JNG #2
  133.            #EX
  134.         ##ENDIF
  135.         ##IF (#1 EQ GREATER_OR_EQUAL)
  136.            JNGE #2
  137.            #EX
  138.         ##ENDIF
  139.         ##IF (#1 EQ LESS_OR_EQUAL)
  140.            JNLE #2
  141.            #EX
  142.         ##ENDIF
  143.         ##IF (#1 EQ LESS_THAN)
  144.            JNL #2
  145.            #EX
  146.         ##ENDIF
  147.         #EM
  148.  
  149.  
  150. _GENLAB         MACRO
  151. #1#V2:
  152.         #EM
  153.  
  154.  
  155. _GENINST        MACRO
  156.                 _MAKEJP #1,#2#V3
  157.         #EM
  158.  
  159.  
  160. _GENWLAB        MACRO
  161. _WHEN#V1_#V2:
  162.         #EM
  163.  
  164.  
  165. _GENCLAB        MACRO
  166. _CASE#V1:
  167.         #EM
  168.  
  169.  
  170.  
  171. _GENWINST       MACRO
  172.         _MAKEJP #1,_WHEN#V2_#V3
  173.         #EM
  174.  
  175.  
  176. _STORE          MACRO
  177. #1#V2           =      #3
  178.         #EM
  179.  
  180.  
  181. _LOAD           MACRO
  182. #1              =      #2#V3
  183.         #EM
  184.  
  185.  
  186. _PUSH           MACRO
  187. _SP             =       _SP + 1
  188.         _STORE _STACK,_SP,#1
  189.         #EM
  190.  
  191. _POP            MACRO
  192.         ##IF (_SP EQ 0)
  193.         #EX
  194.         ##ENDIF
  195.         _LOAD #1,_STACK,_SP
  196. _SP             =       _SP - 1
  197.         #EM
  198.  
  199.  
  200. IF_             MACRO
  201.         _PUSH   _CURIF
  202. _IFCNT          =       _IFCNT + 1
  203. _CURIF          =       _IFCNT
  204.         _GENLAB    _IF,_IFCNT
  205.         _GENINST   #1,_ELSE,_IFCNT
  206.         _PUSH   _IFCNT
  207.         _PUSH   _IF
  208.         #EM
  209.  
  210.  
  211. ELSE_           MACRO
  212.         _POP    _TYPE
  213.         _POP    _COUNT
  214.         ##IF (_TYPE NE _IF)
  215.         #EX
  216.         ##ENDIF
  217.         _GENINST    _JMP,_ENDIF,_COUNT
  218.         _GENLAB     _ELSE,_COUNT
  219.         _PUSH       _COUNT
  220.         _PUSH       _ELSE
  221.         #EM
  222.  
  223.  
  224. ENDIF_          MACRO
  225.         _POP      _TYPE
  226.         _POP      _COUNT
  227.         ##IF ((_TYPE NE _IF) AND (_TYPE NE _ELSE))
  228.         #EX
  229.         ##ENDIF
  230.         ##IF (_TYPE EQ _IF)
  231.                 _GENLAB _ELSE,_COUNT
  232.         ##ENDIF
  233.         _GENLAB _ENDIF,_COUNT
  234.         _POP    _CURIF
  235.         #EM
  236.  
  237.  
  238. CASE_           MACRO
  239.         _PUSH   _CURCASE
  240.  
  241. _CASECNT        =       _CASECNT + 1
  242. _CURCASE        =       _CASECNT
  243.  
  244.         _GENCLAB   _CURCASE
  245.         NOP
  246.         ##IF  (#S1 NE 0)
  247.         MOV   AX,#V1
  248.         ##ENDIF
  249.         _PUSH   0
  250.         _PUSH   _CASECNT
  251.         _PUSH _CASE
  252.         #EM
  253.  
  254.  
  255. WHEN_           MACRO
  256.         _POP    _TYPE
  257.         _POP    _COUNT
  258.         _POP    _WHENCNT
  259.         ##IF (_TYPE NE _CASE) AND (_TYPE NE _WHEN)
  260.         #EX
  261.         ##ENDIF
  262.         ##IF (_WHENCNT GT 0)
  263.                 _GENINST _JMP,_ENDCASE,_COUNT
  264.         ##ENDIF
  265.         _GENWLAB _COUNT,_WHENCNT
  266.         CMP  AX,#1
  267.         _GENWINST  _JNE,_COUNT,(_WHENCNT + 1)
  268.         _PUSH    (_WHENCNT + 1)
  269.         _PUSH    _COUNT
  270.         _PUSH    _WHEN
  271.         #EM
  272.  
  273.  
  274.  
  275. OTHERWISE_      MACRO
  276.         _POP    _TYPE
  277.         _POP    _COUNT
  278.         _POP    _WHENCNT
  279.         ##IF (_TYPE NE _WHEN)
  280.         #EX
  281.         ##ENDIF
  282.         _GENINST        _JMP,_ENDCASE,_COUNT
  283.         _GENWLAB        _COUNT,_WHENCNT
  284.         _PUSH    _WHENCNT
  285.         _PUSH    _COUNT
  286.         _PUSH    _OTHERWISE
  287.         #EM
  288.  
  289.  
  290. ENDCASE_        MACRO
  291.         _POP    _TYPE
  292.         _POP    _COUNT
  293.         _POP    _WHENCNT
  294.         ##IF (_TYPE NE _WHEN) AND (_TYPE NE _OTHERWISE)
  295.         #EX
  296.         ##ENDIF
  297.         ##IF (_TYPE EQ _WHEN)
  298.                 _GENWLAB _COUNT,_WHENCNT
  299.         ##ENDIF
  300.         _GENLAB  _ENDCASE,_COUNT
  301.         _POP   _CURCASE
  302.         #EM
  303.  
  304.  
  305. LOOP_           MACRO
  306.         _PUSH  _CURLOOP
  307. _LOOPCNT        =       _LOOPCNT + 1
  308. _CURLOOP        =       _LOOPCNT
  309.         _GENLAB   _LOOP,_LOOPCNT
  310.         _PUSH    _LOOPCNT
  311.         _PUSH    _LOOP
  312.         #EM
  313.  
  314.  
  315. ENDLOOP_        MACRO
  316.         _POP    _TYPE
  317.         _POP    _COUNT
  318.         ##IF (_TYPE NE _LOOP)
  319.         #EX
  320.         ##ENDIF
  321.         _GENINST        _JMP,_LOOP,_COUNT
  322.         _GENLAB         _ENDLOOP,_COUNT
  323.         _POP    _CURLOOP
  324.         #EM
  325.  
  326.  
  327.  
  328. REPEAT_         MACRO
  329.         _PUSH   _CURREPEAT
  330. _REPEATCNT      =       _REPEATCNT + 1
  331. _CURREPEAT      =       _REPEATCNT
  332.         _GENLAB _REPEAT,_REPEATCNT
  333.         _PUSH  _REPEATCNT
  334.         _PUSH  _REPEAT
  335.         #EM
  336.  
  337.  
  338. UNTIL_          MACRO
  339.         _POP   _TYPE
  340.         _POP   _COUNT
  341.         ##IF (_TYPE NE _REPEAT)
  342.         #EX
  343.         ##ENDIF
  344.         _GENINST  #1,_REPEAT,_COUNT
  345.         _GENLAB   _ENDREPEAT,_COUNT
  346.         _POP    _CURREPEAT
  347.         #EM
  348.  
  349.  
  350. DO_             MACRO
  351.         _PUSH   _CURDO
  352. _DOCNT          =       _DOCNT + 1
  353. _CURDO          =       _DOCNT
  354.         _GENLAB _DO,_DOCNT
  355.         _PUSH   _DOCNT
  356.         _PUSH   _DO
  357.         #EM
  358.  
  359.  
  360. WHILE_          MACRO
  361.         _POP    _TYPE
  362.         _POP    _COUNT
  363.         ##IF (_TYPE NE _DO)
  364.         #EX
  365.         ##ENDIF
  366.         _GENINST   #1,_ENDDO,_COUNT
  367.         _PUSH   _COUNT
  368.         _PUSH   _WHILE
  369.         #EM
  370.  
  371.  
  372. ENDDO_          MACRO
  373.         _POP    _TYPE
  374.         _POP    _COUNT
  375.         ##IF (_TYPE NE _WHILE)
  376.         #EX
  377.         ##ENDIF
  378.         _GENINST   _JMP,_DO,_COUNT
  379.         _GENLAB    _ENDDO,_COUNT
  380.         _POP       _CURDO
  381.         #EM
  382.  
  383.  
  384. PROCEDURE_      MACRO
  385.         ##IF (_SP NE ZERO)
  386.         #EX
  387. _SP             =       0
  388.         ##ENDIF
  389. _PROCCNT        =       _PROCCNT + 1
  390. #1      PROC    #2
  391.         #EM
  392.  
  393.  
  394. ENDPROCEDURE_   MACRO
  395.         ##IF (_SP NE 0)
  396.         NOP
  397. _SP             =       0
  398.         ##ENDIF
  399.         _GENLAB _ENDPROC,_PROCCNT
  400.         ##IF (_VAR_OFFSET GT 0)
  401.         _RELEASE _VAR_OFFSET
  402. _VAR_OFFSET     =       0
  403.         ##ENDIF
  404.         RET     #2
  405. #1      ENDP
  406.         #EM
  407.  
  408.  
  409. TASK_   MACRO
  410.         ##IF (_SP NE 0)
  411.         NOP
  412. _SP             =       0
  413.         ##ENDIF
  414. _TASKCNT        =       _TASKCNT + 1
  415. #1      PROC    #2
  416.         #EM
  417.  
  418.  
  419. ENDTASK_        MACRO
  420.         ##IF (_SP NE 0)
  421.         NOP
  422. _SP             =       0
  423.         ##ENDIF
  424.         _GENLAB _ENDTASK,_TASKCNT
  425.         ##IF (_VAR_OFFSET GT 0)
  426.         _RELEASE _VAR_OFFSET
  427. _VAR_OFFSET     =       0
  428.         ##ENDIF
  429.         ##IF (#S3 NE 0)
  430.                 #3
  431.         ##ELSE
  432.         RET  #2
  433.         ##ENDIF
  434. #1      ENDP
  435.         #EM
  436.  
  437.  
  438. BEGIN_          MACRO
  439. _BEGINCNT       =       _BEGINCNT + 1
  440.         _GENLAB _BEGIN_#1,_BEGINCNT
  441.         _PUSH   _BEGINCNT
  442.         _PUSH   _BEGIN
  443.         #EM
  444.  
  445.  
  446. ENDBEGIN_       MACRO
  447.         _POP    _TYPE
  448.         _POP    _COUNT
  449.         ##IF (_TYPE NE _BEGIN)
  450.         #EX
  451.         ##ENDIF
  452.         _GENLAB _ENDBEG_#1,_COUNT
  453.         #EM
  454.  
  455.  
  456. PACKAGE_        MACRO
  457. #1:
  458.         #EM
  459.  
  460.  
  461. ENDPACKAGE_     MACRO
  462. _END_#1:
  463.         #EM
  464.  
  465.  
  466. EXIT_           MACRO
  467.         ##IF !   #1_
  468.         NOP
  469.         #EX
  470.         ##ELSEIF (_#1 EQ _BEGIN)
  471.                 _GENINST _JMP,_ENDBEG_#2,_COUNT
  472.         #EX
  473.         ##ELSEIF (_#1 EQ _IF)
  474.                 _GENINST _JMP,_ENDIF,_CURIF
  475.         #EX
  476.         ##ELSEIF (_#1 EQ _CASE)
  477.                 _GENINST _JMP,_ENDCASE,_CURCASE
  478.         #EX
  479.         ##ELSEIF (_#1 EQ _LOOP)
  480.                 _GENINST _JMP,_ENDLOOP,_CURLOOP
  481.         #EX
  482.         ##ELSEIF (_#1 EQ _REPEAT)
  483.                 _GENINST _JMP,_ENDREPEAT,_CURREPEAT
  484.         #EX
  485.         ##ELSEIF (_#1 EQ _WHILE)
  486.                 _GENINST _JMP,_ENDDO,_CURDO
  487.         #EX
  488.         ##ELSEIF (_#1 EQ _PROCEDURE)
  489.                 _GENINST _JMP,_ENDPROC,_PROCCNT
  490.         #EX
  491.                 _GENINST _JMP,_ENDTASK,_TASKCNT
  492.         #EX
  493.         ##ELSE
  494.         NOP
  495.         #EX
  496.         ##ENDIF
  497.         ##ENDIF
  498.         ##ENDIF
  499.         ##ENDIF
  500.         ##ENDIF
  501.         ##ENDIF
  502.         ##ENDIF
  503.         ##ENDIF
  504.         #EM
  505.  
  506.  
  507. CONST_  MACRO
  508. #1      EQU     #2
  509.         #EM
  510.  
  511.  
  512. DATA_   MACRO
  513.         ##IF (_#1 EQ _BYTE)
  514.         DB      #2
  515.         #EX
  516.         ##ELSEIF (_#1 EQ _INT)
  517.         DW      #2
  518.         #EX
  519.         ##ELSEIF (_#1 EQ _DINT)
  520.         DD      #2
  521.         #EX
  522.         ##ELSE
  523.         NOP
  524.         #EX
  525.         ##ENDIF
  526.         ##ENDIF
  527.         ##ENDIF
  528.         #EM
  529.  
  530.  
  531. VAR_    MACRO
  532.         ##IF (_#2 EQ _BYTE) OR (_#2 EQ _INT) OR (_#2 EQ _DINT)
  533.                 ##IF (_SP EQ 0)
  534. #1      LABEL   _#2_TYPE
  535.         DATA    #2,?
  536.         #EX
  537.         ##ELSE
  538.         _POP    _TYPE
  539.         ##IF (_TYPE NE _DECLARE)
  540.         NOP
  541.         ##ENDIF
  542. _VAR_OFFSET             =       _VAR_OFFSET - _#1
  543. #1                      =       _VAR_OFFSET
  544.         _PUSH   _TYPE
  545.         #EX
  546.         ##ENDIF
  547.         ##ELSE
  548.         NOP
  549.         ##ENDIF
  550.         #EM
  551.  
  552.  
  553. ARRAY_  MACRO
  554.         ##IF (_#2 EQ _BYTE) OR (_#2 EQ _INT) OR (_#2 EQ _DINT)
  555.         ##IF (_SP EQ 0)
  556.                 LABEL _#2_TYPE
  557.                 DATA_  #2,#3' DUP (?)'
  558.                 #EX
  559.         ##ELSE
  560.         _POP    _TYPE
  561.         ##IF (_TYPE NE _DECLARE)
  562.         NOP
  563.         ##ENDIF
  564. _VAR_OFFSET             =       _VAR_OFFSET - (_#2 * #3)
  565. #1              =       _VAR_OFFSET
  566.         _PUSH   _TYPE
  567.         #EX
  568.         ##ENDIF
  569.         ##ELSE
  570.         NOP
  571.         ##ENDIF
  572.         #EM
  573.  
  574.  
  575. TABLE_  MACRO
  576.         ##IF #S2 = 0
  577. #1      LABEL   BYTE
  578.         ##ELSEIF (_#2 EQ _BYTE) OR (_#2 EQ _INT) OR (_#2 EQ _DINT)
  579. #1      LABEL   _#2_TYPE
  580.         ##ELSE
  581.         NOP
  582.         ##ENDIF
  583.         ##ENDIF
  584.         #EM
  585.  
  586.  
  587. ENDTABLE_       MACRO
  588. _#1     LABEL   BYTE
  589.         #EM
  590.  
  591.  
  592. DECLARE_        MACRO
  593.         _PUSH   _DECLARE
  594.         #EM
  595.  
  596.  
  597. ENDDECLARE_     MACRO
  598.         _POP _TYPE
  599.         ##IF (_TYPE NE _DECLARE)
  600.         NOP
  601.         ##ENDIF
  602.         ##IF (_VAR_OFFSET NE 0)
  603.         _ALLOCATE  _VAR_OFFSET
  604.         #EX
  605.         ##ELSE
  606.         NOP
  607.         ##ENDIF
  608.         #EM
  609.  
  610.  
  611. _ALLOCATE       MACRO
  612.         PUSH BP
  613.         MOV BP,SP
  614.         ADD SP,#1
  615.         #EM
  616.  
  617.  
  618. _RELEASE        MACRO
  619.         MOV SP,BP
  620.         POP BP
  621.         #EM
  622.