diff src/divemenu_tree.asm @ 634:4050675965ea

3.10 stable release
author heinrichsweikamp
date Tue, 28 Apr 2020 17:34:31 +0200
parents 185ba2f91f59
children 8c1f1f334275
line wrap: on
line diff
--- a/src/divemenu_tree.asm	Thu Mar 05 15:06:14 2020 +0100
+++ b/src/divemenu_tree.asm	Tue Apr 28 17:34:31 2020 +0200
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File divemenu_tree.asm                    combined next generation V3.08.8
+;   File divemenu_tree.asm                  * combined next generation V3.09.5
 ;
 ;   OSTC dive mode menu
 ;
@@ -9,52 +9,80 @@
 ; HISTORY
 ;   2013-02-02 : [mH] Made out of menu_tree.asm
 
-#include "hwos.inc"						; Mandatory header
+
+;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+;
+;                                  ATTENTION
+;
+; All Calls made via the Menu Macros need to go to Addresses within 0x0xxxx !
+;
+;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+#include "hwos.inc"
+#include "shared_definitions.h"
 #include "menu_processor.inc"
-#include "shared_definitions.h"			; Mailbox from/to p2_deco.c
 #include "tft_outputs.inc"
 #include "customview.inc"
 #include "strings.inc"
 #include "calibrate.inc"
-
-	extern	timeout_divemode_menu2
-	extern	restart_deco_engine_wo_ceiling
-	extern	diveloop_menu_exit
+#include "gaslist.inc"
+#include "colorschemes.inc"
 
 
-dmenu_tree	CODE
+	extern	diveloop_menu_exit
+
+ IFDEF _cave_mode
+	extern	cavemode_turndive_check
+	extern	cavemode_waypoint_set_check
+	extern	cavemode_waypoint_out_check
+	extern	cavemode_waypoint_in_check
+ ENDIF
+
 
 ;=============================================================================
+dive_menu	CODE	0x02000				; needs to be at 0x0xxxx
+;=============================================================================
+
+
+;-----------------------------------------------------------------------------
+; Return to Main Dive Mode Menu
 ;
-; Dive Mode Menu
-;
-
 do_return_main_divemenu:
 	call	menu_processor_double_pop	; drop exit line and back to last line
 	incf	selected_item,W				; item numbers start with 0, menu positions with 1
 	movwf	menu_pos_cur				; position cursor where we came from
-	bra		do_main_divemenu_common
+	bra		do_main_divemenu_common		; continue with common part
+
 
+;-----------------------------------------------------------------------------
+; Entry Point for Main Dive Mode Menu
+;
 	global	do_main_divemenu
 do_main_divemenu:
 	movff	active_customview,backup_customview	; back up current custom view
 	call	menu_processor_reset				; restart from first icon
 	movlw	.1									; set cursor to first menu item
 	movwf	menu_pos_cur						; ...
+	;bra	do_main_divemenu_common				; continue with common part
 
+
+;-----------------------------------------------------------------------------
+; Common Part for Main Dive Mode Menu, 1st Layer
+;
 do_main_divemenu_common:
  IFDEF _ccr_pscr
-	btfsc	FLAG_ccr_mode
-	bra		main_divemenu_loop			; goto CCR / pSCR Menu menu
-	btfsc	FLAG_pscr_mode
-	bra		main_divemenu_loop			; goto CCR / pSCR Menu menu
- ENDIF
+	btfsc	FLAG_ccr_mode				; in CCR mode?
+	bra		main_divemenu_loop			; YES - goto CCR / pSCR Menu menu
+	btfsc	FLAG_pscr_mode				; in pSCR mode?
+	bra		main_divemenu_loop			; YES - goto CCR / pSCR Menu menu
+ ENDIF	; _ccr_pscr
 
 main_divemenu_OC:
  IFDEF _ccr_pscr
 	bcf		is_diluent_menu				; selecting OC gases ...
 	bcf		is_bailout_menu				; ... not for bailout reason
- ENDIF
+ ENDIF	; _ccr_pscr
 
  IFDEF _cave_mode
 	TSTOSS	opt_cave_mode				; cave mode switched on?
@@ -62,28 +90,25 @@
 	;bra	main_divemenu_OC_cave		; YES - use version with    cave mode entry
 
 main_divemenu_OC_cave:
-	MENU_BEGIN	tMainMenu,	.6
+	MENU_BEGIN_DIVE	.6
 		MENU_CALL		tDivemenu_Gaslist,	do_divemode_gaslist
 		MENU_CALL		tDivemenu_ResetAvg,	do_reset_average
-		MENU_DYNAMIC	label_do_toggle_gf,	do_toggle_gf
+		MENU_DYNAMIC	dyn_toggle_gf,		do_toggle_gf
 		MENU_CALL		tDivemenu_Marker,	do_set_marker
 		MENU_CALL		tCaveMode,			do_main_cavemenu
 		MENU_CALL		tExit,				do_exit_divemode_menu
 	MENU_END
- ENDIF
+ ENDIF	; _cave_mode
 
 main_divemenu_OC_nocave:
-	MENU_BEGIN	tMainMenu,	.5
+	MENU_BEGIN_DIVE	.5
 		MENU_CALL		tDivemenu_Gaslist,	do_divemode_gaslist
 		MENU_CALL		tDivemenu_ResetAvg,	do_reset_average
-		MENU_DYNAMIC	label_do_toggle_gf,	do_toggle_gf
+		MENU_DYNAMIC	dyn_toggle_gf,		do_toggle_gf
 		MENU_CALL		tDivemenu_Marker,	do_set_marker
 		MENU_CALL		tExit,				do_exit_divemode_menu
 	MENU_END
 
-
-;=============================================================================
-
  IFDEF _ccr_pscr
 
 main_divemenu_loop:
@@ -92,60 +117,95 @@
 	btfsc	FLAG_pscr_mode				; in pSCR mode?
 	bra		main_divemenu_pscr			; YES - show pSCR menu
 
