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