changeset 312:b7e4e74c0e17 @5 variant

New @5 variant: compute TTS if staying some extra time (CF58) at current depth. * Added extra deco_status, and sim_extra_time() in p2_deco.c * Launched by setting char_O_deco_state to 6, result in int_O_extra_ascenttime * Added 8th divemode customview * Auto stole every other cycles * CF58 menu updated (EN,FR,DE,SP)
author JeanDo
date Tue, 03 May 2011 00:52:42 +0200
parents 91371c7553f5
children 11be2470b9eb
files code_part1/OSTC_code_asm_part1/customview.asm code_part1/OSTC_code_asm_part1/definitions.asm code_part1/OSTC_code_asm_part1/divemode.asm code_part1/OSTC_code_asm_part1/english_text.asm code_part1/OSTC_code_asm_part1/french_text.asm code_part1/OSTC_code_asm_part1/german_text.asm code_part1/OSTC_code_asm_part1/menu_reset.asm code_part1/OSTC_code_asm_part1/pled_outputs.asm code_part1/OSTC_code_asm_part1/spanish_text.asm code_part1/OSTC_code_c_part2/p2_deco.c code_part1/OSTC_code_c_part2/p2_deco.o code_part1/OSTC_code_c_part2/shared_definitions.h
diffstat 12 files changed, 189 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/code_part1/OSTC_code_asm_part1/customview.asm	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_asm_part1/customview.asm	Tue May 03 00:52:42 2011 +0200
@@ -75,18 +75,18 @@
 	bra		customview_1sec_graphs      ; Update the leading tissue
 	dcfsnz	WREG,F
 	bra		customview_1sec_ead_end		; Show END and EAD in divemode
+	dcfsnz	WREG,F
+	bra		customview_1sec_@5          ; Show TTS for extra time.
 
 	; Menupos3=0, do nothing
 	return
 
 customview_1sec_average:
-	call	PLED_total_average_show2	; Update the figures only
-	return
+	goto	PLED_total_average_show2	; Update the figures only
 	
 customview_1sec_stopwatch:
 	bsf		menu3_active                ; Set Flag
-	call	PLED_stopwatch_show2        ; Update figures only
-	return
+	goto	PLED_stopwatch_show2        ; Update figures only
 
 customview_1sec_marker:                 ; Do nothing extra
 	bsf		menu3_active                ; Set Flag
@@ -102,12 +102,13 @@
 
 	call	deco_calc_desaturation_time	; calculate desaturation time
 	movlb	b'00000001'						; select ram bank 1
-	call	PLED_tissue_saturation_graph
-	return
+	goto	PLED_tissue_saturation_graph
 
 customview_1sec_ead_end:
-	call	PLED_show_end_ead_divemode
-	return
+	goto	PLED_show_end_ead_divemode
+
+customview_1sec_@5:
+    goto    PLED_show_@5
 
 ;=============================================================================
 ; Do every-minute tasks for the custom view area
@@ -127,19 +128,20 @@
 	dcfsnz	WREG,F
 	bra		customview_minute_graphs	; Update the graphs
 	dcfsnz	WREG,F
-	bra		customview_minute_ead_end	; Show END and EAD in divemode
+	bra		customview_minute_ead_end   ; Show END and EAD in divemode
+	dcfsnz	WREG,F
+	bra		customview_minute_@5        ; Show TTS for extra time.
 
 	; Menupos3=0, do nothing
 	return
 
 customview_minute_clock:
-	call	PLED_diveclock2             ; Update the clock
-	return
+	goto	PLED_diveclock2             ; Update the clock
 
 customview_minute_lead_tiss:
-	call	PLED_show_leading_tissue_2  ; Update the leading tissue
-	return
+	goto	PLED_show_leading_tissue_2  ; Update the leading tissue
 
+customview_minute_@5:                   ; Do nothing extra
 customview_minute_ead_end:              ; Do nothing extra
 customview_minute_marker:               ; Do nothing extra
 customview_minute_stopwatch:            ; Do nothing extra
@@ -148,7 +150,7 @@
 	return
 
 ;=============================================================================
-; Yes, show next customview (and delete this flag)
+; Show next customview (and delete this flag)
 
 customview_toggle:
 	bcf		menu3_active	;=1: menu entry three in divemode menu is active		