-	MENU_BEGIN	tMainMenu,	.6
+	MENU_BEGIN_DIVE	.6
 		MENU_CALL		tDiveBailout,		do_divemode_gaslist_bail
 		MENU_CALL		tDivemenu_Setpoint,	do_divemode_splist
 		MENU_CALL		tDivemenu_Diluent,	do_divemode_gaslist
 		MENU_CALL		tDivemenu_Avg_Mkr,	do_reset_avg_set_mkr
-		MENU_DYNAMIC	label_do_toggle_gf,	do_toggle_gf
+		MENU_DYNAMIC	dyn_toggle_gf,		do_toggle_gf
 		MENU_CALL		tExit,				do_exit_divemode_menu
 	MENU_END
 
 
 main_divemenu_pscr:
  IFDEF _external_sensor
-	btfsc	analog_o2_input				; do we have an analog  input (OSTC cR)?
+	btfsc	ext_input_s8_ana			; do we have an S8/analog input (OSTC cR)?
 	bra		main_divemenu_pscr_sensors	; YES - do menu with calibration
-	btfsc	optical_input				; do we have an optical input (OSTC 3)?
+	btfsc	ext_input_optical			; do we have an optical input (OSTC 3)?
 	bra		main_divemenu_pscr_sensors	; YES - do menu with calibration
- ENDIF
+ ENDIF	; _external_sensor
 
 main_divemenu_pscr_no_sensors:
-	MENU_BEGIN	tMainMenu,	.6
+	MENU_BEGIN_DIVE	.6
 		MENU_CALL		tDiveBailout,		do_divemode_gaslist_bail
 		MENU_CALL		tDivemenu_Premix,	do_divemode_gaslist
 		MENU_CALL		tBackToLoop,		do_switch_sp_calc
 		MENU_CALL		tDivemenu_Avg_Mkr,	do_reset_avg_set_mkr
-		MENU_DYNAMIC	label_do_toggle_gf,	do_toggle_gf
+		MENU_DYNAMIC	dyn_toggle_gf,		do_toggle_gf
 		MENU_CALL		tExit,				do_exit_divemode_menu
 	MENU_END
 
+ IFDEF _external_sensor
 main_divemenu_pscr_sensors:
- IFDEF _external_sensor
-	MENU_BEGIN	tMainMenu,	.6
+	MENU_BEGIN_DIVE	.6
 		MENU_CALL		tDiveBailout,		do_divemode_gaslist_bail
 		MENU_CALL		tCCRSensor,			do_divemode_setpoint_pscr
 		MENU_CALL		tDivemenu_Premix,	do_divemode_gaslist
 		MENU_CALL		tDivemenu_Avg_Mkr,	do_reset_avg_set_mkr
-		MENU_DYNAMIC	label_do_toggle_gf,	do_toggle_gf
+		MENU_DYNAMIC	dyn_toggle_gf,		do_toggle_gf
 		MENU_CALL		tExit,				do_exit_divemode_menu
 	MENU_END
  ENDIF	; _external_sensor
 
+
+;-----------------------------------------------------------------------------
+; Call Function - start Bailout Condition
+;
+do_divemode_gaslist_bail:
+	bcf		is_diluent_menu				; select OC gases
+	bsf		is_bailout_menu				; flag it is a bailout action
+	bra		do_divemode_gaslist			; continue with the gas menu for B/O gas selection
+
+
+;-----------------------------------------------------------------------------
+; Call Function - switch to calculated Setpoint (pSCR)
+;
+do_switch_sp_calc:
+	bcf		warn_det_sensors_lost		; clear fallback condition (revoke all sensors lost warning)
+	clrf	WREG						; switch to fixed SP
+	movff	WREG,opt_ccr_mode			; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP
+	movff	WREG,char_I_const_ppO2		; set setpoint to 0, this forces deco engine to take the computed ppO2
+	bra		do_switch_sp_com			; continue with common part
+
  ENDIF	; _ccr_pscr
 
-;=============================================================================
+
+;-----------------------------------------------------------------------------
+; dynamic Title - toggle GF
+;
+dyn_toggle_gf:
+	movff	char_I_model,WREG			; 0 = ZH-L16, 1 = ZH-L16-GF
+	decfsz	WREG,W						; toggle GF only in GF modes - in GF mode?
+	bra		dyn_toggle_gf_1				; NO  - print in disabled color
+	TSTOSS	opt_enable_aGF				; YES - aGF enabled?
+dyn_toggle_gf_1:
+	FONT_COLOR_DISABLED					;       NO  - print in disabled color
+	STRCAT_TEXT tDivemenu_ToggleGF		; output label
+	return								; done
 
 
+;-----------------------------------------------------------------------------
+; Sub-Menu: Toggle GFs
+;
 do_return_toggle_gf:
 	call	menu_processor_pop			; drop selection from menu stack
 	bra		do_toggle_gf_1				; re-draw the custom view and enter the menu again
 
 do_toggle_gf:
 	TSTOSS	char_I_model				; toggle GF only in GF modes - in GF mode? (0 = ZH-L16, 1 = ZH-L16-GF)
-	bra		do_main_divemenu_common		; NO - do nothing and return
-	TSTOSS	opt_enable_aGF				; =1: aGF can be selected underwater
-	bra		do_main_divemenu_common		; NO - do nothing and return
+	bra		do_abort_toggle_gf			; NO - do nothing and return
+	TSTOSS	opt_enable_aGF				; aGF enabled?
+	bra		do_abort_toggle_gf			; NO - do nothing and return
 	bsf		custom_view_locked			; lock custom view
 do_toggle_gf_1:
 	movlw	index_gf_factors			; get  number of GF factors custom view
@@ -154,40 +214,56 @@
 	movlw	.1							; set to first option in dive mode menu
 	movwf	menu_pos_cur				; ...
 
-	MENU_BEGIN	tDivemenu_ToggleGF,	.2
+	MENU_BEGIN_DIVE	.2
 		MENU_CALL		tDivemenu_ToggleGF,	do_toggle_gf_toggle
 		MENU_CALL		tExit,				do_exit_divemode_menu
 	MENU_END
 
