home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / OWLSCR / PCDECL.MAC < prev    next >
Encoding:
Text File  |  1990-12-07  |  8.9 KB  |  382 lines

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