@@ -158,10 +160,11 @@
 	bra		customview_toggle_exit			; Yes, ignore custom view in divemode completely
 
 	incf	menupos3,F			            ; Number of customview to show
-	movlw	d'7'							; Max number
+	movlw	d'8'							; Max number
 	cpfsgt	menupos3			            ; Max reached?
 	bra		customview_mask		            ; No, show
 	clrf	menupos3			            ; Reset to zero (Zero=no custom view)
+
 customview_mask:	
 	call	PLED_clear_customview_divemode
 	movff	menupos3,WREG                   ; Menupos3 holds number of customview function
@@ -179,6 +182,9 @@
 	bra		customview_init_graphs		    ; Show the graphs
 	dcfsnz	WREG,F
 	bra		customview_init_ead_end		    ; Show END and EAD in divemode
+	dcfsnz	WREG,F
+	bra		customview_init_@5              ; Show TTS for extra time.
+    bcf     tts_extra_time                  ; Else, CLEAR computation of @5 request.
 
 customview_init_nocustomview:
 	bra		customview_toggle_exit	
@@ -222,9 +228,31 @@
 	bra		    customview_toggle_exit	
 
 customview_init_ead_end:
+	btfsc		no_deco_customviews		; no-deco-mode-flag = 1
+	bra			customview_toggle		; Yes, use next Customview!
+
 	call		PLED_show_end_ead_divemode
 	bra		    customview_toggle_exit	
 
+customview_init_@5:
+ 	GETCUSTOM8	d'58'					; Extra time to simulate
+ 	iorwf       WREG,F                  ; Null ?
+ 	bz          customview_toggle       ; Yes: use next Customview !
+
+	btfsc		no_deco_customviews		; no-deco-mode-flag = 1
+	bra			customview_toggle		; Yes, use next Customview!
+
+    clrf        WREG                    ; Reset extra TTS
+    movff       WREG,int_O_extra_ascenttime+0
+    movff       WREG,int_O_extra_ascenttime+1
+    
+    movlw       1
+    movwf       apnoe_mins              ; Start compute after next cycle.
+    bsf         tts_extra_time
+    call        PLED_show_@5            ; Show (wait)
+
+	bra		    customview_toggle_exit	
+
 customview_init_graphs:					; Show tissue graph
  	GETCUSTOM8	d'52'					; Show Tissue Graph? (=1 in WREG)
 	decfsz		WREG,F					; WREG=1?	
--- a/code_part1/OSTC_code_asm_part1/definitions.asm	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_asm_part1/definitions.asm	Tue May 03 00:52:42 2011 +0200
@@ -387,11 +387,11 @@
 #DEFINE win_flip_screen     win_flags,0 ; 180° rotation of the OLED screen.
 
 ; Flags
-#DEFINE	FLAG_scale			flag1,0	; Wordprocessor
-#DEFINE	FLAG_truncated		flag1,1	; Wordprocessor
+#DEFINE	tts_extra_time		flag1,0	; unused
+#DEFINE	FLAG_2      		flag1,1	; unused
 #DEFINE	pre_zero_flag		flag1,2	; leading zeros
 #DEFINE neg_flag			flag1,3	; e.g. Sub_16 (sub_c = sub_a - sub_b)
-#DEFINE	FLAG_row_prime		flag1,4	; Wordproceesor
+#DEFINE	FLAG_3      		flag1,4	; unused
 #DEFINE leading_zeros		flag1,5	; display leading zeros?
 #DEFINE	show_last3			flag1,6	; show only three figures
 #DEFINE	leftbind			flag1,7	; leftbinded output
@@ -427,7 +427,7 @@
 
 #DEfINE	eeprom_overflow		flag5,0	; EEPROM overflowed (>32KB)
 #DEFINE	eeprom_blockwrite	flag5,1	; EEPROM blockwrite active
-#DEFINE neg_flag_xdT		flag5,2	; xdT negative (2nd order temperature calculation)
+#DEFINE Flag_4      		flag5,2	; unused
 #DEFINE	low_battery_state	flag5,3	;=1 if battery low
 #DEFINE	DP_done				flag5,4	; valconv
 #DEFINE	DP_done2			flag5,5	; valconv
@@ -513,7 +513,7 @@
 #DEFINE	display_set_simulator	flag14,4	;=1: Show Divemode simulator menu
 #DEFINE	displaytext_high		flag14,5	;=1: Show/Use Texts 255-511 in Texttable
 #DEFINE	better_gas_available	flag14,6	;=1: A better gas is available and a gas change is advised in divemode
