Mac OS 9
MixedMode.h
Go to the documentation of this file.
1 
19 #ifndef __MIXEDMODE__
20 #define __MIXEDMODE__
21 
22 #ifndef __MACTYPES__
23 #include <MacTypes.h>
24 #endif
25 
26 #if PRAGMA_ONCE
27 #pragma once
28 #endif
29 
30 #ifdef __cplusplus
31 extern "C"
32 {
33 #endif
34 
35 #if PRAGMA_IMPORT
36 #pragma import on
37 #endif
38 
39 #if PRAGMA_STRUCT_ALIGN
40 #pragma options align = mac68k
41 #elif PRAGMA_STRUCT_PACKPUSH
42 #pragma pack(push, 2)
43 #elif PRAGMA_STRUCT_PACK
44 #pragma pack(2)
45 #endif
46 
49  enum
50  {
51  kRoutineDescriptorVersion = 7
52  };
53 
55  enum
56  {
57  _MixedModeMagic = 0xAAFE
58  };
59 
61  enum
62  {
63  kCurrentMixedModeStateRecord = 1
64  };
65 
67  typedef unsigned short CallingConventionType;
68  enum
69  {
70  kPascalStackBased = 0,
71  kCStackBased = 1,
72  kRegisterBased = 2,
73  kD0DispatchedPascalStackBased = 8,
74  kD1DispatchedPascalStackBased = 12,
75  kD0DispatchedCStackBased = 9,
76  kStackDispatchedPascalStackBased = 14,
77  kThinkCStackBased = 5
78  };
79 
81  typedef SInt8 ISAType;
82  enum
83  {
84  kM68kISA = 0,
85  kPowerPCISA = 1
86  };
87 
89  typedef SInt8 RTAType;
90  enum
91  {
92  kOld68kRTA = 0 << 4,
93  kPowerPCRTA = 0 << 4,
94  kCFM68kRTA = 1 << 4
95  };
96 
97 #if TARGET_OS_MAC
98 #if TARGET_CPU_PPC
99 #define GetCurrentISA() ((ISAType)kPowerPCISA)
100 #define GetCurrentRTA() ((RTAType)kPowerPCRTA)
101 #elif TARGET_CPU_68K
102 #define GetCurrentISA() ((ISAType)kM68kISA)
103 #if TARGET_RT_MAC_CFM
104 #define GetCurrentRTA() ((RTAType)kCFM68kRTA)
105 #else
106 #define GetCurrentRTA() ((RTAType)kOld68kRTA)
107 #endif
108 
109 #endif
110 #define GetCurrentArchitecture() (GetCurrentISA() | GetCurrentRTA())
111 #else
112 #define GetCurrentArchitecture() 0
113 #endif
114 
116  enum
117  {
118  kRegisterD0 = 0,
119  kRegisterD1 = 1,
120  kRegisterD2 = 2,
121  kRegisterD3 = 3,
122  kRegisterD4 = 8,
123  kRegisterD5 = 9,
124  kRegisterD6 = 10,
125  kRegisterD7 = 11,
126  kRegisterA0 = 4,
127  kRegisterA1 = 5,
128  kRegisterA2 = 6,
129  kRegisterA3 = 7,
130  kRegisterA4 = 12,
131  kRegisterA5 = 13,
132  kRegisterA6 = 14,
134  kCCRegisterVBit = 17,
135  kCCRegisterZBit = 18,
136  kCCRegisterNBit = 19,
137  kCCRegisterXBit = 20
138  };
139 
140  typedef unsigned short registerSelectorType;
142  enum
143  {
144  kNoByteCode = 0,
145  kOneByteCode = 1,
146  kTwoByteCode = 2,
147  kFourByteCode = 3
148  };
149 
151  typedef unsigned long ProcInfoType;
153  typedef unsigned short RoutineFlagsType;
154  enum
155  {
156  kProcDescriptorIsAbsolute = 0x00,
157  kProcDescriptorIsRelative = 0x01
158  };
159 
160  enum
161  {
162  kFragmentIsPrepared = 0x00,
163  kFragmentNeedsPreparing = 0x02
164  };
165 
166  enum
167  {
168  kUseCurrentISA = 0x00,
169  kUseNativeISA = 0x04
170  };
171 
172  enum
173  {
174  kPassSelector = 0x00,
175  kDontPassSelector = 0x08
176  };
177 
178  enum
179  {
180  kRoutineIsNotDispatchedDefaultRoutine = 0x00,
181  kRoutineIsDispatchedDefaultRoutine = 0x10
182  };
183 
184  enum
185  {
186  kProcDescriptorIsProcPtr = 0x00,
187  kProcDescriptorIsIndex = 0x20
188  };
189 
191  {
192  ProcInfoType procInfo;
193  SInt8 reserved1;
196  ProcPtr procDescriptor;
197  UInt32 reserved2;
198  UInt32 selector;
199  };
200  typedef struct RoutineRecord RoutineRecord;
205  typedef UInt8 RDFlagsType;
206  enum
207  {
208  kSelectorsAreNotIndexable = 0x00,
209  kSelectorsAreIndexable = 0x01
210  };
211 
214  {
215  UInt16 goMixedModeTrap;
216  SInt8 version;
218  UInt32 reserved1;
219  UInt8 reserved2;
220  UInt8 selectorInfo;
221  UInt16 routineCount;
223  };
224  typedef struct RoutineDescriptor RoutineDescriptor;
229  {
230  UInt32 state1;
231  UInt32 state2;
232  UInt32 state3;
233  UInt32 state4;
234  };
236 #if CALL_NOT_IN_CARBON
241 #define BUILD_ROUTINE_DESCRIPTOR(procInfo, procedure) \
242  { \
243  _MixedModeMagic, \
244  kRoutineDescriptorVersion, \
245  kSelectorsAreNotIndexable, \
246  0, \
247  0, \
248  0, \
249  0, \
250  { \
251  { \
252  (procInfo), \
253  0, \
254  GetCurrentArchitecture(), \
255  kProcDescriptorIsAbsolute | \
256  kFragmentIsPrepared | \
257  kUseNativeISA, \
258  (ProcPtr)(procedure), \
259  0, \
260  0 \
261  } \
262  } \
263  }
264 
266 #define BUILD_FAT_ROUTINE_DESCRIPTOR(m68kProcInfo, m68kProcPtr, \
267  powerPCProcInfo, powerPCProcPtr) \
268  { \
269  _MixedModeMagic, \
270  kRoutineDescriptorVersion, \
271  kSelectorsAreNotIndexable, \
272  0, \
273  0, \
274  0, \
275  1, \
276  { \
277  { \
278  \
279  (m68kProcInfo), \
280  0, \
281  kM68kISA | \
282  kOld68kRTA, \
283  kProcDescriptorIsAbsolute | \
284  kUseCurrentISA, \
285  (ProcPtr)(m68kProcPtr), \
286  0, \
287  0, \
288  }, \
289  { \
290  (powerPCProcInfo), \
291  0, \
292  GetCurrentArchitecture(), \
293  kProcDescriptorIsAbsolute | \
294  kFragmentIsPrepared | \
295  kUseCurrentISA, \
296  (ProcPtr)(powerPCProcPtr), \
297  0, \
298  0 \
299  } \
300  } \
301  }
302 #endif
305  enum
306  {
309  kCallingConventionPhase = 0,
310  kCallingConventionMask = 0x0F,
312  kResultSizePhase = kCallingConventionWidth,
313  kResultSizeMask = 0x30,
315  kStackParameterPhase = (kCallingConventionWidth + kResultSizeWidth),
316  kStackParameterMask =
317  (long)0xFFFFFFC0,
319  kRegisterResultLocationPhase =
323  kRegisterParameterPhase = (kCallingConventionWidth + kResultSizeWidth +
325  kRegisterParameterMask = 0x7FFFF800,
326  kRegisterParameterSizePhase = 0,
327  kRegisterParameterSizeWidth = 2,
328  kRegisterParameterWhichPhase = kRegisterParameterSizeWidth,
329  kRegisterParameterWhichWidth =
330  3,
332  kDispatchedSelectorSizePhase =
339  kSpecialCaseSelectorPhase = kCallingConventionWidth,
340  kSpecialCaseSelectorMask = 0x03F0
341  };
342 
343  enum
344  {
345  kSpecialCase = 0x000F
346  };
347 
348  enum
349  {
352  kSpecialCaseCaretHook = 0,
354  kSpecialCaseWidthHook = 2,
355  kSpecialCaseTextWidthHook = 2,
357  kSpecialCaseDrawHook = 4,
358  kSpecialCaseHitTestHook = 5,
359  kSpecialCaseTEFindWord = 6,
360  kSpecialCaseProtocolHandler = 7,
361  kSpecialCaseSocketListener = 8,
362  kSpecialCaseTERecalc = 9,
363  kSpecialCaseTEDoText = 10,
364  kSpecialCaseGNEFilterProc = 11,
365  kSpecialCaseMBarHook = 12
366  };
367 
416 #if CALL_NOT_IN_CARBON
425  UniversalProcPtr
426  NewRoutineDescriptor(ProcPtr theProc, ProcInfoType theProcInfo, ISAType theISA);
427 #if !TARGET_OS_MAC || !TARGET_RT_MAC_CFM
428 #ifdef __cplusplus
429  inline UniversalProcPtr NewRoutineDescriptor(ProcPtr theProc, ProcInfoType,
430  ISAType)
431  {
432  return (UniversalProcPtr)theProc;
433  }
434 #else
435 #define NewRoutineDescriptor(theProc, theProcInfo, theISA) \
436  ((UniversalProcPtr)theProc)
437 #endif
438 #endif
439 
448  void
449  DisposeRoutineDescriptor(UniversalProcPtr theUPP);
450 #if !TARGET_OS_MAC || !TARGET_RT_MAC_CFM
451 #ifdef __cplusplus
452  inline void DisposeRoutineDescriptor(UniversalProcPtr) {}
453 #else
454 #define DisposeRoutineDescriptor(theUPP)
455 #endif
456 #endif
457 
458 #endif
460 #if CALL_NOT_IN_CARBON
469  UniversalProcPtr
470  NewFatRoutineDescriptor(ProcPtr theM68kProc, ProcPtr thePowerPCProc,
471  ProcInfoType theProcInfo);
472 
473 #endif
475 #if TARGET_CPU_68K && !TARGET_RT_MAC_CFM
480 #if CALL_NOT_IN_CARBON
489  UniversalProcPtr
490  NewRoutineDescriptorTrap(ProcPtr theProc, ProcInfoType theProcInfo,
491  ISAType theISA);
492 
501  void
502  DisposeRoutineDescriptorTrap(UniversalProcPtr theProcPtr);
503 
512  UniversalProcPtr
513  NewFatRoutineDescriptorTrap(ProcPtr theM68kProc, ProcPtr thePowerPCProc,
514  ProcInfoType theProcInfo);
515 
516 #endif
518 #endif
520 #if !TARGET_CPU_68K || TARGET_RT_MAC_CFM
526 #if CALL_NOT_IN_CARBON
535  long
536  CallUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo, ...);
537 
546  long
547  CallOSTrapUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo,
548  ...);
549 
550 #endif
552 #endif
554 #if TARGET_CPU_68K
555 #if CALL_NOT_IN_CARBON
564  OSErr
565  SaveMixedModeState(MixedModeStateRecord *stateStorage, UInt32 stateVersion);
566 
575  OSErr
576  RestoreMixedModeState(MixedModeStateRecord *stateStorage, UInt32 stateVersion);
577 
578 #endif
580 #endif
614 #define SIZE_CODE(size) \
615  (((size) == 4) \
616  ? kFourByteCode \
617  : (((size) == 2) ? kTwoByteCode : (((size) == 1) ? kOneByteCode : 0)))
618 
623 #define RESULT_SIZE(sizeCode) ((ProcInfoType)(sizeCode) << kResultSizePhase)
624 
630 #define STACK_ROUTINE_PARAMETER(whichParam, sizeCode) \
631  ((ProcInfoType)(sizeCode) \
632  << (kStackParameterPhase + (((whichParam)-1) * kStackParameterWidth)))
633 
640 #define DISPATCHED_STACK_ROUTINE_PARAMETER(whichParam, sizeCode) \
641  ((ProcInfoType)(sizeCode) \
642  << (kDispatchedParameterPhase + (((whichParam)-1) * kStackParameterWidth)))
643 
649 #define DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(sizeCode) \
650  ((ProcInfoType)(sizeCode) << kDispatchedSelectorSizePhase)
651 
656 #define REGISTER_RESULT_LOCATION(whichReg) \
657  ((ProcInfoType)(whichReg) << kRegisterResultLocationPhase)
658 
663 #define REGISTER_ROUTINE_PARAMETER(whichParam, whichReg, sizeCode) \
664  ((((ProcInfoType)(sizeCode) << kRegisterParameterSizePhase) | \
665  ((ProcInfoType)(whichReg) << kRegisterParameterWhichPhase)) \
666  << (kRegisterParameterPhase + \
667  (((whichParam)-1) * kRegisterParameterWidth)))
668 
697 #define SPECIAL_CASE_PROCINFO(specialCaseCode) \
698  (kSpecialCase | ((ProcInfoType)(specialCaseCode) << 4))
699 
711 #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
713 #define STACK_UPP_TYPE(name) name
714 #define REGISTER_UPP_TYPE(name) Register68kProcPtr
715 #define TVECTOR_UPP_TYPE(name) name
716 #elif TARGET_OS_MAC && TARGET_RT_MAC_CFM
718 #if OPAQUE_UPP_TYPES
719 #define STACK_UPP_TYPE(name) struct Opaque##name##*
720 #define REGISTER_UPP_TYPE(name) struct Opaque##name##*
721 #define TVECTOR_UPP_TYPE(name) struct Opaque##name##*
722 #else
723 #define STACK_UPP_TYPE(name) UniversalProcPtr
724 #define REGISTER_UPP_TYPE(name) UniversalProcPtr
725 #define TVECTOR_UPP_TYPE(name) name
726 #endif
727 #elif TARGET_OS_MAC && TARGET_RT_MAC_MACHO
729 #define STACK_UPP_TYPE(name) name
730 #define REGISTER_UPP_TYPE(name) name
731 #define TVECTOR_UPP_TYPE(name) name
732 #else
734 #define STACK_UPP_TYPE(name) name
735 #define REGISTER_UPP_TYPE(name) name
736 #define TVECTOR_UPP_TYPE(name) name
737 #endif
738 
749 #if TARGET_OS_MAC && TARGET_RT_MAC_CFM
750 #define CALL_ZERO_PARAMETER_UPP(upp, procInfo) CallUniversalProc(upp, procInfo)
751 #define CALL_ONE_PARAMETER_UPP(upp, procInfo, p1) \
752  CallUniversalProc(upp, procInfo, (p1))
753 #define CALL_TWO_PARAMETER_UPP(upp, procInfo, p1, p2) \
754  CallUniversalProc(upp, procInfo, (p1), (p2))
755 #define CALL_THREE_PARAMETER_UPP(upp, procInfo, p1, p2, p3) \
756  CallUniversalProc(upp, procInfo, (p1), (p2), (p3))
757 #define CALL_FOUR_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4) \
758  CallUniversalProc(upp, procInfo, (p1), (p2), (p3), (p4))
759 #define CALL_FIVE_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5) \
760  CallUniversalProc(upp, procInfo, (p1), (p2), (p3), (p4), (p5))
761 #define CALL_SIX_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6) \
762  CallUniversalProc(upp, procInfo, (p1), (p2), (p3), (p4), (p5), (p6))
763 #define CALL_SEVEN_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7) \
764  CallUniversalProc(upp, procInfo, (p1), (p2), (p3), (p4), (p5), (p6), (p7))
765 #define CALL_EIGHT_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, \
766  p8) \
767  CallUniversalProc(upp, procInfo, (p1), (p2), (p3), (p4), (p5), (p6), (p7), \
768  (p8))
769 #define CALL_NINE_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, p8, \
770  p9) \
771  CallUniversalProc(upp, procInfo, (p1), (p2), (p3), (p4), (p5), (p6), (p7), \
772  (p8), (p9))
773 #define CALL_TEN_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, p8, \
774  p9, p10) \
775  CallUniversalProc(upp, procInfo, (p1), (p2), (p3), (p4), (p5), (p6), (p7), \
776  (p8), (p9), (p10))
777 #define CALL_ELEVEN_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, \
778  p8, p9, p10, p11) \
779  CallUniversalProc(upp, procInfo, (p1), (p2), (p3), (p4), (p5), (p6), (p7), \
780  (p8), (p9), (p10), (p11))
781 #define CALL_TWELVE_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, \
782  p8, p9, p10, p11, p12) \
783  CallUniversalProc(upp, procInfo, (p1), (p2), (p3), (p4), (p5), (p6), (p7), \
784  (p8), (p9), (p10), (p11), (p12))
785 #define CALL_THIRTEEN_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, \
786  p8, p9, p10, p11, p12, p13) \
787  CallUniversalProc(upp, procInfo, (p1), (p2), (p3), (p4), (p5), (p6), (p7), \
788  (p8), (p9), (p10), (p11), (p12), (p13))
789 #else
790 #define CALL_ZERO_PARAMETER_UPP(upp, procInfo) (*(upp))()
791 #define CALL_ONE_PARAMETER_UPP(upp, procInfo, p1) (*(upp))((p1))
792 #define CALL_TWO_PARAMETER_UPP(upp, procInfo, p1, p2) (*(upp))((p1), (p2))
793 #define CALL_THREE_PARAMETER_UPP(upp, procInfo, p1, p2, p3) \
794  (*(upp))((p1), (p2), (p3))
795 #define CALL_FOUR_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4) \
796  (*(upp))((p1), (p2), (p3), (p4))
797 #define CALL_FIVE_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5) \
798  (*(upp))((p1), (p2), (p3), (p4), (p5))
799 #define CALL_SIX_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6) \
800  (*(upp))((p1), (p2), (p3), (p4), (p5), (p6))
801 #define CALL_SEVEN_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7) \
802  (*(upp))((p1), (p2), (p3), (p4), (p5), (p6), (p7))
803 #define CALL_EIGHT_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, \
804  p8) \
805  (*(upp))((p1), (p2), (p3), (p4), (p5), (p6), (p7), (p8))
806 #define CALL_NINE_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, p8, \
807  p9) \
808  (*(upp))((p1), (p2), (p3), (p4), (p5), (p6), (p7), (p8), (p9))
809 #define CALL_TEN_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, p8, \
810  p9, p10) \
811  (*(upp))((p1), (p2), (p3), (p4), (p5), (p6), (p7), (p8), (p9), (p10))
812 #define CALL_ELEVEN_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, \
813  p8, p9, p10, p11) \
814  (*(upp))((p1), (p2), (p3), (p4), (p5), (p6), (p7), (p8), (p9), (p10), (p11))
815 #define CALL_TWELVE_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, \
816  p8, p9, p10, p11, p12) \
817  (*(upp))((p1), (p2), (p3), (p4), (p5), (p6), (p7), (p8), (p9), (p10), (p11), \
818  (p12))
819 #define CALL_THIRTEEN_PARAMETER_UPP(upp, procInfo, p1, p2, p3, p4, p5, p6, p7, \
820  p8, p9, p10, p11, p12, p13) \
821  (*(upp))((p1), (p2), (p3), (p4), (p5), (p6), (p7), (p8), (p9), (p10), (p11), \
822  (p12), (p13))
823 #endif
824 
825 #if PRAGMA_STRUCT_ALIGN
826 #pragma options align = reset
827 #elif PRAGMA_STRUCT_PACKPUSH
828 #pragma pack(pop)
829 #elif PRAGMA_STRUCT_PACK
830 #pragma pack()
831 #endif
832 
833 #ifdef PRAGMA_IMPORT_OFF
834 #pragma import off
835 #elif PRAGMA_IMPORT
836 #pragma import reset
837 #endif
838 
839 #ifdef __cplusplus
840 }
841 #endif
842 
843 #endif
Basic Macintosh data types.
unsigned short RoutineFlagsType
Definition: MixedMode.h:153
UniversalProcPtr NewFatRoutineDescriptor(ProcPtr theM68kProc, ProcPtr thePowerPCProc, ProcInfoType theProcInfo)
unsigned short CallingConventionType
Definition: MixedMode.h:67
unsigned long ProcInfoType
Definition: MixedMode.h:151
SInt8 ISAType
Definition: MixedMode.h:81
long CallOSTrapUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo,...)
long CallUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo,...)
@ kDispatchedSelectorSizeWidth
Definition: MixedMode.h:331
@ kRegisterParameterWidth
Definition: MixedMode.h:322
@ kResultSizeWidth
Definition: MixedMode.h:311
@ kDispatchedParameterPhase
Definition: MixedMode.h:335
@ kStackParameterWidth
Definition: MixedMode.h:314
@ kRegisterResultLocationWidth
Definition: MixedMode.h:318
@ kSpecialCaseSelectorWidth
Definition: MixedMode.h:338
@ kCallingConventionWidth
Definition: MixedMode.h:308
@ kSpecialCaseEOLHook
Definition: MixedMode.h:353
@ kSpecialCaseNWidthHook
Definition: MixedMode.h:356
@ kSpecialCaseHighHook
Definition: MixedMode.h:351
void DisposeRoutineDescriptor(UniversalProcPtr theUPP)
UniversalProcPtr NewRoutineDescriptor(ProcPtr theProc, ProcInfoType theProcInfo, ISAType theISA)
@ kCCRegisterCBit
Definition: MixedMode.h:133
UInt8 RDFlagsType
Definition: MixedMode.h:205
SInt8 RTAType
Definition: MixedMode.h:89
Definition: MixedMode.h:229
Definition: MixedMode.h:214
SInt8 version
Definition: MixedMode.h:216
UInt16 routineCount
Definition: MixedMode.h:221
UInt8 selectorInfo
Definition: MixedMode.h:220
UInt32 reserved1
Definition: MixedMode.h:218
RDFlagsType routineDescriptorFlags
Definition: MixedMode.h:217
UInt8 reserved2
Definition: MixedMode.h:219
RoutineRecord routineRecords[1]
Definition: MixedMode.h:222
Definition: MixedMode.h:191
RoutineFlagsType routineFlags
Definition: MixedMode.h:195
UInt32 selector
Definition: MixedMode.h:198
UInt32 reserved2
Definition: MixedMode.h:197
ISAType ISA
Definition: MixedMode.h:194
SInt8 reserved1
Definition: MixedMode.h:193
ProcPtr procDescriptor
Definition: MixedMode.h:196