RULES.ASI (16446B)
1 ;[]-----------------------------------------------------------------[] 2 ;| RULES.ASI -- Rules & Structures for assembler | 3 ;| | 4 ;| Turbo C++ Run Time Library | 5 ;| | 6 ;| Copyright (c) 1987, 1991 by Borland International Inc. | 7 ;| All Rights Reserved. | 8 ;[]-----------------------------------------------------------------[] 9 10 ;*** First we begin with a few of the major constants of C. 11 12 false equ 0 ; Beware ! For incoming parameters, non-false = true. 13 true equ 1 ; For results, we generate the proper numbers. 14 15 lesser equ -1 ; Incoming, lesser < 0 16 equal equ 0 17 greater equ 1 ; Incoming, greater > 0 18 19 PAGE 20 ;[]------------------------------------------------------------[] 21 ;| | 22 ;| Conditional Assembly Directives | 23 ;| | 24 ;[]------------------------------------------------------------[] 25 26 ;memory model aliases, for the convenience of building the library 27 28 IFDEF __s__ 29 __SMALL__ equ 1 30 ENDIF 31 32 IFDEF __c__ 33 __COMPACT__ equ 1 34 ENDIF 35 36 IFDEF __m__ 37 __MEDIUM__ equ 1 38 ENDIF 39 40 IFDEF __l__ 41 __LARGE__ equ 1 42 ENDIF 43 44 IFDEF __h__ 45 __HUGE__ equ 1 46 ENDIF 47 48 IFNDEF __TINY__ 49 IFNDEF __SMALL__ 50 IFNDEF __MEDIUM__ 51 IFNDEF __COMPACT__ 52 IFNDEF __LARGE__ 53 IFNDEF __HUGE__ 54 %OUT You must supply a model symbol. 55 .ERR 56 ENDIF 57 ENDIF 58 ENDIF 59 ENDIF 60 ENDIF 61 ENDIF 62 63 ;bit masks to extract default pointer types from MMODEL (at run-time) 64 FCODE equ 8000h 65 FDATA equ 4000h 66 67 IFDEF __TINY__ ; Small Code - Small Data 68 LPROG equ false 69 LDATA equ false 70 MMODEL equ 0 71 _DSSTACK_ equ <> 72 ENDIF 73 74 IFDEF __SMALL__ ; Small Code - Small Data 75 LPROG equ false 76 LDATA equ false 77 MMODEL equ 1 78 _DSSTACK_ equ <> 79 ENDIF 80 81 IFDEF __MEDIUM__ ; Large Code - Small Data 82 LPROG equ true 83 LDATA equ false 84 MMODEL equ FCODE+2 85 _DSSTACK_ equ <> 86 ENDIF 87 88 IFDEF __COMPACT__ ; Small Code - Large Data 89 LPROG equ false 90 LDATA equ true 91 MMODEL equ FDATA+3 92 ENDIF 93 94 IFDEF __LARGE__ ; Large Code - Large Data 95 LPROG equ true 96 LDATA equ true 97 MMODEL equ FCODE+FDATA+4 98 ENDIF 99 100 IFDEF __HUGE__ ; Large Code - Large Data 101 LPROG equ true 102 LDATA equ true 103 MMODEL equ FCODE+FDATA+5 104 ENDIF 105 106 IF LPROG 107 DIST equ FAR 108 ELSE 109 DIST equ NEAR 110 ENDIF 111 112 PAGE 113 ;[]------------------------------------------------------------[] 114 ;| | 115 ;| Segment Declarations Macros | 116 ;| | 117 ;[]------------------------------------------------------------[] 118 119 Code_Seg@ MACRO ;; Open a Code Segment 120 IFDEF __WINDOWS__ 121 _TEXT SEGMENT WORD PUBLIC 'CODE' 122 ELSE 123 _TEXT SEGMENT BYTE PUBLIC 'CODE' 124 ENDIF 125 ASSUME CS:_TEXT 126 ENDM 127 128 Code_EndS@ MACRO ;; Close a Code Segment 129 _TEXT ENDS 130 ENDM 131 132 Data_Seg@ MACRO ;; Open a Data Segment (initialized) 133 _DATA SEGMENT WORD PUBLIC 'DATA' 134 ENDM 135 136 Data_EndS@ MACRO ;; Close a Data Segment (initialized) 137 _DATA ENDS 138 ENDM 139 140 IFNDEF __HUGE__ 141 BSS_Seg@ MACRO ;; Open a Data Segment (un-initialized) 142 _BSS SEGMENT WORD PUBLIC 'BSS' 143 ENDM 144 145 BSS_EndS@ MACRO ;; Close a Data Segment (un-initialized) 146 _BSS ENDS 147 ENDM 148 ENDIF 149 150 FarData_Seg@ MACRO ;; Open a FAR Data Segment 151 _FARDATA SEGMENT PARA PUBLIC 'FAR_DATA' 152 ENDM 153 154 FarData_EndS@ MACRO ;; Close a FAR Data Segment 155 _FARDATA ENDS 156 ENDM 157 158 FarBSS_Seg@ MACRO ;; Open a FAR BSS Segment 159 _FARBSS SEGMENT PARA PUBLIC 'FAR_BSS' 160 ENDM 161 162 FarBSS_EndS@ MACRO ;; Close a FAR BSS Segment 163 _FARBSS ENDS 164 ENDM 165 166 Const_Seg@ MACRO ;; Open a CONST Segment 167 _CONST SEGMENT WORD PUBLIC 'CONST' 168 ENDM 169 170 Const_EndS@ MACRO ;; Close a CONST Segment 171 _CONST ENDS 172 ENDM 173 174 Init_Seg@ MACRO ;; Open a INIT Segment 175 _INIT_ SEGMENT WORD PUBLIC 'INITDATA' 176 ENDM 177 178 Init_EndS@ MACRO ;; Close a INIT Segment 179 _INIT_ ENDS 180 ENDM 181 182 Exit_Seg@ MACRO ;; Open a EXIT Segment 183 _EXIT_ SEGMENT WORD PUBLIC 'EXITDATA' 184 ENDM 185 186 Exit_EndS@ MACRO ;; Close a EXIT Segment 187 _EXIT_ ENDS 188 ENDM 189 190 CVT_Seg@ MACRO 191 _CVTSEG SEGMENT WORD PUBLIC 'DATA' 192 ENDM 193 194 CVT_EndS@ MACRO 195 _CVTSEG ENDS 196 ENDM 197 198 SCN_Seg@ MACRO 199 _SCNSEG SEGMENT WORD PUBLIC 'DATA' 200 ENDM 201 202 SCN_EndS@ MACRO 203 _SCNSEG ENDS 204 ENDM 205 206 Header@ MACRO 207 Code_Seg@ 208 Code_EndS@ 209 Data_Seg@ 210 Data_EndS@ 211 BSS_Seg@ 212 BSS_EndS@ 213 ASSUME CS:_TEXT, DS:DGROUP 214 ENDM 215 216 ;[]------------------------------------------------------------[] 217 ;| | 218 ;| Segment Definitions | 219 ;| | 220 ;[]------------------------------------------------------------[] 221 222 IFDEF __C0__ 223 224 IFDEF __WINDOWS__ 225 _TEXT SEGMENT WORD PUBLIC 'CODE' 226 ENDS 227 ELSE 228 _TEXT SEGMENT BYTE PUBLIC 'CODE' 229 ENDS 230 ENDIF 231 232 _FARDATA SEGMENT PARA PUBLIC 'FAR_DATA' 233 ENDS 234 235 _FARBSS SEGMENT PARA PUBLIC 'FAR_BSS' 236 ENDS 237 238 IFNDEF __WINDOWS__ 239 IFNDEF __TINY__ 240 _OVERLAY_ SEGMENT PARA PUBLIC 'OVRINFO' 241 ENDS 242 _1STUB_ SEGMENT PARA PUBLIC 'STUBSEG' 243 ENDS 244 ENDIF 245 ENDIF 246 247 IFDEF __WINDOWS__ 248 NULL SEGMENT PARA PUBLIC 'BEGDATA' 249 ENDS 250 ENDIF 251 252 _DATA SEGMENT PARA PUBLIC 'DATA' 253 ENDS 254 ENDS 255 256 _CONST SEGMENT WORD PUBLIC 'CONST' 257 ENDS 258 259 IFDEF __WINDOWS__ 260 _FPSEG SEGMENT WORD PUBLIC 'DATA' 261 ENDS 262 ENDIF 263 264 _CVTSEG SEGMENT WORD PUBLIC 'DATA' 265 ENDS 266 267 _SCNSEG SEGMENT WORD PUBLIC 'DATA' 268 ENDS 269 270 _INIT_ SEGMENT WORD PUBLIC 'INITDATA' 271 InitStart label byte 272 ENDS 273 _INITEND_ SEGMENT BYTE PUBLIC 'INITDATA' 274 InitEnd label byte 275 ENDS 276 277 _EXIT_ SEGMENT WORD PUBLIC 'EXITDATA' 278 ExitStart label byte 279 ENDS 280 _EXITEND_ SEGMENT BYTE PUBLIC 'EXITDATA' 281 ExitEnd label byte 282 ENDS 283 284 IFNDEF __HUGE__ 285 _BSS SEGMENT WORD PUBLIC 'BSS' 286 BeginBSS label byte 287 ENDS 288 _BSSEND SEGMENT BYTE PUBLIC 'BSSEND' 289 EndBSS label byte 290 ENDS 291 ENDIF 292 293 294 IFDEF __WINDOWS__ 295 296 IFDEF __HUGE__ 297 DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_ 298 ELSE 299 DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND 300 ENDIF 301 302 ELSE 303 304 IFNDEF __NOFLOAT__ 305 IF LDATA 306 IFDEF __HUGE__ 307 DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_ 308 ELSE 309 DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND 310 ENDIF 311 ELSE 312 IFDEF __TINY__ 313 DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND 314 ELSE 315 DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND 316 ENDIF 317 ENDIF 318 ELSE 319 IF LDATA 320 IFDEF __HUGE__ 321 DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_ 322 ELSE 323 DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_BSS,_BSSEND 324 ENDIF 325 ELSE 326 IFDEF __TINY__ 327 DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND 328 ELSE 329 DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND 330 ENDIF 331 ENDIF 332 ENDIF ; __NOFLOAT__ 333 334 ENDIF ; __WINDOWS__ 335 336 ELSE 337 338 Code_Seg@ 339 Code_EndS@ 340 Data_Seg@ 341 Data_EndS@ 342 DGROUP GROUP _DATA 343 344 ENDIF ; __C0__ 345 346 PAGE 347 ;[]------------------------------------------------------------[] 348 ;| | 349 ;| Old Segment Declarations Macros | 350 ;| | 351 ;[]------------------------------------------------------------[] 352 353 354 CSeg@ MACRO ;; Open a Code Segment 355 IFDEF __WINDOWS__ 356 _TEXT SEGMENT WORD PUBLIC 'CODE' 357 ELSE 358 _TEXT SEGMENT BYTE PUBLIC 'CODE' 359 ENDIF 360 ASSUME CS:_TEXT 361 ENDM 362 363 CSegEnd@ MACRO ;; Close a Code Segment 364 _TEXT ENDS 365 ENDM 366 367 DSeg@ MACRO ;; Open a Data Segment (initialized) 368 _DATA SEGMENT WORD PUBLIC 'DATA' 369 ENDM 370 371 DSegEnd@ MACRO ;; Close a Data Segment (initialized) 372 _DATA ENDS 373 ENDM 374 375 IFDEF __BSS__ 376 IFNDEF __HUGE__ 377 BSeg@ MACRO ;; Open a Data Segment (un-initialized) 378 _BSS SEGMENT WORD PUBLIC 'BSS' 379 ENDM 380 381 BSegEnd@ MACRO ;; Close a Data Segment (un-initialized) 382 _BSS ENDS 383 ENDM 384 ENDIF 385 ENDIF 386 387 Header@ MACRO 388 IFDEF __WINDOWS__ 389 _TEXT SEGMENT WORD PUBLIC 'CODE' 390 ELSE 391 _TEXT SEGMENT BYTE PUBLIC 'CODE' 392 ENDIF 393 _TEXT ENDS 394 _DATA SEGMENT WORD PUBLIC 'DATA' 395 _DATA ENDS 396 IFDEF __BSS__ 397 IFNDEF __HUGE__ 398 _BSS SEGMENT WORD PUBLIC 'BSS' 399 _BSS ENDS 400 ENDIF 401 ENDIF 402 403 ASSUME CS:_TEXT, DS:DGROUP 404 ENDM 405 406 PAGE 407 ;[]------------------------------------------------------------[] 408 ;| | 409 ;| C Naming Convention Macros | 410 ;| | 411 ;[]------------------------------------------------------------[] 412 413 UNDERSCORE EQU 1 414 415 ExtSym@ MACRO Sym, sType, sName 416 IFNB <sName> 417 IFIDN <sName>, <__PASCAL__> 418 NAMING = 0 419 ELSE 420 NAMING = UNDERSCORE 421 ENDIF 422 ENDIF 423 IF NAMING 424 EXTRN _&Sym : sType 425 Sym&@ equ _&Sym 426 ELSE 427 EXTRN Sym : sType 428 Sym&@ equ Sym 429 ENDIF 430 ENDM 431 432 PubSym@ MACRO Sym, Definition, sName 433 IFNB <sName> 434 IFIDN <sName>, <__PASCAL__> 435 NAMING = 0 436 ELSE 437 NAMING = UNDERSCORE 438 ENDIF 439 ENDIF 440 IF NAMING 441 PUBLIC _&Sym 442 _&Sym Definition 443 Sym&@ equ _&Sym 444 ELSE 445 PUBLIC Sym 446 Sym Definition 447 Sym&@ equ Sym 448 ENDIF 449 ENDM 450 451 Static@ MACRO Sym, Definition, sName 452 IFNB <sName> 453 IFIDN <sName>, <__PASCAL__> 454 NAMING = 0 455 ELSE 456 NAMING = UNDERSCORE 457 ENDIF 458 ENDIF 459 IF NAMING 460 _&Sym Definition 461 Sym&@ equ _&Sym 462 ELSE 463 Sym Definition 464 Sym&@ equ Sym 465 ENDIF 466 ENDM 467 468 PAGE 469 ;[]------------------------------------------------------------[] 470 ;| | 471 ;| Macros which are Data Size Dependent | 472 ;| | 473 ;[]------------------------------------------------------------[] 474 475 IF LDATA 476 DPTR_ equ DWORD PTR 477 dPtrSize equ 4 478 LES_ equ LES 479 ES_ equ ES: 480 SS_ equ SS: 481 LDS_ equ LDS 482 483 pushDS_ MACRO 484 PUSH DS 485 ENDM 486 487 popDS_ MACRO 488 POP DS 489 ENDM 490 491 PushPtr MACRO dPtrOff, dPtrSeg 492 PUSH dPtrSeg 493 PUSH dPtrOff 494 ENDM 495 496 497 dPtr@ MACRO Sym, VALUE, sName ;; Static Data pointer 498 Static@ Sym, <DD VALUE>, sName 499 ENDM 500 501 dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer 502 PubSym@ Sym, <DD VALUE>, sName 503 ENDM 504 505 dPtrExt@ MACRO Sym, sName ;; External Data Pointer 506 ExtSym@ Sym, DWORD, sName 507 ENDM 508 ELSE 509 DPTR_ equ WORD PTR 510 dPtrSize equ 2 511 LES_ equ MOV 512 ES_ equ DS: 513 SS_ equ DS: 514 LDS_ equ MOV 515 516 pushDS_ MACRO 517 ENDM 518 519 popDS_ MACRO 520 ENDM 521 522 PushPtr MACRO dPtrOff, dPtrSeg 523 PUSH dPtrOff 524 ENDM 525 526 dPtr@ MACRO Sym, VALUE, sName ;; Static Data pointer 527 Static@ Sym, <DW VALUE>, sName 528 ENDM 529 530 dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer 531 PubSym@ Sym, <DW VALUE>, sName 532 ENDM 533 534 dPtrExt@ MACRO Sym, sName ;; External Data Pointer 535 ExtSym@ Sym, WORD, sName 536 ENDM 537 ENDIF 538 PAGE 539 ;[]------------------------------------------------------------[] 540 ;| | 541 ;| Macros which are Code Size Dependent | 542 ;| | 543 ;[]------------------------------------------------------------[] 544 545 IF LPROG 546 CPTR_ equ DWORD PTR 547 cPtrSize equ 4 548 549 Proc@ MACRO Sym, sName ;; Open a Static function 550 Static@ Sym, <PROC FAR>, sName 551 ENDM 552 553 PubProc@ MACRO Sym, sName ;; Open a Public function 554 PubSym@ Sym, <PROC FAR>, sName 555 ENDM 556 557 ExtProc@ MACRO Sym, sName ;; External Function 558 ExtSym@ Sym, FAR, sName 559 ENDM 560 561 cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer 562 Static@ Sym, <DD VALUE>, sName 563 ENDM 564 565 cPtrPub@ MACRO Sym, VALUE, sName;; Global Function Pointer 566 PubSym@ Sym, <DD VALUE>, sName 567 ENDM 568 569 cPtrExt@ MACRO Sym, sName ;; External Function Pointer 570 ExtSym@ Sym, DWORD, sName 571 ENDM 572 ELSE 573 CPTR_ equ WORD PTR 574 cPtrSize equ 2 575 576 Proc@ MACRO Sym, sName ;; Open a Static function 577 Static@ Sym, <PROC NEAR>, sName 578 ENDM 579 580 PubProc@ MACRO Sym, sName ;; Open a Public function 581 PubSym@ Sym, <PROC NEAR>, sName 582 ENDM 583 584 ExtProc@ MACRO Sym, sName ;; External Function 585 ExtSym@ Sym, NEAR, sName 586 ENDM 587 588 cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer 589 Static@ Sym, <DW VALUE>, sName 590 ENDM 591 592 cPtrPub@ MACRO Sym, VALUE, sName ;; Global Function Pointer 593 PubSym@ Sym, <DW VALUE>, sName 594 ENDM 595 596 cPtrExt@ MACRO Sym, sName ;; External Function Pointer 597 ExtSym@ Sym, WORD, sName 598 ENDM 599 ENDIF 600 601 EndProc@ MACRO Sym, sName ;; Close a function 602 Static@ Sym, ENDP, sName 603 ENDM 604 605 PAGE 606 ;[]------------------------------------------------------------[] 607 ;| | 608 ;| Miscellaneous Definitions | 609 ;| | 610 ;[]------------------------------------------------------------[] 611 612 ;*** Set up some macros for procedure parameters and export/import 613 614 nearCall STRUC 615 nearBP dw ? 616 nearIP dw ? 617 nearParam dw ? 618 nearCall ENDS 619 620 farCall STRUC 621 farBP dw ? 622 farCSIP dd ? 623 aParam dw ? 624 farCall ENDS 625 626 ;*** Next, we define some convenient structures to access the parts 627 ; of larger objects. 628 629 _twoBytes STRUC 630 BY0 db ? 631 BY1 db ? 632 _twoBytes ENDS 633 634 _fourWords STRUC 635 W0 dw ? 636 W1 dw ? 637 W2 dw ? 638 W3 dw ? 639 _fourWords ENDS 640 641 _twoDwords STRUC 642 DD0 dd ? 643 DD1 dd ? 644 _twoDwords ENDS 645 646 _aFloat STRUC 647 double dq ? 648 _aFloat ENDS 649 650 ; How to invoke MSDOS. 651 652 MSDOS@ MACRO 653 int 21h 654 ENDM 655 PAGE 656 657 ; The next section concerns the use of registers. SI and DI are used 658 ; for register variables, and must be conserved. 659 660 ; Registers AX, BX, CX, DX will not be preserved across function calls. 661 662 ; Firstly, the registers to be conserved through function calls, including 663 ; the setup of local variables. 664 665 link@ MACRO _si,_di,_ES,locals 666 push bp 667 mov bp, sp 668 IFNB <locals> 669 lea sp, locals 670 ENDIF 671 IFNB <_si> 672 push si 673 ENDIF 674 IFNB <_di> 675 push di 676 ENDIF 677 ENDM 678 679 unLink@ MACRO _si,_di,_ES,locals 680 IFNB <_di> 681 pop di 682 ENDIF 683 IFNB <_si> 684 pop si 685 ENDIF 686 IFNB <locals> 687 mov sp, bp 688 ENDIF 689 pop bp 690 ENDM 691 692 .LIST