nostub.h 4.5 KB

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