]> 4ch.mooo.com Git - 16.git/blobdiff - 16/WOLFSRC/RULES.ASI
got 8086 port of wolf3d to work and sod to work
[16.git] / 16 / WOLFSRC / RULES.ASI
diff --git a/16/WOLFSRC/RULES.ASI b/16/WOLFSRC/RULES.ASI
new file mode 100755 (executable)
index 0000000..eba7111
--- /dev/null
@@ -0,0 +1,692 @@
+;[]-----------------------------------------------------------------[]\r
+;|      RULES.ASI  --  Rules & Structures for assembler              |\r
+;|                                                                   |\r
+;|      Turbo C++ Run Time Library                                   |\r
+;|                                                                   |\r
+;|      Copyright (c) 1987, 1991 by Borland International Inc.       |\r
+;|      All Rights Reserved.                                         |\r
+;[]-----------------------------------------------------------------[]\r
+\r
+;*** First we begin with a few of the major constants of C.\r
+\r
+false   equ     0       ; Beware !  For incoming parameters, non-false = true.\r
+true    equ     1       ; For results, we generate the proper numbers.\r
+\r
+lesser  equ    -1       ; Incoming, lesser < 0\r
+equal   equ     0\r
+greater equ     1       ; Incoming, greater > 0\r
+\r
+       PAGE\r
+;[]------------------------------------------------------------[]\r
+;|                                                              |\r
+;|      Conditional Assembly Directives                         |\r
+;|                                                              |\r
+;[]------------------------------------------------------------[]\r
+\r
+;memory model aliases, for the convenience of building the library\r
+\r
+IFDEF           __s__\r
+__SMALL__       equ     1\r
+ENDIF\r
+\r
+IFDEF           __c__\r
+__COMPACT__     equ     1\r
+ENDIF\r
+\r
+IFDEF           __m__\r
+__MEDIUM__      equ     1\r
+ENDIF\r
+\r
+IFDEF           __l__\r
+__LARGE__       equ     1\r
+ENDIF\r
+\r
+IFDEF           __h__\r
+__HUGE__        equ     1\r
+ENDIF\r
+\r
+IFNDEF __TINY__\r
+    IFNDEF __SMALL__\r
+       IFNDEF __MEDIUM__\r
+           IFNDEF __COMPACT__\r
+               IFNDEF __LARGE__\r
+                   IFNDEF __HUGE__\r
+                       %OUT  You must supply a model symbol.\r
+                       .ERR\r
+                   ENDIF\r
+               ENDIF\r
+           ENDIF\r
+       ENDIF\r
+    ENDIF\r
+ENDIF\r
+\r
+;bit masks to extract default pointer types from MMODEL (at run-time)\r
+FCODE           equ     8000h\r
+FDATA           equ     4000h\r
+\r
+IFDEF   __TINY__                ; Small Code - Small Data\r
+       LPROG           equ     false\r
+       LDATA           equ     false\r
+       MMODEL          equ     0       \r
+       _DSSTACK_       equ     <>\r
+ENDIF\r
+\r
+IFDEF   __SMALL__               ; Small Code - Small Data\r
+       LPROG           equ     false\r
+       LDATA           equ     false\r
+       MMODEL          equ     1       \r
+       _DSSTACK_       equ     <>\r
+ENDIF\r
+\r
+IFDEF   __MEDIUM__              ; Large Code - Small Data\r
+       LPROG           equ     true\r
+       LDATA           equ     false\r
+       MMODEL          equ     FCODE+2 \r
+       _DSSTACK_       equ     <>\r
+ENDIF\r
+\r
+IFDEF   __COMPACT__             ; Small Code - Large Data\r
+       LPROG           equ     false\r
+       LDATA           equ     true\r
+       MMODEL          equ     FDATA+3 \r
+ENDIF\r
+\r
+IFDEF   __LARGE__               ; Large Code - Large Data\r
+       LPROG           equ     true\r
+       LDATA           equ     true\r
+       MMODEL          equ     FCODE+FDATA+4\r
+ENDIF\r
+\r
+IFDEF   __HUGE__                ; Large Code - Large Data\r
+       LPROG           equ     true\r
+       LDATA           equ     true\r
+       MMODEL          equ     FCODE+FDATA+5\r
+ENDIF\r
+\r
+IF      LPROG\r
+       DIST            equ     FAR\r
+ELSE\r
+       DIST            equ     NEAR\r
+ENDIF\r
+\r
+       PAGE\r
+;[]------------------------------------------------------------[]\r
+;|                                                              |\r
+;|      Segment Declarations Macros                             |\r
+;|                                                              |\r
+;[]------------------------------------------------------------[]\r
+\r
+Code_Seg@       MACRO           ;; Open a Code Segment\r
+IFDEF __WINDOWS__\r
+_TEXT   SEGMENT WORD PUBLIC 'CODE'\r
+ELSE\r
+_TEXT   SEGMENT BYTE PUBLIC 'CODE'\r
+ENDIF\r
+       ASSUME  CS:_TEXT\r
+               ENDM\r
+\r
+Code_EndS@      MACRO           ;; Close a Code Segment\r
+_TEXT   ENDS\r
+               ENDM\r
+\r
+Data_Seg@       MACRO           ;; Open a Data Segment  (initialized)\r
+_DATA   SEGMENT WORD PUBLIC 'DATA'\r
+               ENDM\r
+\r
+Data_EndS@      MACRO           ;; Close a Data Segment (initialized)\r
+_DATA   ENDS\r
+               ENDM\r
+\r
+IFNDEF __HUGE__\r
+    BSS_Seg@        MACRO       ;; Open a Data Segment  (un-initialized)\r
+    _BSS    SEGMENT WORD PUBLIC 'BSS'\r
+           ENDM\r
+\r
+    BSS_EndS@       MACRO       ;; Close a Data Segment (un-initialized)\r
+    _BSS    ENDS\r
+                   ENDM\r
+ENDIF\r
+\r
+FarData_Seg@    MACRO           ;; Open a FAR Data Segment\r
+_FARDATA        SEGMENT PARA PUBLIC 'FAR_DATA'\r
+               ENDM\r
+\r
+FarData_EndS@   MACRO           ;; Close a FAR Data Segment\r
+_FARDATA        ENDS\r
+               ENDM\r
+\r
+FarBSS_Seg@     MACRO           ;; Open a FAR BSS Segment\r
+_FARBSS         SEGMENT PARA PUBLIC 'FAR_BSS'\r
+               ENDM\r
+\r
+FarBSS_EndS@    MACRO           ;; Close a FAR BSS Segment\r
+_FARBSS         ENDS\r
+               ENDM\r
+\r
+Const_Seg@      MACRO           ;; Open a CONST Segment\r
+_CONST  SEGMENT WORD PUBLIC 'CONST'\r
+               ENDM\r
+\r
+Const_EndS@     MACRO           ;; Close a CONST Segment\r
+_CONST  ENDS\r
+               ENDM\r
+\r
+Init_Seg@       MACRO           ;; Open a INIT Segment\r
+_INIT_  SEGMENT WORD PUBLIC 'INITDATA'\r
+               ENDM\r
+\r
+Init_EndS@      MACRO           ;; Close a INIT Segment\r
+_INIT_  ENDS\r
+               ENDM\r
+\r
+Exit_Seg@       MACRO           ;; Open a EXIT Segment\r
+_EXIT_  SEGMENT WORD PUBLIC 'EXITDATA'\r
+               ENDM\r
+\r
+Exit_EndS@      MACRO           ;; Close a EXIT Segment\r
+_EXIT_  ENDS\r
+               ENDM\r
+\r
+CVT_Seg@        MACRO\r
+_CVTSEG SEGMENT WORD PUBLIC 'DATA'\r
+               ENDM\r
+\r
+CVT_EndS@       MACRO\r
+_CVTSEG ENDS\r
+               ENDM\r
+\r
+SCN_Seg@        MACRO\r
+_SCNSEG SEGMENT WORD PUBLIC 'DATA'\r
+               ENDM\r
+\r
+SCN_EndS@       MACRO\r
+_SCNSEG ENDS\r
+               ENDM\r
+\r
+Header@ MACRO\r
+Code_Seg@\r
+Code_EndS@\r
+Data_Seg@\r
+Data_EndS@\r
+BSS_Seg@\r
+BSS_EndS@\r
+       ASSUME  CS:_TEXT, DS:DGROUP\r
+       ENDM\r
+\r
+;[]------------------------------------------------------------[]\r
+;|                                                              |\r
+;|      Segment Definitions                                     |\r
+;|                                                              |\r
+;[]------------------------------------------------------------[]\r
+\r
+IFDEF __C0__\r
+\r
+IFDEF __WINDOWS__\r
+_TEXT           SEGMENT WORD PUBLIC 'CODE'\r
+               ENDS\r
+ELSE\r
+_TEXT           SEGMENT BYTE PUBLIC 'CODE'\r
+               ENDS\r
+ENDIF\r
+\r
+_FARDATA        SEGMENT PARA PUBLIC 'FAR_DATA'\r
+               ENDS\r
+\r
+_FARBSS         SEGMENT PARA PUBLIC 'FAR_BSS'\r
+               ENDS\r
+\r
+IFNDEF __WINDOWS__\r
+  IFNDEF __TINY__\r
+  _OVERLAY_       SEGMENT PARA PUBLIC 'OVRINFO'\r
+                 ENDS\r
+  _1STUB_         SEGMENT PARA PUBLIC 'STUBSEG'\r
+                 ENDS\r
+  ENDIF\r
+ENDIF\r
+\r
+IFDEF __WINDOWS__\r
+NULL            SEGMENT PARA PUBLIC 'BEGDATA'\r
+               ENDS\r
+ENDIF\r
+\r
+_DATA           SEGMENT PARA PUBLIC 'DATA'\r
+               ENDS\r
+               ENDS\r
+\r
+_CONST          SEGMENT WORD PUBLIC 'CONST'\r
+               ENDS\r
+\r
+IFDEF __WINDOWS__\r
+_FPSEG          SEGMENT WORD PUBLIC 'DATA'\r
+               ENDS\r
+ENDIF\r
+\r
+_CVTSEG         SEGMENT WORD PUBLIC 'DATA'\r
+               ENDS\r
+\r
+_SCNSEG         SEGMENT WORD PUBLIC 'DATA'\r
+               ENDS\r
+\r
+_INIT_          SEGMENT WORD PUBLIC 'INITDATA'\r
+InitStart       label byte\r
+               ENDS\r
+_INITEND_       SEGMENT BYTE PUBLIC 'INITDATA'\r
+InitEnd         label byte\r
+               ENDS\r
+\r
+_EXIT_          SEGMENT WORD PUBLIC 'EXITDATA'\r
+ExitStart       label byte\r
+               ENDS\r
+_EXITEND_       SEGMENT BYTE PUBLIC 'EXITDATA'\r
+ExitEnd         label byte\r
+               ENDS\r
+\r
+IFNDEF __HUGE__\r
+_BSS          SEGMENT WORD PUBLIC 'BSS'\r
+BeginBSS      label byte\r
+             ENDS\r
+_BSSEND       SEGMENT BYTE PUBLIC 'BSSEND'\r
+EndBSS        label byte\r
+             ENDS\r
+ENDIF\r
+\r
+\r
+IFDEF __WINDOWS__\r
+\r
+  IFDEF  __HUGE__\r
+  DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_\r
+  ELSE\r
+  DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+  ENDIF\r
+\r
+ELSE\r
+\r
+IFNDEF __NOFLOAT__\r
+  IF LDATA\r
+    IFDEF  __HUGE__\r
+      DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_\r
+    ELSE\r
+      DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+    ENDIF\r
+  ELSE\r
+    IFDEF __TINY__\r
+      DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+    ELSE\r
+      DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+    ENDIF\r
+  ENDIF\r
+ELSE\r
+  IF LDATA\r
+    IFDEF __HUGE__\r
+      DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_\r
+    ELSE\r
+      DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_BSS,_BSSEND\r
+    ENDIF\r
+  ELSE\r
+    IFDEF __TINY__\r
+      DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+    ELSE\r
+      DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+    ENDIF\r
+  ENDIF\r
+ENDIF ; __NOFLOAT__\r
+\r
+ENDIF ; __WINDOWS__\r
+\r
+ELSE\r
+\r
+Code_Seg@\r
+Code_EndS@\r
+Data_Seg@\r
+Data_EndS@\r
+DGROUP GROUP _DATA\r
+\r
+ENDIF ; __C0__\r
+\r
+       PAGE\r
+;[]------------------------------------------------------------[]\r
+;|                                                              |\r
+;|      Old Segment Declarations Macros                         |\r
+;|                                                              |\r
+;[]------------------------------------------------------------[]\r
+\r
+\r
+CSeg@           MACRO           ;; Open a Code Segment\r
+IFDEF __WINDOWS__\r
+_TEXT   SEGMENT WORD PUBLIC 'CODE'\r
+ELSE\r
+_TEXT   SEGMENT BYTE PUBLIC 'CODE'\r
+ENDIF\r
+       ASSUME  CS:_TEXT\r
+               ENDM\r
+\r
+CSegEnd@        MACRO           ;; Close a Code Segment\r
+_TEXT   ENDS\r
+               ENDM\r
+\r
+DSeg@           MACRO           ;; Open a Data Segment  (initialized)\r
+_DATA   SEGMENT WORD PUBLIC 'DATA'\r
+               ENDM\r
+\r
+DSegEnd@        MACRO           ;; Close a Data Segment (initialized)\r
+_DATA   ENDS\r
+               ENDM\r
+\r
+IFDEF __BSS__\r
+    IFNDEF __HUGE__\r
+       BSeg@           MACRO           ;; Open a Data Segment  (un-initialized)\r
+       _BSS    SEGMENT WORD PUBLIC 'BSS'\r
+               ENDM\r
+\r
+       BSegEnd@        MACRO           ;; Close a Data Segment (un-initialized)\r
+       _BSS    ENDS\r
+                       ENDM\r
+    ENDIF\r
+ENDIF\r
+\r
+Header@ MACRO\r
+IFDEF __WINDOWS__\r
+_TEXT   SEGMENT WORD PUBLIC 'CODE'\r
+ELSE\r
+_TEXT   SEGMENT BYTE PUBLIC 'CODE'\r
+ENDIF\r
+_TEXT   ENDS\r
+_DATA   SEGMENT WORD PUBLIC 'DATA'\r
+_DATA   ENDS\r
+IFDEF __BSS__\r
+    IFNDEF  __HUGE__\r
+       _BSS    SEGMENT WORD PUBLIC 'BSS'\r
+       _BSS    ENDS\r
+    ENDIF\r
+ENDIF\r
+\r
+       ASSUME  CS:_TEXT, DS:DGROUP\r
+       ENDM\r
+\r
+       PAGE\r
+;[]------------------------------------------------------------[]\r
+;|                                                              |\r
+;|      C Naming Convention Macros                              |\r
+;|                                                              |\r
+;[]------------------------------------------------------------[]\r
+\r
+UNDERSCORE      EQU     1\r
+\r
+ExtSym@ MACRO   Sym, sType, sName\r
+       IFNB    <sName>\r
+       IFIDN   <sName>, <__PASCAL__>\r
+NAMING      =       0\r
+       ELSE\r
+NAMING      =       UNDERSCORE\r
+       ENDIF\r
+       ENDIF\r
+       IF      NAMING\r
+       EXTRN   _&Sym : sType\r
+Sym&@   equ     _&Sym\r
+       ELSE\r
+       EXTRN   Sym : sType\r
+Sym&@   equ     Sym\r
+       ENDIF\r
+       ENDM\r
+\r
+PubSym@ MACRO   Sym, Definition, sName\r
+       IFNB    <sName>\r
+       IFIDN   <sName>, <__PASCAL__>\r
+NAMING      =       0\r
+       ELSE\r
+NAMING      =       UNDERSCORE\r
+       ENDIF\r
+       ENDIF\r
+       IF      NAMING\r
+       PUBLIC  _&Sym\r
+_&Sym   Definition\r
+Sym&@   equ     _&Sym\r
+       ELSE\r
+       PUBLIC  Sym\r
+Sym     Definition\r
+Sym&@   equ     Sym\r
+       ENDIF\r
+       ENDM\r
+\r
+Static@ MACRO   Sym, Definition, sName\r
+       IFNB    <sName>\r
+       IFIDN   <sName>, <__PASCAL__>\r
+NAMING      =       0\r
+       ELSE\r
+NAMING      =       UNDERSCORE\r
+       ENDIF\r
+       ENDIF\r
+       IF      NAMING\r
+_&Sym   Definition\r
+Sym&@   equ     _&Sym\r
+       ELSE\r
+Sym     Definition\r
+Sym&@   equ     Sym\r
+       ENDIF\r
+       ENDM\r
+\r
+       PAGE\r
+;[]------------------------------------------------------------[]\r
+;|                                                              |\r
+;|      Macros which are Data Size Dependent                    |\r
+;|                                                              |\r
+;[]------------------------------------------------------------[]\r
+\r
+IF      LDATA\r
+DPTR_           equ     DWORD PTR\r
+dPtrSize        equ     4\r
+LES_            equ     LES\r
+ES_             equ     ES:\r
+SS_             equ     SS:\r
+LDS_            equ     LDS\r
+\r
+pushDS_         MACRO\r
+               PUSH    DS\r
+               ENDM\r
+\r
+popDS_          MACRO\r
+               POP    DS\r
+               ENDM\r
+\r
+PushPtr         MACRO   dPtrOff, dPtrSeg\r
+               PUSH    dPtrSeg\r
+               PUSH    dPtrOff\r
+               ENDM\r
+\r
+\r
+dPtr@           MACRO   Sym, VALUE, sName       ;; Static Data pointer\r
+Static@         Sym, <DD        VALUE>, sName\r
+               ENDM\r
+\r
+dPtrPub@        MACRO   Sym, VALUE, sName       ;; Global Data Pointer\r
+PubSym@         Sym, <DD        VALUE>, sName\r
+               ENDM\r
+\r
+dPtrExt@        MACRO   Sym, sName      ;; External Data Pointer\r
+ExtSym@         Sym, DWORD, sName\r
+               ENDM\r
+ELSE\r
+DPTR_           equ     WORD PTR\r
+dPtrSize        equ     2\r
+LES_            equ     MOV\r
+ES_             equ     DS:\r
+SS_             equ     DS:\r
+LDS_            equ     MOV\r
+\r
+pushDS_         MACRO\r
+               ENDM\r
+\r
+popDS_          MACRO\r
+               ENDM\r
+\r
+PushPtr         MACRO   dPtrOff, dPtrSeg\r
+               PUSH    dPtrOff\r
+               ENDM\r
+\r
+dPtr@           MACRO   Sym, VALUE, sName       ;; Static Data pointer\r
+Static@         Sym, <DW        VALUE>, sName\r
+               ENDM\r
+\r
+dPtrPub@        MACRO   Sym, VALUE, sName       ;; Global Data Pointer\r
+PubSym@         Sym, <DW        VALUE>, sName\r
+               ENDM\r
+\r
+dPtrExt@        MACRO   Sym, sName      ;; External Data Pointer\r
+ExtSym@         Sym, WORD, sName\r
+               ENDM\r
+ENDIF\r
+       PAGE\r
+;[]------------------------------------------------------------[]\r
+;|                                                              |\r
+;|      Macros which are Code Size Dependent                    |\r
+;|                                                              |\r
+;[]------------------------------------------------------------[]\r
+\r
+IF      LPROG\r
+CPTR_           equ     DWORD PTR\r
+cPtrSize        equ     4\r
+\r
+Proc@           MACRO   Sym, sName      ;; Open a Static function\r
+Static@         Sym, <PROC      FAR>, sName\r
+               ENDM\r
+\r
+PubProc@        MACRO   Sym, sName      ;; Open a Public function\r
+PubSym@         Sym, <PROC      FAR>, sName\r
+               ENDM\r
+\r
+ExtProc@        MACRO   Sym, sName      ;; External Function\r
+ExtSym@         Sym, FAR, sName\r
+               ENDM\r
+\r
+cPtr@           MACRO   Sym, VALUE, sName       ;; Static Function pointer\r
+Static@         Sym, <DD        VALUE>, sName\r
+               ENDM\r
+\r
+cPtrPub@        MACRO   Sym, VALUE, sName;; Global Function Pointer\r
+PubSym@         Sym, <DD        VALUE>, sName\r
+               ENDM\r
+\r
+cPtrExt@        MACRO   Sym, sName      ;; External Function Pointer\r
+ExtSym@         Sym, DWORD, sName\r
+               ENDM\r
+ELSE\r
+CPTR_           equ     WORD PTR\r
+cPtrSize        equ     2\r
+\r
+Proc@           MACRO   Sym, sName      ;; Open a Static function\r
+Static@         Sym, <PROC      NEAR>, sName\r
+               ENDM\r
+\r
+PubProc@        MACRO   Sym, sName      ;; Open a Public function\r
+PubSym@         Sym, <PROC      NEAR>, sName\r
+               ENDM\r
+\r
+ExtProc@        MACRO   Sym, sName      ;; External Function\r
+ExtSym@         Sym, NEAR, sName\r
+               ENDM\r
+\r
+cPtr@           MACRO   Sym, VALUE, sName       ;; Static Function pointer\r
+Static@         Sym, <DW        VALUE>, sName\r
+               ENDM\r
+\r
+cPtrPub@        MACRO   Sym, VALUE, sName       ;; Global Function Pointer\r
+PubSym@         Sym, <DW        VALUE>, sName\r
+               ENDM\r
+\r
+cPtrExt@        MACRO   Sym, sName      ;; External Function Pointer\r
+ExtSym@         Sym, WORD, sName\r
+               ENDM\r
+ENDIF\r
+\r
+EndProc@        MACRO   Sym, sName      ;; Close a function\r
+Static@         Sym, ENDP, sName\r
+               ENDM\r
+\r
+       PAGE\r
+;[]------------------------------------------------------------[]\r
+;|                                                              |\r
+;|      Miscellaneous Definitions                               |\r
+;|                                                              |\r
+;[]------------------------------------------------------------[]\r
+\r
+;*** Set up some macros for procedure parameters and export/import\r
+\r
+nearCall        STRUC\r
+nearBP          dw      ?\r
+nearIP          dw      ?\r
+nearParam       dw      ?\r
+nearCall        ENDS\r
+\r
+farCall         STRUC\r
+farBP           dw      ?\r
+farCSIP         dd      ?\r
+aParam          dw      ?\r
+farCall         ENDS\r
+\r
+;*** Next, we define some convenient structures to access the parts\r
+;       of larger objects.\r
+\r
+_twoBytes       STRUC\r
+BY0     db      ?\r
+BY1     db      ?\r
+_twoBytes       ENDS\r
+\r
+_fourWords      STRUC\r
+W0      dw      ?\r
+W1      dw      ?\r
+W2      dw      ?\r
+W3      dw      ?\r
+_fourWords      ENDS\r
+\r
+_twoDwords      STRUC\r
+DD0     dd      ?\r
+DD1     dd      ?\r
+_twoDwords      ENDS\r
+\r
+_aFloat         STRUC\r
+double          dq      ?\r
+_aFloat         ENDS\r
+\r
+; How to invoke MSDOS.\r
+\r
+MSDOS@  MACRO\r
+       int     21h\r
+       ENDM\r
+       PAGE\r
+\r
+; The next section concerns the use of registers.  SI and DI are used\r
+;       for register variables, and must be conserved.\r
+\r
+; Registers AX, BX, CX, DX will not be preserved across function calls.\r
+\r
+; Firstly, the registers to be conserved through function calls, including\r
+;       the setup of local variables.\r
+\r
+link@   MACRO   _si,_di,_ES,locals\r
+       push    bp\r
+       mov     bp, sp\r
+       IFNB    <locals>\r
+               lea     sp, locals\r
+       ENDIF\r
+       IFNB    <_si>\r
+               push    si\r
+       ENDIF\r
+       IFNB    <_di>\r
+               push    di\r
+       ENDIF\r
+ENDM\r
+\r
+unLink@ MACRO   _si,_di,_ES,locals\r
+       IFNB    <_di>\r
+               pop     di\r
+       ENDIF\r
+       IFNB    <_si>\r
+               pop     si\r
+       ENDIF\r
+       IFNB    <locals>\r
+               mov     sp, bp\r
+       ENDIF\r
+       pop     bp\r
+ENDM\r
+\r
+.LIST\r