home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 2.ddi / OWLSRC.EXE / CSCAPE / SOURCE / PCDECL.MAC < prev    next >
Encoding:
Text File  |  1989-07-16  |  7.3 KB  |  324 lines

  1. ; pcdecl.mac
  2. ;
  3. ; 3/3/88 by Ted
  4. ;
  5. ; Macros for PC assembly code.
  6. ;
  7. ; Copyright (c) 1988, 1989 Oakland Group Inc.
  8. ; ALL RIGHTS RESERVED
  9. ;
  10. ; There are a few variables in this file which select the memory model
  11. ; for which the code will be assembled.
  12. ;
  13. ; MAKE SURE THAT THE CORRECT MEMORY MODEL AND COMPILER ARE SELECTED.
  14. ;
  15. ;------------------------REVISION HISTORY--------------------------------------;
  16. ;     1/19/89 Ted    Changed segment names for Lattice 3.0
  17. ;      6/30/89 ted    Added Phar Lap support.
  18. ;------------------------------------------------------------------------------;
  19. ;-- ** Compiler selection ** -------;
  20. MSFT = 0
  21. TURB = 0
  22. LATC = 0
  23. MWHC = 0
  24. PHAR = 0
  25. ;-- ** Memory model selection ** ---;
  26. SMALL_MODEL    =    0
  27. LPROG_MODEL    =    0
  28. LDATA_MODEL    =    0
  29. LARGE_MODEL    =    0
  30. ;-----------------------------------;
  31. IFDEF M1        ; Microsoft C 5.1
  32.     MSFT = 1
  33. ENDIF
  34. IFDEF M5        ; Microsoft C 5.0
  35.     MSFT = 1
  36. ENDIF
  37. IFDEF M4        ; Microsoft C 4.0
  38.     MSFT = 1
  39. ENDIF
  40. ;-------------------;
  41. IF  MSFT
  42.     IFDEF SMOD
  43.         SMALL_MODEL = 1
  44.     ENDIF
  45.     IFDEF MMOD
  46.         LPROG_MODEL = 1
  47.     ENDIF
  48.     IFDEF CMOD
  49.         LDATA_MODEL = 1
  50.     ENDIF
  51.     IFDEF LMOD
  52.         LARGE_MODEL = 1
  53.     ENDIF
  54. ENDIF
  55. ;-----------------------------------;
  56. IFDEF T2        ; Borland Turbo C 2.0
  57.     TURB = 1
  58. ENDIF
  59. ;-------------------;
  60. IF TURB
  61.     IFDEF sMOD
  62.         SMALL_MODEL = 1
  63.     ENDIF
  64.     IFDEF mMOD
  65.         LPROG_MODEL = 1
  66.     ENDIF
  67.     IFDEF cMOD
  68.         LDATA_MODEL = 1
  69.     ENDIF
  70.     IFDEF lMOD
  71.         LARGE_MODEL = 1
  72.     ENDIF
  73. ENDIF
  74. ;-----------------------------------;
  75. ; For Lattice -
  76. IFDEF LC        ; Lattice C 4.0
  77.   IF (LC GE 50)
  78.     LATC = 1
  79.   ENDIF
  80. ENDIF
  81. ;-------------------;
  82. IF LATC
  83.     IFDEF sMOD
  84.         SMALL_MODEL = 1
  85.     ENDIF
  86.     IFDEF pMOD
  87.         LPROG_MODEL = 1
  88.     ENDIF
  89.     IFDEF dMOD
  90.         LDATA_MODEL = 1
  91.     ENDIF
  92.     IFDEF lMOD
  93.         LARGE_MODEL = 1
  94.     ENDIF
  95. ENDIF
  96. ;-----------------------------------;
  97. IFDEF MW        ; MetaWare High C 1.4
  98.     MWHC = 1
  99. ENDIF
  100. ;-------------------;
  101. IF MWHC
  102.     PHAR = 1
  103.         SMALL_MODEL = 1
  104. ENDIF
  105. ;------------------------------------------------------------------------------;
  106. ;-- ** Set up FAR_DATA and FAR_PROC macros
  107. ;-----------------------------------;
  108. IF LARGE_MODEL OR LDATA_MODEL
  109.     FAR_DATA = 1
  110. ELSE
  111.     FAR_DATA = 0
  112. ENDIF
  113.  
  114. IF LARGE_MODEL OR LPROG_MODEL
  115.     FAR_PROC = 1
  116. ELSE
  117.     FAR_PROC = 0
  118. ENDIF
  119. ;------------------------------------------------------------------------------;
  120. ;-- ** Set up "defdseg" and "defpseg" macros ** --;
  121. ;-------------------------------------------------;
  122. IF MWHC
  123.     defdseg macro segname
  124.         DSEG    MACRO    
  125.             DGROUP    GROUP    segname
  126.             segname    SEGMENT    DWORD PUBLIC USE32 'DATA'
  127.             ASSUME    DS:DGROUP
  128.             ASSUME    ES:DGROUP
  129.             ASSUME    FS:DGROUP
  130.             ASSUME    GS:DGROUP
  131.         ENDM
  132.     ;
  133.         ENDDS    MACRO
  134.             segname    ENDS
  135.         ENDM
  136.     endm
  137.     ;-----------------------------------;
  138.     defpseg macro segname
  139.         PSEG    MACRO
  140.             CGROUP    GROUP    segname
  141.             segname SEGMENT DWORD PUBLIC USE32 'CODE'
  142.             ASSUME    CS:CGROUP
  143.         ENDM
  144.  
  145.         ENDPS    MACRO
  146.             segname    ENDS
  147.         ENDM
  148.     endm
  149. ELSE        ;; not MWHC
  150.     defdseg macro segname
  151.         DSEG    MACRO    
  152.             DGROUP    GROUP    segname
  153.             segname    SEGMENT    WORD PUBLIC 'DATA'
  154.             ASSUME    DS:DGROUP
  155.             ASSUME    ES:DGROUP
  156.         ENDM
  157.  
  158.         ENDDS    MACRO
  159.             segname    ENDS
  160.         ENDM
  161.     endm
  162.     ;-----------------------------------;
  163.     defpseg macro segname
  164.         IF (FAR_PROC)
  165.             PSEG    MACRO
  166.                 segname&_TEXT    SEGMENT BYTE PUBLIC 'CODE'
  167.                 ASSUME    CS:&segname&_TEXT
  168.             ENDM
  169.  
  170.             ENDPS    MACRO
  171.                 segname&_TEXT    ENDS
  172.             ENDM
  173.         ELSE
  174.             PSEG    MACRO
  175.                 _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  176.                 ASSUME    CS:_TEXT
  177.             ENDM
  178.  
  179.             ENDPS    MACRO
  180.                 _TEXT    ENDS
  181.             ENDM
  182.         ENDIF
  183.     endm
  184. ENDIF
  185. ;------------------------------------------------------------------------------;
  186. ;-- ** Private segment Near/Far selection; define "pseg" macro ** ---;
  187. ;--------------------------------------------------------------------;
  188. donear    = 1
  189. dofar    = 0
  190. bad        = 0
  191. ;-----------------------------------;
  192. IF (MSFT) OR (TURB) OR (LATC) OR (MWHC)
  193.     IFDEF DIGSEG
  194.         defpseg PCDIG
  195.         DIGPRIV equ donear
  196.         OWLPRIV equ bad        ; If digseg defined, no owl funcs allowed in source.
  197.     ELSE
  198.         IFDEF OWLSEG
  199.             defpseg OWL
  200.             OWLPRIV equ donear
  201.             DIGPRIV equ donear    ; If owlseg defined, it may include dig code.
  202.         ELSE
  203.             defpseg ASM
  204.             OWLPRIV equ dofar
  205.             DIGPRIV equ dofar    ; If no private seg defined, use far procs.
  206.         ENDIF
  207.     ENDIF
  208. ENDIF
  209. ;------------------------------------------------------------------------------;
  210. ;-- ** Define "dseg" and "msname" macros ** ---;
  211. ;----------------------------------------------;
  212. IF (MSFT) OR (TURB)
  213.     defdseg _DATA
  214.  
  215.     msname macro word1, msnam, word2
  216.         word1 _&msnam word2
  217.     endm
  218. ENDIF
  219. IF (LATC) OR (MWHC)
  220.     defdseg DATA
  221.  
  222.     msname macro word1, msnam, word2
  223.         word1 msnam word2
  224.     endm
  225. ENDIF
  226. ;------------------------------------------------------------------------------;
  227. ;-- ** Define other macros ** --;
  228. ;-------------------------------;
  229. IF (PHAR)
  230.     LOWMEG = 34h
  231.     near_offs       equ     8               ; Offset into stack frame for near
  232.     far_offs        equ     12              ; Offset into stack frame for far
  233. ELSE
  234.     near_offs       equ     4               ; Offset into stack frame for near
  235.     far_offs        equ     6               ; Offset into stack frame for far
  236. ENDIF
  237. ;-----------------------------------;
  238. pubproc macro   arg1, arg2, arg3           ;procedure header macro
  239.  
  240.     IFDIF <DIGPRIV>, <arg1>    ; if arg 1 is not DIGPRIV
  241.     IFDIF <OWLPRIV>, <arg1>    ; if arg 1 is not OWLPRIV either
  242.         pubprocsub dofar, arg1, <arg2>
  243.     ELSE
  244.         pubprocsub arg1, arg2, <arg3>    ; arg 1 is OWLPRIV
  245.     ENDIF
  246.     ELSE
  247.         pubprocsub arg1, arg2, <arg3>    ; arg 1 is DIGPRIV
  248.     ENDIF
  249. endm
  250. ;------------------;
  251. pubprocsub macro   makenear, proc_name, args
  252.  
  253.     IF FAR_PROC AND NOT makenear ;; if makenear is not 0 that means a near function
  254.         count = far_offs
  255.     ELSE
  256.         count = near_offs
  257.     ENDIF
  258.     irp tag,<args>
  259.         IFDIF <tag>, <dptr>
  260.         tag = count
  261.         IF (PHAR)
  262.             count = count + 4
  263.         ELSE
  264.             count = count + 2
  265.         ENDIF
  266.         ELSE
  267.             IF FAR_DATA
  268.             count = count + 2    ;; far address takes a 2-byte seg after offset
  269.             ENDIF
  270.         ENDIF
  271.     endm
  272.  
  273.     IF FAR_PROC AND NOT makenear ;; if makenear is not 0 that means a near function
  274.         msname <> proc_name <proc far>
  275.     ELSE
  276.         msname <> proc_name <proc near>
  277.     ENDIF
  278.         msname <public> proc_name <>
  279. endm
  280. ;-----------------------------------;
  281. endproc    macro   proc_name               ;end procedure macro
  282.     msname <> proc_name <endp>
  283. endm
  284. ;-----------------------------------;
  285. extproc    macro   proc_name               ;external procedure declaration
  286.     IF FAR_PROC
  287.         msname extrn proc_name <:far>
  288.     ELSE
  289.         msname extrn proc_name <:near>
  290.     ENDIF
  291. endm
  292. ;-----------------------------------;
  293. ocall    macro   proc_name               ;call public function
  294.     IF FAR_PROC
  295.         msname <call far ptr> proc_name <>
  296.     ELSE
  297.         msname call proc_name <>
  298.     ENDIF
  299. endm
  300. ;-----------------------------------;
  301. pubdata macro   data_name, dsize           ;public data declaration
  302.     msname <> data_name <label dsize>
  303.     msname public data_name <>
  304. endm
  305. ;-----------------------------------;
  306. extdata macro   data_name, dsize           ;extrn data declaration
  307.     msname extrn data_name <:&dsize>
  308.     msname <data_name&_ext equ> data_name <>
  309. endm
  310. ;-----------------------------------;
  311. pushm    macro   regs
  312.     irp     r,<regs>
  313.     push    r                           ;push register
  314.     endm
  315. endm
  316. ;-----------------------------------;
  317. popm    macro   regs
  318.     irp        r,<regs>
  319.     pop        r                           ;pop register
  320.     endm
  321.  endm
  322. ;------------------------------------------------------------------------------;
  323.  
  324.