home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / ASM / BCDASM.ZIP / BCDASM / INCLUDE / MODELT.INC < prev   
Encoding:
Text File  |  1997-06-03  |  5.3 KB  |  284 lines

  1.     %noincl
  2.     ; Memory-model dependent equates and macros
  3.  
  4. ; ----- True/false equates -----
  5.  
  6.     @isCodeNear    = (@CodeSize eq 0) and 1
  7.     @isDataNear    = (@DataSize eq 0) and 1
  8.     @isDataFar    = @isDataNear xor 1
  9.     @isStackNear    INSTR 1,@data,@stack
  10.     @isStackFar    = @isStackNear xor 1
  11.     ; Next line required for Borland C++
  12.     @isStackFar    = @isStackFar or @isDataFar
  13.     @is386        = (@Cpu shr 3) and 1    ; .386+ instructions
  14.     @isUse32    INSTR 1,@data,<FLAT>
  15.     @isWin32    = @isUse32        ; NOTE
  16.  
  17.     ife @isWin32
  18.     @isDirectionUp    = 0    ; Zero if
  19.     @isDSeqESeqSS    = 0    ;   don't know
  20.      else            ; Must be set for Win32
  21.     @isDirectionUp    = 1    ; 1: assume direction flag clear
  22.     @isDSeqESeqSS    = 1    ; 1: assume DS = ES = SS
  23.     endif
  24.  
  25.  
  26. ; ----- Text equates -----------
  27.  
  28.     @bptr equ <byte ptr>
  29.     @wptr equ <word ptr>
  30.     @uiptr equ <@uint ptr>
  31.     sh    equ <short>
  32.     if @isDSeqESeqSS
  33.     @ES   equ <>
  34.      else
  35.     @ES   equ <es:>
  36.     endif
  37.  
  38.  
  39.     ife @isUse32
  40.     @uint equ <word>
  41.     @dui equ <dw>
  42.     rax equ <ax>
  43.     rcx equ <cx>
  44.     rdx equ <dx>
  45.     rbx equ <bx>
  46.     rsp equ <sp>
  47.     rbp equ <bp>
  48.     rsi equ <si>
  49.     rdi equ <di>
  50.      else
  51.     @uint equ <dword>
  52.     @dui equ <dd>
  53.     rax equ <eax>
  54.     rcx equ <ecx>
  55.     rdx equ <edx>
  56.     rbx equ <ebx>
  57.     rsp equ <esp>
  58.     rbp equ <ebp>
  59.     rsi equ <esi>
  60.     rdi equ <edi>
  61.     endif
  62.  
  63.  
  64.     ; KLUDGES! to make TASM's extended CALL work with either
  65.     ; near or far data, as dataptr(segm::offs) isn't supported.
  66.     ; (Feel free to e-mail me a smart invoke macro.)
  67.     ;
  68.     ; e.g.:    call WriteZStr, @dsaddr(msg)
  69.     ;    call bcdCmpz, @dsr(si), 10
  70.     ;
  71.     if @isDataNear        ; With CALL:
  72.         @nullptr equ <0>
  73.     @dsaddr equ <offset>    ; push offset(msg)
  74.     @dsr    equ <>        ; push (si)
  75.     if @isStackNear
  76.     @ssr    equ <>
  77.     endif
  78.      else
  79.         @nullptr equ <0 0>
  80.     @dsaddr equ <ds offset> ; push ds offset(msg)
  81.     @dsr    equ <ds offset> ; push ds offset(si)  ; = push ds si
  82.     @ssr    equ <ss offset>
  83.     endif
  84.  
  85.  
  86. ; ----- Macros -----------------
  87.  
  88. @CODESEG MACRO
  89.     if @isCodeNear        ;; Near: segment name _TEXT
  90.     .code
  91.      else            ;; Segment name of far code
  92.     % .code  @fartext
  93.     endif
  94.     endm
  95.  
  96. ;
  97. ; Align code for speed,
  98. ; use if large-sized BCDs
  99. ;
  100. @alignn MACRO
  101.     align @WordSize
  102.     endm
  103.  
  104. ;
  105. ; Define procedure type (named @Type_procname)
  106. ;
  107. @ptype    MACRO procname, ahrgs:REST
  108.     @Type_&procname proctype ahrgs
  109.     endm
  110.  
  111. ;
  112. ; Define procedure type (named @Type_procname)
  113. ; and make procname public or extrn
  114. ;
  115. @proto  MACRO procname, ahrgs:REST
  116.     procname procdesc ahrgs
  117.     endm
  118.  
  119. ;
  120. ; Selective USES statement that picks unneeded items 
  121. ; off the push/pop list. It looks dangerous, and it is.
  122. ;
  123. @uses    MACRO savelist:VARARG
  124.     local ulist,delim,pn,saveit
  125.     ulist equ <>
  126.     delim equ <>
  127.     irp pn,<savelist>
  128.     ifnb <pn>
  129.      saveit = 1        ;; Default: preserve register
  130.      ifidni <pn>,<ds>    ;; Skip DS if neardata and nearstack
  131.        saveit = @isDataFar OR @isStackFar
  132.      elseifidni <pn>,<es>    ;; Skip ES unless 32-bit non-flat
  133.        if @isDSeqESeqSS
  134.        saveit = 0
  135.        else
  136.        saveit = @isUse32
  137.        endif
  138.      elseifidni <pn>,<rbx>    ;; Skip BX if 16-bit code
  139.        saveit = @isUse32
  140.      elseifidni <pn>,<rsi>    ;; Skip SI if 16-bit Pascal
  141.        saveit = @isUse32 OR ((@Interface and 7Fh) ne 4)
  142.      elseifidni <pn>,<rdi>    ;; Skip DI if 16-bit Pascal
  143.        saveit = @isUse32 OR ((@Interface and 7Fh) ne 4)
  144.      elseifidni <pn>,<rdx>    ;; Skip eDX, eCX, eAX
  145.        saveit = 0
  146.      elseifidni <pn>,<rcx>
  147.        saveit = 0
  148.      elseifidni <pn>,<rax>
  149.        saveit = 0
  150.      else
  151.        %out Bad USES parameter
  152.        .err
  153.      endif
  154.      if saveit
  155.        ulist CATSTR ulist,delim,<pn>
  156.        delim equ <,>
  157.      endif
  158.     endif
  159.     endm    ;; irp pn
  160.     ifnb <ulist>
  161.     % uses ulist
  162.     endif
  163.     endm    ;; macro
  164.  
  165. ;
  166. ; All segment register loads are
  167. ; made using @LDSEGM, @LDS, or @LES
  168. ;
  169. @LDSEGM MACRO dstseg, srcseg, genreg
  170.     local skip
  171.     if @isDSeqESeqSS    ;; Ignore ds:=ss,es:=ds,es:=ss
  172.      skip = 0
  173.      ifidni <dstseg>,<es>
  174.      skip = 1
  175.      elseifidni <dstseg>,<ds>
  176.      skip = 1
  177.      endif
  178.      if skip
  179.      ifidni <srcseg>,<ds>
  180.       exitm
  181.      elseifidni <srcseg>,<ss>
  182.       exitm
  183.      endif
  184.      endif
  185.     endif
  186.     ifnb <genreg>        ;; Move thru general register
  187.     mov   genreg, srcseg
  188.     mov   dstseg, genreg
  189.      else
  190.     push  srcseg
  191.     pop   dstseg
  192.     endif
  193.     endm
  194.  
  195. @LDS    MACRO genreg, mem
  196.     if @isDataNear
  197.     mov   genreg, mem
  198.      else
  199.     lds   genreg, mem
  200.     endif
  201.     endm
  202.  
  203. @LES    MACRO genreg, mem
  204.     if @isDataNear
  205.     mov   genreg, mem
  206.     @LDSEGM es, ds
  207.      else
  208.     les   genreg, mem
  209.     endif
  210.     endm
  211.  
  212.  
  213. @cld    MACRO
  214.     ife @isDirectionUp
  215.     cld
  216.     endif
  217.     endm
  218.  
  219. @shl    MACRO reg, count
  220.     shl   reg, count    ;; TASM REPTs if .8086
  221.     endm
  222.  
  223. @shr    MACRO reg, count
  224.     shr   reg, count    ;; TASM REPTs if .8086
  225.     endm
  226.  
  227. ;
  228. ; TASM's automatic stack frames use ENTER and LEAVE
  229. ; unless the 8086 processor is selected. For speed
  230. ; and/or size, it's better to use push/mov/sub.
  231. ;
  232.     pushstate
  233.     nowarn RES        ; Reserved word warnings off
  234. ENTERW    MACRO loc, lex
  235.     @enter loc, lex
  236.     endm
  237.  
  238. ENTERD    MACRO loc, lex
  239.     @enter loc, lex
  240.     endm
  241.  
  242. LEAVEW    MACRO
  243.     @leave
  244.     endm
  245.  
  246. LEAVED    MACRO
  247.     @leave
  248.     endm
  249.     popstate        ; Restore warning state
  250.  
  251. @enter    MACRO loc, lex
  252.     if lex eq 0
  253.     @fram = 2
  254.     push  rbp
  255.     mov   rbp, rsp
  256.     if loc gt 0
  257.      @fram = 3
  258.      if loc eq @WordSize
  259.      push  rax
  260.       else
  261.      sub   rsp, loc
  262.      endif
  263.         endif
  264.      else
  265.     @fram = 4
  266.     enter loc, lex
  267.     endif
  268.     endm
  269.  
  270. @leave    MACRO
  271.     .erre @fram        ;; leave without enter
  272.     if @fram and 4
  273.     leave
  274.      else
  275.     if @fram and 1
  276.     mov  rsp, rbp
  277.     endif
  278.     pop  rbp
  279.     endif
  280.     @fram = 0
  281.     endm
  282.  
  283. ; end of include
  284.