home *** CD-ROM | disk | FTP | other *** search
- ;[]-----------------------------------------------------------------[]
- ;| RULES.ASI -- Rules & Structures for assembler |
- ;| |
- ;| Turbo-C Run Time Library version 3.0 |
- ;| |
- ;| Copyright (c) 1987,1988,1990 by Borland International Inc. |
- ;| All Rights Reserved. |
- ;[]-----------------------------------------------------------------[]
-
- ; 4/15/88 ah:
- ; Emulator segment Direktiven wurden für Turbo Pascal modifiziert
- ; durch _Pascal_.
-
- ;*** Zuerst werden einige der wichtigsten Konstanten von C definiert .
-
- false equ 0 ; Vorsicht ! für Eingabe-Parameter gilt non-false = true.
- true equ 1 ; Für Ergebnisse wird der korrekte Wert eingesetzt.
-
- lesser equ -1 ; Eingehend, kleiner < 0
- equal equ 0
- greater equ 1 ; Eingehend, größer > 0
- PAGE
- ;[]------------------------------------------------------------[]
- ;| |
- ;| Direktiven zur bedingten Assemblierung; |
- ;| |
- ;[]------------------------------------------------------------[]
-
- ;Speichermodellnamen, zum einfacheren Erstellen der Library
-
- IFDEF __s__
- __SMALL__ equ 1
- ENDIF
-
- IFDEF __c__
- __COMPACT__ equ 1
- ENDIF
-
- IFDEF __m__
- __MEDIUM__ equ 1
- ENDIF
-
- IFDEF __l__
- __LARGE__ equ 1
- ENDIF
-
- IFDEF __h__
- __HUGE__ equ 1
- ENDIF
-
- IFNDEF __TINY__
- IFNDEF __SMALL__
- IFNDEF __MEDIUM__
- IFNDEF __COMPACT__
- IFNDEF __LARGE__
- IFNDEF __HUGE__
- %OUT Sie müssen ein Speichermodell angeben.
- .ERR
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
-
- ; Bitmasken zum Ermitteln der voreingestellten Pointertypen vom MMODEL
- ; (zur Laufzeit)
- FCODE equ 8000h
- FDATA equ 4000h
-
- IFDEF __TINY__ ; Small Code - Small Data
- LPROG equ false
- LDATA equ false
- MMODEL equ 0
- ENDIF
-
- IFDEF __SMALL__ ; Small Code - Small Data
- LPROG equ false
- LDATA equ false
- MMODEL equ 1
- ENDIF
-
- IFDEF __MEDIUM__ ; Large Code - Small Data
- LPROG equ true
- LDATA equ false
- MMODEL equ FCODE+2
- ENDIF
-
- IFDEF __COMPACT__ ; Small Code - Large Data
- LPROG equ false
- LDATA equ true
- MMODEL equ FDATA+3
- ENDIF
-
- IFDEF __LARGE__ ; Large Code - Large Data
- LPROG equ true
- LDATA equ true
- MMODEL equ FCODE+FDATA+4
- ENDIF
-
- IFDEF __HUGE__ ; Large Code - Large Data
- LPROG equ true
- LDATA equ true
- MMODEL equ FCODE+FDATA+5
- ENDIF
-
- IFNDEF LPROG ; *** Voreinstellung = __COMPACT__ ***
- __COMPACT__ equ true
- LPROG equ false
- LDATA equ true
- MMODEL equ FDATA+3
- ENDIF
-
- IF LPROG
- DIST equ FAR
- ELSE
- DIST equ NEAR
- ENDIF
-
- PAGE
- ;[]------------------------------------------------------------[]
- ;| |
- ;| Makros zur Segmentdeklaration |
- ;| |
- ;[]------------------------------------------------------------[]
-
- CSeg@ MACRO ;; Anlegen eines Code-Segments
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:_TEXT
- ENDM
-
- CSegEnd@ MACRO ;; Beenden eines Code-Segments
- _TEXT ENDS
- ENDM
-
- DSeg@ MACRO ;; Anlegen eines Datensegments (initialisiert)
- _DATA SEGMENT WORD PUBLIC 'DATA'
- ENDM
-
- DSegEnd@ MACRO ;; Beenden eines Datensegments (initialisiert)
- _DATA ENDS
- ENDM
-
- IFDEF __BSS__
- IFNDEF __HUGE__
- BSeg@ MACRO ;; Anlegen eines nicht initialisierten Datensegmentes
- _BSS SEGMENT WORD PUBLIC 'BSS'
- ENDM
-
- BSegEnd@ MACRO ;; Beenden eines nicht initialisierten Datensegmentes
- _BSS ENDS
- ENDM
- ENDIF
- ENDIF
-
- Header@ MACRO
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- _TEXT ENDS
- _DATA SEGMENT WORD PUBLIC 'DATA'
- _DATA ENDS
- IFDEF __BSS__
- IFNDEF __HUGE__
- _BSS SEGMENT WORD PUBLIC 'BSS'
- _BSS ENDS
- ENDIF
- ENDIF
-
- IFDEF __BSS__
- IFDEF __TINY__
- DGROUP GROUP _TEXT, _DATA, _BSS
- ELSE
- IFDEF __HUGE__
- DGROUP GROUP _DATA
- ELSE
- DGROUP GROUP _DATA, _BSS
- ENDIF
- ENDIF
- ELSE
- IFDEF __TINY__
- DGROUP GROUP _TEXT, _DATA
- ELSE
- DGROUP GROUP _DATA
- ENDIF
- ENDIF
- ASSUME CS:_TEXT, DS:DGROUP
- ENDM
- PAGE
- ;[]------------------------------------------------------------[]
- ;| |
- ;| Makros zu den Namenskonventionen in C |
- ;| |
- ;[]------------------------------------------------------------[]
-
- UNDERSCORE EQU 1
-
- ExtSym@ MACRO Sym, sType, sName
- IFNB <sName>
- IFIDN <sName>, <__PASCAL__>
- NAMING = 0
- ELSE
- NAMING = UNDERSCORE
- ENDIF
- ENDIF
- IF NAMING
- EXTRN _&Sym : sType
- Sym&@ equ _&Sym
- ELSE
- EXTRN Sym : sType
- Sym&@ equ Sym
- ENDIF
- ENDM
-
- PubSym@ MACRO Sym, Definition, sName
- IFNB <sName>
- IFIDN <sName>, <__PASCAL__>
- NAMING = 0
- ELSE
- NAMING = UNDERSCORE
- ENDIF
- ENDIF
- IF NAMING
- PUBLIC _&Sym
- _&Sym Definition
- Sym&@ equ _&Sym
- ELSE
- PUBLIC Sym
- Sym Definition
- Sym&@ equ Sym
- ENDIF
- ENDM
-
- Static@ MACRO Sym, Definition, sName
- IFNB <sName>
- IFIDN <sName>, <__PASCAL__>
- NAMING = 0
- ELSE
- NAMING = UNDERSCORE
- ENDIF
- ENDIF
- IF NAMING
- _&Sym Definition
- Sym&@ equ _&Sym
- ELSE
- Sym Definition
- Sym&@ equ Sym
- ENDIF
- ENDM
- PAGE
- ;[]------------------------------------------------------------[]
- ;| |
- ;| Datengrößenabhängige Makros |
- ;| |
- ;[]------------------------------------------------------------[]
-
- IF LDATA
- DPTR_ equ DWORD PTR
- dPtrSize equ 4
- LES_ equ LES
- ES_ equ ES:
- SS_ equ SS:
- LDS_ equ LDS
-
- pushDS_ MACRO
- PUSH DS
- ENDM
-
- popDS_ MACRO
- POP DS
- ENDM
-
- PushPtr MACRO dPtrOff, dPtrSeg
- PUSH dPtrSeg
- PUSH dPtrOff
- ENDM
-
-
- dPtr@ MACRO Sym, VALUE, sName ;; Static Daten-Zeiger
- Static@ Sym, <DD VALUE>, sName
- ENDM
-
- dPtrPub@ MACRO Sym, VALUE, sName ;; Globaler Daten-Zeiger
- PubSym@ Sym, <DD VALUE>, sName
- ENDM
-
- dPtrExt@ MACRO Sym, sName ;; Externer Daten-Zeiger
- ExtSym@ Sym, DWORD, sName
- ENDM
- ELSE
- DPTR_ equ WORD PTR
- dPtrSize equ 2
- LES_ equ MOV
- ES_ equ DS:
- SS_ equ DS:
- LDS_ equ MOV
-
- pushDS_ MACRO
- ENDM
-
- popDS_ MACRO
- ENDM
-
- PushPtr MACRO dPtrOff, dPtrSeg
- PUSH dPtrOff
- ENDM
-
- dPtr@ MACRO Sym, VALUE, sName ;; Static Daten-Zeiger
- Static@ Sym, <DW VALUE>, sName
- ENDM
-
- dPtrPub@ MACRO Sym, VALUE, sName ;; Globaler Daten-Zeiger
- PubSym@ Sym, <DW VALUE>, sName
- ENDM
-
- dPtrExt@ MACRO Sym, sName ;; Externer Daten-Zeiger
- ExtSym@ Sym, WORD, sName
- ENDM
- ENDIF
- PAGE
- ;[]------------------------------------------------------------[]
- ;| |
- ;| von der Code-Größe abhängige Makros |
- ;| |
- ;[]------------------------------------------------------------[]
-
- IF LPROG
- CPTR_ equ DWORD PTR
- cPtrSize equ 4
-
- Proc@ MACRO Sym, sName ;; Einleitung einer "static"-Funktion
- Static@ Sym, <PROC FAR>, sName
- ENDM
-
- PubProc@ MACRO Sym, sName ;; Einleitung einer globalen Funktion
- PubSym@ Sym, <PROC FAR>, sName
- ENDM
-
- ExtProc@ MACRO Sym, sName ;; Externe Funktion
- ExtSym@ Sym, FAR, sName
- ENDM
-
- cPtr@ MACRO Sym, VALUE, sName ;; Zeiger auf "Static"-Funktion
- Static@ Sym, <DD VALUE>, sName
- ENDM
-
- cPtrPub@ MACRO Sym, VALUE, sName;; Zeiger auf globale Funktion
- PubSym@ Sym, <DD VALUE>, sName
- ENDM
-
- cPtrExt@ MACRO Sym, sName ;; Zieger auf externe Funktion
- ExtSym@ Sym, DWORD, sName
- ENDM
- ELSE
- CPTR_ equ WORD PTR
- cPtrSize equ 2
-
- Proc@ MACRO Sym, sName ;; Einleitung für "static"-Funktion
- Static@ Sym, <PROC NEAR>, sName
- ENDM
-
- PubProc@ MACRO Sym, sName ;; Einleitung für "public"-Funktion
- PubSym@ Sym, <PROC NEAR>, sName
- ENDM
-
- ExtProc@ MACRO Sym, sName ;; Externe Funktion
- ExtSym@ Sym, NEAR, sName
- ENDM
-
- cPtr@ MACRO Sym, VALUE, sName ;; Zeiger auf "static"-Funktion
- Static@ Sym, <DW VALUE>, sName
- ENDM
-
- cPtrPub@ MACRO Sym, VALUE, sName ;; Zeiger auf globale Funktion
- PubSym@ Sym, <DW VALUE>, sName
- ENDM
-
- cPtrExt@ MACRO Sym, sName ;; Zeiger auf externe Funktion
- ExtSym@ Sym, WORD, sName
- ENDM
- ENDIF
-
- EndProc@ MACRO Sym, sName ;; Beenden einer Funktion
- Static@ Sym, ENDP, sName
- ENDM
- PAGE
- ;[]------------------------------------------------------------[]
- ;| |
- ;| Verschiedene Definitionen |
- ;| |
- ;[]------------------------------------------------------------[]
-
- ;*** Diverse Makros für Prozedurparameter und Export/Import
-
- nearCall STRUC
- nearBP dw ?
- nearIP dw ?
- nearParam dw ?
- nearCall ENDS
-
- farCall STRUC
- farBP dw ?
- farCSIP dd ?
- aParam dw ?
- farCall ENDS
-
-
- ;*** Als nächstes definieren wir uns einige Strukturen zum bequemeren
- ; Zugriff auf die Komponenten von größeren Objekten
-
- _twoBytes STRUC
- BY0 db ?
- BY1 db ?
- _twoBytes ENDS
-
- _fourWords STRUC
- W0 dw ?
- W1 dw ?
- W2 dw ?
- W3 dw ?
- _fourWords ENDS
-
- _twoDwords STRUC
- DD0 dd ?
- DD1 dd ?
- _twoDwords ENDS
-
- _aFloat STRUC
- double dq ?
- _aFloat ENDS
-
- ; Aufruf einer MS-DOS-Funktion.
-
- MSDOS@ MACRO
- int 21h
- ENDM
- PAGE
-
- ; Der nächste Abschnitt behandelt den Gebrauch von Registern. SI und DI
- ; werden als Register-Variable verwendet und müssen daher gesichert werden
-
- ; Die Register AX, BX, CX, DX werden bei Funktionsaufrufen nicht gesichert
-
- ; Zuerst kommen die zu sichernden Register bei Funktionsaufrufen
- ; einschließlich den lokalen Variablen
-
-
- link@ MACRO _si,_di,_ES,locals
- push bp
- mov bp, sp
- IFNB <locals>
- lea sp, locals
- ENDIF
- IFNB <_si>
- push si
- ENDIF
- IFNB <_di>
- push di
- ENDIF
- ENDM
-
- unLink@ MACRO _si,_di,_ES,locals
- IFNB <_di>
- pop di
- ENDIF
- IFNB <_si>
- pop si
- ENDIF
- IFNB <locals>
- mov sp, bp
- ENDIF
- pop bp
- ENDM
-
- .LIST