wolf3d

The original open source release of Wolfenstein 3D
Log | Files | Refs

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