+
+;-----------------------------------------------------------------------------
+; Helper Function - abort toggle GF Sub-Menu
+;
+do_abort_toggle_gf:
+	call	menu_processor_pop			; drop selection from menu stack
+	bra		do_main_divemenu_common		; back to main menu
+
+
+;-----------------------------------------------------------------------------
+; Call Function - toggle GF <-> aGF
+;
 do_toggle_gf_toggle:
-	bsf		request_toggle_GF			; set request flag to have the deco engine restarted
+	bsf		request_toggle_GF			; request restart of the deco engine
 	btg		use_aGF						; toggle normal / alternative GF factor selection
 	btfsc	use_aGF						; alternative GF factors activated?
 	bra		do_togglegf_agf				; YES - branch to using alternative GF
 	;bra	do_togglegf_ngf				; NO  - branch to using normal      GF
-
 do_togglegf_ngf:
 	movff	opt_GF_low, char_I_GF_Low_percentage	; use normal GF factor low
 	movff	opt_GF_high,char_I_GF_High_percentage	; use normal GF factor high
 	bra		do_return_toggle_gf						; back to menu
-
 do_togglegf_agf:
 	movff	opt_aGF_low, char_I_GF_Low_percentage	; use alternative GF factor low
 	movff	opt_aGF_high,char_I_GF_High_percentage	; use alternative GF factor high
 	bra		do_return_toggle_gf						; back to menu
 
 
+;-----------------------------------------------------------------------------
+; Sub-Menu: Reset average Depth & set Marker
+;
 do_reset_avg_set_mkr:
 	movlw	.1							; set to first option in dive mode menu
 	movwf	menu_pos_cur				; ...
 
-	MENU_BEGIN	tDivemenu_Avg_Mkr,	.3
+	MENU_BEGIN_DIVE	.3
 		MENU_CALL		tDivemenu_ResetAvg,	do_reset_average
 		MENU_CALL		tDivemenu_Marker,	do_set_marker
-		MENU_CALL		tBack,				do_return_main_divemenu
+		MENU_CALL		tBack,				do_return_main_divemenu		; return to main menu
 	MENU_END
 
 
+;-----------------------------------------------------------------------------
+; Call Function - reset average Depth
+;
 do_reset_average:
 	bsf		request_reset_avg			; request reset of resettable average depth and dive time
  IFDEF _min_depth_option
@@ -196,67 +272,22 @@
 	bra		do_exit_divemode_menu		; continue exiting the menu
 
 
+;-----------------------------------------------------------------------------
+; Call Function - set a Marker in the Dive Profile Recording
+;
 do_set_marker:
 	bsf		request_set_marker			; set request flag
 	bra		do_exit_divemode_menu		; continue exiting the menu
 
-;=============================================================================
 
- IFDEF _ccr_pscr
-
-do_switch_sp:							; entry point when coming from manual setpoint selection (CCR)
-	decf	menu_pos_cur,W				; 1-5 -> 0-4
-	lfsr	FSR1,opt_setpoint_cbar		; load base address
-	movff	PLUSW1,char_I_const_ppO2	; set selected setpoint
- IFDEF _external_sensor
-	call	transmit_setpoint			; transmit current setpoint from WREG (in cbar) to external electronics
- ENDIF
-	bcf		sp_fallback					; clear fallback condition (stops fallback warning)
-	clrf	WREG						; switch to fixed SP
-	movff	WREG,opt_ccr_mode			; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP
-	bra		do_switch_sp_com			; continue with common part
-
-
-do_switch_sp_calc:						; entry point when coming from switch to calculated ppO2 (pSCR)
-	bcf		sp_fallback					; clear fallback condition (stops fallback warning)
-	clrf	WREG						; switch to fixed SP
-	movff	WREG,opt_ccr_mode			; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP
-	movff	WREG,char_I_const_ppO2		; set setpoint to 0, this forces deco engine to take the computed ppO2
-	;bra	do_switch_sp_com			; continue with common part
-
-
-do_switch_sp_com:						; common part
-	bsf		event_occured				; set global   event byte
-	bsf		event_SP_change				; set setpoint event flag
-
-	; Clear some flags in case we were in bailout before...
-	bcf		bailout_mode				; end bailout mode
-	bcf		better_gas_available		; =1: a better gas is available and a gas change is advised in dive mode
-	bcf		better_dil_available		; =1: a better diluent is available and a gas change is advised in dive mode
-	bcf		better_gas_blinking			; clear blinking flag
-	bcf		better_dil_blinking			; clear blinking flag
-	call	dive_customview_callup		; redraw custom view mask to (if applicable) rewrite "ppO2(Dil)" to "ppO2" or SAC label
-
-	bsf		request_back_to_loop		; indicate that it is a switchback from OC bailout to CCR/pSCR loop
-	bsf		request_gas_change			; initiate reconfiguration to loop mode on last diluent
-
-	bra		do_exit_divemode_menu		; continue exiting the menu
-
-
-do_divemode_gaslist_bail:				; entry point from CCR/pSCR to bailout to OC gases
-	bcf		is_diluent_menu				; select OC gases
-	bsf		is_bailout_menu				; flag it is a bailout action
-	;bra	do_divemode_gaslist
-
- ENDIF	; _ccr_pscr
-
-;=============================================================================
-
-do_divemode_gaslist:					; entry point for switching: OC -> gases, loop -> diluents
+;-----------------------------------------------------------------------------
+; Sub-Menu: Switch OC / Diluent Selection
+;
+do_divemode_gaslist:
  IFDEF _ccr_pscr
 	btfsc	bailout_mode				; in bailout mode?
 	bcf		is_diluent_menu				; YES - for safety reasons, redirect to selecting OC (bailout) gases
- ENDIF
+ ENDIF	; _ccr_pscr
 	bsf		short_gas_descriptions		; do not show "Gas x" etc.
 	bsf		better_gas_hint				; mark the gas which is the best gas/diluent
 	bsf		color_code_gases			; color-code the gases/diluents by their ppO2 and current depth