-#DEFINE	displaytext_invert		flag14,7	;=1: inverts word prozessor output
+#DEFINE	Flag_5          		flag14,7	;=1: unused
 
 #DEFINE	restore_deco_data		flag15,0	;=1: Restore Decodata after the dive from 0x380 buffer
 #DEFINE	uart_store_tissue_data	flag15,1	;=1: Store tissue data for next simualted dive!
--- a/code_part1/OSTC_code_asm_part1/divemode.asm	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_asm_part1/divemode.asm	Tue May 03 00:52:42 2011 +0200
@@ -497,21 +497,49 @@
 	call	word_processor
 
 calc_deko_divemode4:
+    movff   char_O_deco_status,WREG     ; Is a compute cycle finished ?
+    iorwf   WREG,F
+    btfss   STATUS,Z
+    return                              ; Return is status <> 0
 
+    ; Check if deco stops are necessary ?
 	movff	char_O_first_deco_depth,wait_temp	; copy ceiling to temp register
 	tstfsz	wait_temp							; Ceiling<0m?
 	bra		calc_deko_divemode3					; Yes!
 
-	btfsc	dekostop_active
-	call	PLED_display_ndl_mask			; Clear deco data, display nostop time
-	bcf		dekostop_active					; clear flag
+	btfsc	dekostop_active             ; Already in nodeco mode ?
+	call	PLED_display_ndl_mask       ; Clear deco data, display nostop time
+	bcf		dekostop_active             ; clear flag
 
-	clrf	decodata+0						; for profile memory
-	movff	char_O_nullzeit,decodata+1		; nostop time
+	clrf	decodata+0                  ; for profile memory
+	movff	char_O_nullzeit,decodata+1  ; nostop time
 	
-	call	PLED_display_ndl				; display no deco limit
+	call	PLED_display_ndl            ; display no deco limit
 	return
 
+calc_deko_divemode3:
+	btfss	dekostop_active             ; Already in deco mode ?
+	call	PLED_display_deko_mask      ; clear nostop time, display decodata
+	bsf		dekostop_active             ; Set flag
+
+	movff	char_O_first_deco_depth,decodata+0	; ceiling
+	movff	char_O_first_deco_time,decodata+1	; length of first stop in minues
+
+	call	PLED_display_deko           ; display decodata
+
+    ; Check if extra cycles are needed to compute @5 variant:
+    btfss   tts_extra_time              ; Is @5 displayed ?
+	return                              ; No: don't compute it.
+	
+	dcfsnz  apnoe_mins                  ; Reached count-down ?
+	return                              ; No: don't compute yet.
+	
+	movlw   .6
+	movff   WREG,char_O_deco_status     ; Stole next cycles for @5 variant.
+    
+    movlw   .2                          ; Restart countdown.
+    movwf   apnoe_mins
+    return
 ;-----------------------------------------------------------------------------
 
 divemode_prepare_flags_for_deco:
@@ -529,16 +557,7 @@
 	movff   divemins+1,int_I_divemins+1
 	goto	restart_set_modes_and_flags			; Sets decomode (char_I_deco_model) and flags (again)
 
-calc_deko_divemode3:
-	btfss	dekostop_active
-	call	PLED_display_deko_mask              ; clear nostop time, display decodata
-	bsf		dekostop_active						; Set flag
-
-	movff	char_O_first_deco_depth,decodata+0	; ceiling
-	movff	char_O_first_deco_time,decodata+1	; length of first stop in minues
-
-	call	PLED_display_deko					; display decodata
-	return						
+;-----------------------------------------------------------------------------
 
 store_dive_data:						; CF20 seconds gone
 	bcf		store_sample				; update only any CF20 seconds
@@ -1685,8 +1704,9 @@
 	setf	last_diluent				; to be displayed after first calculation (range: 0 to 100 [%])
 	bcf		dekostop_active	
 	bcf		is_bailout					;=1: CC mode, but bailout active!		
-	bcf		better_gas_available	;=1: A better gas is available and a gas change is advised in divemode
-	
+	bcf		better_gas_available        ;=1: A better gas is available and a gas change is advised in divemode
+    bcf     tts_extra_time              ;=1: Compute TTS if extra time spent at current depth
+
 	call	get_free_EEPROM_location	; get last position in external EEPROM, may be up to 2 secs!
 
     btfss   simulatormode_active
