# HG changeset patch # User JeanDo # Date 1293546535 -3600 # Node ID 3003a8040b78d1e087bbed9c3a52be1b1e3cc250 # Parent e0f29e20bd24088a4cb2a5c52be822018ff076d6 FIX again reset C data stack and frame pointer when entering C code. diff -r e0f29e20bd24 -r 3003a8040b78 code_part1/OSTC_code_c_part2/p2_deco.c --- a/code_part1/OSTC_code_c_part2/p2_deco.c Sun Dec 26 23:49:11 2010 +0100 +++ b/code_part1/OSTC_code_c_part2/p2_deco.c Tue Dec 28 15:28:55 2010 +0100 @@ -255,6 +255,7 @@ #pragma udata bank8=0x800 static char md_pi_subst[256]; +#define C_STACK md_pi_subst // Overlay C-code data stack here, too. #pragma udata bank9a=0x900 // output: @@ -467,7 +468,7 @@ // ------------------------------- // DBG - multi main during dive // // ------------------------------- -void check_dbg(char is_post_check) +void check_dbg(static char is_post_check) { temp_DBS = 0; if( (DBG_N2_ratio != N2_ratio) || (DBG_He_ratio != He_ratio) ) @@ -746,26 +747,63 @@ // ** for the asm code ** // ********************** // ********************** + +void fillDataStack(void) +{ + _asm + LFSR 1,C_STACK + MOVLW 0xCC +loop: MOVWF POSTINC1,0 + TSTFSZ FSR1L,0 + BRA loop + + LFSR 1,C_STACK + LFSR 2,C_STACK + MOVLW 1 + MOVWF TBLPTRU,0 + _endasm +} + +// When calling C code from ASM context, the data stack pointer and +// frames should be reset. Bank3 is dedicated to the stack (see the +// .lkr script). +#ifdef __DEBUG +# define RESET_C_STACK fillDataStack(); +#else +# define RESET_C_STACK \ + _asm \ + LFSR 1, C_STACK \ + LFSR 2, C_STACK \ + MOVLW 1 \ + MOVWF TBLPTRU,0 \ + _endasm +#endif + + void deco_calc_hauptroutine(void) { + RESET_C_STACK calc_hauptroutine(); int_O_desaturation_time = 65535; } void deco_calc_without_deco(void) { + RESET_C_STACK calc_without_deco(); deco_calc_desaturation_time(); } void deco_clear_tissue(void) { + RESET_C_STACK clear_tissue(); char_I_depth_last_deco = 0; // for compatibility with v.101pre_no_last_deco } void deco_calc_wo_deco_step_1_min(void) { + RESET_C_STACK calc_wo_deco_step_1_min(); char_O_deco_status = 3; // surface new in v.102 overwrites value of calc_wo_deco_step_1_min deco_calc_desaturation_time(); @@ -773,7 +811,8 @@ void deco_debug(void) { -//debug(); + RESET_C_STACK +// debug(); } // --------------- @@ -793,12 +832,6 @@ int_O_DBG_post_bitfield = 0; char_O_NDL_at_20mtr = 255; -_asm -lfsr 1, 0x300 // C math routines shall use this variable bank -movlw 0x01 -movwf TBLPTRU,0 -_endasm - // N2_ratio = (float)char_I_N2_ratio; // the 0.0002 of 0.7902 are missing with standard air N2_ratio = 0.7902; // N2_ratio / 100.0; pres_respiration = (float)int_I_pres_respiration / 1000.0; @@ -864,9 +897,6 @@ void calc_without_deco(void) { -_asm - lfsr 1, 0x300 -_endasm N2_ratio = 0.7902; // FIXED RATIO !! sum as stated in b"uhlmann pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system pres_surface = (float)int_I_pres_surface / 1000.0; @@ -1281,12 +1311,6 @@ void calc_tissue(void) { -_asm -lfsr 1, 0x300 -movlw 0x01 -movwf TBLPTRU,0 -_endasm - char_O_gtissue_no = 255; pres_gtissue_limit = 0.0; @@ -1549,13 +1573,6 @@ temp_pres_gtissue_limit = 0.0; temp_gtissue_no = 255; -_asm -lfsr 1, 0x300 -movlw 0x01 -movwf TBLPTRU,0 -_endasm - - for (ci=0;ci<16;ci++) { _asm @@ -1673,12 +1690,6 @@ temp_pres_gtissue_limit = 0.0; temp_gtissue_no = 255; -_asm -lfsr 1, 0x300 -movlw 0x01 -movwf TBLPTRU,0 -_endasm - for (ci=0;ci<16;ci++) { _asm @@ -1920,6 +1931,7 @@ void deco_gradient_array() { + RESET_C_STACK pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system for (ci=0;ci<16;ci++) { @@ -1948,11 +1960,8 @@ void deco_calc_desaturation_time(void) { -_asm -lfsr 1, 0x300 -movlw 0x01 -movwf TBLPTRU,0 -_endasm + RESET_C_STACK + N2_ratio = 0.7902; // FIXED sum as stated in b"uhlmann pres_surface = (float)int_I_pres_surface / 1000.0; temp_atem = N2_ratio * (pres_surface - 0.0627); @@ -2085,9 +2094,7 @@ flag_in_divemode = 0; set_dbg_end_of_dive(); } -_asm - lfsr 1, 0x300 -_endasm + N2_ratio = 0.7902; // FIXED, sum lt. buehlmann pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system pres_surface = (float)int_I_pres_surface / 1000.0; @@ -2114,12 +2121,6 @@ void calc_tissue_step_1_min(void) { -_asm -lfsr 1, 0x300 -movlw 0x01 -movwf TBLPTRU,0 -_endasm - char_O_gtissue_no = 255; pres_gtissue_limit = 0.0; @@ -2250,6 +2251,7 @@ // ---------- void deco_hash(void) { + RESET_C_STACK // init for (md_i=0;md_i<16;md_i++) { @@ -2346,6 +2348,7 @@ void deco_clear_CNS_fraction(void) { + RESET_C_STACK CNS_fraction = 0.0; char_O_CNS_fraction = 0; } // void deco_clear_CNS_fraction(void) @@ -2364,6 +2367,7 @@ void deco_calc_CNS_fraction(void) { + RESET_C_STACK actual_ppO2 = (float)char_I_actual_ppO2 / 100.0; if (char_I_actual_ppO2 < 50) @@ -2422,6 +2426,7 @@ void deco_calc_CNS_decrease_15min(void) { + RESET_C_STACK CNS_fraction = 0.890899 * CNS_fraction; char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0); }// deco_calc_CNS_decrease_15min(void) @@ -2437,6 +2442,7 @@ void deco_calc_percentage(void) { + RESET_C_STACK temp1 = (float)int_I_temp; temp2 = (float)char_I_temp / 100.0; temp3 = temp1 * temp2; @@ -2445,12 +2451,14 @@ void deco_push_tissues_to_vault(void) { + RESET_C_STACK cns_vault = CNS_fraction; for (ci=0;ci<32;ci++) pres_tissue_vault[ci] = pres_tissue[ci]; } void deco_pull_tissues_from_vault(void) { + RESET_C_STACK CNS_fraction = cns_vault; for (ci=0;ci<32;ci++) pres_tissue[ci] = pres_tissue_vault[ci];