@@ -264,7 +295,7 @@
  IFDEF _ccr_pscr
 	btfsc	is_diluent_menu				; in diluent selection?
 	movf	best_dil_number,W			; YES - overwrite with best diluent (1-5)
- ENDIF
+ ENDIF; _ccr_pscr
 	bnz		do_divemode_gaslist_1		; best gas/dil number  =   0 (none available) ?
 	movlw	.1							; YES - default to first gas/dil
 	btfsc	WREG,7						; best gas/dil number >= 128 (not computed yet) ?
@@ -272,88 +303,42 @@
 do_divemode_gaslist_1:
 	movwf	menu_pos_cur				; position cursor to best gas/dil (or first option if none avail)
 
-	MENU_BEGIN	tGaslist,	.6
-		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_switch_gas
-		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_switch_gas
-		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_switch_gas
-		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_switch_gas
-		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_switch_gas
+	MENU_BEGIN_DIVE	.6
+		MENU_DYNAMIC	dyn_strcat_gas_prodl,	do_switch_gas
+		MENU_DYNAMIC	dyn_strcat_gas_prodl,	do_switch_gas
+		MENU_DYNAMIC	dyn_strcat_gas_prodl,	do_switch_gas
+		MENU_DYNAMIC	dyn_strcat_gas_prodl,	do_switch_gas
+		MENU_DYNAMIC	dyn_strcat_gas_prodl,	do_switch_gas
 		MENU_CALL		tDivemenu_LostGas,		do_lost_gas
 	MENU_END
 
 
-do_gas6_or_exit:
-	btfsc	gas6_or_EXIT					; shall exit?
-	bra		do_exit_divemode_menu			; YES - continue exiting menu
-	movlw	.1								; NO  - select first item
-	movwf	menu_pos_cur					;     - set cursor
-	movff	char_I_O2_ratio,gas6_O2_ratio	;     - initialize gas6 with currently breathed gas - O2 ratio
- IFDEF _helium
-	movff	char_I_He_ratio,gas6_He_ratio	;     - initialize gas6 with currently breathed gas - He ratio
- ENDIF
-
-do_divemode_gaslist_more_common:
- IFDEF _helium
-	MENU_BEGIN	tGaslist,	.6
-		MENU_CALL		tO2Plus,				do_dive_pO2
-		MENU_CALL		tO2Minus,				do_dive_mO2
-		MENU_CALL		tHePlus,				do_dive_pHe
-		MENU_CALL		tHeMinus,				do_dive_mHe
-		MENU_DYNAMIC	gaslist_strcat_gas6,	do_switch_gas6
-		MENU_CALL		tExit,					do_exit_divemode_menu
-	MENU_END
- ELSE
-	MENU_BEGIN	tGaslist,	.4
-		MENU_CALL		tO2Plus,				do_dive_pO2
-		MENU_CALL		tO2Minus,				do_dive_mO2
-		MENU_DYNAMIC	gaslist_strcat_gas6,	do_switch_gas6
-		MENU_CALL		tExit,					do_exit_divemode_menu
-	MENU_END
- ENDIF
+;-----------------------------------------------------------------------------
+; dynamic Title - print full Gas Description
+;
+dyn_strcat_gas_prodl:
+	goto	gaslist_strcat_gas_PRODL	; code is hosted in gaslist.asm
 
 
-do_lost_gas:
-	movlw	.1							; set to first option in dive mode menu
-	movwf	menu_pos_cur				; ...
-	bcf		gas6_or_EXIT				; default to presenting gas6 option
-do_lost_gas_common:
-	bsf		short_gas_descriptions		; do not show "Gas x" etc.
-	bcf		better_gas_hint				; do not mark the best gas/diluent
-	bcf		color_code_gases			; do not color-code the gases/diluents by their ppO2
-
-	MENU_BEGIN	tDivemenu_LostGas, .6
-		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_toggle_staged_lost
-		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_toggle_staged_lost
-		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_toggle_staged_lost
-		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_toggle_staged_lost
-		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_toggle_staged_lost
-		MENU_DYNAMIC	label_do_gas6_or_exit,	do_gas6_or_exit
-	MENU_END
-
-
-do_switch_gas6:
-	movlw	.6							; gas 6
-	movwf	menu_pos_cur				; transfer register for selected gas towards gas_switched_common
-	bsf		event_gas_change_gas6		; set flag for profile recording
-	;bra	do_switch_gas				; continue with common gas-switched code
-
-
+;-----------------------------------------------------------------------------
+; Call Function - initiate Gas Change (will also trigger restart of deco_engine)
+;
 do_switch_gas:
-	bsf		request_gas_change			; initiate gas change, will also trigger restart of deco_engine
+	bsf		request_gas_change			; request dive mode to do a gas change
  IFDEF _ccr_pscr
 	btfss	is_bailout_menu				; doing a bailout?
 	bra		do_switch_gas_1				; NO
 	bsf		bailout_mode				; YES - begin bailout mode
- ENDIF
+ ENDIF	; _ccr_pscr
  IFDEF _cave_mode
 	btfsc	cave_mode					;     - cave mode switched on?
 	bsf		request_turn_turn			;       YES - request to turn the dive
- ENDIF
+ ENDIF	; _cave_mode
  IFDEF _ccr_pscr
 do_switch_gas_1:
-	bcf		sp_fallback					; terminate fallback mode and get rid of its warning if applicable
+	bcf		warn_det_sensors_lost		; terminate fallback mode and get rid of its warning if applicable
 	call	dive_customview_callup		; redraw custom view mask to rewrite "ppO2(Dil)" to "ppO2" or SAC label if applicable
- ENDIF
+ ENDIF	; _ccr_pscr
 	; revoke staged and lost state on the selected gas
 	lfsr	FSR1,opt_gas_type			; load base address of gas types
 	movff	menu_pos_cur,lo				; copy selected gas to lo
@@ -366,17 +351,42 @@
 	bcf		PLUSW1,gas_lost				; revoke lost   state
  IFDEF _cave_mode
 	bcf		PLUSW1,gas_staged			; revoke staged state
