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