home *** CD-ROM | disk | FTP | other *** search
/ 100 af Verdens Bedste Spil / 100Spil.iso / dos / wolf3d / source / wolfsrc.1 / RULES.ASI < prev    next >
Text File  |  1993-02-04  |  17KB  |  693 lines

  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
  693.