home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / m2posx02 / portab.m2h < prev    next >
Encoding:
Text File  |  1993-10-23  |  9.3 KB  |  361 lines

  1. /* Wenn MiNT beruecksichtigt werden soll */
  2. #define MINT 1
  3.  
  4.  
  5.  
  6. #define not !
  7. #define NONE 0
  8.  
  9. #ifdef LPRM2
  10. #  undef LPRM2
  11. #  define LPRM2 1
  12. #else
  13. #  define LPRM2 0
  14. #endif
  15.  
  16. #ifdef SPCM2
  17. #  undef SPCM2
  18. #  define SPCM2 1
  19. #else
  20. #  define SPCM2 0
  21. #endif
  22.  
  23. #ifdef HM2
  24. #  undef HM2
  25. #  define HM2 1
  26. #else
  27. #  define HM2 0
  28. #endif
  29.  
  30. #ifdef MM2
  31. #  undef MM2
  32. #  define MM2 1
  33. #else
  34. #  define MM2 0
  35. #endif
  36.  
  37. #ifdef TDIM2
  38. #  undef TDIM2
  39. #  define TDIM2 1
  40. #else
  41. #  define TDIM2 0
  42. #endif
  43.  
  44. #ifdef FTLM2
  45. #  undef FTLM2
  46. #  define FTLM2 1
  47. #else
  48. #  define FTLM2 0
  49. #endif
  50.  
  51. #if not(LPRM2 || SPCM2 || HM2 || MM2 || TDIM2)
  52. #  error *** compiler not (yet) supported
  53. #endif
  54.  
  55.  
  56.  
  57. #define GEMDOS (NONE || LPRM2 || SPCM2 || HM2 || MM2 || TDIM2 || FTLM2)
  58. #define PCDOS  (NONE)
  59.  
  60. #define ISOM2 (NONE)
  61.  
  62.  
  63.  
  64. /* Bei Def. eines Prozedurtyps kann der Typ selber als Param.typ auftreten */
  65. #define ISO_recursive_proc_decl (NONE || ISOM2 || MM2)
  66.  
  67. /* Prozeduren gleichen Typs duerfen auf Gleichheit getestet werden (ISO) */
  68. #define ISO_proc_compare (NONE || ISOM2)
  69.  
  70. /* Werte gleichen opaken Typs duerfen auf Gleichheit getestet werden (ISO) */
  71. #define ISO_opaque_compare (NONE || ISOM2)
  72.  
  73. /* Opake Typen koennen im entspr. Imp.modul auch als Import-Typ def. werden */
  74. #define ISO_opaque_far_imp (NONE || ISOM2 || LPRM2 || SPCM2)
  75.  
  76. /* Prozedurkonstanten sind erlaubt (ISO) */
  77. #define ISO_proc_const (NONE || ISOM2 || FTLM2)
  78.  
  79. /* ARRAY- und RECORD-Konstanten (ISO) */
  80. #define ISO_value_constructor (NONE || ISOM2 || MM2)
  81.  
  82. /* VAL ist Universalkonvertierung (ISO) */
  83. #define ISO_val (NONE || ISOM2 || MM2)
  84.  
  85. /* Wenn Unterstriche in Bezeichnern erlaubt sind (ISO) */
  86. #define ISO_underscore (NONE || ISOM2 || MM2)
  87.  
  88. /* Wenn der Typ PACKEDSET fuer Bitmengen vorhanden ist (ISO) */
  89. #define ISO_packedset (NONE || ISOM2)
  90.  
  91. /* ISO-Prozeduren fuer Zeigerarithmetik vorhanden */
  92. #define ISO_ptr_arith (NONE || ISOM2)
  93.  
  94. /* Felder und Verbunde als Funktionsresultate moeglich (ISO) */
  95. #define ISO_struct_return (NONE || ISOM2 || MM2 || HM2 || FTLM2)
  96.  
  97. /* SET OF CHAR definierbar (ISO) */
  98. #define ISO_char_set (NONE || ISOM2 || MM2 || TDIM2 || FTLM2)
  99.  
  100. /* Universaltyp LOC vorhanden (ISO) */
  101. #define ISO_loc (NONE || ISOM2 || MM2)
  102.  
  103. /* Bit-Mengen (<= 32) mit 0 als hoechstwertigem Bit */
  104. #define reverse_set (NONE || FTLM2)
  105.  
  106. /* Mengen mit 32 Elementen definierbar */
  107. #define long_set (NONE || ISOM2 || HM || SPCM2 || MM2 || TDIM2 || FTLM2)
  108.  
  109. /* Bei RECORD-Varianten ohne Diskriminator kein Doppelpunkt (PIM2) */
  110. #define no_empty_tag_colon (NONE)
  111.  
  112. /* Als Indextyp in Feldern sind nur Unterbereiche erlaubt */
  113. #define only_subrange_index (NONE || LPRM2 || SPCM2)
  114.  
  115. /* Standardprozeduren MIN und MAX existieren nicht */
  116. #define no_MIN_MAX (NONE)
  117.  
  118. /* Hat den Parametertyp REF */
  119. #define has_REF (NONE || MM2)
  120.  
  121. /* Exportliste im Definitionsmodul notwendig */
  122. #define export (NONE)
  123.  
  124. /* Schwierigkeiten bei reexportierten Bezeichnern */
  125. #define no_reexport (NONE || FTLM2)
  126.  
  127. #define odd_arrays (NONE || MM2 || TDIM2)
  128.  
  129. #define odd_records (NONE)
  130.  
  131. #define align_byte_after_odd (NONE)
  132.  
  133.  
  134. /* Betrifft nur Parameter vom Typ ARRAY OF CHAR */
  135. #if TDIM2
  136. #  define REF VAR
  137. #elif not has_REF
  138. #  define REF
  139. #endif
  140.  
  141. #if not ISO_packedset
  142. #define PACKEDSET SET
  143. #endif
  144.  
  145.  
  146. /* Max Groesse von INTEGER und CARDINAL-Zahlen in Bytes */
  147. #if GEMDOS
  148. #  define sizeof_biggest_signed 4
  149. #  define sizeof_biggest_unsigned 4
  150. #endif
  151.  
  152.  
  153. /* Falls LONG-Konstanten eine besondere Kennzeichnung benoetigen */
  154.  
  155. #if LPRM2 || SPCM2
  156. #  define LC(_NUM) _NUM ## D
  157. #  define LIC(_NUM) _NUM ## D
  158. #else
  159. #  define LC(_NUM) _NUM
  160. #  define LIC(_NUM) _NUM
  161. #endif
  162.  
  163.  
  164. /* Falls LONGREAL-Konstanten eine besondere Kennzeichnung haben */
  165.  
  166. #if LPRM2 || SPCM2
  167. #  define LRC(_MANT,_EXP) _MANT ## D ## _EXP
  168. #else
  169. #  define LRC(_MANT,_EXP) _MANT ## E ## _EXP
  170. #endif
  171.  
  172.  
  173. /* */
  174.  
  175. #if no_empty_tag_colon
  176. #  define TAG_COLON
  177. #else
  178. #  define TAG_COLON :
  179. #endif
  180.  
  181.  
  182. /* Falls VAL aus SYSTEM importiert werden muss */
  183.  
  184. #if LPRM2 || SPCM2
  185. #  define VAL_INTRINSIC FROM SYSTEM IMPORT VAL;
  186. #else
  187. #  define VAL_INTRINSIC
  188. #endif
  189.  
  190.  
  191. #if FTLM2 || TDIM2
  192. /* Ein CAST von 32 auf 16 Bit funktioniert bei FTL-Version 1.18 nicht !! */
  193. #  define VAL(_TYPE,_EXPR) _TYPE(_EXPR)
  194. #endif
  195.  
  196.  
  197. /* Emulation der ISO-funktion CAST */
  198.  
  199. #if ISOM2 || MM2
  200. #  define CAST_IMPORT FROM SYSTEM IMPORT CAST;
  201. #elif LPRM2 || SPCM2
  202. #  define CAST_IMPORT
  203. #  define CAST(_TYPE,_EXPR) VAL(_TYPE,_EXPR)
  204. #else
  205. #  define CAST_IMPORT
  206. #  define CAST(_TYPE,_EXPR) _TYPE(_EXPR)
  207. #endif
  208.  
  209.  
  210.  
  211. /* Emulation der ISO-Funktion INT */
  212.  
  213. #if FTLM2
  214. #  define INT(_EXPR) SHORT(LONGINT(_EXPR))
  215. #elif not(ISOM2 || HM2)
  216. #  define INT(_EXPR) VAL(INTEGER,_EXPR)
  217. #endif
  218.  
  219.  
  220. /* Falls NEW und DISPOSE fehlen */
  221.  
  222. #if LPRM2
  223. #  define Storage Heap
  224. #  define ALLOCATE Allocate
  225. #  define DEALLOCATE Deallocate
  226. #  define NEW(_PTR) ALLOCATE(_PTR,SIZE(_PTR ## ^))
  227. #  define DISPOSE(_PTR) DEALLOCATE(_PTR,SIZE(_PTR ## ^))
  228. #elif SPCM2
  229. #  define NEW(_PTR) ALLOCATE(_PTR,SIZE(_PTR ## ^))
  230. #  define DISPOSE(_PTR) DEALLOCATE(_PTR)
  231. #endif
  232.  
  233.  
  234. /* Pointer-Arithmetik */
  235.  
  236. #if ISO_ptr_arith
  237. #  define PTR_ARITH_IMPORT FROM SYSTEM IMPORT ADDADR,SUBADR,DIFADR,MAKEADR;
  238. #elif LPRM2 || SPCM2
  239. #  define PTR_ARITH_IMPORT
  240.  
  241. #  define ADDADR(_PTR,_ADD) (VAL(ADDRESS,_PTR)+VAL(ADDRESS,_ADD))
  242. #  define SUBADR(_PTR,_SUB) (VAL(ADDRESS,_PTR)-VAL(ADDRESS,_SUB))
  243. #  define DIFADR(_PTR1,_PTR2) (VAL(LONGINT,_PTR1)-VAL(LONGINT,_PTR2))
  244. #  define MAKEADR(_EXPR) VAL(ADDRESS,_EXPR)
  245. #elif HM2
  246. #  define PTR_ARITH_IMPORT
  247.  
  248. #  define ADDADR(_PTR,_ADD) (ADDRESS(_PTR)+VAL(LONGCARD,_ADD))
  249. #  define SUBADR(_PTR,_SUB) (ADDRESS(_PTR)-VAL(LONGCARD,_SUB))
  250. #  define DIFADR(_PTR1,_PTR2) (LONGINT(_PTR1)-LONGINT(_PTR2))
  251. #  define MAKEADR(_EXPR) VAL(ADDRESS,_EXPR)
  252. #elif MM2
  253. #  define PTR_ARITH_IMPORT
  254.  
  255. #  define ADDADR(_PTR,_ADD) (ADDRESS(_PTR)+VAL(LONGCARD,_ADD))
  256. #  define SUBADR(_PTR,_SUB) (ADDRESS(_PTR)-VAL(LONGCARD,_SUB))
  257. #  define DIFADR(_PTR1,_PTR2) (LONGINT(_PTR1)-LONGINT(_PTR2))
  258. #  define MAKEADR(_EXPR) ADDRESS(VAL(LONGCARD,_EXPR))
  259. #elif FTLM2
  260. #  define PTR_ARITH_IMPORT
  261.  
  262. #  define ADDADR(_PTR,_ADD) (ADDRESS(_PTR)+LONGCARD(_ADD))
  263. #  define SUBADR(_PTR,_SUB) (ADDRESS(_PTR)-LONGCARD(_SUB))
  264. #  define DIFADR(_PTR1,_PTR2) (LONGINT(_PTR1)-LONGINT(_PTR2))
  265. #  define MAKEADR(_EXPR) ADDRESS(_EXPR)
  266. #elif TDIM2
  267. #  define PTR_ARITH_IMPORT
  268.  
  269. #  define ADDADR(_PTR,_ADD) (ADDRESS(_PTR)+ADDRESS(_ADD))
  270. #  define SUBADR(_PTR,_SUB) (ADDRESS(_PTR)-ADDRESS(_SUB))
  271. #  define DIFADR(_PTR1,_PTR2) (LONGINT(_PTR1)-LONGINT(_PTR2))
  272. #  define MAKEADR(_EXPR) ADDRESS(_EXPR)
  273. #endif
  274.  
  275.  
  276. /* Pseudoprozedur fuer ``Inline''-Code zum OS-Aufruf */
  277.  
  278. #if LPRM2 || SPCM2
  279. #  define OSCALL_IMPORT FROM SYSTEM IMPORT INLINE, SETREG, REG;
  280. #  define CODE INLINE
  281. #elif MM2 || HM2
  282. #  define OSCALL_IMPORT FROM SYSTEM IMPORT CODE, LOAD, STORE;
  283. #elif TDIM2
  284. #  define OSCALL_IMPORT FROM SYSTEM IMPORT CODE, SETREG, REGISTER;
  285. #elif FTLM2
  286. #  define OSCALL_IMPORT FROM SYSTEM IMPORT CODE, SETREG, GETREG;
  287. #endif
  288. #define INLINE_CODE_IMPORT OSCALL_IMPORT
  289.  
  290.  
  291. /* Setzen und Lesen eines CPU-Registers.
  292.  * _VAR : nur (UN)SIGNEDWORD, (UN)SIGNEDLONG oder ADDRESS und einfache,
  293.  *        lokale Variable!
  294.  */
  295.  
  296. #if LPRM2 || SPCM2
  297. #  define REGISTER_IMPORT FROM SYSTEM IMPORT REG, SETREG;
  298.  
  299. #  define SETREG(_REG,_EXPR) SETREG(_REG,VAL(LONGCARD,_EXPR))
  300. #  define GETSWREG(_REG,_VAR) _VAR:=VAL(INTEGER,REG(_REG))
  301. #  define GETUWREG(_REG,_VAR) _VAR:=VAL(CARDINAL,REG(_REG))
  302. #  define GETLREG(_REG,_VAR) _VAR:=REG(_REG)
  303. #  define GETREGADR(_REG,_VAR) _VAR:=REG(_REG)
  304. #elif MM2 || HM2
  305. #  define REGISTER_IMPORT FROM SYSTEM IMPORT LOAD, STORE;
  306.  
  307. #  define SETREG(_REG,_EXPR) LOAD(_EXPR,_REG)
  308. #  define GETSWREG(_REG,_VAR) STORE(_REG,_VAR)
  309. #  define GETUWREG(_REG,_VAR) STORE(_REG,_VAR)
  310. #  define GETLREG(_REG,_VAR) STORE(_REG,_VAR)
  311. #  define GETREGADR(_REG,_VAR) STORE(_REG,_VAR)
  312. #elif TDIM2
  313. #  define REGISTER_IMPORT FROM SYSTEM IMPORT REGISTER, SETREG;
  314.  
  315. #  define SETREG(_REG,_EXPR) SETREG(_REG,_EXPR)
  316. #  define GETSWREG(_REG,_VAR) _VAR:=INTEGER(REGISTER(_REG))
  317. #  define GETUWREG(_REG,_VAR) _VAR:=CARDINAL(REGISTER(_REG))
  318. #  define GETLREG(_REG,_VAR) _VAR:=LONGCARD(REGISTER(_REG))
  319. #  define GETREGADR(_REG,_VAR) _VAR:=REGISTER(_REG)
  320. #elif FTLM2
  321. #  define REGISTER_IMPORT FROM SYSTEM IMPORT SETREG, GETREG;
  322.  
  323. #  define SETREG(_REG,_EXPR) SETREG(_REG,LONGCARD(_EXPR))
  324. /* GETREG funktioniert bei Version 1.18 nur mit 16-Bit-Variablen !! */
  325. #  define GETSWREG(_REG,_VAR) GETREG(_REG,_VAR)
  326. #  define GETUWREG(_REG,_VAR) GETREG(_REG,_VAR)
  327. #  define GETLREG(_REG,_VAR) GETREG(_REG,_VAR)
  328. #  define GETREGADR(_REG,_VAR) GETREG(_REG,_VAR)
  329. #endif
  330.  
  331.  
  332. /* Sichern benoetigter Register waehrend OS-Aufruf (d0-d2/a0-a2 zerstoert) */
  333.  
  334. #if LPRM2 || SPCM2 || TDIM2 || MM2 || FTLM2
  335. #  define SAVEREGS
  336. #  define RESTOREREGS
  337. #elif  HM2
  338. #  define SAVEREGS CODE(48E7H,2020H);/* movem.l d2/a2, -(sp) */
  339. #  define RESTOREREGS CODE(4CDFH,0404H);/* movem.l (sp)+, d2/a2 */
  340. #else
  341. #  define SAVEREGS CODE(48E7H,60E0H);/* movem.l d1-d2/a0-a2, -(sp) */
  342. #  define RESTOREREGS CODE(4CDFH,0706H);/* movem.l (sp)+, d1-d2/a0-a2 */
  343. #endif
  344.  
  345. /* Stack- und Bereichstests ausschalten */
  346.  
  347. #if MM2
  348. #  define __NO_CHECKS__ $R-,S-
  349. #  define __RES_ON_STACK__ $Z-
  350. #elif HM2
  351. #  define __NO_CHECKS__ $C-,$S-,$T-,$V-
  352. #  define __RES_ON_STACK__
  353. #elif TDIM2
  354. #  define __NO_CHECKS__ $R-,$S-,$T-,$V-
  355. #  define __RES_ON_STACK__
  356. #else
  357. #  define __NO_CHECKS__
  358. #  define __RES_ON_STACK__
  359. #endif
  360.  
  361.