--- a/code_part1/OSTC_code_asm_part1/english_text.asm	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_asm_part1/english_text.asm	Tue May 03 00:52:42 2011 +0200
@@ -243,15 +243,15 @@
     TCODE    .40,   .35,     "Show Lead.Tiss."           ;175 Show Lead.Tiss.
     TCODE    .40,   .35,     "ShallowStop 1st"           ;176 Shallow stop 1st  (Reverse order of deco plans)
     TCODE    .40,   .35,     "Gas switch[min]"           ;177 Gas switch[min]   (Additional delay in decoplan for gas switches).
-    TCODE    .40,   .35,     "BottomGas[l/mn]"           ;178 BottomGas[l/mn]   (Bottom gas usage, for volume estimation).
-    TCODE    .40,   .35,     "AscentGas[l/mn]"           ;179 AscentGas[l/mn]   (Ascent+Deco gas usage)
-    TCODE    .40,   .35,     "not used       "           ;180 not used
+    TCODE    .40,   .35,     "BottomGas[/min]"           ;178 BottomGas[/min]   (Bottom gas usage, for volume estimation).
+    TCODE    .40,   .35,     "AscentGas[/min]"           ;179 AscentGas[/min]   (Ascent+Deco gas usage)
+    TCODE    .40,   .35,     "TTS @extra[min]"           ;180 TTS @extra[min]   (@5 variant: compute TTS for extra time at current depth)
     TCODE    .40,   .35,     "not used       "           ;181 not used
     TCODE    .40,   .35,     "not used       "           ;182 not used
     TCODE    .40,   .35,     "not used       "           ;183 not used
     TCODE    .40,   .35,     "not used       "           ;184 not used
     TCODE    .40,   .35,     "not used       "           ;185 not used
-; End of function descriptor I
+; End of function descriptor II
 ;
     TCODE    .13,   .2,      "Custom Functions II"       ;186 Custom Functions II
     TCODE    .20,   .95,     "Show License"              ;187 Show License
--- a/code_part1/OSTC_code_asm_part1/french_text.asm	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_asm_part1/french_text.asm	Tue May 03 00:52:42 2011 +0200
@@ -244,15 +244,15 @@
     TCODE    .40,   .35,     "Aff.Tiss.Direct"           ;175 Show Lead.Tiss.
     TCODE    .40,   .35,     "Ordre paliers  "           ;176 Shallow stop 1st   (Reverse order of deco plans)
     TCODE    .40,   .35,     "Chang. gaz[min]"           ;177 Gas switch[min]   (Additional delay in decoplan for gas switches).
-    TCODE    .40,   .35,     "ConsoFond[l/mn]"           ;178 BottomGas[l/mn]   (Bottom gas usage, for volume estimation).
-    TCODE    .40,   .35,     "ConsoDeco[l/mn]"           ;179 AscentGas[l/mn]   (Ascent+Deco gas usage)
-    TCODE    .40,   .35,     "not used       "           ;180 not used
+    TCODE    .40,   .35,     "ConsoFond[/min]"           ;178 BottomGas[/min]   (Bottom gas usage, for volume estimation).
+    TCODE    .40,   .35,     "ConsoDeco[/min]"           ;179 AscentGas[/min]   (Ascent+Deco gas usage)
+    TCODE    .40,   .35,     "DTR @extra[min]"           ;180 TTS @extra[min]   (@5 variant: compute TTS for extra time at current depth)
     TCODE    .40,   .35,     "not used       "           ;181 not used
     TCODE    .40,   .35,     "not used       "           ;182 not used
     TCODE    .40,   .35,     "not used       "           ;183 not used
     TCODE    .40,   .35,     "not used       "           ;184 not used
     TCODE    .40,   .35,     "not used       "           ;185 not used
-; End of function descriptor I
+; End of function descriptor II
 ;
     TCODE    .13,   .2,      "Config Fonctions II"       ;186 Custom Functions II
     TCODE    .20,   .95,     "Voir la licence"           ;187 Show License
