home *** CD-ROM | disk | FTP | other *** search
- /* Wenn MiNT beruecksichtigt werden soll */
- #define MINT 1
-
-
-
- #define not !
- #define NONE 0
-
- #ifdef LPRM2
- # undef LPRM2
- # define LPRM2 1
- #else
- # define LPRM2 0
- #endif
-
- #ifdef SPCM2
- # undef SPCM2
- # define SPCM2 1
- #else
- # define SPCM2 0
- #endif
-
- #ifdef HM2
- # undef HM2
- # define HM2 1
- #else
- # define HM2 0
- #endif
-
- #ifdef MM2
- # undef MM2
- # define MM2 1
- #else
- # define MM2 0
- #endif
-
- #ifdef TDIM2
- # undef TDIM2
- # define TDIM2 1
- #else
- # define TDIM2 0
- #endif
-
- #ifdef FTLM2
- # undef FTLM2
- # define FTLM2 1
- #else
- # define FTLM2 0
- #endif
-
- #if not(LPRM2 || SPCM2 || HM2 || MM2 || TDIM2)
- # error *** compiler not (yet) supported
- #endif
-
-
-
- #define GEMDOS (NONE || LPRM2 || SPCM2 || HM2 || MM2 || TDIM2 || FTLM2)
- #define PCDOS (NONE)
-
- #define ISOM2 (NONE)
-
-
-
- /* Bei Def. eines Prozedurtyps kann der Typ selber als Param.typ auftreten */
- #define ISO_recursive_proc_decl (NONE || ISOM2 || MM2)
-
- /* Prozeduren gleichen Typs duerfen auf Gleichheit getestet werden (ISO) */
- #define ISO_proc_compare (NONE || ISOM2)
-
- /* Werte gleichen opaken Typs duerfen auf Gleichheit getestet werden (ISO) */
- #define ISO_opaque_compare (NONE || ISOM2)
-
- /* Opake Typen koennen im entspr. Imp.modul auch als Import-Typ def. werden */
- #define ISO_opaque_far_imp (NONE || ISOM2 || LPRM2 || SPCM2)
-
- /* Prozedurkonstanten sind erlaubt (ISO) */
- #define ISO_proc_const (NONE || ISOM2 || FTLM2)
-
- /* ARRAY- und RECORD-Konstanten (ISO) */
- #define ISO_value_constructor (NONE || ISOM2 || MM2)
-
- /* VAL ist Universalkonvertierung (ISO) */
- #define ISO_val (NONE || ISOM2 || MM2)
-
- /* Wenn Unterstriche in Bezeichnern erlaubt sind (ISO) */
- #define ISO_underscore (NONE || ISOM2 || MM2)
-
- /* Wenn der Typ PACKEDSET fuer Bitmengen vorhanden ist (ISO) */
- #define ISO_packedset (NONE || ISOM2)
-
- /* ISO-Prozeduren fuer Zeigerarithmetik vorhanden */
- #define ISO_ptr_arith (NONE || ISOM2)
-
- /* Felder und Verbunde als Funktionsresultate moeglich (ISO) */
- #define ISO_struct_return (NONE || ISOM2 || MM2 || HM2 || FTLM2)
-
- /* SET OF CHAR definierbar (ISO) */
- #define ISO_char_set (NONE || ISOM2 || MM2 || TDIM2 || FTLM2)
-
- /* Universaltyp LOC vorhanden (ISO) */
- #define ISO_loc (NONE || ISOM2 || MM2)
-
- /* Bit-Mengen (<= 32) mit 0 als hoechstwertigem Bit */
- #define reverse_set (NONE || FTLM2)
-
- /* Mengen mit 32 Elementen definierbar */
- #define long_set (NONE || ISOM2 || HM || SPCM2 || MM2 || TDIM2 || FTLM2)
-
- /* Bei RECORD-Varianten ohne Diskriminator kein Doppelpunkt (PIM2) */
- #define no_empty_tag_colon (NONE)
-
- /* Als Indextyp in Feldern sind nur Unterbereiche erlaubt */
- #define only_subrange_index (NONE || LPRM2 || SPCM2)
-
- /* Standardprozeduren MIN und MAX existieren nicht */
- #define no_MIN_MAX (NONE)
-
- /* Hat den Parametertyp REF */
- #define has_REF (NONE || MM2)
-
- /* Exportliste im Definitionsmodul notwendig */
- #define export (NONE)
-
- /* Schwierigkeiten bei reexportierten Bezeichnern */
- #define no_reexport (NONE || FTLM2)
-
- #define odd_arrays (NONE || MM2 || TDIM2)
-
- #define odd_records (NONE)
-
- #define align_byte_after_odd (NONE)
-
-
- /* Betrifft nur Parameter vom Typ ARRAY OF CHAR */
- #if TDIM2
- # define REF VAR
- #elif not has_REF
- # define REF
- #endif
-
- #if not ISO_packedset
- #define PACKEDSET SET
- #endif
-
-
- /* Max Groesse von INTEGER und CARDINAL-Zahlen in Bytes */
- #if GEMDOS
- # define sizeof_biggest_signed 4
- # define sizeof_biggest_unsigned 4
- #endif
-
-
- /* Falls LONG-Konstanten eine besondere Kennzeichnung benoetigen */
-
- #if LPRM2 || SPCM2
- # define LC(_NUM) _NUM ## D
- # define LIC(_NUM) _NUM ## D
- #else
- # define LC(_NUM) _NUM
- # define LIC(_NUM) _NUM
- #endif
-
-
- /* Falls LONGREAL-Konstanten eine besondere Kennzeichnung haben */
-
- #if LPRM2 || SPCM2
- # define LRC(_MANT,_EXP) _MANT ## D ## _EXP
- #else
- # define LRC(_MANT,_EXP) _MANT ## E ## _EXP
- #endif
-
-
- /* */
-
- #if no_empty_tag_colon
- # define TAG_COLON
- #else
- # define TAG_COLON :
- #endif
-
-
- /* Falls VAL aus SYSTEM importiert werden muss */
-
- #if LPRM2 || SPCM2
- # define VAL_INTRINSIC FROM SYSTEM IMPORT VAL;
- #else
- # define VAL_INTRINSIC
- #endif
-
-
- #if FTLM2 || TDIM2
- /* Ein CAST von 32 auf 16 Bit funktioniert bei FTL-Version 1.18 nicht !! */
- # define VAL(_TYPE,_EXPR) _TYPE(_EXPR)
- #endif
-
-
- /* Emulation der ISO-funktion CAST */
-
- #if ISOM2 || MM2
- # define CAST_IMPORT FROM SYSTEM IMPORT CAST;
- #elif LPRM2 || SPCM2
- # define CAST_IMPORT
- # define CAST(_TYPE,_EXPR) VAL(_TYPE,_EXPR)
- #else
- # define CAST_IMPORT
- # define CAST(_TYPE,_EXPR) _TYPE(_EXPR)
- #endif
-
-
-
- /* Emulation der ISO-Funktion INT */
-
- #if FTLM2
- # define INT(_EXPR) SHORT(LONGINT(_EXPR))
- #elif not(ISOM2 || HM2)
- # define INT(_EXPR) VAL(INTEGER,_EXPR)
- #endif
-
-
- /* Falls NEW und DISPOSE fehlen */
-
- #if LPRM2
- # define Storage Heap
- # define ALLOCATE Allocate
- # define DEALLOCATE Deallocate
- # define NEW(_PTR) ALLOCATE(_PTR,SIZE(_PTR ## ^))
- # define DISPOSE(_PTR) DEALLOCATE(_PTR,SIZE(_PTR ## ^))
- #elif SPCM2
- # define NEW(_PTR) ALLOCATE(_PTR,SIZE(_PTR ## ^))
- # define DISPOSE(_PTR) DEALLOCATE(_PTR)
- #endif
-
-
- /* Pointer-Arithmetik */
-
- #if ISO_ptr_arith
- # define PTR_ARITH_IMPORT FROM SYSTEM IMPORT ADDADR,SUBADR,DIFADR,MAKEADR;
- #elif LPRM2 || SPCM2
- # define PTR_ARITH_IMPORT
-
- # define ADDADR(_PTR,_ADD) (VAL(ADDRESS,_PTR)+VAL(ADDRESS,_ADD))
- # define SUBADR(_PTR,_SUB) (VAL(ADDRESS,_PTR)-VAL(ADDRESS,_SUB))
- # define DIFADR(_PTR1,_PTR2) (VAL(LONGINT,_PTR1)-VAL(LONGINT,_PTR2))
- # define MAKEADR(_EXPR) VAL(ADDRESS,_EXPR)
- #elif HM2
- # define PTR_ARITH_IMPORT
-
- # define ADDADR(_PTR,_ADD) (ADDRESS(_PTR)+VAL(LONGCARD,_ADD))
- # define SUBADR(_PTR,_SUB) (ADDRESS(_PTR)-VAL(LONGCARD,_SUB))
- # define DIFADR(_PTR1,_PTR2) (LONGINT(_PTR1)-LONGINT(_PTR2))
- # define MAKEADR(_EXPR) VAL(ADDRESS,_EXPR)
- #elif MM2
- # define PTR_ARITH_IMPORT
-
- # define ADDADR(_PTR,_ADD) (ADDRESS(_PTR)+VAL(LONGCARD,_ADD))
- # define SUBADR(_PTR,_SUB) (ADDRESS(_PTR)-VAL(LONGCARD,_SUB))
- # define DIFADR(_PTR1,_PTR2) (LONGINT(_PTR1)-LONGINT(_PTR2))
- # define MAKEADR(_EXPR) ADDRESS(VAL(LONGCARD,_EXPR))
- #elif FTLM2
- # define PTR_ARITH_IMPORT
-
- # define ADDADR(_PTR,_ADD) (ADDRESS(_PTR)+LONGCARD(_ADD))
- # define SUBADR(_PTR,_SUB) (ADDRESS(_PTR)-LONGCARD(_SUB))
- # define DIFADR(_PTR1,_PTR2) (LONGINT(_PTR1)-LONGINT(_PTR2))
- # define MAKEADR(_EXPR) ADDRESS(_EXPR)
- #elif TDIM2
- # define PTR_ARITH_IMPORT
-
- # define ADDADR(_PTR,_ADD) (ADDRESS(_PTR)+ADDRESS(_ADD))
- # define SUBADR(_PTR,_SUB) (ADDRESS(_PTR)-ADDRESS(_SUB))
- # define DIFADR(_PTR1,_PTR2) (LONGINT(_PTR1)-LONGINT(_PTR2))
- # define MAKEADR(_EXPR) ADDRESS(_EXPR)
- #endif
-
-
- /* Pseudoprozedur fuer ``Inline''-Code zum OS-Aufruf */
-
- #if LPRM2 || SPCM2
- # define OSCALL_IMPORT FROM SYSTEM IMPORT INLINE, SETREG, REG;
- # define CODE INLINE
- #elif MM2 || HM2
- # define OSCALL_IMPORT FROM SYSTEM IMPORT CODE, LOAD, STORE;
- #elif TDIM2
- # define OSCALL_IMPORT FROM SYSTEM IMPORT CODE, SETREG, REGISTER;
- #elif FTLM2
- # define OSCALL_IMPORT FROM SYSTEM IMPORT CODE, SETREG, GETREG;
- #endif
- #define INLINE_CODE_IMPORT OSCALL_IMPORT
-
-
- /* Setzen und Lesen eines CPU-Registers.
- * _VAR : nur (UN)SIGNEDWORD, (UN)SIGNEDLONG oder ADDRESS und einfache,
- * lokale Variable!
- */
-
- #if LPRM2 || SPCM2
- # define REGISTER_IMPORT FROM SYSTEM IMPORT REG, SETREG;
-
- # define SETREG(_REG,_EXPR) SETREG(_REG,VAL(LONGCARD,_EXPR))
- # define GETSWREG(_REG,_VAR) _VAR:=VAL(INTEGER,REG(_REG))
- # define GETUWREG(_REG,_VAR) _VAR:=VAL(CARDINAL,REG(_REG))
- # define GETLREG(_REG,_VAR) _VAR:=REG(_REG)
- # define GETREGADR(_REG,_VAR) _VAR:=REG(_REG)
- #elif MM2 || HM2
- # define REGISTER_IMPORT FROM SYSTEM IMPORT LOAD, STORE;
-
- # define SETREG(_REG,_EXPR) LOAD(_EXPR,_REG)
- # define GETSWREG(_REG,_VAR) STORE(_REG,_VAR)
- # define GETUWREG(_REG,_VAR) STORE(_REG,_VAR)
- # define GETLREG(_REG,_VAR) STORE(_REG,_VAR)
- # define GETREGADR(_REG,_VAR) STORE(_REG,_VAR)
- #elif TDIM2
- # define REGISTER_IMPORT FROM SYSTEM IMPORT REGISTER, SETREG;
-
- # define SETREG(_REG,_EXPR) SETREG(_REG,_EXPR)
- # define GETSWREG(_REG,_VAR) _VAR:=INTEGER(REGISTER(_REG))
- # define GETUWREG(_REG,_VAR) _VAR:=CARDINAL(REGISTER(_REG))
- # define GETLREG(_REG,_VAR) _VAR:=LONGCARD(REGISTER(_REG))
- # define GETREGADR(_REG,_VAR) _VAR:=REGISTER(_REG)
- #elif FTLM2
- # define REGISTER_IMPORT FROM SYSTEM IMPORT SETREG, GETREG;
-
- # define SETREG(_REG,_EXPR) SETREG(_REG,LONGCARD(_EXPR))
- /* GETREG funktioniert bei Version 1.18 nur mit 16-Bit-Variablen !! */
- # define GETSWREG(_REG,_VAR) GETREG(_REG,_VAR)
- # define GETUWREG(_REG,_VAR) GETREG(_REG,_VAR)
- # define GETLREG(_REG,_VAR) GETREG(_REG,_VAR)
- # define GETREGADR(_REG,_VAR) GETREG(_REG,_VAR)
- #endif
-
-
- /* Sichern benoetigter Register waehrend OS-Aufruf (d0-d2/a0-a2 zerstoert) */
-
- #if LPRM2 || SPCM2 || TDIM2 || MM2 || FTLM2
- # define SAVEREGS
- # define RESTOREREGS
- #elif HM2
- # define SAVEREGS CODE(48E7H,2020H);/* movem.l d2/a2, -(sp) */
- # define RESTOREREGS CODE(4CDFH,0404H);/* movem.l (sp)+, d2/a2 */
- #else
- # define SAVEREGS CODE(48E7H,60E0H);/* movem.l d1-d2/a0-a2, -(sp) */
- # define RESTOREREGS CODE(4CDFH,0706H);/* movem.l (sp)+, d1-d2/a0-a2 */
- #endif
-
- /* Stack- und Bereichstests ausschalten */
-
- #if MM2
- # define __NO_CHECKS__ $R-,S-
- # define __RES_ON_STACK__ $Z-
- #elif HM2
- # define __NO_CHECKS__ $C-,$S-,$T-,$V-
- # define __RES_ON_STACK__
- #elif TDIM2
- # define __NO_CHECKS__ $R-,$S-,$T-,$V-
- # define __RES_ON_STACK__
- #else
- # define __NO_CHECKS__
- # define __RES_ON_STACK__
- #endif
-
-