- ENDIF
-	;bra	do_exit_divemode_menu		; continue exiting the menu
+ ENDIF	; _cave_mode
+	bra		do_exit_divemode_menu		; continue exiting the menu
 
 
-; +++ Dive Mode and Cave Mode common exit point +++
-do_exit_divemode_menu:
-	call	timeout_divemode_menu2		; check for timeout and do some cleanup
-	clrf	STKPTR						; reset the stack
-	goto	diveloop_menu_exit			; back to the dive loop
+;-----------------------------------------------------------------------------
+; Sub-Menu: lost / staged Gas
+;
+do_lost_gas:
+	movlw	.1							; set to first option in dive mode menu
+	movwf	menu_pos_cur				; ...
+	bcf		gas6_or_EXIT				; default to presenting gas6 option
+do_lost_gas_common:
+	bsf		short_gas_descriptions		; do not show "Gas x" etc.
+	bcf		better_gas_hint				; do not mark the best gas/diluent
+	bcf		color_code_gases			; do not color-code the gases/diluents by their ppO2
+
+	MENU_BEGIN_DIVE	.6
+		MENU_DYNAMIC	dyn_strcat_gas_prodl,	do_toggle_staged_lost
+		MENU_DYNAMIC	dyn_strcat_gas_prodl,	do_toggle_staged_lost
+		MENU_DYNAMIC	dyn_strcat_gas_prodl,	do_toggle_staged_lost
+		MENU_DYNAMIC	dyn_strcat_gas_prodl,	do_toggle_staged_lost
+		MENU_DYNAMIC	dyn_strcat_gas_prodl,	do_toggle_staged_lost
+		MENU_DYNAMIC	dyn_gas6_or_exit,		do_gas6_or_exit
+	MENU_END
 
 
+;-----------------------------------------------------------------------------
+; dynamic Title - print full Gas Description
+;
+;dyn_strcat_gas_prodl:
+;	goto	gaslist_strcat_gas_PRODL	; code is hosted in gaslist.asm
+
+
+;-----------------------------------------------------------------------------
+; Call Function - toggle a Gas between available, lost and staged
+;
 do_toggle_staged_lost:
 	movff	menu_pos_cur,lo				; copy selected gas/diluent to lo   (1-5)
 	movf	active_gas,W				; copy currently used gas   to WREG (1-5)
@@ -388,7 +398,7 @@
 	btfss	is_diluent_menu				;       NO  - breathing a diluent then, in diluent menu?
 	bra		do_toggle_staged_lost_exec	;             NO  - can modify any gas, no need for a check
 	movf	active_dil,W				;             YES - check selected diluent against diluent in use
- ENDIF
+ ENDIF	; _ccr_pscr
 do_toggle_staged_lost_check:
 	cpfseq	lo							; selected gas/dil = currently used gas/dil?
 	bra		do_toggle_staged_lost_exec	; NO  - can set selected gas/dil to lost or staged
@@ -431,99 +441,187 @@
 	bra		do_lost_gas_common			; back to the menu
 
 
-do_dive_pO2:
-	incf	gas6_O2_ratio,F				; increment O2 %
+;-----------------------------------------------------------------------------
+; dynamic Title - print Gas 6 Item or Exit Item
+;
+dyn_gas6_or_exit:
+	btfsc	gas6_or_EXIT				; shall print exit?
+	bra		dyn_gas6_or_exit_1			; YES - print exit  label
+	STRCAT_TEXT tGas6					; NO  - print gas 6 label
+	return								;     - done
+dyn_gas6_or_exit_1:
+	STRCAT_TEXT tExit					; print exit label
+	return								; done
+
+
+;-----------------------------------------------------------------------------
+; Sub-Menu: Gas 6 / Menu-Exit
+;
+do_gas6_or_exit:
+	btfsc	gas6_or_EXIT						; shall exit?
+	bra		do_exit_divemode_menu				; YES - exit the menu
+	movlw	.1									; NO  - select first item
+	movwf	menu_pos_cur						;     - set cursor
+	movff	char_I_O2_ratio,opt_gas6_O2_ratio	;     - initialize gas6 with currently breathed gas - O2 ratio
  IFDEF _helium
-	movf	gas6_He_ratio,W				; get He %
-	addwf	gas6_O2_ratio,W				; add O2 %
+	movff	char_I_He_ratio,opt_gas6_He_ratio	;     - initialize gas6 with currently breathed gas - He ratio
  ELSE
-	movf	gas6_O2_ratio,W				; get O2 %
- ENDIF
-	movwf	lo							; copy to lo
-	movlw	.101						; O2 + He < 101 
-	cpfslt	lo							; ... ?
-	decf	gas6_O2_ratio,F				; NO  - decrement O2 again
-	bra		do_divemode_gaslist_more_common
+	clrf	WREG								;     - set gas6 helium to zero
+	movff	WREG,opt_gas6_He_ratio				;     - ...
+ ENDIF	; _helium
+	bsf		block_option_value					; suspend displaying of option values
 
 
-do_dive_mO2:
-	decf	gas6_O2_ratio,F				; decrement O2 %
-	movlw	gaslist_min_o2				; get minimum value
-	cpfslt	gas6_O2_ratio				; O2 < minimum allowed %O2 ?
-	bra		do_dive_mO2_done			; NO  - value is valid
-	movwf	gas6_O2_ratio				; YES - set O2 % to minimum
-do_dive_mO2_done:
-	bra		do_divemode_gaslist_more_common
+ IFDEF _helium
+	MENU_BEGIN_DIVE .6
+		MENU_OPT_INCS	tO2Plus,				oGas6O2
+		MENU_OPT_DECS	tO2Minus,				oGas6O2
+		MENU_OPT_INCS	tHePlus,				oGas6He
+		MENU_OPT_DECS	tHeMinus,				oGas6He
+		MENU_DYNAMIC	dyn_show_gas6,			do_gas6_switch
+		MENU_CALL		tExit,					do_exit_divemode_menu
+	MENU_END
+ ELSE
+	MENU_BEGIN_DIVE .4
+		MENU_OPT_INCS	tO2Plus,				oGas6O2
+		MENU_OPT_DECS	tO2Minus,				oGas6O2
+		MENU_DYNAMIC	dyn_show_gas6,			do_gas6_switch
+		MENU_CALL		tExit,					do_exit_divemode_menu
+	MENU_END
+ ENDIF; _helium
 
