home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 May / Pcwk5b98.iso / Borland / Cplus45 / BC45 / START16.PAK / RULES.ASI < prev   
Text File  |  1995-08-29  |  19KB  |  699 lines

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