rules.asi
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:18k
源码类别:

DVD

开发平台:

Others

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