home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / win3 / patches / symantec / rtlinc.exe / MACROS.ASM < prev    next >
Assembly Source File  |  1993-05-19  |  22KB  |  1,322 lines

  1. ;_ macros.asm
  2. ; Copyright (C) 1985-1991 by Walter Bright
  3. ; All Rights Reserved
  4. ; Written by Walter Bright and Joe Huffman
  5.  
  6. ifdef _WINDOWS
  7.     extrn  MESSAGEFATALERROR : far
  8. endif
  9.  
  10. ifndef M_I386
  11. ; modified for RATIONAL support by P Murray, April 1990
  12. ; define DOS16RM for protected mode programs
  13.  
  14. ; Determine which memory model we are assembling for. For .COM files,
  15. ; force S model.
  16.  
  17. ifdef DOS16RM
  18. ifndef I8086L
  19. %out    Only L model supported with RATIONAL DOS Extender.
  20. end
  21. endif
  22. else
  23.     ifdef I8086T
  24. I8086S equ    1
  25.     else
  26.     ifndef I8086S
  27.     ifndef I8086M
  28.     ifndef I8086C
  29.     ifndef I8086L        ;if none of the memory models are defined
  30.     ifndef I8086V
  31. I8086S equ    1        ;default to S model
  32.     endif ;I8086V
  33.     endif ;I8086L
  34.     endif ;I8086C
  35.     endif ;I8086M
  36.     endif ;I8086S
  37.     endif ;I8086T
  38. endif ;DOS16RM
  39.  
  40. ifdef __OS2__
  41.     .286C
  42. endif
  43.  
  44.  
  45. ifdef DOS16RM
  46.     .286P
  47. endif
  48.  
  49. ifndef I386
  50. I386    equ    0
  51. endif
  52.  
  53. ;Decide if SI and DI are saved across function calls
  54. SAVESIDI equ    1        ;1 means SI and DI are saved across functions
  55.  
  56. if 0    ;Lattice conventions no longer supported
  57. MSC    equ    1        ;ifdef means use Microsoft C calling conventions
  58.                 ;ifndef means use Lattice
  59. endif
  60.  
  61. ; Macros to bracket data segment stuff.
  62.  
  63. ifndef STARTUP
  64. begdata macro
  65.  
  66. ifdef DOS16RM
  67. ;Segment so we can find the start of DGROUP
  68.  
  69. NULL    segment para public 'BEGDATA'        ;Note PARAGRAPH alignment
  70. NULL    ends
  71. endif
  72.  
  73. _DATA    segment word public 'DATA'
  74. _DATA    ends
  75. CONST    segment word public 'CONST'
  76. CONST    ends
  77. _BSS    segment word public 'BSS'
  78. _BSS    ends
  79. ifdef DOS16RM
  80. DGROUP    group    NULL,_DATA,CONST,_BSS
  81. else
  82. DGROUP    group    _DATA,CONST,_BSS
  83. endif
  84. _DATA    segment
  85.     assume ds:DGROUP
  86.     endm
  87. endif ; STARTUP
  88.  
  89. enddata macro
  90. _DATA    ends
  91.     endm
  92.  
  93. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  94. ; Macros specific to each memory model in an attempt to make it easier
  95. ; to write memory model independent code.
  96. ;    begcode,endcode        Use to bracket code sections
  97. ;    P            Offset on BP to first argument on stack
  98. ;                (excluding any local variables)
  99. ;    SPTR            1 if small data model
  100. ;    LPTR            1 if large pointers (large data)
  101. ;    LCODE            1 if large code model
  102. ;    ESeqDS            1 if ES == DS at all times
  103. ;    SSeqDS            1 if SS == DS at all times
  104. ;    SIZEPTR            # of bytes in a pointer
  105. ;    func            Declare a function as NEAR or FAR
  106. ;    callm            Call function as NEAR or FAR
  107.  
  108. ;;;;;;;;;;;;;; SMALL MEMORY MODEL ;;;;;;;;;;;;;;;;;
  109. ifdef I8086S
  110. begcode macro    module
  111. _TEXT    segment word public 'CODE'
  112.     assume    cs:_TEXT
  113.     endm
  114.  
  115. endcode macro    module
  116. _TEXT    ENDS
  117.     endm
  118.  
  119. P    equ    4    ; Offset of start of parameters on the stack frame
  120. SPTR    equ    1
  121. LPTR    equ    0
  122. LCODE    equ    0
  123. ESeqDS    equ    0
  124. SSeqDS    equ    1
  125. SIZEPTR equ    2    ; Size of a pointer
  126.  
  127. p_func    macro    name
  128. name    proc    near
  129.     endm
  130.  
  131. p_endp    macro    name
  132. name    endp
  133.     endm
  134.  
  135. callp    macro    name
  136.     call    near ptr name
  137.     endm
  138.  
  139. func    macro    name
  140. _&name    proc    near
  141.     ifndef name
  142. name    equ    _&name
  143.     endif
  144.     endm
  145.  
  146. callm    macro    name
  147.     call    near ptr _&name
  148.     endm
  149. endif
  150.  
  151. ;;;;;;;;;;;;;;;;; MEDIUM MEMORY MODEL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  152.  
  153. ifdef I8086M
  154. begcode macro    module
  155. module&_TEXT    segment word public 'CODE'
  156.     assume    cs:module&_TEXT
  157.     endm
  158.  
  159. endcode macro    module
  160. module&_TEXT    ends
  161.     endm
  162.  
  163. P    equ    6    ; Offset of start of parameters on the stack frame
  164. SPTR    equ    1
  165. LPTR    equ    0
  166. LCODE    equ    1
  167. ESeqDS    equ    0
  168. SSeqDS    equ    1
  169. SIZEPTR equ    2
  170.  
  171. p_func    macro    name
  172. name    proc    far
  173.     endm
  174.  
  175. p_endp    macro    name
  176. name    endp
  177.     endm
  178.  
  179. callp    macro    name
  180.     call    far ptr name
  181.     endm
  182.  
  183. func    macro    name
  184. _&name    proc    far
  185.     ifndef name
  186. name    equ    _&name
  187.     endif
  188.     endm
  189.  
  190. callm    macro    name
  191.     call    far ptr _&name
  192.     endm
  193. endif
  194.  
  195. ;;;;;;;;;;;;;;;;; COMPACT MEMORY MODEL ;;;;;;;;;;;;;;
  196.  
  197. ifdef I8086C
  198. begcode macro    module
  199. _TEXT    segment word public 'CODE'
  200.     assume    cs:_TEXT
  201.     endm
  202.  
  203. endcode macro    module
  204. _TEXT    ends
  205.     endm
  206.  
  207. P    equ    4    ; Offset of start of parameters on the stack frame
  208. SPTR    equ    0
  209. LPTR    equ    1
  210. LCODE    equ    0
  211. ESeqDS    equ    0
  212. SSeqDS    equ    0
  213. SIZEPTR equ    4
  214.  
  215. p_func    macro    name
  216. name    proc    near
  217.     endm
  218.  
  219. p_endp    macro    name
  220. name    endp
  221.     endm
  222.  
  223. callp    macro    name
  224.     call    near ptr name
  225.     endm
  226.  
  227. func    macro    name
  228. _&name    proc    near
  229.     ifndef name
  230. name    equ    _&name
  231.     endif
  232.     endm
  233.  
  234. callm    macro    name
  235.     call    near ptr _&name
  236.     endm
  237. endif
  238.  
  239. ;;;;;;;;;;;;;;;; LARGE MEMORY MODEL ;;;;;;;;;;;;;;;;;;;
  240.  
  241. ifdef I8086L
  242. begcode macro    module
  243. module&_TEXT    segment word public 'CODE'
  244.     assume    cs:module&_TEXT
  245.     endm
  246.  
  247. endcode macro    module
  248. module&_TEXT    ends
  249.     endm
  250.  
  251. P    equ    6    ; Offset of start of parameters on the stack frame
  252. SPTR    equ    0
  253. LPTR    equ    1
  254. LCODE    equ    1
  255. ESeqDS    equ    0
  256. SSeqDS    equ    0
  257. SIZEPTR equ    4
  258.  
  259. p_func    macro    name
  260. name    proc    far
  261.     endm
  262.  
  263. p_endp    macro    name
  264. name    endp
  265.     endm
  266.  
  267. callp    macro    name
  268.     call    far ptr name
  269.     endm
  270.  
  271. func    macro    name
  272. _&name    proc    far
  273.     ifndef name
  274. name    equ    _&name
  275.     endif
  276.     endm
  277.  
  278. callm    macro    name
  279.     call    far ptr _&name
  280.     endm
  281. endif
  282.  
  283. ;;;;;;;;;;;;;;;; OVERLAY MEMORY MODEL ;;;;;;;;;;;;;;;;;;;
  284. ifdef I8086V
  285.  
  286. begcode macro    module
  287. module&_TEXT    segment word public 'CODE'
  288.     assume    cs:module&_TEXT
  289.     endm
  290.  
  291. endcode macro    module
  292. module&_TEXT    ends
  293.     endm
  294.  
  295.  
  296. P    equ    6    ; Offset of start of parameters on the stack frame
  297. SPTR    equ    0
  298. LPTR    equ    1
  299. LCODE    equ    1
  300. ESeqDS    equ    0
  301. SSeqDS    equ    0
  302. SIZEPTR equ    4
  303.  
  304. p_func    macro    name
  305. name    proc    far
  306.     endm
  307.  
  308. p_endp    macro    name
  309. name    endp
  310.     endm
  311.  
  312. callp    macro    name
  313.     call    far ptr name
  314.     endm
  315.  
  316. func    macro    name
  317. _&name    proc    far
  318.     ifndef name
  319. name    equ    _&name
  320.     endif
  321.     endm
  322.  
  323. callm    macro    name
  324.     call    far ptr _&name
  325.     endm
  326. endif
  327.  
  328. ;Macros to replace public, extrn, and endp for C-callable assembly routines,
  329. ; and to define labels: c_label defines labels,
  330. ; c_public replaces public, c_extrn replaces extrn, and c_endp replaces endp
  331.  
  332. c_name    macro    name
  333.     name equ _&name
  334.     endm
  335.  
  336. c_label macro    name
  337. _&name:
  338.     endm
  339.  
  340. c_public macro    a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  341.     ifnb <a>            ;;Check for blank argument
  342.     public    _&a
  343.     a equ _&a
  344.       ifnb <b>
  345.     c_public b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  346.       endif
  347.     endif
  348.     endm
  349.  
  350. c_extrn macro    a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  351.     ifnb <a>            ;;Check for blank argument
  352.     extrn    _&a:b
  353.     a equ _&a
  354.       ifnb <c>
  355.     c_extrn c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  356.       endif
  357.     endif
  358.     endm
  359.  
  360. c_endp    macro    name
  361. _&name    ENDP
  362.     endm
  363.  
  364. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  365. ; Define function ctor as a static constructor
  366.  
  367. static_ctor macro    ctor
  368.     if LCODE
  369. XIFB    segment word public 'DATA'
  370. XIFB    ends
  371. XIF    segment word public 'DATA'
  372.     dd    ctor
  373. XIF    ends
  374. XIFE    segment word public 'DATA'
  375. XIFE    ends
  376.     else
  377. XIB    segment word public 'DATA'
  378. XIB    ends
  379. XI    segment word public 'DATA'
  380.     dw    ctor
  381. XI    ends
  382. XIE    segment word public 'DATA'
  383. XIE    ends
  384.     endif
  385.     endm
  386.  
  387. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  388. ; Define function ctor as a static destructor
  389.  
  390. static_dtor macro    dtor
  391.     if LCODE
  392. XCFB    segment word public 'DATA'
  393. XCFB    ends
  394. XCF    segment word public 'DATA'
  395.     dd    dtor
  396. XCF    ends
  397. XCFE    segment word public 'DATA'
  398. XCFE    ends
  399.     else
  400. XCB    segment word public 'DATA'
  401. XCB    ends
  402. XC    segment word public 'DATA'
  403.     dw    dtor
  404. XC    ends
  405. XCE    segment word public 'DATA'
  406. XCE    ends
  407.     endif
  408.     endm
  409.  
  410. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  411. ; Other more or less useful macros
  412. ; Commented out ones are obsolete
  413.  
  414. ;setESeqDS macro        ;set ES == DS, if not already true
  415. ;    ife ESeqDS
  416. ;    push    DS
  417. ;    pop    ES
  418. ;    endif
  419. ;    endm
  420.  
  421. .push    macro    list
  422.     irp    arg,<list>
  423.      push    arg
  424.     endm
  425.     endm
  426.  
  427. .pop    macro    list
  428.     irp    arg,<list>
  429.      pop    arg
  430.     endm
  431.     endm
  432.  
  433. _push    macro    list
  434.     irp    arg,<list>
  435.      push    arg
  436.     endm
  437.     endm
  438.  
  439. _pop    macro    list
  440.     irp    arg,<list>
  441.      pop    arg
  442.     endm
  443.     endm
  444.  
  445. ; Macros to save and restore regs destroyed by a function
  446.  
  447. .save    macro    list
  448.     if SAVESIDI
  449.     irp    arg,<list>
  450.      push    arg
  451.     endm
  452.     endif
  453.     endm
  454.  
  455. .restore macro    list
  456.     if SAVESIDI
  457.     irp    arg,<list>
  458.      pop    arg
  459.     endm
  460.     endif
  461.     endm
  462.  
  463. _save    macro    list
  464.     if SAVESIDI
  465.     irp    arg,<list>
  466.      push    arg
  467.     endm
  468.     endif
  469.     endm
  470.  
  471. _restore macro    list
  472.     if SAVESIDI
  473.     irp    arg,<list>
  474.      pop    arg
  475.     endm
  476.     endif
  477.     endm
  478.  
  479. ; Macros to save and restore ES, but only if ESeqDS is 1.
  480. ;pushES macro
  481. ;    if ESeqDS
  482. ;    push    ES
  483. ;    endif
  484. ;    endm
  485. ;
  486. ;popES    macro
  487. ;    if ESeqDS
  488. ;    pop    ES
  489. ;    endif
  490. ;    endm
  491.  
  492. clr    macro    list        ;clear a register
  493.     irp    reg,<list>
  494.      xor    reg,reg
  495.     endm
  496.     endm
  497.  
  498. tst    macro    reg
  499.     or    reg,reg
  500.     endm
  501.  
  502. jmps    macro    lbl
  503.     jmp    short    lbl
  504.     endm
  505.  
  506.     if @Version lt 600
  507.     ;For compatibility with MASM 5.10
  508. .if    macro    arg1,cond,arg2,lbl
  509.     cmp    arg1,arg2
  510.     j&cond    lbl
  511.     endm
  512.  
  513.     endif
  514.  
  515. _if    macro    arg1,cond,arg2,lbl
  516.     cmp    arg1,arg2
  517.     j&cond    lbl
  518.     endm
  519.  
  520. ;sob    macro    arg,lbl
  521. ;    ifidn    <arg>,<CX>
  522. ;     loop    lbl
  523. ;    else
  524. ;     dec    arg
  525. ;     jnz    lbl
  526. ;    endif
  527. ;    endm
  528.  
  529.  
  530.     ifdef _WINDOWS
  531.     extrn  DOS3CALL : far
  532.     endif
  533.  
  534. ifndef nobdos
  535. bdos    macro    func
  536.     ifnb    <func>
  537.     mov    AH,func
  538.     endif
  539.     ifndef _WINDOWS
  540.     int    21h
  541.     else
  542.         call    DOS3CALL
  543.     endif
  544.     endm
  545.  
  546. dpmi    macro    func
  547.     ifnb    <func>
  548.         mov    AX,func
  549.         endif
  550.     int    31h
  551.         endm
  552. else
  553. __bdos    macro    func
  554.     ifnb    <func>
  555.     mov    AH,func
  556.     endif
  557.     ifndef _WINDOWS
  558.     int    21h
  559.     else
  560.         call    DOS3CALL
  561.     endif
  562.     endm
  563.  
  564. __dpmi    macro    func
  565.     ifnb    <func>
  566.         mov    AX,func
  567.         endif
  568.     int    31h
  569.         endm
  570. endif
  571.  
  572. .retf    macro    val        ;force assembler to build a far return
  573.     ifnb    <val>
  574.      db    0CAh
  575.      dw    val
  576.     else
  577.      db    0CBh
  578.     endif
  579.     endm
  580.  
  581. _retf    macro    val        ;force assembler to build a far return
  582.     ifnb    <val>
  583.      db    0CAh
  584.      dw    val
  585.     else
  586.      db    0CBh
  587.     endif
  588.     endm
  589.  
  590. ; Sometimes MASM ignores my segment overrides.
  591. segES    macro
  592.     db    26h
  593.     endm
  594.  
  595. ; 32 bit negate
  596. neg32    macro    reg1,reg2
  597.      neg    reg1
  598.      neg    reg2
  599.      sbb    reg1,0
  600.     endm
  601.  
  602. ; Push immediate (reg is for scratch)
  603. pushi    macro    reg,value
  604.     if 0
  605.      push    value        ;for 286 code generation only
  606.     else
  607.      mov    reg,value
  608.      push    reg
  609.     endif
  610.     endm
  611.  
  612. ; Inc/dec BP if I8086V memory model
  613. incBP    macro
  614.     ifdef I8086V
  615.       inc    BP
  616.     endif
  617.     endm
  618.  
  619. decBP    macro
  620.     ifdef I8086V
  621.       dec    BP
  622.     endif
  623.     endm
  624.  
  625. WINENTER macro
  626.     ifdef _WINDOWS
  627.     ifndef I8086S
  628.     ifndef I8086C
  629.     inc    BP
  630.     endif
  631.     endif
  632.     endif
  633.         push    BP
  634.         mov    BP,SP
  635.     endm
  636.  
  637. WINLEAVE macro
  638.     pop    BP
  639.     ifdef _WINDOWS
  640.     ifndef I8086S
  641.     ifndef I8086C
  642.         dec    BP
  643.     endif
  644.     endif
  645.     endif
  646.     endm
  647.  
  648. WINENTER_VCM macro
  649.     ifdef _WINDOWS
  650.     ifndef I8086S
  651.     ifndef I8086C
  652.         inc    BP
  653.     endif
  654.     endif
  655.     else
  656.     ifdef I8086V
  657.         inc    BP
  658.     endif
  659.     endif
  660.         push    BP
  661.         mov    BP,SP
  662.     endm
  663.  
  664. WINLEAVE_VCM macro
  665.         pop    BP
  666.     ifdef _WINDOWS
  667.     ifndef I8086S
  668.     ifndef I8086C
  669.         dec    BP
  670.     endif
  671.     endif
  672.     else
  673.     ifdef I8086V
  674.         dec    BP
  675.     endif
  676.     endif
  677.     endm
  678.  
  679. WINENTER_NF macro
  680.     ifdef _WINDOWS
  681.     ifndef I8086S
  682.     ifndef I8086C
  683.         inc    BP
  684.         push    BP
  685.         mov    BP,SP
  686.     endif
  687.     endif
  688.     endif
  689.     endm
  690.  
  691. WINLEAVE_NF macro
  692.     ifdef _WINDOWS
  693.     ifndef I8086S
  694.     ifndef I8086C
  695.         pop    BP
  696.         dec    BP
  697.     endif
  698.     endif
  699.     endif
  700.     endm
  701.  
  702. WINENTER_VCM_NF macro
  703.     ifdef _WINDOWS
  704.     ifndef I8086S
  705.     ifndef I8086C
  706.         inc    BP
  707.         push    BP
  708.         mov    BP,SP
  709.     endif
  710.     endif
  711.     else
  712.     ifdef I8086V
  713.         inc    BP
  714.         push    BP
  715.         mov    BP,SP
  716.     endif
  717.     endif
  718.     endm
  719.  
  720. WINLEAVE_VCM_NF macro
  721.     ifdef _WINDOWS
  722.     ifndef I8086S
  723.     ifndef I8086C
  724.         pop    BP
  725.         dec    BP
  726.     endif
  727.     endif
  728.     else
  729.     ifdef I8086V
  730.         pop    BP
  731.         dec    BP
  732.     endif
  733.     endif
  734.     endm
  735.  
  736. else    ;M_I386
  737.  
  738.     .386P
  739.     .387
  740.  
  741. ifdef DOS386
  742. SEG_1ST_MEG    equ    034h    ;Selector of 1st Mbyte used by MSDOS
  743. SEG_SCREEN    equ    01ch    ;Selector for the video memory.
  744. SEG_PSP        equ    024H    ;PSP selector.
  745. SEG_DGROUP    equ    014H    ;DGROUP selector.
  746. SEG_ENV        equ    02cH    ;Selector of environment string.
  747.  
  748. OMF    equ    1
  749. COFF    equ    0
  750. _FLAT    equ    0        ;FLAT memory model
  751. _STDCALL equ    0        ;default to _stdcall
  752. _RETST0    equ    0        ;return floating point results in ST0
  753. endif    ;DOS386
  754.  
  755. ifdef X386
  756. _FLAT    equ    0
  757. _STDCALL equ    0
  758. _RETST0    equ    0
  759. endif
  760.  
  761. ifdef __OS2__
  762. OMF    equ    1
  763. COFF    equ    0
  764. _FLAT    equ    1    ;FLAT memory model
  765. _STDCALL equ    1
  766. _RETST0    equ    1
  767. _INLINE_8087 equ 1    ;defined if we always generate inline 8087 code
  768. endif
  769.  
  770. ifdef __NT__
  771. OMF    equ    1
  772. COFF    equ    0
  773. _FLAT    equ    1
  774. _STDCALL equ    0
  775. _RETST0    equ    1
  776. ;_NOCTOR equ    1    ;defined if no static constructors/destructors supported
  777. _INLINE_8087 equ 1    ;defined if we always generate inline 8087 code
  778. endif
  779.  
  780. ifdef M_XENIX
  781. OMF    equ    1    ;Set to non-zero if OMF object format.
  782. COFF    equ    0    ;Set to non-zero if COFF object format.
  783. _FLAT    equ    0
  784. _STDCALL equ    0
  785. _RETST0    equ    0
  786. endif
  787.  
  788. ifdef M_UNIX
  789. OMF    equ    0    ;Set to non-zero if OMF object format.
  790. COFF    equ    1    ;Set to non-zero if COFF object format.
  791. _FLAT    equ    0
  792. _STDCALL equ    0
  793. _RETST0    equ    0
  794. endif
  795.  
  796. .ERRNZ    OMF AND COFF
  797. .ERRE    OMF OR COFF
  798.  
  799. I386    equ    1
  800.  
  801. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  802. ; Macros specific to each memory model in an attempt to make it easier
  803. ; to write memory model independent code.
  804. ;    begcode,endcode        Use to bracket code sections
  805. ;    begdata,enddata        Use to bracket data sections
  806. ;    begrcode,endrcode       Use to bracket real mode code sections 
  807. ;    begrdata,endrdata       Use to bracket real mode data sections 
  808. ;                               (Pharlap DOS386 only)
  809. ;    P            Offset on EBP to first argument on stack
  810. ;                Assuming EBP was pushed.
  811. ;    PS            Offset on ESP to first argument on stack
  812. ;                Assuming nothing was pushed on the stack.
  813. ;    ESeqDS            1 if ES == DS at all times
  814. ;    FSeqDS            1 if FS == DS at all times
  815. ;    GSeqDS            1 if GS == DS at all times
  816. ;    SSeqDS            1 if SS == DS at all times
  817. ;    SIZEPTR            # of bytes in a pointer
  818. ;    func            Declare a function as NEAR or FAR
  819. ;    callm            Call function as NEAR or FAR
  820. ;    LPTR            Large data model?
  821. ;    SPTR            Small data model?
  822.  
  823.  
  824. ;Macro for start and end of real mode code segment.
  825.  
  826. begcode_16 macro     
  827. __X386_CODESEG_16       segment para use16 public 'CODE'
  828.         assume ds:__X386_GROUP_16
  829.         assume cs:__X386_CODESEG_16
  830. endm
  831.  
  832. endcode_16 macro
  833. __X386_CODESEG_16       ends
  834. endm
  835.  
  836. begcode macro    module
  837.     if _FLAT
  838. _TEXT    segment dword use32 public 'CODE'
  839.       assume    CS:FLAT,DS:FLAT,SS:FLAT
  840.     else
  841. _TEXT    segment dword public 'CODE'
  842.       assume    CS:_TEXT
  843.     endif
  844.     endm
  845.  
  846. endcode macro    module
  847. _TEXT    ENDS
  848.     endm
  849.  
  850. begdata macro
  851.  
  852. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  853. ; Set up segments for data
  854. ; Regular initialized data goes in _DATA
  855.  
  856. _DATA    segment dword public 'DATA'
  857. _DATA    ends
  858.  
  859.     ifndef _NOCTOR
  860. ;Function pointers to constructors
  861. XIB    segment dword public 'DATA'
  862. XIB    ends
  863. XI    segment dword public 'DATA'
  864. XI    ends
  865. XIE    segment dword public 'DATA'
  866. XIE    ends
  867.  
  868. ;Function pointers to destructors
  869. XCB    segment dword public 'DATA'
  870. XCB    ends
  871. XC    segment dword public 'DATA'
  872. XC    ends
  873. XCE    segment dword public 'DATA'
  874. XCE    ends
  875.  
  876. ;Constant data, such as switch tables, go here.
  877.  
  878. CONST    segment dword public 'CONST'
  879. CONST    ends
  880.  
  881. ;Segment for uninitialized data. This is set to 0 by the startup code/OS,
  882. ;so it does not consume room in the executable file.
  883.  
  884. _BSS    segment dword public 'BSS'
  885. _BSS    ends
  886.  
  887. if OMF
  888. HUGE_BSS    segment dword public 'HUGE_BSS'
  889. HUGE_BSS    ends
  890.  
  891. EEND    segment dword public 'ENDBSS'
  892. EEND    ends
  893.  
  894. ifdef DOS386
  895. STACK    segment para stack 'STACK'
  896. STACK    ends
  897.  
  898. DGROUP    group    _DATA,XIB,XI,XIE,XCB,XC,XCE,CONST,_BSS,EEND,STACK
  899. else
  900. ifdef __OS2__
  901. STACK    segment para stack 'STACK'
  902. STACK    ends
  903.  
  904. DGROUP    group    _DATA,XIB,XI,XIE,XCB,XC,XCE,CONST,_BSS,EEND,STACK
  905. else
  906. ifdef __NT__
  907. STACK    segment para stack 'STACK'
  908. STACK    ends
  909.  
  910. DGROUP    group    _DATA,XIB,XI,XIE,XCB,XC,XCE,CONST,_BSS,EEND,STACK
  911. else
  912. DGROUP    group    _DATA,XIB,XI,XIE,XCB,XC,XCE,CONST,_BSS,EEND
  913. endif
  914. endif
  915. endif
  916.  
  917. else    ;OMF
  918. DGROUP    group    _DATA,XIB,XI,XIE,XCB,XC,XCE,CONST,_BSS
  919. endif
  920.     endif
  921.  
  922. _DATA    segment
  923.     if _FLAT
  924.       assume DS:FLAT
  925.     else
  926.       assume DS:DGROUP
  927.     endif
  928.     endm
  929.  
  930. enddata macro
  931. _DATA    ends
  932.     endm
  933.  
  934. P    equ    8    ; Offset of start of parameters on the stack frame
  935.             ; From EBP assuming EBP was pushed.
  936. PS    equ    4    ; Offset of start of parameters on the stack frame
  937.             ; From ESP assuming EBP was NOT pushed.
  938. ESeqDS    equ    0
  939. FSeqDS    equ    0
  940. GSeqDS    equ    0
  941. SSeqDS    equ    1
  942. SIZEPTR equ    4    ; Size of a pointer
  943. LPTR    equ    0
  944. SPTR    equ    1
  945. LCODE    equ    0
  946.  
  947. func    macro    name
  948. _&name    proc    near
  949.     ifndef name
  950. name    equ    _&name
  951.     endif
  952.     endm
  953.  
  954. callm    macro    name
  955.     call    _&name
  956.     endm
  957.  
  958. ;Macros to replace public, extrn, and endp for C-callable assembly routines,
  959. ; and to define labels: c_label defines labels,
  960. ; c_public replaces public, c_extrn replaces extrn, and c_endp replaces endp
  961.  
  962. c_name    macro    name
  963.     name equ _&name
  964.     endm
  965.  
  966. c_label macro    name
  967. _&name:
  968.     endm
  969.  
  970. c_public macro    a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  971.     ifnb <a>            ;;Check for blank argument
  972.     public    _&a
  973.     a equ _&a
  974.       ifnb <b>
  975.     c_public b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  976.       endif
  977.     endif
  978.     endm
  979.  
  980. c_extrn macro    a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  981.     ifnb <a>            ;;Check for blank argument
  982.     extrn    _&a:b
  983.     a equ _&a
  984.       ifnb <c>
  985.     c_extrn c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  986.       endif
  987.     endif
  988.     endm
  989.  
  990.  
  991. c_endp    macro    name
  992. _&name    ENDP
  993.     endm
  994.  
  995. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  996. ; Define function ctor as a static constructor
  997.  
  998. static_ctor macro    ctor
  999.   ifndef _NOCTOR
  1000. XIB    segment dword public 'DATA'
  1001. XIB    ends
  1002. XI    segment dword public 'DATA'
  1003.     if _FLAT
  1004.     dd    offset FLAT:ctor
  1005.     else
  1006.     dd    ctor
  1007.     endif
  1008. XI    ends
  1009. XIE    segment dword public 'DATA'
  1010. XIE    ends
  1011.   endif
  1012.     endm
  1013.  
  1014. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1015. ; Define function dtor as a static destructor
  1016.  
  1017. static_dtor macro    dtor
  1018.   ifndef _NOCTOR
  1019. XCB    segment dword public 'DATA'
  1020. XCB    ends
  1021. XC    segment dword public 'DATA'
  1022.     if _FLAT
  1023.     dd    offset FLAT:dtor
  1024.     else
  1025.     dd    dtor
  1026.     endif
  1027.  
  1028. XC    ends
  1029. XCE    segment dword public 'DATA'
  1030. XCE    ends
  1031.   endif
  1032.     endm
  1033.  
  1034. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1035. ; Other more or less useful macros
  1036.  
  1037. ;Aligns the code on dword boundary for max speed.
  1038. _align    macro
  1039.     ;MASM 6.0 has a bug where ALIGN 4 produces bogus code when
  1040.     ;2 or 3 bytes of filler are necessary.
  1041.     ifdef @Version
  1042.       if @Version eq 600
  1043.         if 0
  1044.         if    (($ - _TEXT) and 3) eq 1
  1045.         db    08Bh,0C0h        ;MOV EAX,EAX
  1046.         nop
  1047.         else
  1048.         if    (($ - _TEXT) and 3) eq 2
  1049.         db    08Bh,0C0h        ;MOV EAX,EAX
  1050.         else
  1051.         if    (($ - _TEXT) and 3) eq 3
  1052.         nop
  1053.         endif
  1054.         endif
  1055.         endif
  1056.         endif
  1057.       else
  1058.         align    4            ;for MASM 5.1
  1059.       endif
  1060.     else
  1061.         align    4            ;for 386ASM
  1062.     endif
  1063.     endm
  1064.  
  1065. _push    macro    list
  1066.     irp    arg,<list>
  1067.      push    arg
  1068.     endm
  1069.     endm
  1070.  
  1071. _pop    macro    list
  1072.     irp    arg,<list>
  1073.      pop    arg
  1074.     endm
  1075.     endm
  1076.  
  1077. _if    macro    arg1,cond,arg2,lbl
  1078.     cmp    arg1,arg2
  1079.     j&cond    lbl
  1080.     endm
  1081.  
  1082. _ifs    macro    arg1,cond,arg2,lbl
  1083.     cmp    arg1,arg2
  1084.     j&cond    short lbl
  1085.     endm
  1086.  
  1087. clr    macro    list        ;clear a register
  1088.     irp    reg,<list>
  1089.      xor    reg,reg
  1090.     endm
  1091.     endm
  1092.  
  1093. jmps    macro    lbl
  1094.     jmp    short    lbl
  1095.     endm
  1096.  
  1097. tst    macro    reg
  1098.     or    reg,reg
  1099.     endm
  1100.  
  1101. ifndef nobdos
  1102.  
  1103. ifdef DOS386
  1104. bdos    macro    func        ;DOS system call.
  1105.     ifnb    <func>
  1106.      mov    AH,func
  1107.     endif
  1108.     int    21h
  1109.     endm
  1110. endif ;DOS386
  1111.  
  1112. ifdef X386
  1113. bdos    macro    func        ;DOS system call.
  1114.     ifnb    <func>
  1115.      mov    AH,func
  1116.     endif
  1117.     int    21h
  1118.     endm
  1119. endif ;DOS386
  1120.  
  1121. ifdef M_XENIX
  1122. bdos    macro    func        ; 386 XENIX system call.
  1123.     ifnb    <func>
  1124.      mov    EAX,func
  1125.     endif
  1126.  
  1127.     db 9ah            ; call far 0x7:0
  1128.     dd 0
  1129.     dw 07h
  1130.     endm
  1131. endif ;M_XENIX
  1132.  
  1133. ifdef M_UNIX
  1134. bdos    macro    func        ; UNIX system call.
  1135.     ifnb    <func>
  1136.      mov    EAX,func
  1137.     endif
  1138.  
  1139.     db 9ah            ; call far 0x7:0
  1140.     dd 0
  1141.     dw 07h
  1142.     endm
  1143. endif ;M_UNIX
  1144.  
  1145. endif ;nobdos
  1146.  
  1147. _retf    macro    val        ;force assembler to build a far return
  1148.     ifnb    <val>
  1149.      db    0CAh
  1150.      dw    val
  1151.     else
  1152.      db    0CBh
  1153.     endif
  1154.     endm
  1155.  
  1156. _ret    macro    val        ;decide whether caller or callee cleans stack
  1157.     if _STDCALL
  1158.       ret    val
  1159.     else
  1160.       ret
  1161.     endif
  1162.     endm
  1163.  
  1164. ; Macros to save and restore regs destroyed by a function
  1165. ; Give the macro the list of registers used by the function:
  1166. ;    uses    <AX,BX,SI,DI>
  1167. ;
  1168. ; At exit to function use 'unuse':
  1169. ;    unuse    <DI,SI,BX,AX>
  1170.  
  1171. uses    macro    list
  1172.     irp    reg,<list>
  1173.      ifidn    <reg>,<ebx>    ;Save ebx.
  1174.      push    reg
  1175.      endif
  1176.  
  1177.      ifidn    <reg>,<EBX>    ;Save EBX (bug in ifidni).
  1178.      push    reg
  1179.      endif
  1180.  
  1181.      ifidn    <reg>,<esi>    ;Save esi.
  1182.      push    reg
  1183.      endif
  1184.  
  1185.      ifidn    <reg>,<ESI>
  1186.      push    reg
  1187.      endif
  1188.  
  1189.      ifidn    <reg>,<edi>    ;Save edi.
  1190.      push    reg
  1191.      endif
  1192.  
  1193.      ifidn    <reg>,<EDI>
  1194.      push    reg
  1195.      endif
  1196.  
  1197.      ifidn    <reg>,<bx>    ;Save bx.
  1198.      push    reg
  1199.      endif
  1200.  
  1201.      ifidn    <reg>,<BX>
  1202.      push    reg
  1203.      endif
  1204.  
  1205.      ifidn    <reg>,<si>    ;Save si.
  1206.      push    reg
  1207.      endif
  1208.  
  1209.      ifidn    <reg>,<SI>
  1210.      push    reg
  1211.      endif
  1212.  
  1213.      ifidn    <reg>,<di>    ;Save di.
  1214.      push    reg
  1215.      endif
  1216.  
  1217.      ifidn    <reg>,<DI>
  1218.      push    reg
  1219.      endif
  1220.  
  1221.      ifidn    <reg>,<ds>    ;Save ds.
  1222.      push    reg
  1223.      endif
  1224.  
  1225.      ifidn    <reg>,<DS>
  1226.      push    reg
  1227.      endif
  1228.  
  1229.      ifidn    <reg>,<es>    ;Save es.
  1230.      push    reg
  1231.      endif
  1232.  
  1233.      ifidn    <reg>,<ES>
  1234.      push    reg
  1235.      endif
  1236.     endm
  1237.     endm
  1238.  
  1239. unuse    macro    list
  1240.     irp    reg,<list>
  1241.      ifidn    <reg>,<ebx>    ;Restore ebx.
  1242.      pop    reg
  1243.      endif
  1244.  
  1245.      ifidn    <reg>,<EBX>
  1246.      pop    reg
  1247.      endif
  1248.  
  1249.      ifidn    <reg>,<esi>    ;Restore esi.
  1250.      pop    reg
  1251.      endif
  1252.  
  1253.      ifidn    <reg>,<ESI>
  1254.      pop    reg
  1255.      endif
  1256.  
  1257.      ifidn    <reg>,<edi>    ;Restore edi.
  1258.      pop    reg
  1259.      endif
  1260.  
  1261.      ifidn    <reg>,<EDI>
  1262.      pop    reg
  1263.      endif
  1264.  
  1265.      ifidn    <reg>,<bx>    ;Restore bx.
  1266.      pop    reg
  1267.      endif
  1268.  
  1269.      ifidn    <reg>,<BX>
  1270.      pop    reg
  1271.      endif
  1272.  
  1273.      ifidn    <reg>,<si>    ;Restore si.
  1274.      pop    reg
  1275.      endif
  1276.  
  1277.      ifidn    <reg>,<SI>
  1278.      pop    reg
  1279.      endif
  1280.  
  1281.      ifidn    <reg>,<di>    ;Restore di.
  1282.      pop    reg
  1283.      endif
  1284.  
  1285.      ifidn    <reg>,<DI>
  1286.      pop    reg
  1287.      endif
  1288.  
  1289.      ifidn    <reg>,<ds>    ;Restore ds.
  1290.      pop    reg
  1291.      endif
  1292.  
  1293.      ifidn    <reg>,<DS>
  1294.      pop    reg
  1295.      endif
  1296.  
  1297.      ifidn    <reg>,<es>    ;Restore es.
  1298.      pop    reg
  1299.      endif
  1300.  
  1301.      ifidn    <reg>,<ES>
  1302.      pop    reg
  1303.      endif
  1304.  
  1305.     endm
  1306.     endm
  1307.  
  1308.  
  1309. endif    ;M_I386
  1310.  
  1311. ; Executable type
  1312. EXE_DOS        equ    1        ; MSDOS
  1313. EXE_DOS16RM    equ    2        ; Rational 286 DOS Extender
  1314. EXE_ZPM        equ    4        ; ZPM 286 DOS Extender
  1315. EXE_PHAR386    equ    8        ; Pharlap 386 DOS Extender
  1316. EXE_DOSX    equ    010h        ; DOSX 386 DOS Extender
  1317. EXE_WINDOWS    equ    020h        ; Windows 3
  1318. EXE_OS2        equ    040h        ; OS/2 1.x
  1319. EXE_SCOUNIX    equ    080h        ; SCO Unix
  1320. EXE_OS2_2    equ    100h        ; OS/2 2.0
  1321. EXE_WINDOWSNT    equ    200h        ; Windows NT
  1322.