FreeCalypso > hg > fc-tourmaline
view src/g23m-fad/fad/fad.h @ 78:c632896652ba
mfw/ti1_key.c: properly initialize notified_keys array
The code in this ti1_key.c layer needs to call kpd_subscribe() and
kpd_define_key_notification() functions in order to register with the
KPD driver. The original code passed KPD_NB_PHYSICAL_KEYS in
nb_notified_keys - this constant is defined to 24 in kpd_cfg.h on all
platforms of interest to us - but it only filled the first 23 slots
in the notified_keys array, resulting in stack garbage being passed
to KPD API functions. The fix consists of initializing the last
missed array slot to KPD_KEY_RECORD, the key ID for the right side
button on the D-Sample handset.
On our current hw targets this "Record" button exists as the EXTRA
button on our Luna keypad board and as the camera button on the
Pirelli DP-L10. There is no support whatsoever for this button
in current BMI+MFW, we have no plans of doing anything with Pirelli's
camera button even if we do get our UI fw running on that phone,
and the Mother's dream of building our own FreeCalypso handset with
the same button arrangement as D-Sample (including the right side
button) is currently very nebulous - but let us nonetheless handle
the full set of buttons on the KPD to MFW interface, and let upper
layers weed out unsupported buttons.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 25 Oct 2020 23:41:01 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-F&D (8411) | Modul : FAD +----------------------------------------------------------------------------- | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : Definitions for the Protocol Stack Entity | Fax Adaptation 3.45 +----------------------------------------------------------------------------- */ #ifndef FAD_H #define FAD_H #include "cl_ribu.h" /* * Macros */ #undef TRACE_FAD_DL_TCF #define TRACE_FAD_DL_STATUS #define TRACE_FAD_UL_STATUS #ifndef _SIMULATION_ /* keeps testcases passing */ #define BMI_TCF_WORKAROUND #endif #ifndef NTRACE /* for trace purposes */ #define SERVICE_NAME_KER "KER" #define SERVICE_NAME_RCV "RCV" #define SERVICE_NAME_RCVSUB "RCVSUB" #define SERVICE_NAME_SND "SND" #define SERVICE_NAME_SNDSUB "SNDSUB" #endif #define KER ker. #define RCV rcv. #define RCVSUB rcv.sub. #define SND snd. #define SNDSUB snd.sub. #define SHARED_FAX_DATA_RAM /* * instance management */ #define GET_INSTANCE(p) &fad_data_base[0] /* * Constants */ /* * global unchangeable constants */ #define SBM_MAX_PRIMS 10 /* max numbers of prims in SBM */ #define FRAME_SIZE 8 /* num of data bytes in fad frame */ #define MAX_NEW_FRAMES 9 /* number of 64 bit frames which can be received in one ra_data_ind primitive */ #define MAX_SDU_SIZE (MAX_NEW_FRAMES * FRAME_SIZE) /*==== TYPES ======================================================*/ /* * Constants */ /* * Bitoffset for encoding/decoding */ #define ENCODE_OFFSET 0 /* * Dynamic Configuration Numbers */ /* * States of the entity process KERNEL */ #define KER_NULL 0 #define IDLE 1 #define BCS_REC 2 #define BCS_TRA 3 #define MSG_REC_TCF 4 #define MSG_REC 5 #define MSG_TRA_TCF 6 #define MSG_TRA 7 /* * States of the entity process SND */ #define SYNC_SND 0 #define PREAM_SND 1 #define TCF_SND 2 #define TRAIN_SND 3 #define TRAIN_CNF_SND 4 #define BCS_SND 5 #define MSG_SND 6 /* * States of the entity process RCV */ #define SYNC_RCV 0 #define PREAM_RCV 1 #define TCF_RCV 2 #define TRAIN_RCV 3 #define BCS_RCV 4 #define MSG_RCV 5 /* substates */ #define SUB_IDLE 0 #define SUB_PREAMBLE 1 #define SUB_TCF 2 #define SUB_POST_TCF 3 #define SUB_DATA 4 /* * FAD Constants */ /* shared */ /* phase identifiers */ #define IDENT_BCS_REC 0x11 #define IDENT_MSG_REC 0x33 #define IDENT_MSG_TRA 0x44 /* Layer 1 TI frame */ #define L1_TI_LEN 40 /* RCV specific */ #ifdef _TARGET_ #define FAD_DESCBUF_LEN 8 #endif #define BCS_TOLERANCE 70 /* 70% tolerance for correct BCS data */ #define TRAIN_TOLERANCE 50 /* SND specific */ /* Frame formats */ #define FR_SEQ_SYNC "\x3E\x37\x50\x96\xC1\xC8\xAF\x69" #define FR_SEQ_PREAMBLE "\x11\x7E" /* BCS-REC + preamble */ #define FR_SEQ_TRAIN_SND "\x33\x0F" /* MSG-REC + STATUS */ #define FR_SEQ_TRAIN_RCV "\x44\x0F" /* MSG-TRA + STATUS */ #define FR_SEQ_TCF "\x00\x00\x00\x00\x00\x00\x00\x00" #define VAL_TCF 0x00 #define HDLC_FLAG 0x7E #define VAL_TRAIN 0x0F /* length in bytes */ #define LEN_SEQ_SYNC FRAME_SIZE #define LEN_SEQ_PREAMBLE 2 #define LEN_SEQ_TCF FRAME_SIZE #define LEN_SEQ_TRAIN 2 #define SYNC_CYCLE_NONE 0 #define SYNC_CYCLE_7200 4 #define SYNC_CYCLE_12000 6 #define SYNC_RESET 3 #define REPEAT_FOREVER 0xFFFF /* bytes remaining - SYNC */ #define PREAMBLE_BYTES_TI_EXP 30 /* = 400 ms (give some extra tolerance to required 850 ms) */ #define PREAMBLE_BYTES_TI_SND 74 /* = 1 sec */ #define TIME_AWAIT_TCF 75 /* 75 millisec. */ #define TIME_TCF_SND 1500 /* 1500 millisec. */ #define TIME_TCF_RCV 1350 /* 1500 millisec. - 10% */ #ifdef _SIMULATION_ #define TIME_THRESHOLD 5000 /* 5-sec. MSG buffer - T.32, §7.4 */ #else #define TIME_THRESHOLD_TI 1000 #endif #define MAX_SND_FRAMES 3 #define SND_FRAME_LEN FRAME_SIZE /* 11.01.99/DL: 24 -> 8 */ #define RCV_FRAME_LEN 24 #define HDLC_LEN (RCV_FRAME_LEN * 12) #define BCS_BUF_LEN (SND_FRAME_LEN * MAX_SND_FRAMES * 16) /* 336 */ #ifdef _SIMULATION_ #define BCS_RATE 300 #define HDLC_REPEAT 8 #endif /* frame types - FAD internal */ #define FT_PREAMBLE 0x06 #define FT_TRAIN_RESPONSE 0x07 #define FT_NONE 0x0F /*==== TYPES ======================================================*/ /* * entity global data */ /* * send buffer management */ #define SBM_PRIMBUF_SIZE (SBM_MAX_PRIMS+1) typedef T_FAD_DATA_REQ T_SBM_PRIM; typedef UBYTE T_SBM_PRIM_INDEX; typedef struct { T_SBM_PRIM *Prim; } T_SBM_PRIMSLOT; /* * receive buffer management */ #define RBM_PQ_MAX_PRIM 10 #define RBM_PQ_SIZE (RBM_PQ_MAX_PRIM+1) typedef T_FAD_DATA_IND T_RBM_PRIM; /* * data for send buffer management */ typedef struct { USHORT syncCycle; USHORT framesUntilSync; USHORT CurrPrimOff; USHORT CurrPrimLen; USHORT FrameSize; UBYTE frames[MAX_SDU_SIZE]; T_RIBU ribu; T_SBM_PRIMSLOT Prim[SBM_PRIMBUF_SIZE]; T_SBM_PRIM_INDEX PA; } T_SBM; /* * data for receive buffer management */ #define DL_RIBU_DEPTH 4 typedef struct { BOOL Initialised; USHORT FramesPerPrim; USHORT FramesInCurrPrim; T_RIBU_FD *ribu; T_RBM_PRIM *CurrPrim; T_RIBU PQ; T_RBM_PRIM *PQ_Array[RBM_PQ_SIZE]; } T_RBM_FAD; typedef struct { UBYTE state; #ifndef NTRACE char *name; char *state_name; #endif BOOL forward_data; } T_KER; typedef struct { UBYTE state; #ifndef NTRACE char *name; char *state_name; #endif } T_STATE; typedef struct { UBYTE state; #ifndef NTRACE char *name; char *state_name; #endif T_STATE sub; /* substate */ UBYTE reset; BOOL send_status; BOOL send_ready_to_t30; BOOL final; UBYTE seq_buf [BCS_BUF_LEN]; UBYTE ul_FD_align[L1_TI_LEN]; USHORT ra_req_frames; USHORT seq_buflen; USHORT seq_bufpos; USHORT bytes_to_send; USHORT threshold; /* T.32: 5-sec. buffer */ USHORT data_to_send; USHORT data_bufpos; USHORT frames_per_prim; USHORT trans_rate; T_FD FD; U8 FD_buf[BCS_BUF_LEN]; T_FAD_DATA_REQ *fad_data_req; #ifdef _TARGET_ T_RA_DATA_REQ ra_data_req; #endif } T_SND; #define FLAGFOUND_MIN 5 typedef struct { UBYTE state; #ifndef NTRACE char *name; char *state_name; #endif T_STATE sub; /* substate */ BOOL train_flg; BOOL prim_ready; BOOL data_incoming; BOOL t30_req_frames; BOOL data_in_rbm; BOOL preamble_pending; BOOL bcs_pending; UBYTE bcs_data_len; UBYTE hdlc [HDLC_LEN]; UBYTE FlagFound; /* HDLC flag in preamble found */ UBYTE AlignShift; /* shift of HDLC flag in received RA_DATA_IND */ USHORT AlignWord; USHORT bytes_good; USHORT bytes_expect; USHORT bytes_rcvd; USHORT hdlc_len; USHORT data_bufpos; } T_RCV; typedef struct { T_KER ker; T_SND snd; T_RCV rcv; T_SBM sbm; T_RBM_FAD rbm; } T_FAD_DATA; /* * SBM, RBM: constants, type defs */ #define ENTITY_DATA fad_data /*==== EXPORT =====================================================*/ /* * instance data base */ #ifdef FAD_PEI_C GLOBAL T_FAD_DATA *fad_data; #else EXTERN T_FAD_DATA *fad_data; #endif #ifdef SHARED_FAX_DATA_RAM /*lint -e526 : not defined */ EXTERN UBYTE l2r_data_base[]; EXTERN ULONG l2r_data_magic_num; #define fad_data_base ((T_FAD_DATA*)l2r_data_base) #define fad_data_magic_num l2r_data_magic_num #else /* !SHARED_FAX_DATA_RAM */ #ifdef FAD_PEI_C GLOBAL T_FAD_DATA fad_data_base[1]; GLOBAL ULONG fad_data_magic_num; #else EXTERN T_FAD_DATA fad_data_base[]; EXTERN ULONG fad_data_magic_num; #endif #endif /* !SHARED_FAX_DATA_RAM */ #define FAD_DATA_MAGIC_NUM (('F'<<24) + ('A'<<16) + ('D'<<8)) /* "FAD",NUL */ /* * Prototypes * * FAD KERNEL * * KERNEL primitive processing */ #ifdef USE_L1FD_FUNC_INTERFACE EXTERN void l1i_ra_detect_req(T_RA_DETECT_REQ *ra_detect_req); #endif #ifdef OPTION_MULTITHREAD #define ker_fad_activate_req _ENTITY_PREFIXED(ker_fad_activate_req) #define ker_fad_deactivate_req _ENTITY_PREFIXED(ker_fad_deactivate_req) #define ker_fad_modify_req _ENTITY_PREFIXED(ker_fad_modify_req) #define ker_fad_data_req _ENTITY_PREFIXED(ker_fad_data_req) #define ker_fad_snd_tcf_req _ENTITY_PREFIXED(ker_fad_snd_tcf_req) #define ker_fad_rcv_tcf_req _ENTITY_PREFIXED(ker_fad_rcv_tcf_req) #define ker_fad_ready_req _ENTITY_PREFIXED(ker_fad_ready_req) #define ker_fad_ignore_req _ENTITY_PREFIXED(ker_fad_ignore_req) #endif EXTERN void ker_fad_activate_req (T_FAD_ACTIVATE_REQ *fad_activate_req); EXTERN void ker_fad_deactivate_req (T_FAD_DEACTIVATE_REQ *fad_deactivate_req); EXTERN void ker_fad_modify_req (T_FAD_MODIFY_REQ *fad_modify_req); EXTERN void ker_fad_data_req (T_FAD_DATA_REQ *fad_data_req); EXTERN void ker_fad_snd_tcf_req (T_FAD_SND_TCF_REQ *fad_snd_tcf_req); EXTERN void ker_fad_rcv_tcf_req (T_FAD_RCV_TCF_REQ *fad_rcv_tcf_req); EXTERN void ker_fad_ready_req (T_FAD_READY_REQ *fad_ready_req); EXTERN void ker_fad_ignore_req (T_FAD_IGNORE_REQ *fad_ignore_req); /* * KERNEL signal processing */ /* * KERNEL procedures */ #ifdef OPTION_MULTITHREAD #define ker_init _ENTITY_PREFIXED(ker_init) #define ker_SetError _ENTITY_PREFIXED(ker_SetError) #endif EXTERN void ker_init (void); EXTERN void ker_SetError (USHORT cause); /* * FAD RCV * * RCV primitive processing */ #ifdef OPTION_MULTITHREAD #define rcv_ra_data_ind _ENTITY_PREFIXED(rcv_ra_data_ind) #endif EXTERN void rcv_ra_data_ind (T_RA_DATA_IND *ra_data_ind); /* * RCV signal processing */ #ifdef OPTION_MULTITHREAD /* KER -> RCV */ #define sig_ker_rcv_await_tcf_req _ENTITY_PREFIXED(sig_ker_rcv_await_tcf_req) #define sig_ker_rcv_ready_req _ENTITY_PREFIXED(sig_ker_rcv_ready_req) #define sig_ker_rcv_reset_req _ENTITY_PREFIXED(sig_ker_rcv_reset_req) /* RCV -> KER */ #define sig_rcv_ker_preamble_ind _ENTITY_PREFIXED(sig_rcv_ker_preamble_ind) #define sig_rcv_ker_tcf_ind _ENTITY_PREFIXED(sig_rcv_ker_tcf_ind) #define sig_rcv_ker_train_ind _ENTITY_PREFIXED(sig_rcv_ker_train_ind) #define sig_rcv_ker_train_end_ind _ENTITY_PREFIXED(sig_rcv_ker_train_end_ind) #define sig_rcv_ker_bcs_ind _ENTITY_PREFIXED(sig_rcv_ker_bcs_ind) #define sig_rcv_ker_msg_ind _ENTITY_PREFIXED(sig_rcv_ker_msg_ind) #define sig_rcv_ker_status_ind _ENTITY_PREFIXED(sig_rcv_ker_status_ind) #define sig_rcv_ker_error_ind _ENTITY_PREFIXED(sig_rcv_ker_error_ind) #endif EXTERN void sig_ker_rcv_await_tcf_req (void); EXTERN void sig_ker_rcv_ready_req (void); EXTERN void sig_ker_rcv_reset_req (void); EXTERN void sig_rcv_ker_preamble_ind (void); EXTERN void sig_rcv_ker_tcf_ind (void); EXTERN void sig_rcv_ker_train_ind (void); EXTERN void sig_rcv_ker_train_end_ind (void); EXTERN void sig_rcv_ker_bcs_ind (UBYTE *hdlc, USHORT hdlc_len); EXTERN void sig_rcv_ker_msg_ind (T_FAD_DATA_IND *fad_data_ind); EXTERN void sig_rcv_ker_status_ind (void); EXTERN void sig_rcv_ker_error_ind (USHORT cause); /* * RCV procedures */ #ifdef OPTION_MULTITHREAD #define rcv_init _ENTITY_PREFIXED(rcv_init) #define rcv_ResetFormatter _ENTITY_PREFIXED(rcv_ResetFormatter) #define rcv_FrameType _ENTITY_PREFIXED(rcv_FrameType) #define rcv_SetHdlcFrame _ENTITY_PREFIXED(rcv_SetHdlcFrame) #define rcv_SetErrorRatio _ENTITY_PREFIXED(rcv_SetErrorRatio) #define rcv_GetMsgData _ENTITY_PREFIXED(rcv_GetMsgData) #define rcv_SetFinalBuffer _ENTITY_PREFIXED(rcv_SetFinalBuffer) #endif EXTERN void rcv_init (void); EXTERN void rcv_ResetFormatter (void); EXTERN UBYTE rcv_FrameType (T_FD *pFD); EXTERN void rcv_SetHdlcFrame (T_FD *pFD, UBYTE *hdlc_data, USHORT *hdlc_len); EXTERN void rcv_SetErrorRatio (T_FD *pFD); EXTERN BOOL rcv_StoreMsgData (T_FD *pFD, BOOL *primAvail); EXTERN BOOL rcv_GetMsgData (T_FAD_DATA_IND **fad_data_ind, BOOL data_incoming); EXTERN void rcv_SetFinalBuffer (void); #ifdef _TARGET_ EXTERN void l1i_ra_detect_req(T_RA_DETECT_REQ *ra_detect_req); #endif /* * FAD SND * * SND primitive processing */ #ifdef OPTION_MULTITHREAD #define snd_ra_ready_ind _ENTITY_PREFIXED(snd_ra_ready_ind) #endif EXTERN void snd_ra_ready_ind (T_RA_READY_IND *ra_ready_ind); /* * SND signal processing */ #ifdef OPTION_MULTITHREAD /* KER -> SND */ #define sig_ker_snd_activate_req _ENTITY_PREFIXED(sig_ker_snd_activate_req) #define sig_ker_snd_sync_req _ENTITY_PREFIXED(sig_ker_snd_sync_req) #define sig_ker_snd_train_req _ENTITY_PREFIXED(sig_ker_snd_train_req) #define sig_ker_snd_tcf_req _ENTITY_PREFIXED(sig_ker_snd_tcf_req) #define sig_ker_snd_preamble_req _ENTITY_PREFIXED(sig_ker_snd_preamble_req) #define sig_ker_snd_bcs_req _ENTITY_PREFIXED(sig_ker_snd_bcs_req) #define sig_ker_snd_status_req _ENTITY_PREFIXED(sig_ker_snd_status_req) /* SND -> KER */ #define sig_snd_ker_ready_ind _ENTITY_PREFIXED(sig_snd_ker_ready_ind) #define sig_snd_ker_data_sent_ind _ENTITY_PREFIXED(sig_snd_ker_data_sent_ind) #endif EXTERN void sig_ker_snd_activate_req (T_FAD_ACTIVATE_REQ *fad_activate_req); EXTERN void sig_ker_snd_sync_req (BOOL reset); EXTERN void sig_ker_snd_train_req (T_FAD_DATA_REQ *fad_data_req, BOOL send_fax); EXTERN void sig_ker_snd_tcf_req (void); EXTERN void sig_ker_snd_preamble_req (T_FAD_DATA_REQ *fad_data_req); EXTERN void sig_ker_snd_bcs_req (T_FAD_DATA_REQ *fad_data_req); EXTERN void sig_ker_snd_status_req (void); EXTERN void sig_ker_snd_msg_req (T_FAD_DATA_REQ *fad_data_req); EXTERN void sig_snd_ker_ready_ind (void); EXTERN void sig_snd_ker_data_sent_ind (void); /* * SND procedures */ #ifdef OPTION_MULTITHREAD #define snd_init _ENTITY_PREFIXED(snd_init) #define snd_SendReset _ENTITY_PREFIXED(snd_SendReset) #define snd_SetSequence _ENTITY_PREFIXED(snd_SetSequence) #define snd_SendSequence _ENTITY_PREFIXED(snd_SendSequence) #define snd_DurationToBytes _ENTITY_PREFIXED(snd_DurationToBytes) #define snd_BuildStatusFrames _ENTITY_PREFIXED(snd_BuildStatusFrames) #define snd_StoreMsgData _ENTITY_PREFIXED(snd_StoreMsgData) #define snd_SendMsgData _ENTITY_PREFIXED(snd_SendMsgData) #define snd_SendBcsData _ENTITY_PREFIXED(snd_SendBcsData) #endif EXTERN void snd_init (void); GLOBAL void snd_SendReset (USHORT bytes_to_send); EXTERN void snd_SetSequence (UBYTE *seq_buf, USHORT *seq_buflen, UBYTE *sequence, USHORT seq_len, USHORT repeat); EXTERN USHORT snd_SendSequence (USHORT bytes_to_send, UBYTE fr_type); EXTERN USHORT snd_DurationToBytes (USHORT trans_rate, USHORT duration); #ifdef _SIMULATION_ EXTERN void snd_BuildStatusFrames(T_FAD_DATA_REQ *fad_data_req, USHORT max_bytes); #else EXTERN void snd_BuildStatusFrames(T_FAD_DATA_REQ *fad_data_req); #endif EXTERN void snd_StoreMsgData (T_FAD_DATA_REQ *fad_data_req); EXTERN BOOL snd_SendMsgData (UBYTE req_frames); #ifdef _SIMULATION_ EXTERN void snd_SendBcsData (USHORT bytes_to_send); #else EXTERN void snd_SendBcsData (void); #endif /* SBM_RBM_BEGIN */ /* * Send Buffer Management SBM */ #ifdef OPTION_MULTITHREAD #define sbm_init _ENTITY_PREFIXED(sbm_init) #define sbm_store_prim _ENTITY_PREFIXED(sbm_store_prim) #define sbm_get_frame _ENTITY_PREFIXED(sbm_get_frame) #define sbm_free_empty_prims _ENTITY_PREFIXED(sbm_free_empty_prims) #endif EXTERN void sbm_init (USHORT frameSize); EXTERN void sbm_store_prim (T_SBM_PRIM *sendPrim); EXTERN BOOL sbm_get_frame (T_FRAME_DESC *frameDesc, UBYTE reqFrames); EXTERN void sbm_free_empty_prims (void); /* * Receive Buffer Management RBM */ #ifdef OPTION_MULTITHREAD #define rbm_init _ENTITY_PREFIXED(rbm_init ) #define rbm_deinit _ENTITY_PREFIXED(rbm_deinit ) #define rbm_reset _ENTITY_PREFIXED(rbm_reset ) #define rbm_store_frames _ENTITY_PREFIXED(rbm_store_frames ) #define rbm_get_prim _ENTITY_PREFIXED(rbm_get_prim ) #define rbm_get_curr_prim _ENTITY_PREFIXED(rbm_get_curr_prim ) #endif EXTERN void rbm_init(USHORT framesPerPrim); EXTERN void rbm_deinit(BOOL final); EXTERN void rbm_reset(void); EXTERN BOOL rbm_store_frames(T_FD *pFDw, BOOL *primIsReady); EXTERN T_RBM_PRIM *rbm_get_prim(void); EXTERN T_RBM_PRIM *rbm_get_curr_prim(void); /* * Communication handles */ #ifdef OPTION_MULTITHREAD #define hCommT30 _ENTITY_PREFIXED(hCommT30) #ifdef _SIMULATION_ #define hCommRA _ENTITY_PREFIXED(hCommRA) #endif #endif #ifdef FAD_PEI_C GLOBAL T_HANDLE fad_handle; /* own handle */ GLOBAL T_HANDLE hCommT30 = VSI_ERROR; /* T30 Communication */ #ifdef _SIMULATION_ GLOBAL T_HANDLE hCommRA = VSI_ERROR; /* RA Communication */ #endif #else EXTERN T_HANDLE fad_handle; /* own handle */ EXTERN T_HANDLE hCommT30; /* T30 Communication */ #ifdef _SIMULATION_ EXTERN T_HANDLE hCommRA; /* RA Communication */ #endif #endif GLOBAL void fad_exec_timeout(USHORT index); #define BYTE2HEXSTR(B, H) {UBYTE b, *a = (UBYTE*)(H);\ b = (((UBYTE)(B)) >> 4) & 0x0F;\ if (b > 9) b += 'A'-10; else b += '0'; *a = b;\ b = ((UBYTE)(B)) & 0x0F;\ if (b > 9) b += 'A'-10; else b += '0'; *(a+1) = b;} #endif