home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / Fortran.51 / DISK5 / CMACROS.NE$ / CMACROS.bin
Text File  |  1991-04-02  |  18KB  |  1,247 lines

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