-;=============================================================================
-
- IFDEF _helium
 
-do_dive_pHe:
-	incf	gas6_He_ratio,F				; increment He %
-	movf	gas6_He_ratio,W				; get He %
-	addwf	gas6_O2_ratio,W				; add O2 %
-	movwf	lo							; copy to lo
-	movlw	.101						; O2 + He < 101
-	cpfslt	lo							; ... ?
-	decf	gas6_He_ratio,F				; YES - decrement He again
-	bra		do_divemode_gaslist_more_common
+;-----------------------------------------------------------------------------
+; dynamic Title: show Gas 6 Mix
+;
+dyn_show_gas6:
+	STRCAT_TEXT tTakeGas				; print "take"
+	PUTC	" "							; print one space
+	movff	opt_gas6_O2_ratio,hi		; TFT_color_code_gaslist needs O2 ratio in hi
+	call	TFT_color_code_gaslist		; color-code according to O2 ratio and depth
+	movff	opt_gas6_O2_ratio,lo		; gaslist_strcat_mix needs O2 ratio in lo
+ IFDEF _helium
+	movff	opt_gas6_He_ratio,hi		;                ... and He ratio in hi
+ ELSE
+	clrf	hi							;                ... and He ration will be zero
+ ENDIF	; _helium
+	goto	gaslist_strcat_mix			; print "Nxlo", "Txlo/hi", "Air" or "O2" and return
 
-do_dive_mHe:
-	decf	gas6_He_ratio,F				; decrement He %
-	bnn		do_dive_mHe_done			; H2 < 0 ?
-	clrf	gas6_He_ratio				; YES - reset to 0
-do_dive_mHe_done:
-	bra		do_divemode_gaslist_more_common
 
- ENDIF
+;-----------------------------------------------------------------------------
+; Call Function - switch to Gas 6
+;
+do_gas6_switch:
+	movlw	.6							; gas 6
+	movwf	menu_pos_cur				; transfer register for selected gas towards gas_switched_common
+	bsf		event_gas_change_gas6		; set flag for profile recording
+	bra		do_switch_gas				; continue with common gas-switched code
 
-;=============================================================================
 
  IFDEF _ccr_pscr
 
+;-----------------------------------------------------------------------------
+; Sub Menu - select Setpoint
+;
 do_divemode_splist:
 	bsf		short_gas_descriptions		; do not show "SP" etc.
 	movlw	.1							; default to first menu item
 	movff	opt_ccr_mode,lo				; get CCR mode (0: Fixed SP, 1: Sensor, 2: Auto SP)
 	dcfsnz	lo,F						; mode = sensor ?
 	movlw	.6							; YES - load menu item number for 'sensor'
-	btfsc	sp_fallback					; in fallback condition?
+	btfsc	warn_det_sensors_lost		; all sensors lost?
 	movlw	.1							; YES - revert to first menu item
 	movwf	menu_pos_cur				; set cursor position
 
-do_divemode_splist_common:
-
  IFDEF _external_sensor
-	btfsc	analog_o2_input				; do we have an analog or S8 digital input (OSTC cR)?
+	btfsc	ext_input_s8_ana			; do we have an S8/analog input (OSTC cR)?
 	bra		do_divemode_splist_sensor	; YES
-	btfsc	optical_input				; do we have an optical input (OSTC 3)?
+	btfsc	ext_input_optical			; do we have an optical input (OSTC 3)?
 	bra		do_divemode_splist_sensor	; YES
- ENDIF
+ ENDIF	; _external_sensor
 
 do_divemode_splist_no_sensor:
-	MENU_BEGIN	tGaslist, .5
-		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
-		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
-		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
-		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
-		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
+	MENU_BEGIN_DIVE	.5
+		MENU_DYNAMIC	dyn_strcat_setpoint_prodl,	do_switch_sp
+		MENU_DYNAMIC	dyn_strcat_setpoint_prodl,	do_switch_sp
+		MENU_DYNAMIC	dyn_strcat_setpoint_prodl,	do_switch_sp
+		MENU_DYNAMIC	dyn_strcat_setpoint_prodl,	do_switch_sp
+		MENU_DYNAMIC	dyn_strcat_setpoint_prodl,	do_switch_sp
 	MENU_END
 
 
  IFDEF _external_sensor
 
 do_divemode_splist_sensor:
-	MENU_BEGIN	tGaslist,	.6
-		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
-		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
-		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
-		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
-		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
+	MENU_BEGIN_DIVE	.6
+		MENU_DYNAMIC	dyn_strcat_setpoint_prodl,	do_switch_sp
+		MENU_DYNAMIC	dyn_strcat_setpoint_prodl,	do_switch_sp
+		MENU_DYNAMIC	dyn_strcat_setpoint_prodl,	do_switch_sp
+		MENU_DYNAMIC	dyn_strcat_setpoint_prodl,	do_switch_sp
+		MENU_DYNAMIC	dyn_strcat_setpoint_prodl,	do_switch_sp
 		MENU_CALL		tCCRSensor,					do_divemode_sensor
 	MENU_END
 
+ ENDIF	; _external_sensor
 
