home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / Fortran.51 / DISK5 / CMACROS.IN$ / CMACROS.bin
Text File  |  1989-09-27  |  13KB  |  923 lines

  1. comment $
  2. cmacros - assembly macros for interfacing to HHLs
  3. (C)Copyright Microsoft Corp. 1984-1990
  4. $
  5. .xcref ??_out
  6. ??_out MACRO string
  7. ifndef ?QUIET
  8. %out string
  9. endif
  10. ENDM
  11. if1
  12. outif MACRO name,defval,onmsg,offmsg
  13. ifndef name
  14. ifb <defval>
  15. name=0
  16. else
  17. name=defval
  18. endif
  19. endif
  20. if name
  21. name=1
  22. ifnb <onmsg>
  23. ??_out <! onmsg>
  24. endif
  25. else
  26. ifnb <offmsg>
  27. ??_out <! offmsg>
  28. endif
  29. endif
  30. endm
  31. error MACRO msg
  32. bug
  33. %out E r r o r ----- msg
  34. ENDM
  35. ??_out <cMacros Version 1.06+>
  36. outif memS,0,<Small Model>
  37. outif memM,0,<Medium Model>
  38. outif memL,0,<Large Model>
  39. outif memC,0,<Compact Model>
  40. outif memH,0,<Huge Model>
  41. memMOD= memS + memM + memL + memC + memH
  42. if memMOD ne 1
  43. if memMOD eq 0
  44. memS= 1
  45. outif memS,0,<Small Model>
  46. else
  47. error <Must have only 1 memory model selected>
  48. endif
  49. endif
  50. sizeC= memM + memL + memH
  51. sizeD= memL + memC + (memH*2)
  52. outif ?DF,0,<No segments or groups will be defined>
  53. outif ?WIN,1,<Windows Support>
  54. outif ?PLM,1,<PLM calling convention>
  55. endif
  56. .XCREF
  57. .XCREF ?N,?AX,?AH,?AL,?BX,?BH
  58. .XCREF ?BL,?CX,?CH,?CL,?DX,?DH
  59. .XCREF ?DL,?SI,?DI,?ES,?DS,?BP
  60. .XCREF ?SP,?SS,?CS
  61. .XCREF ?RSL,?CPD,?argl,?argc,?BA
  62. .XCREF ?ACB,???,?PO
  63. .XCREF ?PAS,?PC
  64. .XCREF Uconcat,mPush,mPop
  65. .XCREF ?RI,?pp,?pp1,?al1
  66. .XCREF ?aD,?AP,?Atal,?pd,?dd,?dd1,?ex1
  67. .XCREF ?pg,?pg1,?aloc,?cs1,?cs2
  68. .XCREF ?lb1,?lblpu
  69. .XCREF ?DF,?PLM,?WIN,?IA,?PU,?ADJ
  70. .CREF
  71. ?RSL = 0
  72. ?CPD = 0
  73. ?ArgL = 0
  74. ?ArgC = 0
  75. ?BA = 0
  76. ?ACB = 0
  77. ??? = 0
  78. ?PO = 0
  79. ?PAS = 0
  80. ?PC = 0
  81. ?IA = 0
  82. ?PU = 0
  83. ?ADJ = 0
  84. ?lblpu = 0
  85. ?N = 0000000000000000B
  86. ?AX = 0000000000000011B
  87. ?AH = 0000000000000001B
  88. ?AL = 0000000000000010B
  89. ?BX = 0000000000001100B
  90. ?BH = 0000000000000100B
  91. ?BL = 0000000000001000B
  92. ?CX = 0000000000110000B
  93. ?CH = 0000000000010000B
  94. ?CL = 0000000000100000B
  95. ?DX = 0000000011000000B
  96. ?DH = 0000000001000000B
  97. ?DL = 0000000010000000B
  98. ?SI = 0000000100000000B
  99. ?DI = 0000001000000000B
  100. ?ES = 0000010000000000B
  101. ?DS = 0000100000000000B
  102. ?BP = 0001000000000000B
  103. ?SP = 0010000000000000B
  104. ?SS = 0100000000000000B
  105. ?CS = 1000000000000000B
  106. uconcat macro n1,n2,o1,o2,p1,p2
  107. n1&n2 o1&o2 p1&p2
  108. endm
  109. mpush macro rV
  110. irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
  111. if rV AND ?&&x
  112. push x
  113. endif
  114. endm
  115. endm
  116. mpop macro rV
  117. irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
  118. if rV AND ?&&x
  119. pop x
  120. endif
  121. endm
  122. endm
  123. SAVE macro rL
  124. ?RSL = 0
  125. ?RI ?RSL,<rL>
  126. endm
  127. smashes macro n,rL
  128. .xcref
  129. .xcref ?SM&n
  130. .cref
  131. ?SM&n = 0
  132. ?RI ?SM&n,<rL>
  133. endm
  134. ?RI macro n,rL
  135. irp x,<rL>
  136. ifdef ?&&x
  137. n = n or ?&&x
  138. endif
  139. endm
  140. endm
  141. parmB macro nl
  142. ?pp <&nL>,<byte>,2,1
  143. endm
  144. parmW macro nl
  145. ?pp <&nL>,<word>,2,2
  146. endm
  147. parmD macro nl
  148. ife ?PLM
  149. irp x,<nL>
  150. ?pp <&&x>,<DWORD>,0,4
  151. ?pp <Off_&&x>,<WORD>,2,2
  152. ?pp <Seg_&&x>,<WORD>,2,2
  153. endm
  154. else
  155. irp x,<nL>
  156. ?pp <Seg_&&x>,<WORD>,2,2
  157. ?pp <Off_&&x>,<WORD>,2,2
  158. ?pp <&&x>,<DWORD>,0,4
  159. endm
  160. endif
  161. endm
  162. parmQ macro nl
  163. ?pp <&nL>,<QWORD>,8,8
  164. endm
  165. parmT macro nl
  166. ?pp <&nL>,<TBYTE>,10,10
  167. endm
  168. if sizeC
  169. parmCP macro nl
  170. parmD <nl>
  171. endm
  172. else
  173. parmCP macro nl
  174. parmW <nl>
  175. endm
  176. endif
  177. if sizeD
  178. parmDP macro nl
  179. parmD <nl>
  180. endm
  181. else
  182. parmDP macro nl
  183. parmW <nl>
  184. endm
  185. endif
  186. ?pp macro nL,t,l,s
  187. if ?CPD
  188. .xcref
  189. ife ?PLM
  190. irp x,<nL>
  191. ?pp1 x,<t>,%?PO,%?adj,%(?PO+?adj)
  192. ?PO = ?PO + l
  193. .xcref ?T&&x
  194. ?T&&x = s
  195. endm
  196. else
  197. irp x,<nL>
  198. ?PO = ?PO + l
  199. ?pp1 x,<t>,%?PO,%?adj,%(?PO+?adj)
  200. .xcref ?T&&x
  201. ?T&&x = s
  202. endm
  203. endif
  204. .cref
  205. else
  206. %out Parm(s) "&nl" declared outside proc def.
  207. endif
  208. endm
  209. ?pp1 macro n,t,o,a,b
  210. ife ?PLM
  211. n equ t ptr [bp+b]
  212. else
  213. n equ t ptr [bp+a+?PO-o]
  214. endif
  215. endm
  216. localB macro nL
  217. ?aLoc <&nL>,<BYTE ptr>,1,1,0
  218. endm
  219. localW macro nL
  220. ?aLoc <&nL>,<WORD PTR>,2,2,1
  221. endm
  222. localD macro nL
  223. irp x,<nL>
  224. ?aLoc <Seg_&&x>,<WORD PTR>,2,2,1
  225. ?aLoc <Off_&&x>,<WORD PTR>,2,2,1
  226. ?aLoc <&&x>,<DWORD PTR>,0,4,1
  227. endm
  228. endm
  229. localQ macro nL
  230. ?aLoc <&nL>,<QWORD PTR>,8,8,1
  231. endm
  232. localT macro nL
  233. ?aLoc <&nL>,<TBYTE PTR>,10,10,1
  234. endm
  235. if sizeC
  236. localCP macro nL
  237. localD <nL>
  238. endm
  239. else
  240. localCP macro nL
  241. localW <nL>
  242. endm
  243. endif
  244. if sizeD
  245. localDP macro nL
  246. localD <nL>
  247. endm
  248. else
  249. localDP macro nL
  250. localW <nL>
  251. endm
  252. endif
  253. localV macro n,a
  254. ?aLoc <&n>,<BYTE PTR>,%(&a),0,1
  255. endm
  256. ?aLoc macro nL,t,l,s,a
  257. if ?CPD
  258. .xcref
  259. ??? = ??? + l
  260. if a
  261. ??? = ((??? + 1) AND 0FFFEH)
  262. endif
  263. irp x,<nL>
  264. ?aL1 x,<t>,%???
  265. .xcref ?T&&x
  266. ?T&&x = s
  267. endm
  268. .cref
  269. else
  270. %out Locals "&nl" declared outside procedure def.
  271. endif
  272. endm
  273. ?aL1 macro n,t,o
  274. if ?IA
  275. n equ t [bp-?IA-o]
  276. else
  277. n equ t [bp-o]
  278. endif
  279. endm
  280. globalB macro n,i,s
  281. ?aD <n>,1
  282. ?dd n,1,<BYTE>,<DB>,<i>,<s>
  283. endm
  284. globalW macro n,i,s
  285. ?aD <n>,2
  286. ?dd n,1,<WORD>,<DW>,<i>,<s>
  287. endm
  288. globalD macro n,i,s
  289. ?aD <n>,4
  290. ?dd n,1,<DWORD>,<DD>,<i>,<s>
  291. endm
  292. globalQ macro n,i,s
  293. ?aD <n>,8
  294. ?dd n,1,<QWORD>,<DQ>,<i>,<s>
  295. endm
  296. globalT macro n,i,s
  297. ?aD <n>,10
  298. ?dd n,1,<TBYTE>,<DT>,<i>,<s>
  299. endm
  300. if sizeC
  301. globalCP macro n,i,s
  302. globalD n,<i>,<s>
  303. endm
  304. else
  305. globalCP macro n,i,s
  306. globalW n,<i>,<s>
  307. endm
  308. endif
  309. if sizeD
  310. globalDP macro n,i,s
  311. globalD n,<i>,<s>
  312. endm
  313. else
  314. globalDP macro n,i,s
  315. globalW n,<i>,<s>
  316. endm
  317. endif
  318. staticB macro n,i,s
  319. ?aD <n>,1
  320. ?dd n,0,<BYTE>,<DB>,<i>,<s>
  321. endm
  322. staticW macro n,i,s
  323. ?aD <n>,2
  324. ?dd n,0,<WORD>,<DW>,<i>,<s>
  325. endm
  326. staticD macro n,i,s
  327. ?aD <n>,4
  328. ?dd n,0,<DWORD>,<DD>,<i>,<s>
  329. endm
  330. staticQ macro n,i,s
  331. ?aD <n>,8
  332. ?dd n,0,<QWORD>,<DQ>,<i>,<s>
  333. endm
  334. staticT macro n,i,s
  335. ?aD <n>,10
  336. ?dd n,0,<TBYTE>,<DT>,<i>,<s>
  337. endm
  338. if sizeC
  339. staticCP macro n,i,s
  340. staticD n,<i>,<s>
  341. endm
  342. else
  343. staticCP macro n,i,s
  344. staticW n,<i>,<s>
  345. endm
  346. endif
  347. if sizeD
  348. staticDP macro n,i,s
  349. staticD n,<i>,<s>
  350. endm
  351. else
  352. staticDP macro n,i,s
  353. staticW n,<i>,<s>
  354. endm
  355. endif
  356. ?dd macro n,p,t,d,i,s
  357. ife ?PLM
  358. n label t
  359. ?dd1 _&n,p,<d>,<i>,<s>
  360. else
  361. ?dd1 n,p,<d>,<i>,<s>
  362. endif
  363. endm
  364. ?dd1 macro n,p,d,i,s
  365. if p
  366. PUBLIC n
  367. endif
  368. ifb <s>
  369. n d i
  370. else
  371. ifb <i>
  372. n d s DUP (?)
  373. else
  374. n d s DUP (i)
  375. endif
  376. endif
  377. endm
  378. externB macro nL
  379. ?ex1 <&nL>,1,<BYTE>
  380. endm
  381. externW macro nL
  382. ?ex1 <&nL>,2,<WORD>
  383. endm
  384. externD macro nL
  385. ?ex1 <&nL>,4,<DWORD>
  386. endm
  387. externQ macro nL
  388. ?ex1 <&nL>,8,<QWORD>
  389. endm
  390. externT macro nL
  391. ?ex1 <&nL>,10,<TBYTE>
  392. endm
  393. externNP macro nL
  394. ?ex1 <&nL>,2,<NEAR>
  395. endm
  396. externFP macro nL
  397. ?ex1 <&nL>,4,<FAR>
  398. endm
  399. if sizeC
  400. externP macro nL
  401. ?ex1 <&nL>,4,<FAR>
  402. endm
  403. else
  404. externP macro nL
  405. ?ex1 <&nL>,2,<NEAR>
  406. endm
  407. endif
  408. if sizeC
  409. externCP macro nL
  410. ?ex1 <&nL>,4,<DWORD>
  411. endm
  412. else
  413. externCP macro nL
  414. ?ex1 <&nL>,2,<WORD>
  415. endm
  416. endif
  417. if sizeD
  418. externDP macro nL
  419. ?ex1 <&nL>,4,<DWORD>
  420. endm
  421. else
  422. externDP macro nL
  423. ?ex1 <&nL>,2,<WORD>
  424. endm
  425. endif
  426. ?ex1 macro nL,s,d
  427. irp x,<nL>
  428. .xcref
  429. .xcref ?T&&x
  430. .cref
  431. ?T&&x = s
  432. ife ?PLM
  433. extrn _&&x:&d
  434. x equ _&&x
  435. else
  436. extrn x:&d
  437. endif
  438. endm
  439. endm
  440. labelB macro nL
  441. ?lb1 <&nL>,1,<BYTE>
  442. endm
  443. labelW macro nL
  444. ?lb1 <&nL>,2,<WORD>
  445. endm
  446. labelD macro nL
  447. ?lb1 <&nL>,4,<DWORD>
  448. endm
  449. labelQ macro nL
  450. ?lb1 <&nL>,8,<QWORD>
  451. endm
  452. labelT macro nL
  453. ?lb1 <&nL>,10,<TBYTE>
  454. endm
  455. labelNP macro nL
  456. ?lb1 <&nL>,2,<NEAR>
  457. endm
  458. labelFP macro nL
  459. ?lb1 <&nL>,4,<FAR>
  460. endm
  461. if sizeC
  462. labelP macro nL
  463. ?lb1 <&nL>,4,<FAR>
  464. endm
  465. else
  466. labelP macro nL
  467. ?lb1 <&nL>,2,<NEAR>
  468. endm
  469. endif
  470. if sizeC
  471. labelCP macro nL
  472. ?lb1 <&nL>,4,<DWORD>
  473. endm
  474. else
  475. labelCP macro nL
  476. ?lb1 <&nL>,2,<WORD>
  477. endm
  478. endif
  479. if sizeD
  480. labelDP macro nL
  481. ?lb1 <&nL>,4,<DWORD>
  482. endm
  483. else
  484. labelDP macro nL
  485. ?lb1 <&nL>,2,<WORD>
  486. endm
  487. endif
  488. ?lb1 macro nL,s,d
  489. ?lblpu = 0
  490. irp x,<nL>
  491. ifidn <x>,<PUBLIC>
  492. ?lblpu = 1
  493. else
  494. .xcref
  495. .xcref ?T&&x
  496. .cref
  497. ?T&&x = s
  498. ife ?PLM
  499. if ?lblpu
  500. public _&&x
  501. endif
  502. _&&x label &d
  503. x equ _&&x
  504. else
  505. if ?lblpu
  506. public x
  507. endif
  508. x label &d
  509. endif
  510. endif
  511. endm
  512. endm
  513. defB macro nL
  514. ?aD <&nL>,1
  515. endm
  516. defW macro nL
  517. ?aD <&nL>,2
  518. endm
  519. defD macro nL
  520. ?aD <&nL>,4
  521. endm
  522. defQ macro nL
  523. ?aD <&nL>,8
  524. endm
  525. defT macro nL
  526. ?aD <&nL>,10
  527. endm
  528. if sizeC
  529. defCP macro nL
  530. defD <nL>
  531. endm
  532. else
  533. defCP macro nL
  534. defW <nL>
  535. endm
  536. endif
  537. if sizeD
  538. defDP macro nL
  539. defD <nL>
  540. endm
  541. else
  542. defDP macro nL
  543. defW <nL>
  544. endm
  545. endif
  546. ?aD macro nL,s
  547. irp x,<nL>
  548. .xcref
  549. .xcref ?T&&x
  550. .cref
  551. ?T&&x = s
  552. endm
  553. endm
  554. regPtr macro n,S,O
  555. .xcref
  556. .xcref ?T&n,?SR&n,?OR&n
  557. .cref
  558. ?T&n = 0FFFFH
  559. ?SR&n = 0
  560. ?RI ?SR&n,<&S>
  561. ?OR&n = 0
  562. ?RI ?OR&n,<&O>
  563. endm
  564. arg macro aL
  565. irp x,<aL>
  566. ?argc = ?argc + 1
  567. ?Atal <x>,%?argc
  568. endm
  569. endm
  570. ?Atal macro n,i
  571. .xcref
  572. .xcref ?ALI&i
  573. .cref
  574. ?ALI&i ¯o
  575. ?AP n
  576. &endm
  577. endm
  578. ?AP macro n
  579. ?argl = ?argl + 2
  580. ifdef ?T&n
  581. ife ?T&n-1
  582. push word ptr (n)
  583. exitm
  584. endif
  585. ife ?T&n-2
  586. push n
  587. exitm
  588. endif
  589. ife ?T&n-4
  590. push word ptr (n)+2
  591. push word ptr (n)
  592. ?argl = ?argl + 2
  593. exitm
  594. endif
  595. ife ?T&n-8
  596. push word ptr (n)+6
  597. push word ptr (n)+4
  598. push word ptr (n)+2
  599. push word ptr (n)
  600. ?argl = ?argl + 6
  601. exitm
  602. endif
  603. ife ?T&n-0FFFFH
  604. mpush %(?SR&n),1
  605. mpush %(?OR&n),1
  606. ?argl = ?argl + 2
  607. exitm
  608. endif
  609. ife ?T&n
  610. push word ptr (n)
  611. exitm
  612. endif
  613. endif
  614. push n
  615. endm
  616. ife ?PLM
  617. ccall macro n,a,sleaze
  618. ifnb <a>
  619. Arg <a>
  620. endif
  621. ifdef ?SM&n
  622. ?RSL = ?RSL AND ?SM&n
  623. endif
  624. mpush %?RSL
  625. ?argl = 0
  626. ?ACB = ?argc
  627. rept ?argc
  628. uconcat <?ALI>,%?ACB
  629. uconcat <purge>,,<?ALI>,%?ACB
  630. ?ACB = ?ACB - 1
  631. endm
  632. ife ?PLM
  633. ifb <sleaze>
  634. call _&n
  635. else
  636. call n
  637. endif
  638. else
  639. call n
  640. endif
  641. if ?argl
  642. add sp,?argl
  643. endif
  644. mpop %?RSL
  645. ?RSL = 0
  646. ?argc = 0
  647. ?argl = 0
  648. endm
  649. else
  650. ccall macro n,a
  651. ifnb <a>
  652. Arg <a>
  653. endif
  654. ifdef ?SM&n
  655. ?RSL = ?RSL AND ?SM&n
  656. endif
  657. mpush %?RSL
  658. ?argl = 0
  659. ?ACB = 1
  660. rept ?argc
  661. uconcat <?ALI>,%?ACB
  662. uconcat <purge>,,<?ALI>,%?ACB
  663. ?ACB = ?ACB + 1
  664. endm
  665. ife ?PLM
  666. call _&n
  667. else
  668. call n
  669. endif
  670. mpop %?RSL
  671. ?RSL = 0
  672. ?argc = 0
  673. ?argl = 0
  674. endm
  675. endif
  676. cProc macro n,cl,s
  677. ?pd n,<cl>,<s>,4
  678. endm
  679. ?pd macro n,c,a,i
  680. if ?CPD
  681. ?UTPE
  682. endif
  683. ?CPD = 1
  684. ??? = 0
  685. ?argc = 0
  686. ?BA = 0
  687. ?PO = 0
  688. ?PU = 0
  689. ?IA = 0
  690. ?adj = i
  691. ?PAS = 0
  692. ifnb <a>
  693. ?RI ?PAS,<a>
  694. endif
  695. ?PC = sizeC
  696. irp x,<c>
  697. ifidn <x>,<FAR>
  698. ?PC = 1
  699. endif
  700. ifidn <x>,<NEAR>
  701. ?PC = 0
  702. endif
  703. ifidn <x>,<PUBLIC>
  704. ?PU = 1
  705. endif
  706. endm
  707. if ?PC
  708. if ?WIN
  709. ?IA = 2
  710. endif
  711. ?adj = ?adj + 2
  712. endif
  713. ife ?PLM
  714. ife ?PC
  715. n label near
  716. else
  717. n label far
  718. endif
  719. ?pg <_&n>,%?PU,%?PC,%?PAS
  720. else
  721. ?pg <n>,%?PU,%?PC,%?PAS
  722. endif
  723. endm
  724. ?pg macro n,p,c,a
  725. .xcref
  726. cBegin ¯o g
  727. .xcref
  728. ?pg1 <n>,c,a,%?PO
  729. ?CPD = 0
  730. ?argc = 0
  731. ?BA = 1
  732. ??? = (???+1) AND 0FFFEH
  733. if p
  734. PUBLIC n
  735. endif
  736. ife c
  737. n proc NEAR
  738. else
  739. n proc FAR
  740. endif
  741. ifidn <g>,<nogen>
  742. if ???+?PO+a
  743. ??_out <cBegin - nogen>
  744. endif
  745. else
  746. if ?IA
  747. mov ax,ds
  748. nop
  749. inc bp
  750. push bp
  751. mov bp,sp
  752. push ds
  753. mov ds,ax
  754. else
  755. push bp
  756. mov bp,sp
  757. endif
  758. if ???
  759. sub sp,???
  760. endif
  761. mPush a,1
  762. endif
  763. .cref
  764. purge cBegin
  765. &endm
  766. ?UTPE ¯o
  767. %out Unterminated Procedure Definition: "&n"
  768. &endm
  769. endm
  770. ?pg1 macro n,c,a,o
  771. .xcref
  772. cEnd ¯o g
  773. .xcref
  774. ?BA = 0
  775. ifidn <g>,<nogen>
  776. if o+a
  777. ??_out <cEnd - nogen>
  778. endif
  779. else
  780. mPop a,1
  781. if ?IA
  782. sub bp,2
  783. mov sp,bp
  784. pop ds
  785. pop bp
  786. dec bp
  787. else
  788. ifdif <g>,<nolocals>
  789. mov sp,bp
  790. endif
  791. pop bp
  792. endif
  793. ife ?PLM
  794. ret
  795. else
  796. ret o
  797. endif
  798. endif
  799. n endp
  800. .cref
  801. purge cEnd
  802. &endm
  803. .cref
  804. endm
  805. assumes macro s,g
  806. local assumed
  807. assumed = 0
  808. ifidn <code>,<g>
  809. assume s&:_TEXT
  810. assumed = 1
  811. endif
  812. ifidn <CODE>,<g>
  813. assume s&:_TEXT
  814. assumed = 1
  815. endif
  816. ifidn <data>,<g>
  817. assume s&:dgroup
  818. assumed = 1
  819. endif
  820. ifidn <DATA>,<g>
  821. assume s&:dgroup
  822. assumed = 1
  823. endif
  824. ife assumed
  825. assume s&:&g
  826. endif
  827. endm
  828. createSeg macro n,ln,a,co,cl,grp
  829. ifnb <grp>
  830. addSeg grp,n
  831. endif
  832. ifnb <cl>
  833. n segment a co '&cl'
  834. else
  835. n segment a co
  836. endif
  837. n ends
  838. ?cs1 <n>,<ln>
  839. endm
  840. if1
  841. ASMpass=1
  842. else
  843. ASMpass=2
  844. endif
  845. addSeg macro grp,seg
  846. ifndef def_&grp
  847. def_&grp= 0
  848. endif
  849. if def_&grp ne ASMpass
  850. add_&grp ¯o s
  851. in_&grp <seg>,s
  852. &endm
  853. in_&grp ¯o sl,s
  854. ifb <s>
  855. grp group sl
  856. else
  857. add_&grp ¯o ns
  858. in_&grp <sl,s>,ns
  859. &endm
  860. endif
  861. &endm
  862. def_&grp=ASMpass
  863. else
  864. add_&grp seg
  865. endif
  866. endm
  867. defGrp macro nam
  868. addSeg nam
  869. endm
  870. ?cs1 macro n,ln
  871. begin&ln ¯o
  872. ?cs2 <n>
  873. n segment
  874. &endm
  875. endm
  876. ?cs2 macro n
  877. sEnd ¯o
  878. n ends
  879. &endm
  880. endm
  881. sBegin macro ln
  882. begin&ln
  883. endm
  884. ife ?DF
  885. createSeg _TEXT,code,word,public,CODE
  886. createSeg _DATA,data,word,public,DATA,DGROUP
  887. defGrp DGROUP
  888. codeOFFSET equ OFFSET _TEXT:
  889. dataOFFSET equ OFFSET DGROUP:
  890. endif
  891. errnz macro x
  892. if2
  893. if x
  894. errnz1 <x>,%(x)
  895. endif
  896. endif
  897. endm
  898. errnz1 macro x1,x2
  899. = *ERRNZ* x1 = x2
  900. endm
  901. errn$ macro l,x
  902. errnz <OFFSET $ - OFFSET l x>
  903. ENDM
  904.  
  905. ; Extra macros for the c-runtime package
  906. ;
  907. ; Macro for calling another run-time-library function.
  908. ; Does a PUSH CS/CALL NEAR in compact/large models, except
  909. ; for QuickC.        --PHG, 5-24-89
  910.  
  911. callcrt MACRO    funcname
  912. ifdef _QC2
  913.     call    funcname
  914. else
  915.   if sizeC
  916.     push    cs
  917.     call    near ptr (funcname)
  918.   else
  919.     call    funcname
  920.   endif
  921. endif
  922. ENDM
  923.