home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / tcpp / examples / startup / rules.asi < prev   
Encoding:
Text File  |  1990-06-10  |  13.3 KB  |  474 lines

  1. ;[]-----------------------------------------------------------------[]
  2. ;|      RULES.ASI  --  Rules & Structures for assembler              |
  3. ;|                                                                   |
  4. ;|      Turbo-C Run Time Library        version 3.0                  |
  5. ;|                                                                   |
  6. ;|      Copyright (c) 1987,1988,1990 by Borland International Inc.   |
  7. ;|      All Rights Reserved.                                         |
  8. ;[]-----------------------------------------------------------------[]
  9.  
  10. ;       4/15/88 ah:
  11. ;       Emulator segment Direktiven wurden für Turbo Pascal modifiziert
  12. ;       durch _Pascal_.
  13.  
  14. ;*** Zuerst werden einige der wichtigsten Konstanten von C definiert .
  15.  
  16. false   equ     0       ; Vorsicht !  für Eingabe-Parameter gilt non-false = true.
  17. true    equ     1       ; Für Ergebnisse wird der korrekte Wert eingesetzt.
  18.  
  19. lesser  equ     -1      ; Eingehend, kleiner < 0
  20. equal   equ      0
  21. greater equ      1      ; Eingehend, größer  > 0
  22.         PAGE
  23. ;[]------------------------------------------------------------[]
  24. ;|                                                              |
  25. ;|      Direktiven zur bedingten Assemblierung;                 |
  26. ;|                                                              |
  27. ;[]------------------------------------------------------------[]
  28.  
  29. ;Speichermodellnamen, zum einfacheren Erstellen der Library
  30.  
  31. IFDEF           __s__
  32. __SMALL__       equ     1
  33. ENDIF
  34.  
  35. IFDEF           __c__
  36. __COMPACT__     equ     1
  37. ENDIF
  38.  
  39. IFDEF           __m__
  40. __MEDIUM__      equ     1
  41. ENDIF
  42.  
  43. IFDEF           __l__
  44. __LARGE__       equ     1
  45. ENDIF
  46.  
  47. IFDEF           __h__
  48. __HUGE__        equ     1
  49. ENDIF
  50.  
  51. IFNDEF __TINY__
  52.     IFNDEF __SMALL__
  53.         IFNDEF __MEDIUM__
  54.             IFNDEF __COMPACT__
  55.                 IFNDEF __LARGE__
  56.                     IFNDEF __HUGE__
  57.                         %OUT  Sie müssen ein Speichermodell angeben.
  58.                         .ERR
  59.                     ENDIF
  60.                 ENDIF
  61.             ENDIF
  62.         ENDIF
  63.     ENDIF
  64. ENDIF
  65.  
  66. ; Bitmasken zum Ermitteln der voreingestellten Pointertypen vom MMODEL
  67. ; (zur Laufzeit)
  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. ENDIF
  76.  
  77. IFDEF   __SMALL__               ; Small Code - Small Data
  78.         LPROG           equ     false
  79.         LDATA           equ     false
  80.         MMODEL          equ     1
  81. ENDIF
  82.  
  83. IFDEF   __MEDIUM__              ; Large Code - Small Data
  84.         LPROG           equ     true
  85.         LDATA           equ     false
  86.         MMODEL          equ     FCODE+2
  87. ENDIF
  88.  
  89. IFDEF   __COMPACT__             ; Small Code - Large Data
  90.         LPROG           equ     false
  91.         LDATA           equ     true
  92.         MMODEL          equ     FDATA+3
  93. ENDIF
  94.  
  95. IFDEF   __LARGE__               ; Large Code - Large Data
  96.         LPROG           equ     true
  97.         LDATA           equ     true
  98.         MMODEL          equ     FCODE+FDATA+4
  99. ENDIF
  100.  
  101. IFDEF   __HUGE__                ; Large Code - Large Data
  102.         LPROG           equ     true
  103.         LDATA           equ     true
  104.         MMODEL          equ     FCODE+FDATA+5
  105. ENDIF
  106.  
  107. IFNDEF  LPROG                   ; *** Voreinstellung = __COMPACT__ ***
  108.         __COMPACT__     equ     true
  109.         LPROG           equ     false
  110.         LDATA           equ     true
  111.         MMODEL          equ     FDATA+3
  112. ENDIF
  113.  
  114. IF      LPROG
  115.         DIST            equ     FAR
  116. ELSE
  117.         DIST            equ     NEAR
  118. ENDIF
  119.  
  120.         PAGE
  121. ;[]------------------------------------------------------------[]
  122. ;|                                                              |
  123. ;|      Makros zur Segmentdeklaration                           |
  124. ;|                                                              |
  125. ;[]------------------------------------------------------------[]
  126.  
  127. CSeg@           MACRO           ;; Anlegen eines Code-Segments
  128. _TEXT   SEGMENT BYTE PUBLIC 'CODE'
  129.         ASSUME  CS:_TEXT
  130.                 ENDM
  131.  
  132. CSegEnd@        MACRO           ;; Beenden eines Code-Segments
  133. _TEXT   ENDS
  134.                 ENDM
  135.  
  136. DSeg@           MACRO           ;; Anlegen eines Datensegments (initialisiert)
  137. _DATA   SEGMENT WORD PUBLIC 'DATA'
  138.                 ENDM
  139.  
  140. DSegEnd@        MACRO           ;; Beenden eines Datensegments (initialisiert)
  141. _DATA   ENDS
  142.                 ENDM
  143.  
  144. IFDEF __BSS__
  145.     IFNDEF __HUGE__
  146.         BSeg@           MACRO           ;; Anlegen eines nicht initialisierten Datensegmentes
  147.         _BSS    SEGMENT WORD PUBLIC 'BSS'
  148.                 ENDM
  149.  
  150.         BSegEnd@        MACRO           ;; Beenden eines nicht initialisierten Datensegmentes
  151.         _BSS    ENDS
  152.                         ENDM
  153.     ENDIF
  154. ENDIF
  155.  
  156. Header@ MACRO
  157. _TEXT   SEGMENT BYTE PUBLIC 'CODE'
  158. _TEXT   ENDS
  159. _DATA   SEGMENT WORD PUBLIC 'DATA'
  160. _DATA   ENDS
  161. IFDEF __BSS__
  162.     IFNDEF  __HUGE__
  163.         _BSS    SEGMENT WORD PUBLIC 'BSS'
  164.         _BSS    ENDS
  165.     ENDIF
  166. ENDIF
  167.  
  168. IFDEF __BSS__
  169.     IFDEF   __TINY__
  170.         DGROUP  GROUP   _TEXT, _DATA, _BSS
  171.     ELSE
  172.         IFDEF __HUGE__
  173.             DGROUP  GROUP   _DATA
  174.         ELSE
  175.             DGROUP  GROUP   _DATA, _BSS
  176.         ENDIF
  177.     ENDIF
  178. ELSE
  179.     IFDEF   __TINY__
  180.         DGROUP  GROUP   _TEXT, _DATA
  181.     ELSE
  182.         DGROUP  GROUP   _DATA
  183.     ENDIF
  184. ENDIF
  185.         ASSUME  CS:_TEXT, DS:DGROUP
  186.         ENDM
  187.         PAGE
  188. ;[]------------------------------------------------------------[]
  189. ;|                                                              |
  190. ;|      Makros zu den Namenskonventionen in C                   |
  191. ;|                                                              |
  192. ;[]------------------------------------------------------------[]
  193.  
  194. UNDERSCORE      EQU     1
  195.  
  196. ExtSym@ MACRO   Sym, sType, sName
  197.         IFNB    <sName>
  198.         IFIDN   <sName>, <__PASCAL__>
  199. NAMING      =       0
  200.         ELSE
  201. NAMING      =       UNDERSCORE
  202.         ENDIF
  203.         ENDIF
  204.         IF      NAMING
  205.         EXTRN   _&Sym : sType
  206. Sym&@   equ     _&Sym
  207.         ELSE
  208.         EXTRN   Sym : sType
  209. Sym&@   equ     Sym
  210.         ENDIF
  211.         ENDM
  212.  
  213. PubSym@ MACRO   Sym, Definition, sName
  214.         IFNB    <sName>
  215.         IFIDN   <sName>, <__PASCAL__>
  216. NAMING      =       0
  217.         ELSE
  218. NAMING      =       UNDERSCORE
  219.         ENDIF
  220.         ENDIF
  221.         IF      NAMING
  222.         PUBLIC  _&Sym
  223. _&Sym   Definition
  224. Sym&@   equ     _&Sym
  225.         ELSE
  226.         PUBLIC  Sym
  227. Sym     Definition
  228. Sym&@   equ     Sym
  229.         ENDIF
  230.         ENDM
  231.  
  232. Static@ MACRO   Sym, Definition, sName
  233.         IFNB    <sName>
  234.         IFIDN   <sName>, <__PASCAL__>
  235. NAMING      =       0
  236.         ELSE
  237. NAMING      =       UNDERSCORE
  238.         ENDIF
  239.         ENDIF
  240.         IF      NAMING
  241. _&Sym   Definition
  242. Sym&@   equ     _&Sym
  243.         ELSE
  244. Sym     Definition
  245. Sym&@   equ     Sym
  246.         ENDIF
  247.         ENDM
  248.         PAGE
  249. ;[]------------------------------------------------------------[]
  250. ;|                                                              |
  251. ;|      Datengrößenabhängige Makros                             |
  252. ;|                                                              |
  253. ;[]------------------------------------------------------------[]
  254.  
  255. IF      LDATA
  256. DPTR_           equ     DWORD PTR
  257. dPtrSize        equ     4
  258. LES_            equ     LES
  259. ES_             equ     ES:
  260. SS_             equ     SS:
  261. LDS_            equ     LDS
  262.  
  263. pushDS_         MACRO
  264.                 PUSH    DS
  265.                 ENDM
  266.  
  267. popDS_          MACRO
  268.                 POP    DS
  269.                 ENDM
  270.  
  271. PushPtr         MACRO   dPtrOff, dPtrSeg
  272.                 PUSH    dPtrSeg
  273.                 PUSH    dPtrOff
  274.                 ENDM
  275.  
  276.  
  277. dPtr@           MACRO   Sym, VALUE, sName       ;; Static Daten-Zeiger
  278. Static@         Sym, <DD        VALUE>, sName
  279.                 ENDM
  280.  
  281. dPtrPub@        MACRO   Sym, VALUE, sName       ;; Globaler Daten-Zeiger
  282. PubSym@         Sym, <DD        VALUE>, sName
  283.                 ENDM
  284.  
  285. dPtrExt@        MACRO   Sym, sName      ;; Externer Daten-Zeiger
  286. ExtSym@         Sym, DWORD, sName
  287.                 ENDM
  288. ELSE
  289. DPTR_           equ     WORD PTR
  290. dPtrSize        equ     2
  291. LES_            equ     MOV
  292. ES_             equ     DS:
  293. SS_             equ     DS:
  294. LDS_            equ     MOV
  295.  
  296. pushDS_         MACRO
  297.                 ENDM
  298.  
  299. popDS_          MACRO
  300.                 ENDM
  301.  
  302. PushPtr         MACRO   dPtrOff, dPtrSeg
  303.                 PUSH    dPtrOff
  304.                 ENDM
  305.  
  306. dPtr@           MACRO   Sym, VALUE, sName       ;; Static Daten-Zeiger
  307. Static@         Sym, <DW        VALUE>, sName
  308.                 ENDM
  309.  
  310. dPtrPub@        MACRO   Sym, VALUE, sName       ;; Globaler Daten-Zeiger
  311. PubSym@         Sym, <DW        VALUE>, sName
  312.                 ENDM
  313.  
  314. dPtrExt@        MACRO   Sym, sName      ;; Externer Daten-Zeiger
  315. ExtSym@         Sym, WORD, sName
  316.                 ENDM
  317. ENDIF
  318.         PAGE
  319. ;[]------------------------------------------------------------[]
  320. ;|                                                              |
  321. ;|      von der Code-Größe abhängige Makros                     |
  322. ;|                                                              |
  323. ;[]------------------------------------------------------------[]
  324.  
  325. IF      LPROG
  326. CPTR_           equ     DWORD PTR
  327. cPtrSize        equ     4
  328.  
  329. Proc@           MACRO   Sym, sName      ;; Einleitung einer "static"-Funktion
  330. Static@         Sym, <PROC      FAR>, sName
  331.                 ENDM
  332.  
  333. PubProc@        MACRO   Sym, sName      ;; Einleitung einer globalen Funktion
  334. PubSym@         Sym, <PROC      FAR>, sName
  335.                 ENDM
  336.  
  337. ExtProc@        MACRO   Sym, sName      ;; Externe Funktion
  338. ExtSym@         Sym, FAR, sName
  339.                 ENDM
  340.  
  341. cPtr@           MACRO   Sym, VALUE, sName       ;; Zeiger auf "Static"-Funktion
  342. Static@         Sym, <DD        VALUE>, sName
  343.                 ENDM
  344.  
  345. cPtrPub@        MACRO   Sym, VALUE, sName;; Zeiger auf globale Funktion
  346. PubSym@         Sym, <DD        VALUE>, sName
  347.                 ENDM
  348.  
  349. cPtrExt@        MACRO   Sym, sName      ;; Zieger auf externe Funktion
  350. ExtSym@         Sym, DWORD, sName
  351.                 ENDM
  352. ELSE
  353. CPTR_           equ     WORD PTR
  354. cPtrSize        equ     2
  355.  
  356. Proc@           MACRO   Sym, sName      ;; Einleitung für "static"-Funktion
  357. Static@         Sym, <PROC      NEAR>, sName
  358.                 ENDM
  359.  
  360. PubProc@        MACRO   Sym, sName      ;; Einleitung für "public"-Funktion
  361. PubSym@         Sym, <PROC      NEAR>, sName
  362.                 ENDM
  363.  
  364. ExtProc@        MACRO   Sym, sName      ;; Externe Funktion
  365. ExtSym@         Sym, NEAR, sName
  366.                 ENDM
  367.  
  368. cPtr@           MACRO   Sym, VALUE, sName       ;; Zeiger auf "static"-Funktion
  369. Static@         Sym, <DW        VALUE>, sName
  370.                 ENDM
  371.  
  372. cPtrPub@        MACRO   Sym, VALUE, sName       ;; Zeiger auf globale Funktion
  373. PubSym@         Sym, <DW        VALUE>, sName
  374.                 ENDM
  375.  
  376. cPtrExt@        MACRO   Sym, sName      ;; Zeiger auf externe Funktion
  377. ExtSym@         Sym, WORD, sName
  378.                 ENDM
  379. ENDIF
  380.  
  381. EndProc@        MACRO   Sym, sName      ;; Beenden einer Funktion
  382. Static@         Sym, ENDP, sName
  383.                 ENDM
  384.         PAGE
  385. ;[]------------------------------------------------------------[]
  386. ;|                                                              |
  387. ;|      Verschiedene Definitionen                               |
  388. ;|                                                              |
  389. ;[]------------------------------------------------------------[]
  390.  
  391. ;*** Diverse Makros für Prozedurparameter und Export/Import
  392.  
  393. nearCall        STRUC
  394. nearBP          dw      ?
  395. nearIP          dw      ?
  396. nearParam       dw      ?
  397. nearCall        ENDS
  398.  
  399. farCall         STRUC
  400. farBP           dw      ?
  401. farCSIP         dd      ?
  402. aParam          dw      ?
  403. farCall         ENDS
  404.  
  405.  
  406. ;*** Als nächstes definieren wir uns einige Strukturen zum bequemeren
  407. ;    Zugriff auf die Komponenten von größeren Objekten
  408.  
  409. _twoBytes       STRUC
  410. BY0     db      ?
  411. BY1     db      ?
  412. _twoBytes       ENDS
  413.  
  414. _fourWords      STRUC
  415. W0      dw      ?
  416. W1      dw      ?
  417. W2      dw      ?
  418. W3      dw      ?
  419. _fourWords      ENDS
  420.  
  421. _twoDwords      STRUC
  422. DD0     dd      ?
  423. DD1     dd      ?
  424. _twoDwords      ENDS
  425.  
  426. _aFloat         STRUC
  427. double          dq      ?
  428. _aFloat         ENDS
  429.  
  430. ; Aufruf einer MS-DOS-Funktion.
  431.  
  432. MSDOS@  MACRO
  433.         int     21h
  434.         ENDM
  435.         PAGE
  436.  
  437. ; Der nächste Abschnitt behandelt den Gebrauch von Registern. SI und DI
  438. ; werden als Register-Variable verwendet und müssen daher gesichert werden
  439.  
  440. ; Die Register AX, BX, CX, DX werden bei Funktionsaufrufen nicht gesichert
  441.  
  442. ; Zuerst kommen die zu sichernden Register bei Funktionsaufrufen
  443. ; einschließlich den lokalen Variablen
  444.  
  445.  
  446. link@   MACRO   _si,_di,_ES,locals
  447.         push    bp
  448.         mov     bp, sp
  449.         IFNB    <locals>
  450.                 lea     sp, locals
  451.         ENDIF
  452.         IFNB    <_si>
  453.                 push    si
  454.         ENDIF
  455.         IFNB    <_di>
  456.                 push    di
  457.         ENDIF
  458. ENDM
  459.  
  460. unLink@ MACRO   _si,_di,_ES,locals
  461.         IFNB    <_di>
  462.                 pop     di
  463.         ENDIF
  464.         IFNB    <_si>
  465.                 pop     si
  466.         ENDIF
  467.         IFNB    <locals>
  468.                 mov     sp, bp
  469.         ENDIF
  470.         pop     bp
  471. ENDM
  472.  
  473. .LIST
  474.