--- a/code_part1/OSTC_code_asm_part1/german_text.asm	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_asm_part1/german_text.asm	Tue May 03 00:52:42 2011 +0200
@@ -244,15 +244,15 @@
     TCODE    .40,   .35,     "Leitgewebe anz "           ;175 Show Lead.Tiss.
     TCODE    .40,   .35,     "Flach.StoppOben"           ;176 Shallow stop 1st  (Reverse order of deco plans)
     TCODE    .40,   .35,     "Gaswechsel[min]"           ;177 Gas switch[min]   (Additional delay in decoplan for gas switches).
-    TCODE    .40,   .35,     "BottomGas[l/mn]"           ;178 BottomGas[l/mn]   (Bottom gas usage, for volume estimation).
-    TCODE    .40,   .35,     "Sonst.Gas[l/mn]"           ;179 AscentGas[l/mn]   (Ascent+Deco gas usage)
-    TCODE    .40,   .35,     "nicht verwendet"           ;180 not used
+    TCODE    .40,   .35,     "BottomGas[/min]"           ;178 BottomGas[/min]   (Bottom gas usage, for volume estimation).
+    TCODE    .40,   .35,     "Sonst.Gas[/min]"           ;179 AscentGas[/min]   (Ascent+Deco gas usage)
+    TCODE    .40,   .35,     "TTS @ zeit[min]"           ;180 TTS @extra[min]   (@5 variant: compute TTS for extra time at current depth)
     TCODE    .40,   .35,     "nicht verwendet"           ;181 not used
     TCODE    .40,   .35,     "nicht verwendet"           ;182 not used
     TCODE    .40,   .35,     "nicht verwendet"           ;183 not used
     TCODE    .40,   .35,     "nicht verwendet"           ;184 not used
     TCODE    .40,   .35,     "nicht verwendet"           ;185 not used
-; End of function descriptor I
+; End of function descriptor II
 ;
     TCODE    .13,   .2,      "Custom Funktionen II"      ;186 Custom Functions II
     TCODE    .20,   .95,     "Lizenz anzeigen "          ;187 Show License
--- a/code_part1/OSTC_code_asm_part1/menu_reset.asm	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_asm_part1/menu_reset.asm	Tue May 03 00:52:42 2011 +0200
@@ -175,7 +175,7 @@
 	CF_DEFAULT    CF_DECI,      d'200', d'5',   0       ; CF56 Bottom gas usage (l/min or bar/min)
 
 	CF_DEFAULT    CF_DECI,      d'200', d'5',   0       ; CF57 Ascent/deco gas usage (l/min or bar/min)
-	CF_DEFAULT    CF_INT15,     0,      0,      0 		; UNUSED
+	CF_DEFAULT    CF_INT8,      d'0',   d'0',   d'10'   ; CF58 TTS for extra time at current depth [min]
 	CF_DEFAULT    CF_INT15,     0,      0,      0 		; UNUSED
 	CF_DEFAULT    CF_INT15,     0,      0,      0 		; UNUSED
 	CF_DEFAULT    CF_INT15,     0,      0,      0 		; UNUSED
--- a/code_part1/OSTC_code_asm_part1/pled_outputs.asm	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_asm_part1/pled_outputs.asm	Tue May 03 00:52:42 2011 +0200
@@ -3121,6 +3121,41 @@
 	return
 
 ;=============================================================================
+; Display TTS after extra time at the same depth.
+;
+PLED_show_@5:
+	call		PLED_divemask_color     ; Set Color for Divemode mask
+
+	WIN_FONT    FT_SMALL
+	WIN_LEFT	.95
+	WIN_TOP		.216
+    STRCPY      "@"
+	GETCUSTOM8  d'58'
+	movwf       lo
+	bsf         leftbind
+	output_8
+	bcf         leftbind
+	STRCAT_PRINT "': "
+	
+	WIN_LEFT	.95+7*5
+	call        PLED_standard_color
+	lfsr        FSR2,letter
+	movff       int_O_extra_ascenttime+0,lo
+	movff       int_O_extra_ascenttime+1,hi
+	movf        lo,W
+	iorwf       hi,W
+	bz          PLED_show_@5_wait
+	bsf         leftbind
+	output_16
+	bcf         leftbind
+	STRCAT_PRINT "'   "         ; From "xxx'" to "1'  " we need 2 trailing spaces
+	return
+
+PLED_show_@5_wait:
+    STRCPY_PRINT "xxx'"
+    return
+
+;=============================================================================
 
 PLED_show_leading_tissue:
 	call		PLED_divemask_color	; Set Color for Divemode mask