+
+;-----------------------------------------------------------------------------
+; dynamic Title - print Setpoint
+;
+dyn_strcat_setpoint_prodl:
+	goto	gaslist_strcat_setpoint_PRODL	; function is hosted in gaslist.asm
+
+
+;-----------------------------------------------------------------------------
+; Call Function - switch to manually selected Setpoint (CCR)
+;
+do_switch_sp:
+	decf	menu_pos_cur,W				; 1-5 -> 0-4
+	lfsr	FSR1,opt_setpoint_cbar		; load base address
+	movff	PLUSW1,char_I_const_ppO2	; set selected setpoint
+ IFDEF _external_sensor
+	call	transmit_setpoint			; transmit current setpoint from WREG (in cbar) to external electronics
+ ENDIF
+	bcf		warn_det_sensors_lost		; clear fallback condition (revoke all sensors lost warning)
+	clrf	WREG						; switch to fixed SP
+	movff	WREG,opt_ccr_mode			; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP
+	;bra	do_switch_sp_com			; continue with common part
+
+
+;-----------------------------------------------------------------------------
+; Helper Function - common Part of Setpoint Switching
+;
+do_switch_sp_com:						; common part
+	bsf		event_occured				; set global   event byte
+	bsf		event_SP_change				; set setpoint event flag
+
+	; Clear some flags in case we were in bailout before...
+	bcf		bailout_mode				; end bailout mode
+	bcf		better_gas_available		; =1: a better gas is available and a gas change is advised in dive mode
+	bcf		better_dil_available		; =1: a better diluent is available and a gas change is advised in dive mode
+	bcf		better_gas_blinking			; clear blinking flag
+	bcf		better_dil_blinking			; clear blinking flag
+	call	dive_customview_callup		; redraw custom view mask to (if applicable) rewrite "ppO2(Dil)" to "ppO2" or SAC label
+
+	bsf		request_back_to_loop		; indicate that it is a switchback from OC bailout to CCR/pSCR loop
+	bsf		request_gas_change			; initiate reconfiguration to loop mode on last diluent
+
+	bra		do_exit_divemode_menu		; continue exiting the menu
+
+
+ IFDEF _external_sensor
+
+
+;-----------------------------------------------------------------------------
+; Return to Sub Menu toggle Sensor Usage / select Sensors from Menu Action
+;
+do_return_divemode_sensor:
+	call	menu_processor_pop			; drop selection from menu stack
+	bra		do_return_divemode_common	; back to menu
+
+;-----------------------------------------------------------------------------
+; Sub Menu - toggle Sensor Usage / select Sensors
+;
 do_divemode_sensor:
 	movlw	index_ppo2_sensors			; number of ppO2 sensors custom view
 	movwf	active_customview			; set     the custom view number
@@ -531,8 +629,8 @@
 	movlw	.1							; set to 1st option: use sensors
 	movwf	menu_pos_cur				; ...
 
-do_return_divemode_sensor:
-	MENU_BEGIN	tGaslist,	.6
+do_return_divemode_common:
+	MENU_BEGIN_DIVE	.6
 		MENU_CALL		tDivemenu_UseSensor,	do_switch_sensor
 		MENU_CALL		tBack,					do_divemode_splist
 		MENU_CALL		tExit,					do_exit_divemode_menu
@@ -545,7 +643,7 @@
 	movlw	.1
 	movwf	menu_pos_cur				; set to 1st option: use calculated ppO2
 
-	MENU_BEGIN	tGaslist,	.6
+	MENU_BEGIN_DIVE	.6
 		MENU_CALL		tCalculated,			do_switch_sp_calc
 		MENU_CALL		tDivemenu_UseSensor,	do_switch_sensor
 		MENU_CALL		tExit,					do_exit_divemode_menu
@@ -554,41 +652,59 @@
 		MENU_CALL		tDiveHudMask3,			do_toggle_sensor
 	MENU_END
 
-do_switch_sensor:						; entry point when coming from switch to sensor
-	movlw	.1							; switch to sensor
-	movff	WREG,opt_ccr_mode			; =0: fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP
-	bra		do_switch_sp_com			; continue with common part
+
+;-----------------------------------------------------------------------------
+; Call Function - switch to using Sensors
+;
+do_switch_sensor:
+	movlw	.1							; switch to sensor (0: fixed/ calculated SP, 1: Sensor, 2: AutoSP)
+	movff	WREG,opt_ccr_mode			; ...
 
+	; check for external HUD/ppO2 Monitor
+	btfss	ext_input_optical			; do we have an optical input?
+	bra		do_switch_sp_com			; NO  - continue with common part
+	btfsc	sensor1_active				; YES - process flags from HUD/ppO2 Monitor
+	bsf		use_O2_sensor1				;     - ...
+	btfsc	sensor2_active				;     - ...
+	bsf		use_O2_sensor2				;     - ...
+	btfsc	sensor3_active				;     - ...
+	bsf		use_O2_sensor3				;     - ...
+	bra		do_switch_sp_com			;     - continue with common part
+
+
+;-----------------------------------------------------------------------------
+; Call Function - toggle Sensor Usage
+;
 do_toggle_sensor:
-	movff	menu_pos_cur,lo				; backup position
-	decf	menu_pos_cur,f				; 4, 5, 6 ->  3, 4, 5
-	decf	menu_pos_cur,f				; 3, 4, 5 ->  2, 3, 4
-	decf	menu_pos_cur,f				; 2, 3, 4 ->  1, 2, 3
-	dcfsnz	menu_pos_cur				; 1, 2, 3 ->  0, 1, 2
-	btg		use_O2_sensor1				;             = 
-	dcfsnz	menu_pos_cur				; 0, 1, 2 -> -1, 0, 1
-	btg		use_O2_sensor2				;                =
-	dcfsnz	menu_pos_cur				; -1,0, 1 -> -2,-1, 0
-	btg		use_O2_sensor3				;                   =
-	movff	lo,menu_pos_cur				; restore position
-	bra		do_return_divemode_sensor
+	movf	menu_pos_cur,W				; copy position to WREG
+	addlw	-.3							; skip first 3 menu items
+	dcfsnz	WREG						; cursor on item sensor 1 ?
+	btg		use_O2_sensor1				; YES - toggle sensor 1 state
+	dcfsnz	WREG						; cursor on item sensor 2 ?
+	btg		use_O2_sensor2				; YES - toggle sensor 2 state
+	dcfsnz	WREG						; cursor on item sensor 3 ?
+	btg		use_O2_sensor3				; YES - toggle sensor 3 state
+	bra		do_return_divemode_sensor	; back to same menu
 
  ENDIF	; _external_sensor
  ENDIF	; _ccr_pscr
 
