# HG changeset patch # User JeanDo # Date 1305982087 -7200 # Node ID 797e2ac42d24d1331f453e951701b4a11af8ebd0 # Parent 6bdf80d7276c44a400b248ce20bb60d198db7d45# Parent d5240792be51833db2cb6211b892310ddb95f326 MERGE with 1.91 main trunk. diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/MAIN.ASM --- a/code_part1/OSTC_code_asm_part1/MAIN.ASM Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/MAIN.ASM Sat May 21 14:48:07 2011 +0200 @@ -82,6 +82,7 @@ osct_asm code #include strings.inc +#include isr.asm ; Interrupt service routine (RTC&Sensor) #include displaytext.asm ; sends texts to wordprocessor #include math.asm ; mathematical functions #include wait.asm ; waitroutines @@ -103,7 +104,6 @@ #include menu_ppO2.asm ; Constant ppO2 setup menu #include menu_battery.asm ; Submenu "Battery Info" #include menu_gassetup.asm ; Menu "Gas Setup" -#include isr.asm ; Interrupt service routine (RTC&Sensor) #include surfmode.asm ; Mainroutines for Surfacemode #include divemode.asm ; Mainroutines for Divemode #include divemode_menu.asm ; Underwater menu diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/adc_rtc.asm --- a/code_part1/OSTC_code_asm_part1/adc_rtc.asm Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/adc_rtc.asm Sat May 21 14:48:07 2011 +0200 @@ -72,9 +72,9 @@ movwf fatal_error_code ; Battery very low! bsf enter_error_sleep ; enter error routine -get_battery_voltage3: - movff amb_pressure+0,sub_b+0 - movff amb_pressure+1,sub_b+1 +get_battery_voltage3: + SAFE_2BYTE_COPY amb_pressure, sub_b + movlw LOW d'15001' ; must be lower then 15001mBar movwf sub_a+0 movlw HIGH d'15001' @@ -136,9 +136,10 @@ write_int_eeprom d'43' movff year,EEDATA write_int_eeprom d'44' - movff temperature+0,EEDATA + SAFE_2BYTE_COPY temperature,lo + movff lo,EEDATA write_int_eeprom d'45' - movff temperature+1,EEDATA + movff hi,EEDATA write_int_eeprom d'46' ; Reset charge statistics clrf EEDATA @@ -150,9 +151,10 @@ write_int_eeprom d'52' ; total complete cycles write_int_eeprom d'53' ; total complete cycles ; Reset temperature extremas - movff temperature+0,EEDATA ; Reset mimimum extrema + SAFE_2BYTE_COPY temperature,lo + movff lo,EEDATA ; Reset mimimum extrema write_int_eeprom d'54' - movff temperature+1,EEDATA + movff hi,EEDATA write_int_eeprom d'55' movff month,EEDATA write_int_eeprom d'56' @@ -160,9 +162,9 @@ write_int_eeprom d'57' movff year,EEDATA write_int_eeprom d'58' - movff temperature+0,EEDATA ; Reset maximum extrema + movff lo,EEDATA ; Reset maximum extrema write_int_eeprom d'59' - movff temperature+1,EEDATA + movff hi,EEDATA write_int_eeprom d'60' movff month,EEDATA write_int_eeprom d'61' @@ -192,9 +194,10 @@ write_int_eeprom d'43' movff year,EEDATA write_int_eeprom d'44' - movff temperature+0,EEDATA + SAFE_2BYTE_COPY temperature,lo + movff lo,EEDATA write_int_eeprom d'45' - movff temperature+1,EEDATA + movff hi,EEDATA write_int_eeprom d'46' return diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/altimeter.asm --- a/code_part1/OSTC_code_asm_part1/altimeter.asm Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/altimeter.asm Sat May 21 14:48:07 2011 +0200 @@ -55,8 +55,7 @@ clrf pressureSum+1 clrf pressureCount - movff amb_pressure+0,pressureAvg+0 ; And init first average. - movff amb_pressure+1,pressureAvg+1 + SAFE_2BYTE_COPY amb_pressure, pressureAvg ; And init first average. movlw 4 ; And multiply AVG by 16 to be coherent. altimeter_reset_1: @@ -73,9 +72,11 @@ altimeter_1: ;---- Do a bank-safe 16bit summing ----------------------------------- - movff amb_pressure+0,WREG + SAFE_2BYTE_COPY amb_pressure, lo ; And init first average. + + movff lo,WREG addwf pressureSum+0,F - movff amb_pressure+1,WREG + movff hi,WREG addwfc pressureSum+1,F incf pressureCount ; Increment count too. diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/definitions.asm --- a/code_part1/OSTC_code_asm_part1/definitions.asm Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/definitions.asm Sat May 21 14:48:07 2011 +0200 @@ -188,7 +188,6 @@ ext_ee_temp2 res 1 ; External EEPROM Temp 2 used in I2C EEPROM isr1_temp res 1 ; ISR temp variables -isr3_temp res 2 timer1int_counter1 res 1 ;Timer 1 counter timer1int_counter2 res 1 ;Timer 1 counter @@ -235,15 +234,16 @@ OFF res 2 SENS res 2 +amb_pressure_avg res 2 ; ambient pressure summing buffer[mBar] amb_pressure res 2 ; ambient pressure [mBar] rel_pressure res 2 ; amb_pressure - surface pressure [mBar] max_pressure res 2 ; Max. pressure for the dive [mBar] avr_rel_pressure res 2 ; Average rel. pressure (Average depth) for the dive [mBar], Resettable avr_rel_pressure_total res 2 ; Average rel. pressure (Average depth) for the dive [mBar], Non-Resettable last_pressure res 2 +temperature_avg res 2 ; Temperature summing buffer. temperature res 2 last_temperature res 2 -temperature_temp res 2 Dx res 2 last_surfpressure res 2 ; Divemode @@ -440,7 +440,7 @@ #DEFINE switch_left flag6,3 ;=1: left switch pressed #DEFINE switch_right flag6,4 ;=1: right switch pressed #DEFINE uart_settime flag6,5 ;=1: enter time sync routine -#DEFINE neg_temp flag6,6 ;=1: temperature below zero +#DEFINE FLAG_1 flag6,6 ;=1: unused #DEFINE twosecupdate flag6,7 ;=1: after any two seconds #DEFINE dekostop_active flag7,0 ;=1: in deocompression mode diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/divemode.asm --- a/code_part1/OSTC_code_asm_part1/divemode.asm Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/divemode.asm Sat May 21 14:48:07 2011 +0200 @@ -416,8 +416,7 @@ ;----------------------------------------------------------------------------- ; calculate ppO2 in 0.01Bar (e.g. 150 = 1.50 Bar ppO2) set_actual_ppo2: - movff amb_pressure+0,xA+0 ; P_amb in milibar (1000 = 1.000 bar). - movff amb_pressure+1,xA+1 + SAFE_2BYTE_COPY amb_pressure, xA ; P_amb in milibar (1000 = 1.000 bar). movlw d'10' movwf xB+0 clrf xB+1 @@ -556,8 +555,8 @@ ;----------------------------------------------------------------------------- divemode_prepare_flags_for_deco: - movff amb_pressure+0,int_I_pres_respiration+0 ; lo and copy result to deco routine - movff amb_pressure+1,int_I_pres_respiration+1 ; hi + SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy result to deco routine + GETCUSTOM8 d'11' ; Saturation multiplier % movff WREG,char_I_saturation_multiplier GETCUSTOM8 d'12' ; Desaturation multiplier % @@ -593,9 +592,10 @@ incf_eeprom_address d'47' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000 store_dive_data2: - movf rel_pressure+0,W ; store depth with every sample + SAFE_2BYTE_COPY rel_pressure, lo + movf lo,W ; store depth with every sample call write_external_eeprom - movf rel_pressure+1,W + movf hi,W call write_external_eeprom ;First, find out how many bytes will append to this sample.... @@ -810,9 +810,10 @@ return store_dive_temperature: - movf temperature+0,W ; append temperature to current sample! + SAFE_2BYTE_COPY temperature,lo + movf lo,W ; append temperature to current sample! call write_external_eeprom - movf temperature+1,W + movf hi,W call write_external_eeprom GETCUSTOM8 d'21' movwf divisor_temperature ; Reload divisor from CF @@ -823,12 +824,11 @@ bra do_not_display_velocity ; display velocity only in divemode calc_velocity2: - movff amb_pressure+0,sub_a+0 - movff amb_pressure+1,sub_a+1 + SAFE_2BYTE_COPY amb_pressure, sub_a movff last_pressure+0,sub_b+0 movff last_pressure+1,sub_b+1 - movff amb_pressure+0,last_pressure+0 ; store old value for velocity - movff amb_pressure+1,last_pressure+1 + movff sub_a+0,last_pressure+0 ; store old value for velocity + movff sub_a+1,last_pressure+1 call sub16 ; sub_c = amb_pressure - last_pressure @@ -875,8 +875,7 @@ return check_ppO2_bail: ; In CC mode but bailout active! - movff amb_pressure+0,xA+0 - movff amb_pressure+1,xA+1 + SAFE_2BYTE_COPY amb_pressure, xA movlw d'10' movwf xB+0 clrf xB+1 @@ -964,9 +963,8 @@ ; check_gas_change: ; Checks if a better gas should be selected (by user) bcf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode - - movff rel_pressure+0,xA+0 - movff rel_pressure+1,xA+1 + + SAFE_2BYTE_COPY rel_pressure,xA movlw d'100' movwf xB+0 clrf xB+1 @@ -1444,21 +1442,23 @@ btfsc divemode call set_min_temp ; store min. temp if required - bcf temp_changed ; Display temperature? - movf temperature+0,W + bcf temp_changed ; Display temperature? + SAFE_2BYTE_COPY temperature,lo + movf lo,W cpfseq last_temperature+0 - bsf temp_changed ; Yes - movf temperature+1,W + bsf temp_changed ; Yes + movf hi,W cpfseq last_temperature+1 - bsf temp_changed ; Yes + bsf temp_changed ; Yes btfsc temp_changed - call PLED_temp_divemode ; Displays temperature + call PLED_temp_divemode ; Displays temperature bcf pres_changed ; Display new depth? - movf amb_pressure+0,W + SAFE_2BYTE_COPY amb_pressure, lo + movf lo,W cpfseq last_pressure+0 bsf pres_changed ; Yes - movf amb_pressure+1,W + movf hi,W cpfseq last_pressure+1 bsf pres_changed ; Yes @@ -1481,32 +1481,30 @@ set_max_depth: movff max_pressure+0,sub_a+0 movff max_pressure+1,sub_a+1 - movff rel_pressure+0,sub_b+0 - movff rel_pressure+1,sub_b+1 - call sub16 ; sub_c = sub_a - sub_b + SAFE_2BYTE_COPY rel_pressure, sub_b + call sub16 ; sub_c = sub_a - sub_b ; max_pressure neg_flag=1 ; rel_pressure<=max_pressure -> neg_flag=0 btfss neg_flag return ;max_pressure neg_flag=1 ; T<=mintemp -> neg_flag=0 btfsc neg_flag return ;mintemp>=T - movff temperature+0,mintemp+0 - movff temperature+1,mintemp+1 + movff sub_b+0,mintemp+0 + movff sub_b+1,mintemp+1 return set_dive_modes: @@ -1518,10 +1516,9 @@ GETCUSTOM8 .0 ; loads dive_threshold in WREG movwf sub_a+0 ; dive_treshold is in cm clrf sub_a+1 - movff rel_pressure+0,sub_b+0 - movff rel_pressure+1,sub_b+1 + SAFE_2BYTE_COPY rel_pressure, sub_b call sub16 ; sub_c = sub_a - sub_b - + btfss neg_flag bra set_dive_modes2 ; too shallow (rel_pressure A addwf C6+0,W @@ -179,23 +185,16 @@ movlw .11-.8 ; A 12bit shift = 1 byte + 3 bits. call isr_shift_C31 - movlw LOW(.200) ; Add 200, and save into temperature - addwf isr_xC+1,W - movwf temperature+0 + movlw LOW(.200) ; Add 200 + addwf isr_xC+1,F movlw HIGH(.200) - addwfc isr_xC+2,W - movwf temperature+1 + addwfc isr_xC+2,F - bcf neg_temp - bnn calc_pos_temp ; Is Temp° negativ ? - - bsf neg_temp ; Yes: set flag and store -temp - comf temperature+1 - negf temperature+0 - btfsc STATUS,C - incf temperature+1 + movf isr_xC+1,W + addwf temperature_avg+0,F + movf isr_xC+2,W + addwfc temperature_avg+1,F -calc_pos_temp: return ; Fertig mit allem ;============================================================================= diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/pled_outputs.asm --- a/code_part1/OSTC_code_asm_part1/pled_outputs.asm Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/pled_outputs.asm Sat May 21 14:48:07 2011 +0200 @@ -105,8 +105,7 @@ PLED_color_code_gaslist: ; %O2 in "EEDATA" ; Check very high ppO2 manually - movff amb_pressure+0,xA+0 - movff amb_pressure+1,xA+1 + SAFE_2BYTE_COPY amb_pressure,xA movlw d'10' movwf xB+0 clrf xB+1 @@ -143,8 +142,7 @@ cpfseq lo ; =1? bra PLED_color_code_ceiling1 ; No, Set to default color - movff rel_pressure+1,hi - movff rel_pressure+0,lo + SAFE_2BYTE_COPY rel_pressure, lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar] movff hi,xA+1 movff lo,xA+0 @@ -168,8 +166,7 @@ PLED_color_code_depth: movff hi,hi_temp movff lo,lo_temp - movff rel_pressure+1,hi - movff rel_pressure+0,lo + SAFE_2BYTE_COPY rel_pressure, lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar] movff lo,sub_a+0 movff hi,sub_a+1 @@ -839,15 +836,13 @@ WIN_LEFT .0 WIN_TOP .177 STRCPY "amb:" - movff amb_pressure+0,lo - movff amb_pressure+1,hi + SAFE_2BYTE_COPY amb_pressure, lo output_16 call word_processor WIN_LEFT .80 WIN_TOP .177 STRCPY "temp:" - movff temperature+0,lo - movff temperature+1,hi + SAFE_2BYTE_COPY temperature, lo output_16 call word_processor @@ -948,20 +943,28 @@ PLED_temp_surfmode: ostc_debug 'e' - movff temperature+0,last_temperature+0 - movff temperature+1,last_temperature+1 + SAFE_2BYTE_COPY temperature, last_temperature WIN_TOP .100 WIN_LEFT .1 WIN_FONT FT_SMALL - WIN_INVERT .0 ; Init new Wordprocessor + WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color + movff last_temperature+1,hi + movff last_temperature+0,lo lfsr FSR2,letter - movlw '-' - btfsc neg_temp ; Show "-"? - movwf POSTINC2 ; Yes - movff temperature+0,lo - movff temperature+1,hi + + btfss hi,7 ; Negative temperature ? + bra PLED_temp_surfmode_1 ; No: continue + + PUTC '-' ; Display "-" + + comf hi ; Then, 16bit sign changes. + negf lo + btfsc STATUS,C + incf hi + +PLED_temp_surfmode_1: movlw d'3' movwf ignore_digits bsf leftbind ; left orientated output @@ -974,8 +977,7 @@ ostc_debug 'u' ; Sends debug-information to screen if debugmode active ; temperature - movff temperature+0,last_temperature+0 - movff temperature+1,last_temperature+1 + SAFE_2BYTE_COPY temperature, last_temperature WIN_TOP .216 WIN_LEFT .50 @@ -983,12 +985,22 @@ WIN_INVERT .0 ; Init new Wordprocessor call PLED_standard_color + movff last_temperature+1,hi + movff last_temperature+0,lo + lfsr FSR2,letter - movlw '-' - btfsc neg_temp ; Show "-"? - movwf POSTINC2 ; Yes - movff temperature+0,lo - movff temperature+1,hi + + btfss hi,7 ; Negative temperature ? + bra PLED_temp_divemode_1 ; No: continue + + PUTC '-' ; Display "-" + + comf hi ; Then, 16bit sign changes. + negf lo + btfsc STATUS,C + incf hi + +PLED_temp_divemode_1: movlw d'3' movwf ignore_digits bsf leftbind ; left orientated output @@ -1546,8 +1558,7 @@ PLED_depth: ostc_debug 'r' ; Sends debug-information to screen if debugmode active - movff rel_pressure+1,hi - movff rel_pressure+0,lo + SAFE_2BYTE_COPY rel_pressure, lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar] movlw .039 @@ -1607,8 +1618,7 @@ WIN_LEFT .40 PLED_color_code warn_depth ; Color-code the output - movff rel_pressure+1,hi - movff rel_pressure+0,lo + SAFE_2BYTE_COPY rel_pressure, lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar] STRCPY "." @@ -1759,8 +1769,7 @@ call PLED_warnings_color ; Yes, display ambient pressure in red lfsr FSR2,letter - movff amb_pressure+0,lo - movff amb_pressure+1,hi + SAFE_2BYTE_COPY amb_pressure, lo bsf leftbind output_16 bcf leftbind @@ -1994,7 +2003,7 @@ movlw .039 cpfslt hi - bra maxdepth_greater_99_84mtr + bra maxdepth_greater_99_84mtr ; Display normal "xx.y" lfsr FSR2,letter @@ -2789,7 +2798,7 @@ PLED_no_graph_grid: ;---- Draw N2 Tissues ---------------------------------------------------- - lfsr FSR2, char_O_tissue_saturation+.000 ; N2 + lfsr FSR2, char_O_tissue_N2_saturation movlw d'16' movwf wait_temp ; 16 tissues clrf waitms_temp ; Row offset @@ -2835,7 +2844,7 @@ bra PLED_tissue_saturation_graph3 ;---- Draw He Tissues ---------------------------------------------------- - lfsr FSR2, char_O_tissue_saturation+.016 ; He + lfsr FSR2, char_O_tissue_He_saturation movlw d'16' movwf wait_temp ; 16 tissues clrf waitms_temp ; Row offset @@ -2895,13 +2904,9 @@ movff char_O_gtissue_no,wait_temp ; used as temp - lfsr FSR1,char_O_tissue_saturation+0 - incf wait_temp,F ; make 1-16 of 0-15 - -PLED_tissue_saturation_graph4: ; point to leading tissue... - movff POSTINC1,lo ; copy/overwrite to lo register - decfsz wait_temp,F ; count until zero - bra PLED_tissue_saturation_graph4 ;loop + lfsr FSR1,char_O_tissue_N2_saturation + movf wait_temp,W ; W <- 0-15 + movff PLUSW1,lo ; lo <- FSR1[W] WIN_TOP .62 WIN_FONT FT_SMALL @@ -2984,8 +2989,8 @@ PLED_const_ppO2_value2: ; Display SetPoint ;Show fixed SP value - movff amb_pressure+0,xA+0 - movff amb_pressure+1,xA+1 + SAFE_2BYTE_COPY amb_pressure, xA + movlw d'10' movwf xB+0 clrf xB+1 @@ -3005,8 +3010,7 @@ PLED_const_ppO2_value1: ; char_I_const_ppO2 < ppO2[Diluent] -> Not physically possible! -> Display actual value! - movff amb_pressure+0,xA+0 - movff amb_pressure+1,xA+1 + SAFE_2BYTE_COPY amb_pressure, xA movlw d'10' movwf xB+0 clrf xB+1 @@ -3230,12 +3234,9 @@ STRCAT_PRINT ") " - lfsr FSR1,char_O_tissue_saturation+0 - incf wait_temp,F ; make 1-16 of 0-15 -PLED_show_leading_tissue3: ; point to leading tissue... - movff POSTINC1,lo ; copy/overwrite to lo register - decfsz wait_temp,F ; count until zero - bra PLED_show_leading_tissue3 ;loop + lfsr FSR1,char_O_tissue_N2_saturation + movf wait_temp,W ; W <- 0-15 + movff PLUSW1,lo ; lo <- FSR1[W] WIN_LEFT .95 WIN_TOP .216 diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/simulator.asm --- a/code_part1/OSTC_code_asm_part1/simulator.asm Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/simulator.asm Sat May 21 14:48:07 2011 +0200 @@ -132,8 +132,9 @@ movff xC+0,sim_pressure+0 movff xC+1,sim_pressure+1 - - movff sim_pressure+0,amb_pressure+0 ; override readings with simulator values + + ; This override is done in ISR too, but do it right now also: + movff sim_pressure+0,amb_pressure+0 movff sim_pressure+1,amb_pressure+1 bcf menubit2 @@ -348,7 +349,8 @@ DISPLAYTEXT .12 ; "Wait..." WIN_INVERT .0 - movff sim_pressure+0,amb_pressure+0 ; override readings with simulator values + ; This override is done in ISR too, but do it right now also: + movff sim_pressure+0,amb_pressure+0 movff sim_pressure+1,amb_pressure+1 call divemode_check_decogases ; Checks for decogases and sets the gases diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/sleepmode.asm --- a/code_part1/OSTC_code_asm_part1/sleepmode.asm Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/sleepmode.asm Sat May 21 14:48:07 2011 +0200 @@ -78,8 +78,7 @@ movlb b'00000001' movff last_surfpressure_15min+0,last_surfpressure_30min+0 ; save older airpressure movff last_surfpressure_15min+1,last_surfpressure_30min+1 ; save older airpressure - movff amb_pressure+0,last_surfpressure_15min+0 ; save new airpressure - movff amb_pressure+1,last_surfpressure_15min+1 ; save new airpressure + SAFE_2BYTE_COPY amb_pressure, last_surfpressure_15min ; save new airpressure clrf divemins+1 ; reset counter GETCUSTOM15 d'7' ; loads max_sufpressure into lo, hi @@ -98,8 +97,7 @@ onemin_sleep2: ;calc_deko_sleepmode: - movff amb_pressure+0,int_I_pres_respiration+0 ; LOW copy pressure to deco routine - movff amb_pressure+1,int_I_pres_respiration+1 ; HIGH + SAFE_2BYTE_COPY amb_pressure, int_I_pres_respiration ; LOW copy pressure to deco routine GETCUSTOM8 d'11' ; Saturation multiplier % movff WREG,char_I_saturation_multiplier GETCUSTOM8 d'12' ; Desaturation multiplier % @@ -134,8 +132,7 @@ GETCUSTOM15 d'6' ; loads pressure threshold into lo,hi movff lo,sub_a+0 ; power on if ambient pressure is greater threshold movff hi,sub_a+1 - movff amb_pressure+0,sub_b+0 - movff amb_pressure+1,sub_b+1 + SAFE_2BYTE_COPY amb_pressure, sub_b call sub16 ; sub_c = sub_a - sub_b bsf sleepmode btfsc neg_flag ; Wake up from Sleep? diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/start.asm --- a/code_part1/OSTC_code_asm_part1/start.asm Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/start.asm Sat May 21 14:48:07 2011 +0200 @@ -67,12 +67,11 @@ call pressuretest_sleep_fast ; Gets pressure without averaging (faster!) bcf sleepmode ; Normal mode again - movff amb_pressure+0,last_surfpressure+0 - movff amb_pressure+1,last_surfpressure+1 - movff amb_pressure+0,last_surfpressure_15min+0 - movff amb_pressure+1,last_surfpressure_15min+1 - movff amb_pressure+0,last_surfpressure_30min+0 - movff amb_pressure+1,last_surfpressure_30min+1 ; Rests all airpressure registers + SAFE_2BYTE_COPY amb_pressure, last_surfpressure + movff last_surfpressure+0,last_surfpressure_15min+0 + movff last_surfpressure+1,last_surfpressure_15min+1 + movff last_surfpressure+0,last_surfpressure_30min+0 + movff last_surfpressure+1,last_surfpressure_30min+1 ; Rests all airpressure registers ; Extra power-up reset (JeanDo) ifdef TESTING @@ -91,10 +90,9 @@ movff WREG,char_I_saturation_multiplier GETCUSTOM8 d'12' ; Desaturation multiplier % movff WREG,char_I_desaturation_multiplier - movff amb_pressure+0,int_I_pres_respiration+0 ; copy for deco routine - movff amb_pressure+1,int_I_pres_respiration+1 - movff amb_pressure+0,int_I_pres_surface+0 ; copy for desat routine - movff amb_pressure+1,int_I_pres_surface+1 + SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy for deco routine + movff int_I_pres_respiration+0,int_I_pres_surface+0 ; copy for desat routine + movff int_I_pres_respiration+1,int_I_pres_surface+1 call deco_clear_tissue ; call deco_calc_desaturation_time ; calculate desaturation time diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/surfmode.asm --- a/code_part1/OSTC_code_asm_part1/surfmode.asm Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/surfmode.asm Sat May 21 14:48:07 2011 +0200 @@ -284,8 +284,7 @@ movwf wait_temp ; Use as buffer movff wait_temp,char_I_N2_ratio ; No He at the Surface - movff amb_pressure+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine - movff amb_pressure+1,int_I_pres_respiration+1 + SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy surface air pressure to deco routine GETCUSTOM8 d'11' ; Saturation multiplier % movff WREG,char_I_saturation_multiplier GETCUSTOM8 d'12' ; Desaturation multiplier % diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_asm_part1/temp_extrema.asm --- a/code_part1/OSTC_code_asm_part1/temp_extrema.asm Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/temp_extrema.asm Sat May 21 14:48:07 2011 +0200 @@ -28,15 +28,14 @@ movff EEDATA,sub_b+0 read_int_eeprom d'55' movff EEDATA,sub_b+1 - movff temperature+0,sub_a+0 - movff temperature+1,sub_a+1 + SAFE_2BYTE_COPY temperature,sub_a call sub16 ; sub_c = sub_a - sub_b btfss neg_flag ; new lowest temperature ? bra check_temp_extrema_high ; Yes, store new value together with the date - movff temperature+0,EEDATA + movff sub_a+0,EEDATA write_int_eeprom d'54' - movff temperature+1,EEDATA + movff sub_a+1,EEDATA write_int_eeprom d'55' movff month,EEDATA write_int_eeprom d'56' @@ -44,21 +43,22 @@ write_int_eeprom d'57' movff year,EEDATA write_int_eeprom d'58' + ; Now check high extrema check_temp_extrema_high: read_int_eeprom d'59' ; get highest temperature so far movff EEDATA,sub_b+0 read_int_eeprom d'60' movff EEDATA,sub_b+1 - movff temperature+0,sub_a+0 - movff temperature+1,sub_a+1 + SAFE_2BYTE_COPY temperature,sub_a call sub16 ; sub_c = sub_a - sub_b btfsc neg_flag ; new highest temperature ? return ; no, quit! + ; Yes, store new value together with the date - movff temperature+0,EEDATA + movff sub_a+0,EEDATA write_int_eeprom d'59' - movff temperature+1,EEDATA + movff sub_a+1,EEDATA write_int_eeprom d'60' movff month,EEDATA write_int_eeprom d'61' diff -r 6bdf80d7276c -r 797e2ac42d24 code_part1/OSTC_code_c_part2/p2_deco.c --- a/code_part1/OSTC_code_c_part2/p2_deco.c Tue May 17 01:05:04 2011 +0200 +++ b/code_part1/OSTC_code_c_part2/p2_deco.c Sat May 21 14:48:07 2011 +0200 @@ -77,6 +77,7 @@ // 2011/04/25: [jDG] Added 1mn mode for CNS calculation, to allow it for decoplanning. // 2011/04/27: [jDG] Fixed char_O_gradient_factor calculation when model uses gradient-factor. // 2011/05/02: [jDG] Added "Future TTS" function (CF58). +// 2011/05/17: [jDG] Various cleanups. // // TODO: // + Allow to abort MD2 calculation (have to restart next time). @@ -163,11 +164,12 @@ // Real context: what we are doing now. static float calc_lead_tissue_limit; // -static unsigned char internal_deco_time[32]; -static unsigned char internal_deco_depth[32]; +static unsigned char internal_deco_time[NUM_STOPS]; +static unsigned char internal_deco_depth[NUM_STOPS]; static float cns_vault; -static float pres_tissue_vault[32]; +static float pres_tissue_N2_vault[NUM_COMP]; +static float pres_tissue_He_vault[NUM_COMP]; //---- Bank 5 parameters ----------------------------------------------------- #pragma udata bank5=0x500 @@ -188,8 +190,8 @@ static float var_N2_e; // Exposition, for current N2 tissue. static float var_He_e; // Exposition, for current He tissue. -static float pres_diluent; // new in v.101 -static float const_ppO2; // new in v.101 +static float pres_diluent; // new in v.101 +static float const_ppO2; // new in v.101 static unsigned char sim_gas_last_depth; // Depth of last used gas, to detected a gas switch. static unsigned char sim_gas_last_used; // Number of last used gas, to detected a gas switch. @@ -200,21 +202,24 @@ static float CNS_fraction; // new in v.101 static float float_saturation_multiplier; // new in v.101 static float float_desaturation_multiplier; // new in v.101 -static float float_deco_distance; // new in v.101 -static char flag_in_divemode; // new in v.108 +static float float_deco_distance; // new in v.101 +static char flag_in_divemode; // new in v.108 -static unsigned char deco_gas_change[5]; // new in v.109 +static unsigned char deco_gas_change[NUM_GAS]; // new in v.109 //---- Bank 6 parameters ----------------------------------------------------- #pragma udata bank6=0x600 -float pres_tissue[32]; +float pres_tissue_N2[NUM_COMP]; +float pres_tissue_He[NUM_COMP]; //---- Bank 7 parameters ----------------------------------------------------- #pragma udata bank7=0x700 -float sim_pres_tissue[32]; // 32 floats = 128 bytes. -static float sim_pres_tissue_backup[32]; +float sim_pres_tissue_N2[NUM_COMP]; // 32 floats = 128 bytes. +float sim_pres_tissue_He[NUM_COMP]; // 32 floats = 128 bytes. +static float sim_pres_tissue_backup_N2[NUM_COMP]; +static float sim_pres_tissue_backup_He[NUM_COMP]; //---- Bank 8 parameters ----------------------------------------------------- #pragma udata bank8=0x800 @@ -328,8 +333,8 @@ int_O_DBS_bitfield |= DBS_mode; if(const_ppO2) int_O_DBS_bitfield |= DBS_ppO2; - for(i = 16; i < 32; i++) - if(pres_tissue[i]) + for(i = 0; i < NUM_COMP; i++) + if(pres_tissue_He[i]) int_O_DBS_bitfield |= DBS_HE_sat; if(float_saturation_multiplier < 0.99) int_O_DBS_bitfield |= DBS_SAT2l; @@ -417,8 +422,8 @@ temp_DBS |= DBG_C_SURF; if( !DBS_HE_sat && !He_ratio) - for(i = 16; i < 32; i++) - if(pres_tissue[i]) + for(i = 0; i < NUM_COMP; i++) + if(pres_tissue_He[i]) temp_DBS |= DBG_HEwoHE; if( DBG_deco_gas_change != deco_gas_change[0] @@ -549,9 +554,10 @@ // static void read_buhlmann_coefficients(void) { + #ifndef CROSS_COMPILE // Note: we don't use far rom pointer, because the - // 24 bits is to complex, hence we have to set + // 24 bits is too complex, hence we have to set // the UPPER page ourself... // --> Set zero if tables are moved to lower pages ! _asm @@ -560,11 +566,17 @@ _endasm #endif - assert( 0 <= ci && ci < 16 ); - var_N2_a = buhlmann_a[ci]; - var_N2_b = buhlmann_b[ci]; - var_He_a = (buhlmann_a+16)[ci]; - var_He_b = (buhlmann_b+16)[ci]; + assert( 0 <= ci && ci < NUM_COMP ); + + // Use an interleaved array (AoS) to access coefficients with a + // single addressing. + { + overlay rom const float* ptr = &buhlmann_ab[4*ci]; + var_N2_a = *ptr++; + var_N2_b = *ptr++; + var_He_a = *ptr++; + var_He_b = *ptr++; + } // Check reading consistency: if( (var_N2_a < 0.231) @@ -596,14 +608,18 @@ movwf TBLPTRU,0 _endasm #endif - assert( 0 <= ci && ci < 16 ); + + assert( 0 <= ci && ci < NUM_COMP ); // Integration intervals. switch(period) { case 0: //---- 2 sec ----------------------------------------------------- - var_N2_e = e2secs[ci]; - var_He_e = (e2secs+16)[ci]; + { + overlay rom const float* ptr = &e2secs[2*ci]; + var_N2_e = *ptr++; + var_He_e = *ptr++; + } // Check reading consistency: if( (var_N2_e < 0.0000363) @@ -616,8 +632,11 @@ break; case 1: //---- 1 min ----------------------------------------------------- - var_N2_e = e1min[ci]; - var_He_e = (e1min+16)[ci]; + { + overlay rom const float* ptr = &e1min[2*ci]; + var_N2_e = *ptr++; + var_He_e = *ptr++; + } // Check reading consistency: if( (var_N2_e < 1.09E-3) @@ -630,8 +649,11 @@ break; case 2: //---- 10 min ---------------------------------------------------- - var_N2_e = e10min[ci]; - var_He_e = (e10min+16)[ci]; + { + overlay rom const float* ptr = &e10min[2*ci]; + var_N2_e = *ptr++; + var_He_e = *ptr++; + } // Check reading consistency: if( (var_N2_e < 0.01085) @@ -649,7 +671,7 @@ } ////////////////////////////////////////////////////////////////////////////// -// calc_next_decodepth_GF +// calc_nextdecodepth // // new in v.102 // @@ -833,11 +855,11 @@ overlay unsigned char x, y; //---- First: search the first non-null depth - for(x=31; x != 0; --x) + for(x=(NUM_STOPS-1); x != 0; --x) if( internal_deco_depth[x] != 0 ) break; //---- Second: copy to output table (in reverse order) - for(y=0; y<32; y++, --x) + for(y=0; y depth ) { - for(j=0; j<5; ++j) + for(j=0; j deco_gas_change[j] ) @@ -1092,7 +1114,7 @@ // static void gas_switch_set(void) { - assert( 0 <= sim_gas_last_used && sim_gas_last_used <= 5 ); + assert( 0 <= sim_gas_last_used && sim_gas_last_used <= NUM_GAS ); if( sim_gas_last_used == 0 ) { @@ -1177,15 +1199,15 @@ N2_ratio = 0.7902; pres_respiration = int_I_pres_respiration * 0.001; - for(ci=0; ci<16; ci++) + for(ci=0; ci pres_surface && char_O_deco_status == 0) @@ -1616,19 +1638,19 @@ assert( 0.00 <= ppN2 && ppN2 < 11.2 ); // 80% N2 at 130m assert( 0.00 <= ppHe && ppHe < 12.6 ); // 90% He at 130m - for (ci=0;ci<16;ci++) + for (ci=0;ci 0 ); // No stop at surface... - for(x=0; x<32; ++x) + for(x=0; x respiration (currently off-gasing) @@ -2018,6 +2046,8 @@ // void deco_calc_desaturation_time(void) { + overlay rom const float *ptr; + RESET_C_STACK assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); @@ -2040,21 +2070,27 @@ int_O_desaturation_time = 0; float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142) - for (ci=0;ci<16;ci++) + ptr = &buhlmann_ht[0]; + for(ci=0; ci= 0.0) { temp1 = 0.0; @@ -2064,9 +2100,6 @@ temp1 = temp1 / temp2; if( 0.0 < temp1 && temp1 < 1.0 ) { - overlay float var_N2_halftime = buhlmann_ht[ci]; - assert( 4.0 <= var_N2_halftime && var_N2_halftime <= 635.0 ); - // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested. // minus because log is negative. temp1 = log(1.0 - temp1) / -0.6931; // temp1 is the multiples of half times necessary. @@ -2080,19 +2113,16 @@ } // He - temp3 = 0.1 - (pres_tissue+16)[ci]; + temp3 = 0.1 - pres_tissue_He[ci]; if (temp3 >= 0.0) { temp3 = 0.0; temp4 = 0.0; } else - temp3 = - temp3 / (pres_tissue+16)[ci]; + temp3 = - temp3 / pres_tissue_He[ci]; if( 0.0 < temp3 && temp3 < 1.0 ) { - overlay float var_He_halftime = (buhlmann_ht+16)[ci]; - assert( 1.5099 <= var_He_halftime && var_He_halftime <= 240.03 ); - temp3 = log(1.0 - temp3) / -0.6931; // temp1 is the multiples of half times necessary. // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested. // minus because log is negative @@ -2114,22 +2144,22 @@ int_O_desaturation_time = desat_time; // N2 saturation in multiples of halftime for display purposes - temp2 = temp1 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8 - temp2 = temp2 + 80.0; // set center + temp2 = temp1 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8 + temp2 = temp2 + 80.0; // set center if (temp2 < 0.0) temp2 = 0.0; if (temp2 > 255.0) temp2 = 255.0; - char_O_tissue_saturation[ci] = (char)temp2; + char_O_tissue_N2_saturation[ci] = (char)temp2; // He saturation in multiples of halftime for display purposes - temp4 = temp3 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8 - temp4 = temp4 + 80.0; // set center + temp4 = temp3 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8 + temp4 = temp4 + 80.0; // set center if (temp4 < 0.0) temp4 = 0.0; if (temp4 > 255.0) temp4 = 255.0; - (char_O_tissue_saturation+16)[ci] = (char)temp4; + char_O_tissue_He_saturation[ci] = (char)temp4; } // for } @@ -2161,7 +2191,7 @@ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142) float_saturation_multiplier = char_I_saturation_multiplier * 0.01; - calc_tissue(1); // update the pressure in the 32 tissues in accordance with the new ambient pressure + calc_tissue(1); // update the pressure in the tissues N2/He in accordance with the new ambient pressure clear_deco_table(); char_O_deco_status = 3; // surface new in v.102 : stays in surface state. @@ -2406,17 +2436,17 @@ // void deco_gas_volumes(void) { - overlay float volumes[5]; + overlay float volumes[NUM_GAS]; overlay float bottom_usage, ascent_usage; overlay unsigned char i, deepest_first; overlay unsigned char gas; RESET_C_STACK //---- initialize with bottom consumption -------------------------------- - for(i=0; i<5; ++i) // Nothing yet... + for(i=0; i char_I_deco_gas_change[j]) ) @@ -2494,7 +2524,7 @@ } //---- convert results for the ASM interface ----------------------------- - for(i=0; i<5; ++i) + for(i=0; i 6553.4 ) int_O_gas_volumes[i] = 65535; else @@ -2509,8 +2539,11 @@ RESET_C_STACK cns_vault = CNS_fraction; - for (x=0;x<32;x++) - pres_tissue_vault[x] = pres_tissue[x]; + for (x=0;x