--- a/code_part1/OSTC_code_asm_part1/spanish_text.asm	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_asm_part1/spanish_text.asm	Tue May 03 00:52:42 2011 +0200
@@ -243,15 +243,15 @@
     TCODE    .40,   .35,     "Mostr. TejContr"           ;175 Show Lead.Tiss.
     TCODE    .40,   .35,     "PriParadaSuperf"           ;176 Shallow stop 1st  (Reverse order of deco plans)
     TCODE    .40,   .35,     "Conmu. gas[min]"           ;177 Gas switch[min]   (Additional delay in decoplan for gas switches).
-    TCODE    .40,   .35,     "Gas Fondo[l/mn]"           ;178 BottomGas[l/mn]   (Bottom gas usage, for volume estimation).
-    TCODE    .40,   .35,     "GasAscens[l/mn]"           ;179 AscentGas[l/mn]   (Ascent+Deco gas usage)
-    TCODE    .40,   .35,     "sin uso        "           ;180 not used
+    TCODE    .40,   .35,     "Gas Fondo[/min]"           ;178 BottomGas[/min]   (Bottom gas usage, for volume estimation).
+    TCODE    .40,   .35,     "GasAscens[/min]"           ;179 AscentGas[/min]   (Ascent+Deco gas usage)
+    TCODE    .40,   .35,     "TTS@tiempo[min]"           ;180 TTS @extra[min]   (@5 variant: compute TTS for extra time at current depth)
     TCODE    .40,   .35,     "sin uno        "           ;181 not used
     TCODE    .40,   .35,     "sin uso        "           ;182 not used
     TCODE    .40,   .35,     "sin uso        "           ;183 not used
     TCODE    .40,   .35,     "sin uso        "           ;184 not used
     TCODE    .40,   .35,     "sin uso        "           ;185 not used
-; End of function descriptor I
+; End of function descriptor II
 ;
     TCODE    .13,   .2,      "Func.Personaliz. II"       ;186 Custom Functions II
     TCODE    .20,   .95,     "Ver Licencia"              ;187 Show License
--- a/code_part1/OSTC_code_c_part2/p2_deco.c	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_c_part2/p2_deco.c	Tue May 03 00:52:42 2011 +0200
@@ -76,6 +76,7 @@
 // 2011/04/15: [jDG] Store low_depth in 32bits (w/o rounding), for a better stability.
 // 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 @+5min variant.
 //
 // TODO:
 //  + Allow to abort MD2 calculation (have to restart next time).
@@ -126,6 +127,8 @@
 static void restore_sim_pres_tissue(void);
 static void sim_tissue(PARAMETER unsigned char period);
 static void sim_limit(PARAMETER float GF_current);
+static void sim_extra_time(void);
+
 static void calc_gradient_factor(void);
 static void calc_wo_deco_step_1_min(void);
 
@@ -1224,6 +1227,10 @@
 // | +------< not finished
 // +--------< finish
 //
+// Added steps 6,5 for @+5 calculation:
+//      6 = ascent to first stop (same as 2), except continue to 7
+//      7 = same as 1, except loop to 7.
+//
 static void calc_hauptroutine(void)
 {
 	static unsigned char backup_gas_used  = 0;
@@ -1268,12 +1275,14 @@
         break;
 
     case 0: //---- bottom time -----------------------------------------------
+    default:
     	calc_nullzeit();
     	check_ndl();
    	    char_O_deco_status = 2; // calc ascent next time.
     	break;
 
     case 2: //---- Simulate ascent to first stop -----------------------------
+    case 6: // @+5min variation
         // Check proposed gas at begin of ascent simulation
         sim_dive_mins = int_I_divemins;         // Init current time.
 
@@ -1286,15 +1295,17 @@
 
     	sim_ascent_to_first_stop();
 
-        char_O_deco_status = 1;     // Calc stops next time (deco or gas switch).
+        // Calc stops next time (deco or gas switch).
+        char_O_deco_status = 1 | ( char_O_deco_status & 4 );
     	break;
 
     case 1: //---- Simulate stops --------------------------------------------
+    case 5: // @+5 variation.
     	calc_hauptroutine_calc_deco();
 
         // If simulation is finished, restore the GF low reference, so that
         // next ascent simulation is done from the current depth:
-    	if( char_O_deco_status == 0 )
+    	if( (char_O_deco_status & 3) == 0 )
     	{
             sim_gas_last_used  = backup_gas_used;
             sim_gas_last_depth = backup_gas_depth;
@@ -1494,9 +1505,11 @@
                 if( temp_deco <= pres_surface )
                 {
 Surface:
-    		        copy_deco_table();
-        	        calc_ascenttime();
-    		        char_O_deco_status = 0; // calc nullzeit next time.
+                    if( char_O_deco_status == 1 )  // Don't in @+5min variant.
+                        copy_deco_table();      
+
+                    calc_ascenttime();
+                    char_O_deco_status = 0;     // calc nullzeit next time.
                     char_O_deco_last_stop = 0;  // Surface reached.
     		        return;
                 }
@@ -1513,7 +1526,6 @@
 	}
 
 	// Surface not reached, need more stops...
-    char_O_deco_status = 1; // calc more stops next time.
     char_O_deco_last_stop = temp_depth_limit;   // Reached depth.
 }
 
