cmacros.inc
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:14k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. comment $
  2. cmacros - assembly macros for interfacing to HHLs
  3. (C)Copyright Microsoft Corp. 1984, 1985, 1986
  4. $
  5. if1
  6. ASMpass=1
  7. else
  8. ASMpass=2
  9. endif
  10. outif MACRO name,defval,onmsg,offmsg
  11. ifndef name
  12. ifb <defval>
  13. name=0
  14. else
  15. name=defval
  16. endif
  17. else
  18. name=name
  19. endif
  20. if name
  21. name=1
  22. ifnb <onmsg>
  23. if1
  24. %out ! onmsg
  25. endif
  26. endif
  27. else
  28. ifnb <offmsg>
  29. if1
  30. %out ! offmsg
  31. endif
  32. endif
  33. endif
  34. endm
  35. ??error macro msg
  36. E r r o r ----- msg
  37. endm
  38. ifdef ?SMALL
  39. memS=1
  40. endif
  41. ifdef ?MEDIUM
  42. memM=1
  43. endif
  44. ifdef ?COMPACT
  45. memC=1
  46. endif
  47. ifdef ?LARGE
  48. memL=1
  49. endif
  50. ifdef ?HUGE
  51. memH=1
  52. endif
  53. if1
  54. %out cMacros Version 2.07 - 9/19/86
  55. %out Copyright (C) Microsoft Corp. 1984, 1985, 1986. All rights reserved.
  56. endif
  57. outif memS,0,<Small Model>
  58. outif memM,0,<Medium Model>
  59. outif memL,0,<Large Model>
  60. outif memC,0,<Compact Model>
  61. outif memH,0,<Huge Model>
  62. memMOD= memS + memM + memL + memC + memH
  63. if memMOD ne 1
  64. if memMOD eq 0
  65. memS= 1
  66. outif memS,0,<Small Model>
  67. else
  68. ??error <Must have only 1 memory model selected>
  69. endif
  70. endif
  71. sizeC= memM + memL + memH
  72. sizeD= memL + memC + (memH*2)
  73. outif ?DF,0,<No segments or groups will be defined>
  74. outif ?TF,0,<Epilog sequences assume valid SP>
  75. outif ?WIN,1,<Windows Support>
  76. outif ?PLM,1,<PLM calling convention>
  77. ifndef ?NODATA
  78. ?NODATA1=0
  79. else
  80. ?NODATA1=1
  81. if1
  82. %out ! NODATA module
  83. endif
  84. endif
  85. ifndef ?CHKSTK
  86. ?CHKSTK1=0
  87. else
  88. ?CHKSTK1=1
  89. ifdef ?CHKSTKPROC
  90. if1
  91. %out ! Private stack checking enabled
  92. endif
  93. else
  94. if1
  95. %out ! Stack checking enabled
  96. endif
  97. endif
  98. endif
  99. ifndef DOS5
  100. ?DOS5=0
  101. else
  102. ?DOS5=1
  103. if1
  104. %out ! DOS5 module
  105. endif
  106. endif
  107. ifdef ?PROFILE
  108. if1
  109. %out ! Native Profiling Enabled
  110. endif
  111. endif
  112. .XCREF
  113. .XCREF ?N,?AX,?AH,?AL,?BX,?BH
  114. .XCREF ?BL,?CX,?CH,?CL,?DX,?DH
  115. .XCREF ?DL,?SI,?DI,?ES,?DS,?BP
  116. .XCREF ?SP,?SS,?CS
  117. .XCREF ?RSL,?CPD,?argl,?argc,?BA
  118. .XCREF ?ACB,???,?PO
  119. .XCREF ?PAS,?PC
  120. .XCREF Uconcat,mPush,mPop
  121. .XCREF ?RI,?pp,?pp1,?al1
  122. .XCREF ?aD,?AP,?Atal,?dd,?dd1
  123. .XCREF ?pg,?pg1,?aloc,?cs1,?cs2
  124. .XCREF ?DF,?TF,?FF,?PLM,?WIN,?IA,?PU,?ADJ
  125. .XCREF ?UF,?RP,?NX,?ND,?NODATA1,?CHKSTK1,?DOS5
  126. .XCREF ?WFP
  127. ?RSL = 0
  128. ?CPD = 0
  129. ?ArgL = 0
  130. ?ArgC = 0
  131. ?BA = 0
  132. ?ACB = 0
  133. ??? = 0
  134. ?PO = 0
  135. ?PAS = 0
  136. ?PC = 0
  137. ?IA = 0
  138. ?PU = 0
  139. ?ADJ = 0
  140. ?RP = 0
  141. ?UF = 0
  142. ?ND = 0
  143. ?NX = 0
  144. ?WFP = 0
  145. ?FF = 0
  146. ?N = 0000000000000000B
  147. ?AX = 0000000000000011B
  148. ?AH = 0000000000000001B
  149. ?AL = 0000000000000010B
  150. ?BX = 0000000000001100B
  151. ?BH = 0000000000000100B
  152. ?BL = 0000000000001000B
  153. ?CX = 0000000000110000B
  154. ?CH = 0000000000010000B
  155. ?CL = 0000000000100000B
  156. ?DX = 0000000011000000B
  157. ?DH = 0000000001000000B
  158. ?DL = 0000000010000000B
  159. ?SI = 0000000100000000B
  160. ?DI = 0000001000000000B
  161. ?ES = 0000010000000000B
  162. ?DS = 0000100000000000B
  163. ?BP = 0001000000000000B
  164. ?SP = 0010000000000000B
  165. ?SS = 0100000000000000B
  166. ?CS = 1000000000000000B
  167. .CREF
  168. uconcat macro a,b,c,d,e,f
  169. a&b c&d e&f
  170. endm
  171. mpush macro r
  172. irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
  173. if r AND ?&&x
  174. push x
  175. endif
  176. endm
  177. endm
  178. mpop macro r
  179. irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
  180. if r AND ?&&x
  181. pop x
  182. endif
  183. endm
  184. endm
  185. save macro r
  186. ?RSL=0
  187. ?RI ?RSL,<r>
  188. endm
  189. ?RI macro n,r
  190. irp x,<r>
  191. ifdef ?&&x
  192. n=n OR ?&&x
  193. endif
  194. endm
  195. endm
  196. parmB macro n
  197. ?pp <n>,<byte>,2,1
  198. endm
  199. parmW macro n
  200. ?pp <n>,<word>,2,2
  201. endm
  202. parmD macro n
  203. ife ?PLM
  204. irp x,<n>
  205. ?pp <&&x>,<DWORD>,0,4
  206. ?pp <Off_&&x>,<WORD>,2,2
  207. ?pp <Seg_&&x>,<WORD>,2,2
  208. endm
  209. else
  210. irp x,<n>
  211. ?pp <Seg_&&x>,<WORD>,2,2
  212. ?pp <Off_&&x>,<WORD>,2,2
  213. ?pp <&&x>,<DWORD>,0,4
  214. endm
  215. endif
  216. endm
  217. parmQ macro n
  218. ?pp <n>,<QWORD>,8,8
  219. endm
  220. parmT macro n
  221. ?pp <n>,<TBYTE>,10,10
  222. endm
  223. if sizeC
  224. parmCP macro n
  225. parmD <n>
  226. endm
  227. else
  228. parmCP macro n
  229. parmW <n>
  230. endm
  231. endif
  232. if sizeD
  233. parmDP macro n
  234. parmD <n>
  235. endm
  236. else
  237. parmDP macro n
  238. parmW <n>
  239. endm
  240. endif
  241. ?pp macro n,t,l,s
  242. if ?CPD
  243. .xcref
  244. irp x,<n>
  245. .xcref ?T&&x
  246. ?T&&x=s
  247. ife ?PLM
  248. ?pp1 x,<t>,,,%(?PO+?adj)
  249. ?PO=?PO+l
  250. else
  251. ?PO=?PO+l
  252. ?pp1 x,<t>,%?PO,%?adj
  253. endif
  254. endm
  255. .cref
  256. else
  257. ??error <Parm(s) "&n" declared outside proc def>
  258. endif
  259. endm
  260. ?pp1 macro n,t,o,a,b
  261. ife ?PLM
  262. n equ t ptr [bp+b]
  263. else
  264. n equ t ptr [bp+a+?PO-o]
  265. endif
  266. endm
  267. ifndef ?NOPARMR
  268. .XCREF
  269. .XCREF ?pr
  270. .CREF
  271. parmR macro n,r,r2
  272. ?pr n,r,r2,%?RP,%(?IA+2)
  273. endm
  274. ?pr macro n,r,r2,i,o
  275. .xcref
  276. ifnb <r2>
  277. parmR SEG_&n,r
  278. parmR OFF_&n,r2
  279. n equ dword ptr [bp-o-2]
  280. .xcref ?T&n
  281. ?T&n=4
  282. else
  283. .xcref ?RP&i
  284. ?RP&i=0
  285. ifdef ?&r
  286. ?RP&i=?&r
  287. endif
  288. if ??? OR (?CPD EQ 0) OR (?RP&i EQ 0)
  289. ??error <invalid parmR encountered: &n,&r>
  290. exitm
  291. endif
  292. n equ word ptr [bp-o]
  293. ?T&n=2
  294. irp x,<bh,ch,dh,bl,cl,dl,ah,al>
  295. if ?&&x EQ ?&r
  296. n equ byte ptr [bp-o]
  297. ?T&n=1
  298. exitm
  299. endif
  300. endm
  301. ?IA=?IA+2
  302. ?RP=?RP+1
  303. endif
  304. .cref
  305. endm
  306. endif
  307. localB macro n
  308. ?aLoc <n>,<BYTE ptr>,1,1,0
  309. endm
  310. localW macro n
  311. ?aLoc <n>,<WORD PTR>,2,2,1
  312. endm
  313. localD macro n
  314. irp x,<n>
  315. ?aLoc <Seg_&&x>,<WORD PTR>,2,2,1
  316. ?aLoc <Off_&&x>,<WORD PTR>,2,2,1
  317. ?aLoc <&&x>,<DWORD PTR>,0,4,1
  318. endm
  319. endm
  320. localQ macro n
  321. ?aLoc <n>,<QWORD PTR>,8,8,1
  322. endm
  323. localT macro n
  324. ?aLoc <n>,<TBYTE PTR>,10,10,1
  325. endm
  326. if sizeC
  327. localCP macro n
  328. localD <n>
  329. endm
  330. else
  331. localCP macro n
  332. localW <n>
  333. endm
  334. endif
  335. if sizeD
  336. localDP macro n
  337. localD <n>
  338. endm
  339. else
  340. localDP macro n
  341. localW <n>
  342. endm
  343. endif
  344. localV macro n,a
  345. ?aLoc <n>,,%(a),0,1
  346. endm
  347. ?aLoc macro n,t,l,s,a
  348. if ?CPD
  349. .xcref
  350. irp x,<n>
  351. ???=???+l
  352. if a
  353. ???=((??? + 1) AND 0FFFEH)
  354. endif
  355. ?aL1 x,<t>,%(???+?IA)
  356. .xcref ?T&&x
  357. ?T&&x=s
  358. endm
  359. .cref
  360. else
  361. ??error <Locals "&n" declared outside procedure def>
  362. endif
  363. endm
  364. ?aL1 macro n,t,o
  365. n equ t [bp-o]
  366. endm
  367. ifndef ?NOGLOBAL
  368. globalB macro n,i,s
  369. ?aD <n>,1
  370. ?dd n,1,<BYTE>,<DB>,<i>,<s>
  371. endm
  372. globalW macro n,i,s
  373. ?aD <n>,2
  374. ?dd n,1,<WORD>,<DW>,<i>,<s>
  375. endm
  376. globalD macro n,i,s
  377. ?aD <n>,4
  378. ?dd n,1,<DWORD>,<DD>,<i>,<s>
  379. endm
  380. globalQ macro n,i,s
  381. ?aD <n>,8
  382. ?dd n,1,<QWORD>,<DQ>,<i>,<s>
  383. endm
  384. globalT macro n,i,s
  385. ?aD <n>,10
  386. ?dd n,1,<TBYTE>,<DT>,<i>,<s>
  387. endm
  388. if sizeC
  389. globalCP macro n,i,s
  390. globalD n,<i>,<s>
  391. endm
  392. else
  393. globalCP macro n,i,s
  394. globalW n,<i>,<s>
  395. endm
  396. endif
  397. if sizeD
  398. globalDP macro n,i,s
  399. globalD n,<i>,<s>
  400. endm
  401. else
  402. globalDP macro n,i,s
  403. globalW n,<i>,<s>
  404. endm
  405. endif
  406. endif
  407. ifndef ?NOSTATIC
  408. staticB macro n,i,s
  409. ?aD <n>,1
  410. ?dd n,0,<BYTE>,<DB>,<i>,<s>
  411. endm
  412. staticW macro n,i,s
  413. ?aD <n>,2
  414. ?dd n,0,<WORD>,<DW>,<i>,<s>
  415. endm
  416. staticD macro n,i,s
  417. ?aD <n>,4
  418. ?dd n,0,<DWORD>,<DD>,<i>,<s>
  419. endm
  420. staticQ macro n,i,s
  421. ?aD <n>,8
  422. ?dd n,0,<QWORD>,<DQ>,<i>,<s>
  423. endm
  424. staticT macro n,i,s
  425. ?aD <n>,10
  426. ?dd n,0,<TBYTE>,<DT>,<i>,<s>
  427. endm
  428. if sizeC
  429. staticCP macro n,i,s
  430. staticD n,<i>,<s>
  431. endm
  432. else
  433. staticCP macro n,i,s
  434. staticW n,<i>,<s>
  435. endm
  436. endif
  437. if sizeD
  438. staticDP macro n,i,s
  439. staticD n,<i>,<s>
  440. endm
  441. else
  442. staticDP macro n,i,s
  443. staticW n,<i>,<s>
  444. endm
  445. endif
  446. endif
  447. ?dd macro n,p,t,d,i,s
  448. ife ?PLM
  449. n label t
  450. ?dd1 _&n,p,<d>,<i>,<s>
  451. else
  452. ?dd1 n,p,<d>,<i>,<s>
  453. endif
  454. endm
  455. ?dd1 macro n,p,d,i,s
  456. if p
  457. PUBLIC n
  458. endif
  459. ifb <s>
  460. n d i
  461. else
  462. ifb <i>
  463. n d s DUP (?)
  464. else
  465. n d s DUP (i)
  466. endif
  467. endif
  468. endm
  469. ifndef ?NOEXTERN
  470. .XCREF
  471. .XCREF ?ex1
  472. .CREF
  473. externB macro n
  474. ?ex1 <n>,1,<BYTE>
  475. endm
  476. externW macro n
  477. ?ex1 <n>,2,<WORD>
  478. endm
  479. externD macro n
  480. ?ex1 <n>,4,<DWORD>
  481. endm
  482. externQ macro n
  483. ?ex1 <n>,8,<QWORD>
  484. endm
  485. externT macro n
  486. ?ex1 <n>,10,<TBYTE>
  487. endm
  488. externNP macro n
  489. ?ex1 <n>,2,<NEAR>
  490. endm
  491. externFP macro n
  492. ?ex1 <n>,4,<FAR>
  493. endm
  494. if sizeC
  495. externP macro n
  496. ?ex1 <n>,4,<FAR>
  497. endm
  498. else
  499. externP macro n
  500. ?ex1 <n>,2,<NEAR>
  501. endm
  502. endif
  503. if sizeC
  504. externCP macro n
  505. ?ex1 <n>,4,<DWORD>
  506. endm
  507. else
  508. externCP macro n
  509. ?ex1 <n>,2,<WORD>
  510. endm
  511. endif
  512. if sizeD
  513. externDP macro n
  514. ?ex1 <n>,4,<DWORD>
  515. endm
  516. else
  517. externDP macro n
  518. ?ex1 <n>,2,<WORD>
  519. endm
  520. endif
  521. ?ex1 macro n,s,d
  522. irp x,<n>
  523. .xcref
  524. .xcref ?T&&x
  525. .cref
  526. ?T&&x=s
  527. ife ?PLM
  528. extrn _&&x:&d
  529. x equ _&&x
  530. else
  531. extrn x:&d
  532. endif
  533. endm
  534. endm
  535. endif
  536. ifndef ?NOLABEL
  537. .XCREF
  538. ?lblpu = 0
  539. .XCREF ?lb1,?lblpu
  540. .CREF
  541. labelB macro n
  542. ?lb1 <n>,1,<BYTE>
  543. endm
  544. labelW macro n
  545. ?lb1 <n>,2,<WORD>
  546. endm
  547. labelD macro n
  548. ?lb1 <n>,4,<DWORD>
  549. endm
  550. labelQ macro n
  551. ?lb1 <n>,8,<QWORD>
  552. endm
  553. labelT macro n
  554. ?lb1 <n>,10,<TBYTE>
  555. endm
  556. labelNP macro n
  557. ?lb1 <n>,2,<NEAR>
  558. endm
  559. labelFP macro n
  560. ?lb1 <n>,4,<FAR>
  561. endm
  562. if sizeC
  563. labelP macro n
  564. ?lb1 <n>,4,<FAR>
  565. endm
  566. else
  567. labelP macro n
  568. ?lb1 <n>,2,<NEAR>
  569. endm
  570. endif
  571. if sizeC
  572. labelCP macro n
  573. ?lb1 <n>,4,<DWORD>
  574. endm
  575. else
  576. labelCP macro n
  577. ?lb1 <n>,2,<WORD>
  578. endm
  579. endif
  580. if sizeD
  581. labelDP macro n
  582. ?lb1 <n>,4,<DWORD>
  583. endm
  584. else
  585. labelDP macro n
  586. ?lb1 <n>,2,<WORD>
  587. endm
  588. endif
  589. ?lb1 macro n,s,d
  590. ?lblpu=0
  591. irp x,<n>
  592. ifidn <x>,<PUBLIC>
  593. ?lblpu=1
  594. else
  595. .xcref
  596. .xcref ?T&&x
  597. .cref
  598. ?T&&x=s
  599. ife ?PLM
  600. if ?lblpu
  601. public _&&x
  602. endif
  603. _&&x label &d
  604. x equ _&&x
  605. else
  606. if ?lblpu
  607. public x
  608. endif
  609. x label &d
  610. endif
  611. endif
  612. endm
  613. endm
  614. endif
  615. ifndef ?NODEF
  616. defB macro n
  617. ?aD <n>,1
  618. endm
  619. defW macro n
  620. ?aD <n>,2
  621. endm
  622. defD macro n
  623. ?aD <n>,4
  624. endm
  625. defQ macro n
  626. ?aD <n>,8
  627. endm
  628. defT macro n
  629. ?aD <n>,10
  630. endm
  631. if sizeC
  632. defCP macro n
  633. defD <n>
  634. endm
  635. else
  636. defCP macro n
  637. defW <n>
  638. endm
  639. endif
  640. if sizeD
  641. defDP macro n
  642. defD <n>
  643. endm
  644. else
  645. defDP macro n
  646. defW <n>
  647. endm
  648. endif
  649. endif
  650. ?aD macro n,s
  651. irp x,<n>
  652. .xcref
  653. .xcref ?T&&x
  654. .cref
  655. ?T&&x=s
  656. endm
  657. endm
  658. ifndef ?NOPTR
  659. regPtr macro n,S,O
  660. farPtr n,S,O
  661. endm
  662. farptr macro n,S,O
  663. .xcref
  664. .xcref ?T&n
  665. .cref
  666. n &macro
  667. push S
  668. push O
  669. &endm
  670. ?T&n=80h
  671. endm
  672. endif
  673. arg macro a
  674. irp x,<a>
  675. ?argc=?argc+1
  676. ?Atal <x>,%?argc
  677. endm
  678. endm
  679. ?Atal macro n,i
  680. .xcref
  681. .xcref ?ALI&i
  682. .cref
  683. ?ALI&i &macro
  684. ?AP n
  685. &endm
  686. endm
  687. ?AP macro n
  688. ?argl=?argl+2
  689. ifdef ?T&n
  690. ife ?T&n-1
  691. push word ptr (n)
  692. exitm
  693. endif
  694. ife ?T&n-2
  695. push n
  696. exitm
  697. endif
  698. ife ?T&n-4
  699. push word ptr (n)+2
  700. push word ptr (n)
  701. ?argl=?argl+2
  702. exitm
  703. endif
  704. ife ?T&n-8
  705. push word ptr (n)+6
  706. push word ptr (n)+4
  707. push word ptr (n)+2
  708. push word ptr (n)
  709. ?argl=?argl+6
  710. exitm
  711. endif
  712. if ?T&n AND 80h
  713. n
  714. ?argl=?argl+2
  715. exitm
  716. endif
  717. ife ?T&n
  718. push word ptr (n)
  719. exitm
  720. endif
  721. endif
  722. push n
  723. endm
  724. ccall macro n,a,sleaze
  725. ifnb <a>
  726. Arg <a>
  727. endif
  728. mpush %?RSL
  729. ?argl=0
  730. ife ?PLM
  731. ?ACB=?argc
  732. else
  733. ?ACB=1
  734. endif
  735. rept ?argc
  736. uconcat <?ALI>,%?ACB
  737. uconcat <purge>,,<?ALI>,%?ACB
  738. ife ?PLM
  739. ?ACB=?ACB-1
  740. else
  741. ?ACB=?ACB+1
  742. endif
  743. endm
  744. ife ?PLM
  745. ifb <sleaze>
  746. call _&n
  747. else
  748. call n
  749. endif
  750. if ?argl
  751. add sp,?argl
  752. endif
  753. else
  754. call n
  755. endif
  756. mpop %?RSL
  757. ?RSL=0
  758. ?argc= 0
  759. ?argl= 0
  760. endm
  761. cProc macro n,c,a
  762. if ?CPD
  763. ?UTPE
  764. endif
  765. ?CPD=1
  766. ???=0
  767. ?argc=0
  768. ?BA=0
  769. ?PO=0
  770. ?PU=0
  771. ?IA=0
  772. ?adj=4
  773. ?RP=0
  774. ?UF=0
  775. ?WFP=0
  776. ?FF=0
  777. ?PAS=0
  778. ifnb <a>
  779. ?RI ?PAS,<a>
  780. endif
  781. ?PC=sizeC
  782. ?ND=?NODATA1
  783. ?NX=0
  784. irp x,<c>
  785. ifidn <x>,<FAR>
  786. ?PC=1
  787. endif
  788. ifidn <x>,<NEAR>
  789. ?PC=0
  790. endif
  791. ifidn <x>,<PUBLIC>
  792. ?PU=1
  793. endif
  794. ifidn <x>,<SMALL>
  795. ?UF=1
  796. endif
  797. ifidn <x>,<DATA>
  798. ?ND=0
  799. endif
  800. ifidn <x>,<NODATA>
  801. ?ND=1
  802. endif
  803. ifidn <x>,<ATOMIC>
  804. ?NX=1
  805. endif
  806. ifidn <x>,<FORCEFRAME>
  807. ?FF=1
  808. endif
  809. endm
  810. if (?NX eq 1) AND (?ND eq 0)
  811. ?NX = 0
  812. ??error <ATOMIC specified without NODATA - ATOMIC ignored>
  813. endif
  814. if ?PC
  815. if ?WIN
  816. ?WFP=1
  817. ife ?NX
  818. ?IA=2
  819. ?PAS = ?PAS AND (NOT ?ds)
  820. endif
  821. endif
  822. ?adj=?adj+2
  823. endif
  824. ?PAS = ?PAS AND (NOT (?sp+?cs+?ss))
  825. if ?UF
  826. ?PAS = ?PAS AND (NOT (?bp+?si+?di))
  827. endif
  828. ife ?PLM
  829. ?pg <_&n>,%?PU,%?PC,%?PAS,%?WFP,<n>
  830. else
  831. ?pg <n>,%?PU,%?PC,%?PAS,%?WFP,<n>
  832. endif
  833. endm
  834. ?pg macro n,p,c,a,w,nu
  835. .xcref
  836. if ?UF
  837. if ?RP
  838. ??error <parmR encountered in &n - user frame ignored>
  839. ?UF=0
  840. endif
  841. if ?ND
  842. ??error <NODATA encountered in &n - user frame ignored>
  843. ?UF=0
  844. endif
  845. endif
  846. cBegin &macro g
  847. .xcref
  848. ?pg1 <n>,c,a,%?PO,w,%?UF,%?ND,%?RP
  849. ?CPD=0
  850. ?argc=0
  851. ?BA=1
  852. ???=(???+1) AND 0FFFEH
  853. if p
  854. PUBLIC n
  855. endif
  856. ife ?PLM
  857. ife c
  858. nu label near
  859. else
  860. nu label far
  861. endif
  862. endif
  863. ife c
  864. n proc NEAR
  865. else
  866. n proc FAR
  867. endif
  868. ifidn <g>,<nogen>
  869. if ???+?PO+a+?RP
  870. %out <cBegin - possible invalid use of nogen>
  871. endif
  872. else
  873. if ?UF
  874. ?MF c,%???,%?PO
  875. mPush a
  876. else
  877. if w
  878. ife ?ND
  879. mov ax,ds
  880. nop
  881. endif
  882. ife ?NX
  883. ife ?DOS5
  884. inc bp
  885. endif
  886. push bp
  887. mov bp,sp
  888. push ds
  889. else
  890. if ?FF+???+?PO+?RP
  891. push bp
  892. mov bp,sp
  893. endif
  894. endif
  895. ife ?ND
  896. mov ds,ax
  897. endif
  898. else
  899. if ?FF+???+?PO+?RP
  900. push bp
  901. mov bp,sp
  902. endif
  903. endif
  904. if ?RP
  905. ?UF=0
  906. rept ?RP
  907. uconcat mpush,,?RP,%?UF
  908. ?UF=?UF+1
  909. endm
  910. endif
  911. if ???
  912. if ?CHKSTK1
  913. ifdef ?CHKSTKPROC
  914. ?CHKSTKPROC %???
  915. else
  916. mov ax,???
  917. ife ?PLM
  918. call _chkstk
  919. else
  920. call chkstk
  921. endif
  922. endif
  923. else
  924. sub sp,???
  925. endif
  926. endif
  927. mPush a
  928. endif
  929. ifdef ?PROFILE
  930. if c
  931. call StartNMeas
  932. endif
  933. endif
  934. endif
  935. .cref
  936. purge cBegin
  937. &endm
  938. ?UTPE &macro
  939. ??error <Unterminated Procedure Definition: "&n">
  940. &endm
  941. endm
  942. ?pg1 macro n,c,a,o,w,f,d,r
  943. .xcref
  944. cEnd &macro g
  945. .xcref
  946. ?BA=0
  947. ifidn <g>,<nogen>
  948. if o+a+r
  949. %out <cEnd - possible invalid use of nogen>
  950. endif
  951. else
  952. ifdef ?PROFILE
  953. if c
  954. call StopNMeas
  955. endif
  956. endif
  957. mPop a
  958. if f
  959. db 0C3h
  960. else
  961. if w
  962. ife ?NX
  963. if (?TF eq 0) OR (???+?RP)
  964. lea sp,-2[bp]
  965. endif
  966. pop ds
  967. pop bp
  968. ife ?DOS5
  969. dec bp
  970. endif
  971. else
  972. if (?TF eq 0) OR (???+?RP)
  973. mov sp,bp
  974. endif
  975. if ???+?PO+?RP
  976. pop bp
  977. endif
  978. endif
  979. else
  980. if ?FF+???+?PO+?RP
  981. if (?TF eq 0) OR (???+?RP)
  982. mov sp,bp
  983. endif
  984. pop bp
  985. endif
  986. endif
  987. ife ?PLM
  988. ret
  989. else
  990. ret o
  991. endif
  992. endif
  993. endif
  994. n endp
  995. .cref
  996. purge cEnd
  997. &endm
  998. .cref
  999. endm
  1000. assumes macro s,ln
  1001. ifndef ln&_assumes
  1002. assume s:ln
  1003. else
  1004. ln&_assumes s
  1005. endif
  1006. endm
  1007. createSeg macro n,ln,a,co,cl,grp
  1008. ifnb <grp>
  1009. addSeg grp,n
  1010. else
  1011. ln&OFFSET equ OFFSET n:
  1012. ln&BASE equ n
  1013. ?cs3 <ln>,<n>
  1014. endif
  1015. ifnb <cl>
  1016. n segment a co '&cl'
  1017. else
  1018. n segment a co
  1019. endif
  1020. n ends
  1021. ?cs1 <ln>,<n>
  1022. endm
  1023. addSeg macro grp,seg
  1024. ifndef grp&_def
  1025. grp&_def=0
  1026. endif
  1027. if grp&_def ne ASMpass
  1028. grp&_add &macro s
  1029. grp&_in <seg>,s
  1030. &endm
  1031. grp&_in &macro sl,s
  1032. ifb <s>
  1033. grp group sl
  1034. else
  1035. grp&_add &macro ns
  1036. grp&_in <sl,s>,ns
  1037. &endm
  1038. endif
  1039. &endm
  1040. grp&_def=ASMpass
  1041. else
  1042. grp&_add seg
  1043. endif
  1044. endm
  1045. defGrp macro grp,ln
  1046. addSeg grp
  1047. ifnb <ln>
  1048. ?cs3 <ln>,<grp>
  1049. ln&OFFSET equ OFFSET grp:
  1050. ln&BASE equ grp
  1051. endif
  1052. endm
  1053. ?cs1 macro ln,n
  1054. ln&_sBegin &macro
  1055. ?MF &&macro c,l,p
  1056. if c
  1057. extrn n&_FARFRAME:near
  1058. call n&_FARFRAME
  1059. else
  1060. extrn n&_NEARFRAME:near
  1061. call n&_NEARFRAME
  1062. endif
  1063. db l shr 1
  1064. db p shr 1
  1065. &&endm
  1066. ?cs2 <ln>,<n>
  1067. n segment
  1068. ?segname equ <&n>
  1069. &endm
  1070. endm
  1071. ?cs2 macro ln,n
  1072. sEnd &macro
  1073. n ends
  1074. purge ?MF
  1075. &endm
  1076. endm
  1077. ?cs3 macro ln,n
  1078. ln&_assumes &macro s
  1079. assume s:&n
  1080. &endm
  1081. endm
  1082. sBegin macro ln
  1083. ln&_sBegin
  1084. endm
  1085. ife ?DF
  1086. createSeg _TEXT,code,word,public,CODE
  1087. ife ?NODATA1
  1088. createSeg _DATA,data,word,public,DATA,DGROUP
  1089. defGrp DGROUP,DATA
  1090. endif
  1091. if ?CHKSTK1
  1092. ifndef ?CHKSTKPROC
  1093. externP <chkstk>
  1094. endif
  1095. endif
  1096. endif
  1097. errnz macro x
  1098. if2
  1099. if x
  1100. errnz1 <x>,%(x)
  1101. endif
  1102. endif
  1103. endm
  1104. errnz1 macro x1,x2
  1105. = *ERRNZ* x1 = x2
  1106. endm
  1107. errn$ macro l,x
  1108. errnz <OFFSET $ - OFFSET l x>
  1109. ENDM
  1110. ifdef ?PROFILE
  1111. externFP <StartNMeas, StopNMeas>
  1112. endif