-;=============================================================================
-;
-; Cave Mode Menu
-;
 
  IFDEF _cave_mode
 
+;-----------------------------------------------------------------------------
+; Return to Cave Mode Main Menu
+;
 do_return_main_cavemenu:
 	call	menu_processor_pop					; drop selection from menu stack
 	incf	selected_item,W						; item numbers start with 0, menu positions with 1
 	movwf	menu_pos_cur						; position cursor where we came from
 	bra		do_main_cavemenu_common				; continue with common part
 
+
+;-----------------------------------------------------------------------------
+; Cave Mode Main Menu
+;
 	global	do_main_cavemenu
 do_main_cavemenu:
 	bsf		custom_view_locked					; lock custom view
@@ -600,47 +716,123 @@
 	btfss	cave_mode							; cave mode switched off ?
 	movlw	.3									; YES - set cursor on cave mode off/on menu item
 	movwf	menu_pos_cur						; actually set cursor position
-
-	; The helper functions for MENU_DYNAMIC can be found in
-	; gaslist.asm as it does not work to include them here.
+	;bra	do_main_cavemenu_common				; continue with common part
 
 do_main_cavemenu_common:
 	movlw	index_cave_waypoints				; get  number of cave waypoints custom view
 	movwf	active_customview					; set  custom view number
 	call	dive_customview_callup				; draw custom view
 
-	MENU_BEGIN	tMainMenu,	.6
-		MENU_DYNAMIC	label_do_wp_set,		do_waypoint_set			; 1
-		MENU_DYNAMIC	label_do_turn_dive,		do_turndive_toggle		; 2
+	MENU_BEGIN_DIVE	.6
+		MENU_DYNAMIC	dyn_waypoint_set,		do_waypoint_set			; 1
+		MENU_DYNAMIC	dyn_turndive_toggle,	do_turndive_toggle		; 2
 		MENU_CALL		tDivemenu_off_on,		do_cavemode_toggle		; 3
-		MENU_DYNAMIC	label_do_wp_out,		do_waypoint_out			; 4
-		MENU_DYNAMIC	label_do_wp_in,			do_waypoint_in			; 5
+		MENU_DYNAMIC	dyn_waypoint_out,		do_waypoint_out			; 4
+		MENU_DYNAMIC	dyn_waypoint_in,		do_waypoint_in			; 5
 		MENU_CALL		tExit,					do_exit_divemode_menu	; 6
 	MENU_END
 
 
+;-------------------------------------------------------------------
+; dynamic Title - set a Waypoint
+;
+dyn_waypoint_set:
+	call	cavemode_waypoint_set_check	; check if command is allowed to execute
+	tstfsz	WREG						; command allowed?
+	FONT_COLOR_DISABLED					; NO - switch to disabled color
+	STRCAT_TEXT tDivemenu_wp_set		; print label
+	return								; done
+
+
+;-------------------------------------------------------------------
+; dynamic Title - turn the Dive
+;
+dyn_turndive_toggle:
+	call	cavemode_turndive_check		; check if command is allowed
+	tstfsz	WREG						; command allowed?
+	FONT_COLOR_DISABLED					; NO - switch to disabled color
+	btfss	cave_mode					; cave mode switched on?
+	bra		dyn_turndive_toggle_1		; NO  - print turn dive label
+	btfss	dive_turned					; YES - dive turned?
+	bra		dyn_turndive_toggle_1		;       NO  - print turn dive label
+	STRCAT_TEXT tDivemenu_ContDive		;       YES - print continue dive label
+	return								;           - done
+dyn_turndive_toggle_1:
+	STRCAT_TEXT tDivemenu_TurnDive		; print turn dive label
+	return								; done
+
+
+;-------------------------------------------------------------------
+; dynamic Title - navigate one Waypoint outwards
+;
+dyn_waypoint_out:
+	call	cavemode_waypoint_out_check	; check if command is allowed to execute
+	tstfsz	WREG						; command allowed?
+	FONT_COLOR_DISABLED					; NO - switch to disabled color
+	STRCAT_TEXT tDivemenu_wp_out		; print label
+	return								; done
+
+
+;-------------------------------------------------------------------
+; dynamic Title - navigate one Waypoint inwards
+;
+dyn_waypoint_in:
+	call	cavemode_waypoint_in_check	; check if command is allowed to execute
+	tstfsz	WREG						; command allowed?
+	FONT_COLOR_DISABLED					; NO - switch to disabled color
+	STRCAT_TEXT tDivemenu_wp_in			; print label
+	return								; done
+
+
+;-------------------------------------------------------------------
+; Call Function - set a Waypoint
+;
 do_waypoint_set:
 	bsf		request_waypoint_set		; set request flag
 	bra		do_return_main_cavemenu		; back to menu
 
+
+;-------------------------------------------------------------------
+; Call Function - turn the dive
+;
 do_turndive_toggle:
 	bsf		request_turn_toggle			; set request flag
 	bra		do_return_main_cavemenu		; back to menu
 
+
+;-------------------------------------------------------------------
+; Call Function - turn Cave Mode on/off
+;
 do_cavemode_toggle:
 	bsf		request_cave_toggle			; set request flag
 	bra		do_return_main_cavemenu		; back to menu
 
+
+;-------------------------------------------------------------------
+; Call Function - navigate one Waypoint outwards
+;
 do_waypoint_out:
 	bsf		request_waypoint_out		; set request flag
 	bra		do_return_main_cavemenu		; back to menu
 
+
+;-------------------------------------------------------------------
+; Call Function - navigate one Waypoint inwards
+;
 do_waypoint_in:
 	bsf		request_waypoint_in			; set request flag
 	bra		do_return_main_cavemenu		; back to menu
 
  ENDIF	; _cave_mode
 
-;=============================================================================
+
+;-----------------------------------------------------------------------------
+; Call Function - leave the Menu
+;
+do_exit_divemode_menu:
+	bcf		block_option_value			; resume displaying of option values
+	goto	diveloop_menu_exit			; back to the dive loop
+
+;-----------------------------------------------------------------------------
 
 	END