! *** PREDECLARED TYPES %IF %DECLARED ( %BASIC$QUADWORD_DECLARED ) = 0 %THEN RECORD BASIC$QUADWORD LONG FILL ( 2 ) END RECORD %LET %BASIC$QUADWORD_DECLARED = 1 %END %IF %IF %DECLARED ( %BASIC$OCTAWORD_DECLARED ) = 0 %THEN RECORD BASIC$OCTAWORD LONG FILL ( 4 ) END RECORD %LET %BASIC$OCTAWORD_DECLARED = 1 %END %IF %IF %DECLARED ( %BASIC$HFLOAT_AXP_DECLARED ) = 0 %THEN RECORD BASIC$HFLOAT_AXP LONG FILL ( 4 ) END RECORD %LET %BASIC$HFLOAT_AXP_DECLARED = 1 %END %IF %IF %DECLARED ( %BASIC$F_FLOATING_COMPLEX_DECL ) = 0 %THEN RECORD BASIC$F_FLOATING_COMPLEX SINGLE REAL_PART SINGLE IMAGINARY_PART END RECORD %LET %BASIC$F_FLOATING_COMPLEX_DECL = 1 %END %IF %IF %DECLARED ( %BASIC$D_FLOATING_COMPLEX_DECL ) = 0 %THEN RECORD BASIC$D_FLOATING_COMPLEX DOUBLE REAL_PART DOUBLE IMAGINARY_PART END RECORD %LET %BASIC$D_FLOATING_COMPLEX_DECL = 1 %END %IF %IF %DECLARED ( %BASIC$G_FLOATING_COMPLEX_DECL ) = 0 %THEN RECORD BASIC$G_FLOATING_COMPLEX GFLOAT REAL_PART GFLOAT IMAGINARY_PART END RECORD %LET %BASIC$G_FLOATING_COMPLEX_DECL = 1 %END %IF %IF %DECLARED ( %BASIC$H_FLOAT_AXP_CMPLX_DCL ) = 0 %THEN RECORD BASIC$H_FLOATING_COMPLEX_AXP BASIC$HFLOAT_AXP REAL_PART BASIC$HFLOAT_AXP IMAGINARY_PART END RECORD %LET %BASIC$H_FLOAT_AXP_CMPLX_DCL = 1 %END %IF DECLARE LONG CONSTANT LIB$K_PROC_VALUE_NULL = 0 DECLARE LONG CONSTANT LIB$K_INVO_HANDLE_NULL = 0 DECLARE LONG CONSTANT LIBICB$K_INVO_HANDLE_SIZE = 8 DECLARE LONG CONSTANT LIBICB$K_INVO_CONTEXT_VERSION = 3 ! The header quadword contains: DECLARE LONG CONSTANT LIBICB$M_FFLAGS_BITS = x'00FFFFFF' DECLARE LONG CONSTANT LIBICB$M_FRAME_FLAGS = x'00FFFFFF' DECLARE LONG CONSTANT LIBICB$M_EXCEPTION_FRAME = x'00000001' DECLARE LONG CONSTANT LIBICB$M_AST_FRAME = x'00000002' DECLARE LONG CONSTANT LIBICB$M_BOTTOM_OF_STACK = x'00000004' DECLARE LONG CONSTANT LIBICB$M_HANDLER_PRESENT = x'00000008' DECLARE LONG CONSTANT LIBICB$M_IN_PROLOGUE = x'00000010' DECLARE LONG CONSTANT LIBICB$M_IN_EPILOGUE = x'00000020' DECLARE LONG CONSTANT UC_MCONTEXT_IREG_RAX = 16 DECLARE LONG CONSTANT REG_RAX = 0 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_RDX = 24 DECLARE LONG CONSTANT REG_RDX = 1 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_RCX = 32 DECLARE LONG CONSTANT REG_RCX = 2 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_RBX = 40 DECLARE LONG CONSTANT REG_RBX = 3 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_RSI = 48 DECLARE LONG CONSTANT REG_RSI = 4 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_RDI = 56 DECLARE LONG CONSTANT REG_RDI = 5 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_RBP = 64 DECLARE LONG CONSTANT REG_RBP = 6 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_RSP = 72 DECLARE LONG CONSTANT REG_RSP = 7 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_R8 = 80 DECLARE LONG CONSTANT REG_R8 = 8 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_R9 = 88 DECLARE LONG CONSTANT REG_R9 = 9 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_R10 = 96 DECLARE LONG CONSTANT REG_R10 = 10 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_R11 = 104 DECLARE LONG CONSTANT REG_R11 = 11 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_R12 = 112 DECLARE LONG CONSTANT REG_R12 = 12 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_R13 = 120 DECLARE LONG CONSTANT REG_R13 = 13 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_R14 = 128 DECLARE LONG CONSTANT REG_R14 = 14 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_R15 = 136 DECLARE LONG CONSTANT REG_R15 = 15 DECLARE LONG CONSTANT UC_MCONTEXT_IREG_RIP = 144 DECLARE LONG CONSTANT REG_RIP = 16 DECLARE LONG CONSTANT LIBICB$K_PSEUDO_REGS_SIZE = 256 DECLARE LONG CONSTANT UC_PSEUDO_REGS = 152 DECLARE LONG CONSTANT UC_MCONTEXT_RFLAGS = 408 DECLARE LONG CONSTANT UC_MCONTEXT_FS = 416 DECLARE LONG CONSTANT UC_MCONTEXT_GS = 418 DECLARE LONG CONSTANT UC_MCONTEXT_MXCSR = 424 DECLARE LONG CONSTANT UC_MCONTEXT_FCW = 428 DECLARE LONG CONSTANT UC_MCONTEXT_FSW = 430 DECLARE LONG CONSTANT LIBICB$K_FXSAVE_SIZE = 512 DECLARE LONG CONSTANT UC_MCONTEXT_FXSAVE = 432 DECLARE LONG CONSTANT LIBICB$K_CONTEXT_BLK_SIZE = 504 DECLARE LONG CONSTANT LIBICB$K_CURSOR_BLK_SIZE = 1024 DECLARE LONG CONSTANT LIBICB$K_SDA_COPY_LENGTH = 1608 ! ******* Start of User Override ************************* DECLARE LONG CONSTANT LIBICB$M_UO_FLAG_CACHE_UNWIND = x'00000001' DECLARE LONG CONSTANT LIBICB$M_UO_FLAG_EMULATION_MODE = x'00000002' DECLARE LONG CONSTANT LIBICB$K_UO_LENGTH = 88 ! DECLARE LONG CONSTANT LIBICB$m_using_client_memread = x'00000001' DECLARE LONG CONSTANT LIBICB$m_my_mode = x'00000006' DECLARE LONG CONSTANT LIBICB$K_REGION_BLK_SIZE = 1096 DECLARE LONG CONSTANT LIBICB$K_REGIONLABEL_BLK_SIZE = 32 DECLARE LONG CONSTANT LIBICB$K_DESCRIPTOR_BLK_SIZE = 1280 ! Action codes: DECLARE LONG CONSTANT LIBICB$K_ACTION_KP_FIND_UNWIND = 1 ! override call to exe$kp_find_unwind_context ! prototype: ! uint64 sp = action_routine (enum action_code code, uint64 sp, uint64 ident); DECLARE LONG CONSTANT LIBICB$K_ACTION_USE_DEFAULT = -1 ! action routine return value to "use default" ! Alert codes: (matches _UNW_ReturnCode enum in unwind.h) DECLARE LONG CONSTANT LIBICB$K_AC_STEP_KRNL_SAV_STATE = -2 ! _UNW_STEP_KERNEL_SAVE_STATE = -2 DECLARE LONG CONSTANT LIBICB$K_AC_STEP_BOTTOM = -1 ! _UNW_STEP_BOTTOM DECLARE LONG CONSTANT LIBICB$K_AC_OK = 0 ! _UNW_OK = 0 DECLARE LONG CONSTANT LIBICB$K_AC_STEP_ERROR = 1 ! _UNW_STEP_ERROR DECLARE LONG CONSTANT LIBICB$K_AC_STEP_INVALID_IP = 2 ! _UNW_STEP_INVALID_IP DECLARE LONG CONSTANT LIBICB$K_AC_STEP_INVALID_SP = 3 ! _UNW_STEP_INVALID_SP DECLARE LONG CONSTANT LIBICB$K_AC_STEP_INVALID_GR = 4 ! _UNW_STEP_INVALID_GR DECLARE LONG CONSTANT LIBICB$K_AC_STEP_INVALID_PFS = 5 ! _UNW_STEP_INVALID_PFS DECLARE LONG CONSTANT LIBICB$K_AC_STEP_INVALID_RSC = 6 ! _UNW_STEP_INVALID_RSC DECLARE LONG CONSTANT LIBICB$K_AC_STEP_INVALID_BSP = 7 ! _UNW_STEP_INVALID_BSP DECLARE LONG CONSTANT LIBICB$K_AC_STEP_INV_BSPSTORE = 8 ! _UNW_STEP_INVALID_BSPSTORE DECLARE LONG CONSTANT LIBICB$K_AC_STEP_INVALID_CFM = 9 ! _UNW_STEP_INVALID_CFM DECLARE LONG CONSTANT LIBICB$K_AC_STEP_INVALID_BR = 10 ! _UNW_STEP_INVALID_BR DECLARE LONG CONSTANT LIBICB$K_AC_STEP_BAD_BSP_ALIGN = 11 ! _UNW_STEP_BAD_BSP_ALIGNMENT DECLARE LONG CONSTANT LIBICB$K_AC_STEP_INVALID_RNAT = 12 ! _UNW_STEP_INVALID_RNAT DECLARE LONG CONSTANT LIBICB$K_AC_STEP_NODSC4_NONLEAF = 13 ! _UNW_STEP_NO_DESCRIPTOR_FOR_NON_LEAF DECLARE LONG CONSTANT LIBICB$K_AC_STEP_CORRUPT_DESC = 14 ! _UNW_STEP_CORRUPT_DESCRIPTOR DECLARE LONG CONSTANT LIBICB$K_AC_STEP_RSE_NOT_FLUSHD = 15 ! _UNW_STEP_RSE_NOT_FLUSHED DECLARE LONG CONSTANT LIBICB$K_AC_STEP_SIGNAL_CONTEXT = 16 ! _UNW_STEP_SIGNAL_CONTEXT DECLARE LONG CONSTANT LIBICB$K_AC_STEP_BAD_STATE = 17 ! _UNW_STEP_NOT_ALLOWED_IN_STATE DECLARE LONG CONSTANT LIBICB$K_AC_INIT_RANGE_ERROR = 18 ! _UNW_INITIALIZATION_RANGE_ERROR DECLARE LONG CONSTANT LIBICB$K_AC_QUERY_RANGE_ERROR = 19 ! _UNW_QUERY_RANGE_ERROR DECLARE LONG CONSTANT LIBICB$K_AC_QUERY_INVALID_ERROR = 20 ! _UNW_QUERY_INVALID_ERROR DECLARE LONG CONSTANT LIBICB$K_AC_SET_BAD_STATE = 21 ! _UNW_SET_NOT_ALLOWED_IN_STATE DECLARE LONG CONSTANT LIBICB$K_AC_CURR_CTXT_FAILED = 22 ! _UNW_CURRENT_CONTEXT_FAILED DECLARE LONG CONSTANT LIBICB$K_AC_CURR_CTXT_BAD_STATE = 23 ! _UNW_CURRENT_CONTEXT_NOT_ALLOWED_IN_STATE DECLARE LONG CONSTANT LIBICB$K_AC_MEMORY_ALLOC_ERROR = 24 ! _UNW_MEMORY_ALLOCATION_ERROR DECLARE LONG CONSTANT LIBICB$K_AC_CLEAR_BAD_STATE = 25 ! _UNW_CLEAR_NOT_ALLOWED_IN_STATE DECLARE LONG CONSTANT LIBICB$K_AC_QUERY_BAD_STATE = 26 ! _UNW_QUERY_NOT_ALLOWED_IN_STATE DECLARE LONG CONSTANT LIBICB$K_AC_INTERNAL_ERROR = 27 ! _UNW_INTERNAL_ERROR DECLARE LONG CONSTANT LIBICB$K_AC_STEP_I_ABI_MISMATCH = 28 ! _UNW_STEP_INTERRUPTION_ABI_MISMATCH DECLARE LONG CONSTANT LIBICB$K_AC_UNALIGNED_ICB = 29 ! _UNW_UNALIGNED_ICB DECLARE LONG CONSTANT LIBICB$K_AC_READ_MEM_FAILURE = 30 ! _UNW_READ_MEMORY_FAILURE DECLARE LONG CONSTANT LIBICB$K_AC_WRITE_MEM_FAILURE = 31 ! _UNW_WRITE_MEMORY_FAILURE DECLARE LONG CONSTANT LIBICB$K_AC_WRITE_REG_FAILURE = 32 ! _UNW_WRITE_REGISTER_FAILURE DECLARE LONG CONSTANT LIBICB$K_AC_UO_INCON_CALLBACK = 33 ! _UNW_USER_OVERRIDE_INCONSISTENT_CALLBACK_PARAM DECLARE LONG CONSTANT LIBICB$K_AC_PUT_REG_INVALID = 34 ! _UNW_PUT_REGISTER_INVALID DECLARE LONG CONSTANT LIBICB$K_INVO_CONTEXT_BLK_SIZE = 1744 DECLARE LONG CONSTANT LIBICB$S_INVO_CONTEXT_BLK = 1744 record INVO_CONTEXT_BLK ! ! The length of the structure in bytes (a longword field), ! The frame flags (a 3 byte field of bits), and ! The version number (a 1 byte field) group LIBICB$R_HDR variant case BASIC$QUADWORD LIBICB$IH_HEADER ! Header (length, flags, version) case group LIBICB$R_HDR_DESC LONG LIBICB$L_CONTEXT_LENGTH group LIBICB$R_FRAMEFLAGS variant case ! deprecated, will go away ... BYTE FFLAGS_BITS_bits ( 6 ) ! COMMENT ADDED BY SDL - FFLAGS_BITS_bits contains bits FFLAGS_BITS through & ! FRAME_FLAGS case group LIBICB$R_FFLAGS_DESC BYTE EXCEPTION_FRAME_bits ! COMMENT ADDED BY SDL - EXCEPTION_FRAME_bits contains bits & ! EXCEPTION_FRAME through FILL_0_ end group LIBICB$R_FFLAGS_DESC end variant end group LIBICB$R_FRAMEFLAGS BYTE LIBICB$B_BLOCK_VERSION end group LIBICB$R_HDR_DESC end variant end group LIBICB$R_HDR BASIC$QUADWORD LIBICB$ih_spare_01 group LIBICB$r_unwind_context variant case group LIBICB$r_ucontext BASIC$QUADWORD LIBICB$ih_uc_flags BASIC$QUADWORD LIBICB$ph_uc_link group LIBICB$r_iregset variant case group LIBICB$r_ireg ! Dwarf numbering, ordering group LIBICB$r_raxovr variant case BASIC$QUADWORD LIBICB$ih_rax ! r0 case BASIC$QUADWORD LIBICB$ih_ai ! synonym for RAX (Argument Information register) end variant end group LIBICB$r_raxovr BASIC$QUADWORD LIBICB$ih_rdx ! r1 BASIC$QUADWORD LIBICB$ih_rcx ! r2 BASIC$QUADWORD LIBICB$ih_rbx ! r3 BASIC$QUADWORD LIBICB$ih_rsi ! r4 BASIC$QUADWORD LIBICB$ih_rdi ! r5 group LIBICB$r_rbpovr variant case BASIC$QUADWORD LIBICB$ih_rbp ! r6 case BASIC$QUADWORD LIBICB$ih_bp ! synonym for RBP (Frame Pointer register) end variant end group LIBICB$r_rbpovr group LIBICB$r_rspovr variant case BASIC$QUADWORD LIBICB$ih_rsp ! r7 case BASIC$QUADWORD LIBICB$ih_sp ! synonym for RSP (Stack Pointer register) end variant end group LIBICB$r_rspovr BASIC$QUADWORD LIBICB$ih_r8 BASIC$QUADWORD LIBICB$ih_r9 BASIC$QUADWORD LIBICB$ih_r10 BASIC$QUADWORD LIBICB$ih_r11 BASIC$QUADWORD LIBICB$ih_r12 BASIC$QUADWORD LIBICB$ih_r13 BASIC$QUADWORD LIBICB$ih_r14 BASIC$QUADWORD LIBICB$ih_r15 group LIBICB$r_ripovr variant case BASIC$QUADWORD LIBICB$ih_rip ! r16, ra, pc case BASIC$QUADWORD LIBICB$ih_ip ! synonym for RIP (Instruction Pointer) end variant end group LIBICB$r_ripovr BASIC$QUADWORD LIBICB$IH_PSEUDO_REGS ( 31 ) BASIC$QUADWORD LIBICB$ih_rflags group LIBICB$R_SEGMENT_REGISTERS variant case BASIC$QUADWORD LIBICB$ih_fsgs case group LIBICB$R_FS_GS_REGISTERS WORD LIBICB$w_fs WORD LIBICB$w_gs end group LIBICB$R_FS_GS_REGISTERS end variant end group LIBICB$R_SEGMENT_REGISTERS group LIBICB$R_SSE_FP_CS_REGISTERS variant case BASIC$QUADWORD LIBICB$ih_mxcsr_fcw_fsw case group LIBICB$R_SSE_FP_CSR LONG LIBICB$l_mxcsr WORD LIBICB$w_fcw WORD LIBICB$w_fsw end group LIBICB$R_SSE_FP_CSR end variant end group LIBICB$R_SSE_FP_CS_REGISTERS end group LIBICB$r_ireg case BASIC$QUADWORD LIBICB$ih_ireg ( 15 ) case BASIC$QUADWORD LIBICB$ih_gregs ( 51 ) ! deprecated - will go away ... end variant end group LIBICB$r_iregset group LIBICB$r_fp_save_area_addr variant case BASIC$QUADWORD LIBICB$ph_xsave case BASIC$QUADWORD LIBICB$ph_fpreg ! deprecated - will go away ... case BASIC$QUADWORD LIBICB$ph_fpregs ! deprecated - will go away ... end variant end group LIBICB$r_fp_save_area_addr BASIC$QUADWORD LIBICB$IH_XSAVE_STATE LONG LIBICB$l_xsave_length LONG LIBICB$l_spare_02 BASIC$QUADWORD LIBICB$ih_reserved1 ( 5 ) end group LIBICB$r_ucontext case BASIC$QUADWORD LIBICB$ih_ucontext ( 62 ) end variant end group LIBICB$r_unwind_context BASIC$QUADWORD LIBICB$ih_ucursor ( 127 ) BASIC$QUADWORD LIBICB$IH_PSP ! SP at entry to routine (Previous SP) BASIC$QUADWORD LIBICB$IH_PSP_VALID ! PreviousSP valid group LIBICB$r_return_addr variant case BASIC$QUADWORD LIBICB$IH_RETURN_IP ! Return IP for SDA. case BASIC$QUADWORD LIBICB$IH_RETURN_PC ! deprecated - will go away ... end variant end group LIBICB$r_return_addr BASIC$QUADWORD LIBICB$PH_CHFCTX_ADDR ! Pointer to condition handler facility context block BASIC$QUADWORD LIBICB$PH_OTHER ! Pointer to other interesting structure (if any) BASIC$QUADWORD LIBICB$IH_OSSD ! Copy of OSSD from Unwind Information Block BASIC$QUADWORD LIBICB$IH_HANDLER_PV ! Condition Handler Procedure Value BASIC$QUADWORD LIBICB$PH_LSDA ! Virtual Address of LSD area of UIB ! ! The following locations can be used to alter the default behavior ! Typically this would be used for cross-process unwinding, and ! specifying an alternative memory allocation scheme. group LIBICB$r_op_flags variant case LONG LIBICB$R_UO_BASE ! base of User Override area case BASIC$QUADWORD LIBICB$Q_UO_FLAGS ! operational flags case group LIBICB$r_uo_flag_bits ! cache unwind information between calls ! for effiecient stack walk. ! Internal use only BYTE UO_FLAG_CACHE_UNWIND_bits ! COMMENT ADDED BY SDL - UO_FLAG_CACHE_UNWIND_bits contains bits & ! UO_FLAG_CACHE_UNWIND through FILL_1_ end group LIBICB$r_uo_flag_bits end variant end group LIBICB$r_op_flags BASIC$QUADWORD LIBICB$IH_UO_IDENT ! user context variable, passed by value ! to the following callback routines. BASIC$QUADWORD LIBICB$PH_UO_READ_MEM ! Pointer to user "read memory" routine BASIC$QUADWORD LIBICB$PH_UO_GETUEINFO ! Pointer to user "get Unwind Entry Information" routine BASIC$QUADWORD LIBICB$PH_UO_GETCONTEXT ! Pointer to user "get Initial Context" routine BASIC$QUADWORD LIBICB$PH_UO_WRITE_MEM ! Pointer to user "put memory" routine BASIC$QUADWORD LIBICB$PH_UO_WRITE_REG ! Pointer to user "put register" routine BASIC$QUADWORD LIBICB$PH_UO_MALLOC ! Pointer to user "malloc" routine BASIC$QUADWORD LIBICB$PH_UO_FREE ! Pointer to user "free" routine BASIC$QUADWORD LIBICB$PH_UO_ACTION_ROUTINE ! Pointer to user "action" routine - actions ! are defined by "action codes" (see below). BASIC$QUADWORD LIBICB$ih_spare_10 ! ******* End of User Override area *************************** ! the following locations are used internally, and should not be ! modified by the user BASIC$QUADWORD LIBICB$ph_most_recent_context ! Most recent user context used group LIBICB$r_int_flags variant case LONG LIBICB$l_internal_flags ! internal operational flags case group LIBICB$r_int_flag_bits BYTE using_client_memread_bits ! COMMENT ADDED BY SDL - using_client_memread_bits contains bits & ! using_client_memread through FILL_2_ end group LIBICB$r_int_flag_bits end variant end group LIBICB$r_int_flags LONG LIBICB$l_interface_state ! enum InterfaceUsageState LONG LIBICB$l_ip_source ! enum IP_SOURCE ! The alert code can be examined to a more detailed failure status LONG LIBICB$L_ALERT_CODE ! enum _UNW_ReturnCode BASIC$QUADWORD LIBICB$ih_spare_11 STRING LIBICB$t_align_2 = 0 ! The following is an "internal" area that's reserved for use by ! the operating system. It's size may vary over time. BASIC$QUADWORD LIBICB$IH_SYSTEM_DEFINED ( 1 ) ! ! Action codes are passed as the first parameter to the UO_ACTION_ROUTINE to indicate ! an action to be performed. The remaining parameters to the action routine are action ! dependent, and usually include the ident value as the last parameter. ! ! Action routine prototype: ! ! uint64 return_value = action_routine (enum action_code code, ..., uint64 ident); ! ! A return_value of ACTION_USE_DEFAULT indicates that the action was not performed ! and the calling standard routines should fall back to "default" processing. ! Other return values are action dependent. ! end record INVO_CONTEXT_BLK ! Write Register callback routine - WhichReg enum. ! ! The Write Register callback routine is only used when a live ! register in another (remote) process needs to be written as ! a result of a call to LIB$X86_PUT_INVO_REGISTERS. ! It is permissible to implement a subset of these registers, ! or not implement it at all if you are sure that these registers ! have been saved to memory before PUT_INVO is called ! ! For the General Registers: ! whichReg = LIBICB$K_WhichReg_GR0 + register number ! value_1 = 64-bit register value ! DECLARE LONG CONSTANT LIBICB$K_WhichReg_GR0 = 0 ! ! For the Floating Registers: ! whichReg = LIBICB$K_WhichReg_FR0 + floating register number ! value_1 = 64-bit lower floating fill value ! value_2 = 64-bit upper floating fill value ! DECLARE LONG CONSTANT LIBICB$K_WhichReg_FR0 = 16 DECLARE LONG CONSTANT LIBICB$K_WhichReg_FPSR = 24