@@ -1524,6 +1536,8 @@
 //       there is no need to break on more that 16 iterations
 //       (or we are already in deep shit).
 //
+// if char_O_deco_status indicate @+5 variant, add extra time at current depth,
+// before ascent.
 void sim_ascent_to_first_stop(void)
 {
     update_startvalues();
@@ -1531,6 +1545,10 @@
 
    	temp_deco = pres_respiration;       // Starts from current real depth.
 
+    // Are we doing the special @+5min variation ?
+    if(char_O_deco_status & 4)
+        sim_extra_time();
+
     // Do we have a gas switch going on ?
     if( sim_gas_delay > sim_dive_mins )
         return;
@@ -1574,6 +1592,19 @@
 }
 
 //////////////////////////////////////////////////////////////////////////////
+// Simulation extra time at the current depth.
+//
+// This routine is used for @+5min feature.
+void sim_extra_time(void)
+{
+    overlay unsigned char extra = read_custom_function(58);
+    do {
+        sim_dive_mins++;                // Advance simulated time by 1 minute.
+		sim_tissue(1);                  // and update tissues for 1 min.
+    } while( --extra != 0 );
+}
+
+//////////////////////////////////////////////////////////////////////////////
 // calc_tissue
 //
 // optimized in v.101
@@ -1713,20 +1744,30 @@
 //////////////////////////////////////////////////////////////////////////////
 // calc_ascenttime
 //
+// Summup ascent from bottom to surface, at 1 bar/min, 1min for last 3 meters,
+// and all stops.
+//
+// Result in int_O_ascenttime, or int_O_extra_ascenttime if in @+5min variant.
 static void calc_ascenttime(void)
 {
-    if (pres_respiration > pres_surface)
+    if( pres_respiration > pres_surface )
     {
         overlay unsigned char x;
+        overlay unsigned short sum;
 
         // + 0.7 to count 1 minute ascent time from 3 metre to surface
         overlay float ascent = pres_respiration - pres_surface + 0.7; 
         if (ascent < 0.0)
             ascent = 0.0;
-        int_O_ascenttime = (unsigned short)(ascent + 0.99);
+        sum = (unsigned short)(ascent + 0.99);
 
         for(x=0; x<32 && internal_deco_depth[x]; x++)
-            int_O_ascenttime += (unsigned short)internal_deco_time[x];
+            sum += (unsigned short)internal_deco_time[x];
+
+        if( char_O_deco_status == 1 )
+            int_O_ascenttime = sum;
+        else
+            int_O_extra_ascenttime = sum;
     }
     else
         int_O_ascenttime = 0;
Binary file code_part1/OSTC_code_c_part2/p2_deco.o has changed
--- a/code_part1/OSTC_code_c_part2/shared_definitions.h	Mon May 02 16:14:07 2011 +0200
+++ b/code_part1/OSTC_code_c_part2/shared_definitions.h	Tue May 03 00:52:42 2011 +0200
@@ -78,6 +78,7 @@
 VAR_UINT  (int_O_gtissue_press);
 VAR_UINT  (int_O_desaturation_time);       // 
 VAR_UINT  (int_O_ascenttime);              // TTS (in minutes)
+VAR_UINT  (int_O_extra_ascenttime);        // TTS for @+5min variant (in minutes)
 
 VAR_UCHAR (char_O_nullzeit);               // 
 VAR_UCHAR (char_O_deco_status);            // Deko state-machine state.