nostub.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #ifndef NOSTUB
  2. #define NOSTUB
  3. #ifdef DOORS
  4. #error "nostub.h" must not be included in "Doors" mode!
  5. #undef NOSTUB
  6. #else
  7. #include <default.h>
  8. #ifndef _GENERIC_ARCHIVE
  9. asm (".xdef _tigcc_native");
  10. _INCLUDE_PATCH(__nostub);
  11. #if defined (USE_FLINE_ROM_CALLS) || defined (KERNEL_FORMAT_ROM_CALLS) || defined (COMPRESSED_FORMAT_ROM_CALLS) || defined (MLINK_FORMAT_ROM_CALLS)
  12. #include <romsymb.h>
  13. #ifdef USE_FLINE_ROM_CALLS
  14. // Kernel-mode ROM calls as introduced by romsymb.h should be avoided.
  15. #undef _rom_call_addr
  16. #define _rom_call_addr(index) (__jmp_tbl[0x##index])
  17. #else
  18. #undef OPTIMIZE_ROM_CALLS
  19. #endif
  20. #endif
  21. #ifdef OPTIMIZE_ROM_CALLS
  22. _INCLUDE_PATCH(__optimize_rom_calls);
  23. #undef __jmp_tbl
  24. register void **__jmp_tbl asm("a5");
  25. #endif
  26. #ifdef SAVE_SCREEN
  27. _INCLUDE_PATCH(__save_screen);
  28. #endif
  29. #ifdef KERNEL_FORMAT_RELOCS
  30. _INCLUDE_PATCH(__kernel_format_relocs);
  31. #endif
  32. #ifdef COMPRESSED_FORMAT_RELOCS
  33. _INCLUDE_PATCH(__compressed_format_relocs);
  34. #endif
  35. #ifdef MLINK_FORMAT_RELOCS
  36. _INCLUDE_PATCH(__mlink_format_relocs);
  37. #endif
  38. #ifndef MERGE_BSS
  39. #ifdef COMPRESSED_FORMAT_BSS
  40. _INCLUDE_PATCH(__compressed_format_bss);
  41. #else
  42. #ifdef MLINK_FORMAT_BSS
  43. _INCLUDE_PATCH(__mlink_format_bss);
  44. #else
  45. _INCLUDE_PATCH(__kernel_format_bss);
  46. #endif
  47. #endif
  48. #endif
  49. #ifdef COMPRESSED_FORMAT_ROM_CALLS
  50. _INCLUDE_PATCH(__compressed_format_rom_calls);
  51. #else
  52. #ifdef MLINK_FORMAT_ROM_CALLS
  53. _INCLUDE_PATCH(__mlink_format_rom_calls);
  54. #else
  55. _INCLUDE_PATCH(__kernel_format_rom_calls);
  56. #endif
  57. #endif
  58. #ifdef RETURN_VALUE /* A RETURN_VALUE option is present */
  59. #define __str(x) #x /* A set of nasty hacks with preprocessor */
  60. #define __xstr(x) __str(x) /* based on some very specific features */
  61. #define __var(x) x##1
  62. #define __xvar(x) __var(x)
  63. #if __xvar(RETURN_VALUE) /* Check whether RETURN_VALUE is blank */
  64. _INCLUDE_PATCH(__nostub_retval);
  65. #else /* A variable is assigned to RETURN_VALUE */
  66. _INCLUDE_PATCH(__nostub_retval_var);
  67. asm("\n"
  68. " /* RETURN_VALUE <variable> Extra Support */\n"
  69. " .xdef __retval_var_name__\n"
  70. " .byte 0\n"
  71. " .ascii \""__xstr(RETURN_VALUE)"\"\n"
  72. "__retval_var_name__:\n"
  73. " .byte 0\n"
  74. " .even\n"
  75. " ");
  76. #endif
  77. #undef __str /* Erase temporary macros */
  78. #undef __xstr
  79. #undef __var
  80. #undef __xvar
  81. #endif
  82. #ifdef ENABLE_ERROR_RETURN
  83. _INCLUDE_PATCH(__special_error_return_support);
  84. #if MIN_AMS<200
  85. _INCLUDE_PATCH(__special_error_return_support_ams_1);
  86. #endif
  87. #endif
  88. /* Support for the _nostub data extension (comment etc.) format: */
  89. #define _comment _nostub_data__0000
  90. #define _program_name _nostub_data__0001
  91. #define _version_string _nostub_data__0002
  92. #define _version_number _nostub_data__0003
  93. #define _bw_icon _nostub_data__0004
  94. #define _grayscale_icon _nostub_data__0005
  95. #define _incompat_flags _nostub_data__0006
  96. #define _authors _nostub_data__0007
  97. #define __TEXTSEC__ __attribute__((__section__(".text")))
  98. #ifdef COMMENT_STRING
  99. __TEXTSEC__ char _comment[] = (COMMENT_STRING);
  100. #endif
  101. #ifdef COMMENT_PROGRAM_NAME
  102. __TEXTSEC__ char _program_name[] = (COMMENT_PROGRAM_NAME);
  103. #endif
  104. #ifdef COMMENT_VERSION_STRING
  105. __TEXTSEC__ char _version_string[] = (COMMENT_VERSION_STRING);
  106. #endif
  107. #ifdef COMMENT_VERSION_NUMBER
  108. __TEXTSEC__ struct __attribute__((__aligned__(2))) {unsigned char major,minor,revision,subrev;} _version_number = {COMMENT_VERSION_NUMBER};
  109. #endif
  110. #ifdef COMMENT_BW_ICON
  111. __TEXTSEC__ short _bw_icon[16] = COMMENT_BW_ICON;
  112. #endif
  113. #ifdef COMMENT_GRAY_ICON
  114. __TEXTSEC__ short _grayscale_icon[2][16] = {COMMENT_GRAY_ICON};
  115. #endif
  116. #ifdef INCOMPAT_CREATES_HANDLES
  117. #define COMMENT_INCOMPAT_CREATES_HANDLES 0x01
  118. #else
  119. #define COMMENT_INCOMPAT_CREATES_HANDLES 0
  120. #endif
  121. #ifdef INCOMPAT_USES_TRAPS
  122. #define COMMENT_INCOMPAT_USES_TRAPS 0x02
  123. #else
  124. #define COMMENT_INCOMPAT_USES_TRAPS 0
  125. #endif
  126. #ifdef INCOMPAT_USES_VECTORS
  127. #define COMMENT_INCOMPAT_USES_VECTORS 0x04
  128. #else
  129. #define COMMENT_INCOMPAT_USES_VECTORS 0
  130. #endif
  131. #ifdef INCOMPAT_USES_EV_HOOK
  132. #define COMMENT_INCOMPAT_USES_EV_HOOK 0x08
  133. #else
  134. #define COMMENT_INCOMPAT_USES_EV_HOOK 0
  135. #endif
  136. #ifdef INCOMPAT_NEEDS_ALL_STACK
  137. #define COMMENT_INCOMPAT_NEEDS_ALL_STACK 0x10
  138. #else
  139. #define COMMENT_INCOMPAT_NEEDS_ALL_STACK 0
  140. #endif
  141. #define COMMENT_INCOMPAT_FLAGS (COMMENT_INCOMPAT_CREATES_HANDLES | COMMENT_INCOMPAT_USES_TRAPS | COMMENT_INCOMPAT_USES_VECTORS | COMMENT_INCOMPAT_USES_EV_HOOK | COMMENT_INCOMPAT_NEEDS_ALL_STACK)
  142. #if COMMENT_INCOMPAT_FLAGS
  143. __TEXTSEC__ unsigned long _incompat_flags = (COMMENT_INCOMPAT_FLAGS);
  144. #endif
  145. #ifdef COMMENT_AUTHORS
  146. __TEXTSEC__ char _authors[] = (COMMENT_AUTHORS);
  147. #endif
  148. #endif
  149. #endif
  150. #endif