diff src/simulator.asm @ 623:c40025d8e750

3.03 beta released
author heinrichsweikamp
date Mon, 03 Jun 2019 14:01:48 +0200
parents ca4556fb60b9
children cd58f7fc86db
line wrap: on
line diff
--- a/src/simulator.asm	Wed Apr 10 10:51:07 2019 +0200
+++ b/src/simulator.asm	Mon Jun 03 14:01:48 2019 +0200
@@ -1,8 +1,8 @@
 ;=============================================================================
 ;
-;   File simulator.asm								REFACTORED VERSION V2.99e
+;   File simulator.asm                        combined next generation V3.03.3
 ;
-;   Decoplan interface to C model code.
+;   Deco Calculator
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
@@ -14,228 +14,280 @@
 #include "shared_definitions.h"		; Mailbox from/to p2_deco.c
 #include "strings.inc"				; STRCPY,...
 #include "tft.inc"					; WIN_LEFT,...
-#include "wait.inc"					; speed_*
 #include "start.inc"
 #include "divemode.inc"
+#include "sleepmode.inc"
 #include "math.inc"
 #include "eeprom_rs232.inc"
 #include "tft_outputs.inc"
 #include "gaslist.inc"
-#include "isr.inc"
+#include "surfmode.inc"
+#include "wait.inc"
 
-	extern deco_clear_tissue
+
 	extern deco_push_tissues_to_vault
 	extern deco_calc_dive_interval
 	extern deco_calc_hauptroutine
 	extern deco_pull_tissues_from_vault
-	extern TFT_display_decotype_surface1
-	extern log_screendump_and_onesecond
-	extern logbook_preloop_tasks
+	extern TFT_decotype_logbook
 	extern do_return_demo_planner
 	extern dive_boot_oc_bail
 	extern dive_boot_oc
+
+ IFDEF _ccr_pscr
 	extern dive_boot_cc
+ ENDIF
 
 
-;---- Private local variables -------------------------------------------------
+;---- Private local Variables -------------------------------------------------
 
 	CBLOCK local1				; max size is 16 Byte !!!
 		decoplan_index			; within each page
 		decoplan_gindex			; global index
-		decoplan_last			; depth of last stop (CF#29)
-		decoplan_flags			; various private flags
+		decoplan_last			; depth of last stop
+		decoplan_flags			; private flags
 		decoplan_page			; page number
 		decoplan_warnings		; deco engine warnings
-		gas_counter				; counter for looping through the gases
-		row_pos					; used for positioning of graphic elements
+		gas_index				; counter for looping through the gases
+		output_row				; used for positioning of the results output
 	ENDC						; used: 8 byte, remaining: 8 byte
 
-;---- Defines ----------------------------------------------------------------
+
+;---- Private local Flags ----------------------------------------------------
 
-#define decoplan_last_ceiling_shown	decoplan_flags,0
-#define decoplan_abort				decoplan_flags,1
+#define decoplan_abort				decoplan_flags,0	; =1: deco calculations were aborted
+#define decoplan_last_stop_shown	decoplan_flags,1	; =1: last deco stop is shown
+#define decoplan_pressures_shown	decoplan_flags,2	; =1: show gas volumes in bar as per tank sizes
+#define decoplan_overflow			decoplan_flags,3	; =1: result > 999
+#define decoplan_toggleflag			decoplan_flags,4	; used to show calculation progress
+;									decoplan_flags,5	; --- unused
+;									decoplan_flags,6	; --- unused
+;									decoplan_flags,7	; --- unused
 
 
-simulator		CODE
+simulator	CODE
 
+;-----------------------------------------------------------------------------
 
-;---- Demo deco planner ------------------------------------------------------
-
+;=============================================================================
+; Deco Calculator Main Function
+;
 	global	do_demo_planner
 do_demo_planner:
 	btfsc	FLAG_gauge_mode					; in gauge mode?
 	bra		do_demo_planner_exit			; YES - abort
-	btfsc	FLAG_apnoe_mode					; in Apnea mode?
+	btfsc	FLAG_apnoe_mode					; in apnea mode?
 	bra		do_demo_planner_exit			; YES - abort
-	bcf		decoplan_abort					; initialize (clear) abort flag
-	bcf		FLAG_bailout_mode				; clear bailout condition (may have remained set from last invocation)
-	rcall	deco_planer
-	btfss	decoplan_abort					; skip recall deco_show_plan if calculations were aborted
-	rcall	deco_show_plan
+
+	clrf	decoplan_flags					; clear all local flags
+	bsf		simulatormode					; activate simulator mode
+	bsf		reset_timebase					; request ISR to reset the timebase
+;	btfsc	reset_timebase					; has the ISR confirmed reset of the timebase?
+;	bra		$-2								; NO - not yet, loop waiting for the ISR
+	call	deco_push_tissues_to_vault		; back-up the state of the real tissues (C-code)
+	banksel	common							; back to bank common
+
+	rcall	deco_calculate					; calculate deco plan
+	btfss	decoplan_abort					; was the deco plan calculation aborted?
+	rcall	deco_results					; NO - show results
+
+	movff	simulator_time,char_I_dive_interval	; get the deco calculator runtime
+	call	deco_pull_tissues_from_vault	; restore the status of the real tissues (C-code)
+	call	deco_calc_dive_interval			; catch up with tissue desaturation      (C-code)
+	call	deco_calc_desaturation_time		; calculate desaturation and no-fly/no-altitude time after catch-up (C-code)
+	banksel	common							; back to bank common
+
+	bcf		switch_left						; clear left button event (may be left over from abort/exit)
+	bcf		simulatormode					; terminate simulator mode
+	bsf		reset_timebase					; request ISR to reset the timebase
+;	btfsc	reset_timebase					; has the ISR confirmed reset of timebase?
+;	bra		$-2								; NO - not yet, loop waiting for the ISR
+
+	btfsc	divemode						; shall go into dive mode?
+	goto	restart							; YES - goto restart which will dispatch further on to dive mode
+
+	btfss	trigger_timeout					; timeout on any button press?
+	bra		do_demo_planner_exit			; NO  - take normal exit into surface menu
+	bcf		trigger_timeout					; YES - clear timeout flag
+	bcf		restart_fast					;     - set next restart to be done slow, i.e. with logos
+	goto	sleeploop						;     - goto sleep mode
+
 do_demo_planner_exit:
-	goto	do_return_demo_planner
+	goto	do_return_demo_planner			; return to simulator menu
 
 
-deco_setup:
-	call	dive_boot_oc_bail				; basic setup for all modes
+;=============================================================================
+; Calculate the Deco Plan
+;
+deco_calculate:
+	call	request_speed_fastest			; request CPU speed change to fastest speed
+	call	TFT_ClearScreen					; clear screen to show that calculator is starting up
+
+	; initialization of the deco engine
+	btfsc	update_surface_pressure			; is there a pending surface pressure update?
+	bra		$-2								; YES - loop waiting for the ISR to kick in
+
+	; set mode and gases
+	call	dive_boot_oc_bail				; basic setup for all modes, also clears bailout_mode
+
+ IFDEF _ccr_pscr
 	btfsc	FLAG_oc_mode					; in OC mode?
 	call	dive_boot_oc					; YES - set up OC mode
 	btfss	FLAG_oc_mode					; in OC mode?
 	call	dive_boot_cc					; NO - set up CCR/pSCR mode
-
-	; use ambient conditions for deco calculation
-	SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface	; copy surface pressure to deco routine
-
-	movlw	deco_distance
-	movff	WREG,char_I_deco_distance
+ ELSE
+	call	dive_boot_oc					; set up OC mode
+ ENDIF
 
-	movff	opt_last_stop,char_I_depth_last_deco
-	movff	opt_GF_low,char_I_GF_Low_percentage
-	movff	opt_GF_high,char_I_GF_High_percentage
+	; set absolute pressure at selected depth
+	movff	char_I_bottom_depth,WREG		; get selected depth in meters
+	mullw	.100							; multiply with 100 to get relative pressure in mbar
+	movff	int_I_pres_surface+0,WREG		; low  byte - get surface pressure to WREG
+	addwf	PRODL,W							;           - add relative pressure
+	movff	WREG,int_I_pres_respiration+0	;           - store as absolute pressure at depth
+	movff	int_I_pres_surface+1,WREG		; high byte - get surface pressure to WREG
+	addwfc	PRODH,W							;           - add relative pressure
+	movff	WREG,int_I_pres_respiration+1	;           - store as absolute pressure at depth
 
-	; overwrite GF if aGF is wanted
-	bsf		use_agf							; set flag to use alternative GF factors by default
-	TSTOSS	opt_sim_use_aGF					; shall use alternative GF factors?
-	bcf		use_agf							; NO - clear flag again
-
-	btfsc	use_agf							; =1: use aGF
-	movff	opt_aGF_low,char_I_GF_Low_percentage
-	btfsc	use_agf							; =1: use aGF
-	movff	opt_aGF_high,char_I_GF_High_percentage
+	; set deco stop settings
+	movlw	deco_distance							; get deco distance safety factor
+	movff	WREG,char_I_deco_distance				; write deco distance safety factor to deco engine
+	movff	opt_last_stop,char_I_depth_last_deco	; write last stop depth to deco engine
 
-	; setup char_I_const_ppO2 for CC modes
-	clrf	WREG
-	btfsc	FLAG_pscr_mode
-	movff	WREG,char_I_const_ppO2			; configure pSCR computations to calculated ppO2
-	btfss	FLAG_ccr_mode
-	return									; done if not in CCR mode
-	movff	opt_sim_setpoint_number,WREG	; configure CCR computations to selected setpoint
-	decf	WREG,W							; 1-5 -> 0-4
-	lfsr	FSR1,char_I_setpoint_cbar		; load base address of setpoint list
-	movff	PLUSW1,char_I_const_ppO2		; setup setpoint
-	return
+	; set GF factors
+	movff	opt_GF_low, char_I_GF_Low_percentage	; load normal GF factors by default
+	movff	opt_GF_high,char_I_GF_High_percentage	; ...
+	TSTOSS	opt_sim_use_aGF							; shall use alternative GF factors in simulation?
+	bra		deco_calculate_1						; NO  - keep normal GF factors
+	movff	opt_aGF_low ,char_I_GF_Low_percentage	; YES - overwrite with alternative GF factors
+	movff	opt_aGF_high,char_I_GF_High_percentage	;     - ...
+
+deco_calculate_1:
 
-;=============================================================================
-; Launch deco planning
-;
-		global	deco_planer
-deco_planer:
-	call	speed_fastest					; quick!
-	call	TFT_ClearScreen					; clear screen to show that calculator is starting up
-	call	deco_push_tissues_to_vault		; C-code: back-up state of the real tissues
-	banksel	common
-	rcall	deco_setup						; setup all model parameters
+ IFDEF _ccr_pscr
+	; set char_I_const_ppO2 for pSCR/CCR mode
+	clrf	WREG							; load coding for pSCR calculated ppO2
+	btfsc	FLAG_pscr_mode					; in pSCR mode?
+	movff	WREG,char_I_const_ppO2			; YES - configure pSCR computations to calculated ppO2
+	btfss	FLAG_ccr_mode					; in CCR mode?
+	bra		deco_calculate_2				; NO  - skip next
+	movff	opt_sim_setpoint_number,WREG	; YES - get selected setpoint
+	decf	WREG,W							;     - 1-5 -> 0-4
+	lfsr	FSR1,opt_setpoint_cbar			;     - load base address of setpoint list
+	movff	PLUSW1,char_I_const_ppO2		;     - configure setpoint value
+ ENDIF
 
-;---- Specific settings ------------------------------------------------------
+deco_calculate_2:
 
-	; configure the deco engine for normal plan, CNS & gas volume calculation and no delayed ascent
-	movff	char_O_deco_status,lo			; bank-safe copy
-	bcf		lo,DECO_PLAN_FLAG				; normal plan mode,
-	bsf		lo,DECO_VOLUME_FLAG				; enable gas volume calculation, and
-	bcf		lo,DECO_ASCENT_FLAG				; disable delayed ascent calculation
-	movff	lo,char_O_deco_status			; bank-safe copy back
+	; configure the deco engine - char_O_main_status
+	movff	char_O_main_status,hi			; get the configuration set by dive_boot_oc / dive_boot_cc
+	bsf		hi,DECO_VOLUME_FLAG				; enable gas volume calculation
+	bsf		hi,DECO_BOTTOM_FLAG				; include bottom segment into gas needs
+	bcf		hi,DECO_CAVE_MODE				; cave mode not supported in deco calculator
+	bcf		hi,DECO_Z_FACTOR_FLAG			; disable Z factors by default
+	TSTOSC	opt_ZfactorUse					; shall use Z factors?
+	bsf		hi,DECO_Z_FACTOR_FLAG			; YES - enable Z factors
+	bcf		hi,DECO_EXTENDED_STOPS			; disable extended stops by default
+	TSTOSC	opt_extended_stops				; shall make extended stops?
+	bsf		hi,DECO_EXTENDED_STOPS			; YES - activate extended stops
+	bcf		hi,DECO_TR_FUNCTIONS			; execution of TR functions is not needed in deco calculator mode
+	movff	hi,char_O_main_status			; bank-safe copy to deco engine control
 
-	; configure the deco engine for total-dive gas volume calculation
-	movff	char_O_main_status,hi			; bank-safe copy
-	bcf		hi,DECO_TR_FUNCTIONS			; execution of TR functions is not needed in deco calculator mode
-	bsf		hi,DECO_BOTTOM_FLAG				; set bottom flag
-	bsf		hi,DECO_Z_FACTOR_FLAG			; enable use of Z factor by default
-	TSTOSS	opt_ZfactorUse					; shall use Z factor?
-	bcf		hi,DECO_Z_FACTOR_FLAG			; NO - disable again
-	movff	hi,char_O_main_status			; bank-safe copy back
+	; configure the deco engine - char_O_deco_status
+	movff	char_O_deco_status,lo			; get the configuration set by dive_boot_oc / dive_boot_cc
+	bcf		lo,DECO_START_NORM				; clear flag for normal      plan mode
+	bcf		lo,DECO_START_ALT				; clear flag for alternative plan mode
+	bsf		lo,DECO_INITIALIZE				; set   flag for once-per-dive initialization
+	bcf		lo,DECO_BAILOUT_FLAG			; no gas switches before first deco stop
+	bcf		lo,DECO_ASCENT_FLAG				; no delayed ascent
+	movff	lo,char_O_deco_status			; bank-safe copy to deco engine control
+
+deco_calculate_redo:
+
+	call	request_speed_fastest			; request CPU speed change to fastest speed (again, if in redo)
 
-deco_planer_redo:
-	; show deco calculation is in progress
-	call	TFT_ClearScreen
-	WIN_COLOR	color_greenish
-	TEXT_SMALL	.20,.40, tCalculating
-	WIN_COLOR	color_lightblue
-	WIN_SMALL	.1,.215
-	STRCPY_TEXT_PRINT tAbort
-
-	; configure the deco engine for initialization
-	movff	char_O_deco_status,lo			; bank-safe copy
-	bsf		lo,DECO_STATUS_0_FLAG			; configure init ...
-	bsf		lo,DECO_STATUS_1_FLAG			; ... state,
-	movff	lo,char_O_deco_status			; bank-safe copy back
+	; show that the deco calculation is in progress
+	call		TFT_ClearScreen				; clear screen from last results
+	WIN_COLOR	color_lightblue				; select color for abort label
+	TEXT_SMALL	.1,.215, tAbort				; print abort label
+	WIN_COLOR	color_white					; select color for title and progress outputs
+	TEXT_SMALL	.0, .40, tCalculating		; print "Calculating..."
 
-;---- add delay at surface, if requested -------------------------------------
-	banksel	char_I_dive_interval
-	tstfsz	char_I_dive_interval
-	call	deco_calc_dive_interval
+	; calculated the surface interval
+	TSTOSS	opt_surface_interval						; surface interval > 0 ?
+	bra		deco_calculate_bottom						; NO  - continue with bottom segment
+	TEXT_SMALL	.20,.75, tCalcSurfInter					; YES - print what we are doing
+	movff	opt_surface_interval,char_I_dive_interval	;     - copy surface interval to deco engine
+	call	deco_calc_dive_interval						;     - calculate surface interval  (C-code)
+	banksel	common										;     - back to bank common
 
-;---- Dive loop --------------------------------------------------------------
-	; compute dive ambient conditions
-	banksel	char_I_bottom_depth
-	movf	char_I_bottom_depth,W
-	mullw	.100
-	movlw	LOW (.1000)
-	addwf	PRODL,W
-	movwf	int_I_pres_respiration+0
-	movlw	HIGH(.1000)
-	addwfc	PRODH,W
-	movwf	int_I_pres_respiration+1
+	; calculate the bottom segment
+deco_calculate_bottom:
+	; advance tissues by selected bottom time,
+	; char_I_sim_advance_time is cleared by deco engine after execution
+	movff	char_I_bottom_time,char_I_sim_advance_time
+
+	TEXT_SMALL	.20,.100, tCalcBotSeg		; print what we are doing
+
+	; invoke the deco engine once to condition the real tissues
+	; to their pressure state at the end of the bottom segment
+	call	deco_calc_hauptroutine			; (C-code)
 	banksel	common
 
-	movff	char_I_bottom_time,char_I_sim_advance_time
-
-	clrf	TMR5L							; restart timer used to preempt stops calculation
-	clrf	TMR5H							;
-
-	call	deco_calc_hauptroutine			; initialization, complete bottom time part and initial ascent
-	banksel	common
-
-	btfss	FLAG_bailout_mode				; doing a bailout deco plan?
-	bra		deco_planer_loop				; NO  - keep gases and go on
-											; YES - switch to OC gas and restart deco plan
+ IFDEF _ccr_pscr
+	; conditional switch to bailout mode
+	btfss	bailout_mode					; shall calculate a bailout plan?
+	bra		deco_calculate_ascent			; NO  - skip next
 
-;---- BAILOUT: Switch to OC gases for ascent -----------------------------------
+	call	dive_boot_oc					; YES - switch to OC mode and gases
+	movff	char_O_main_status,hi			;     - bank-safe copy from deco engine control (main status)
+	bcf		hi,DECO_BOTTOM_FLAG				;     - exclude bottom segment from gas needs, i.e. calculate ascent needs only
+	movff	hi,char_O_main_status			;     - bank-safe copy back to deco engine control
+	movff	char_O_deco_status,lo			;     - bank-safe copy from deco engine control (deco status)
+	bsf		lo,DECO_BAILOUT_FLAG			;     - allow gas switches before first deco stop
+	bsf		lo,DECO_ASCENT_FLAG				;     - allow delayed ascent
+	movff	lo,char_O_deco_status			;     - bank-safe copy back to deco engine control
 
-	; reconfigure the deco engine for delayed ascent & bailout mode and start a new calculation cycle
-	movff	char_O_deco_status,lo			; bank-safe copy
-	bsf		lo,DECO_ASCENT_FLAG				; set flag for delayed ascent calculation
-	bsf		lo,DECO_BAILOUT_FLAG			; set bailout mode flag to allow gas changes on initial ascent
-	bcf		lo,DECO_STATUS_0_FLAG			; configure start of a new...
-	bcf		lo,DECO_STATUS_1_FLAG			; ... deco calculation cycle
-	movff	lo,char_O_deco_status			; bank-safe copy back
-
-	; reconfigure the deco engine for bailout ascent needs
-	movff	char_O_main_status,hi			; bank-safe copy
-	bcf		hi,DECO_BOTTOM_FLAG				; clear bottom flag
-	movff	hi,char_O_main_status			; bank-safe copy back
+	TEXT_SMALL	.20,.125, tCalcBailout		;     - print what we are doing
+ ENDIF
 
-	; reconfigure gas settings to OC gases
-	call	dive_boot_oc					; configure deco engine for OC mode
-
-;---- Wait until status reaches zero -------------------------------------------
-deco_planer_loop:
-	clrf	TMR5L							; restart timer used to preempt stops calculation
-	clrf	TMR5H							;
-	call	deco_calc_hauptroutine			; simulate more dive time to trigger the deco calculations
-	banksel	common
+	; calculate ascent
+deco_calculate_ascent:
+	movff	char_O_deco_status,lo			; bank-safe copy from deco engine control
+	bsf		lo,DECO_START_NORM				; start calculation of a normal plan
+	movff	lo,char_O_deco_status			; bank-safe copy back to deco engine control
+	TEXT_SMALL	.20,.150, tCalcAscent		; print what we are doing
+deco_calculate_loop:
+	btfsc	switch_left						; was the left button pressed?
+	bra		deco_calculate_abort			; YES - set abort flag, do some clean-up and return
+	call	deco_calc_hauptroutine			; NO  - invoke the deco engine so that it can do the deco calculation  (C-code)
+	banksel	common							;     - back to bank common
+	movff	char_O_depth_sim,lo				;     - get the depth reached (in meters)
+	WIN_SMALL .70,.150						;     - set output position
+	output_8								;     - print depth reached (in meters)
+	STRCAT	" m"							;     - print unit (meters)
+	btg		decoplan_toggleflag				;     - toggle the toggle flag
+	btfsc	decoplan_toggleflag				;     - toggle flag set?
+	bra		deco_calculate_loop_1			;       YES - print ". "
+	STRCAT_PRINT " ."						;       NO  - print " ."
+	bra		deco_calculate_loop_2			;
+deco_calculate_loop_1:						;
+	STRCAT_PRINT ". "						;
+deco_calculate_loop_2:						;
+	movff	char_O_deco_status,lo			;     - get deco calculation status
+	btfss	lo,DECO_COMPLETED_NORM			;     - deco calculation completed?
+	bra		deco_calculate_loop				;       NO  - loop
+	movff	char_O_deco_warnings,decoplan_warnings; YES - copy warnings for later display
+	bra		deco_calculate_finish			;           - do some clean-up and return
+deco_calculate_abort:
+	bcf		switch_left						; clear button event
+	bsf		decoplan_abort					; set abort flag
+deco_calculate_finish:
+	goto	request_speed_normal			; request switch back to normal speed and return to deco calculator main function
 
-	btfss	switch_left						; check if left button was pressed
-	bra		deco_planer_finishing_1			; NO  - continue calculations
-	bsf		decoplan_abort					; YES - set abort flag so that deco_show_plan will not be called
-	bra		deco_planer_finishing_2			;       do some clean-up and return
-deco_planer_finishing_1:
-	movff	char_O_main_status,hi			; working copy of char_O_main_status in bank common
-	btfss	hi,DECO_COMPLETED_NORM			; calculations completed?
-	bra		deco_planer_loop				; NO - needs more computation cycles
-
-;---- Done: add CNS from decoplan, and restore tissues
-deco_planer_finishing_2:
-	movff	char_O_deco_warnings,decoplan_warnings	; copy warnings
-
-	call	deco_pull_tissues_from_vault	; C-code: restore status of the real tissues
-	banksel	common							; back to bank 1
-
-	movlw	b'00111000'						; 1:8 Prescaler -> 65,536ms@16MHz
-	movwf	T3CON
-	goto	speed_normal					; (and return)
 
 ;-----------------------------------------------------------------------------
-; Draw a stop of the deco plan (simulator or dive).
+; Draw a stop of the deco plan (simulator or dive)
 ; Inputs:  lo      = depth
 ;          hi      = minutes
 ;          win_top = line to draw on screen.
@@ -245,250 +297,223 @@
 ;          WREG, PROD, TBLPTR TABLAT.
 ;
 deco_plan_show_stop:
-	;---- Print depth ----------------------------------------------------
-	lfsr	FSR2,char_O_deco_gas		; needed to be initialized here every time because...
-	movf	decoplan_gindex,W			; ...FSR2 is also used for string operations
-	movff	PLUSW2,WREG					; get current gas and copy it to WREG for color-coding
-	call	TFT_color_code_gas			; set output color dependent on gas (1-5)
+	; print depth
+	lfsr	FSR2,char_O_deco_gas			; needed to be initialized here every time because...
+	movf	decoplan_gindex,W				; ...FSR2 is also used for string operations
+	movff	PLUSW2,WREG						; get current gas and copy it to WREG for color-coding
+	call	TFT_color_code_gas				; set output color dependent on gas (1-5)
 
-	lfsr	FSR2,buffer
+	lfsr	FSR2,buffer						; set up output buffer
 
-	TSTOSS	opt_units					; 0=Meter, 1=Feet
-	bra		deco_plan_show_nstd_stop_metric
-
-	movff	hi,ul						; back-up hi (minutes)
+	TSTOSS	opt_units						; 0=Meter, 1=Feet
+	bra		deco_plan_show_nstd_stop_metric	; 0 - do metric
+											; 1 - do imperial
+	movff	hi,ul							; back-up hi (minutes)
 	WIN_LEFT .80
-	movf	lo,W						; lo = m
-	mullw	.100						; PRODL:PRODH = hPa
-	movff	PRODL,lo
-	movff	PRODH,hi
-	; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops...
-	movff	lo,xA+0
-	movff	hi,xA+1
-	movlw	LOW  d'334'					; 334feet/100m
-	movwf	xB+0
-	movlw	HIGH d'334'
-	movwf	xB+1
-	call	mult16x16					; xA*xB=xC (lo:hi * 328)
-	movlw	d'50'						; round up
-	addwf	xC+0,F
-	movlw	.0
-	addwfc	xC+1,F
-	addwfc	xC+2,F
-	addwfc	xC+3,F
-	movlw	d'100'
-	movwf	xB+0
-	clrf	xB+1
-	call	div32x16					; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
-	movff	xC+0,lo
-	movff	xC+1,hi						; restore lo and hi with updated value
-	bsf		ignore_digit4				; only full feet
-	output_16
+	call	convert_meter_to_feet			; convert value in lo from meters to feet
+	output_16_3								; limit output to 0...999
 	STRCAT_PRINT "ft"
-	movff	ul,hi						; restore hi (minutes)
+	movff	ul,hi							; restore hi (minutes)
 	bra		deco_plan_show_nstd_stop_common
 
 deco_plan_show_nstd_stop_metric:
 	WIN_LEFT .85
-	output_8							; outputs into postinc2
+	output_8								; outputs into postinc2
 	STRCAT_PRINT "m"
 
 deco_plan_show_nstd_stop_common:
-	;---- Print duration -------------------------------------------------
+
+	; print duration
 	WIN_LEFT .135
 	lfsr	FSR2,buffer
 	movff	hi,lo
-	output_99							; stop entries are 99 min max.
+	output_99								; stop entries are 99 min max.
 	STRCAT_PRINT "'"
 
-	;---------------------------------------------------------------------
-	; Draw the bar graph used for deco stops (deco plan in simulator or dive)
+	; draw the bar graph used for deco stops (lo = minutes)
 	incf	win_top,F
 	movlw	.19
 	movwf	win_height
 	movlw	.118
-	movwf	win_leftx2					; column left (0-159)
-	movlw	.16
-	movwf	win_width+0					; column max width
-	clrf	win_width+1
+	movwf	win_leftx2						; column left (0-159)
+	MOVLI	.16,win_width					; column max width
+;	movlw	.16								; limit length to max. column width - not needed, done by TFT_box
+;	cpfslt	lo
+;	movwf	lo
+	incf	lo,W							; add 1 for a minimum visible active bargraph area
+	movwf	win_bargraph					; set width of the active bargraph area
+	call	TFT_box							; draw bargraph
 
-	; Draw used area (lo = minutes):
-	movlw	.16							; limit length to max. column width
-	cpfslt	lo
-	movwf	lo
-	movff	lo,win_bargraph				; active width, the rest is cleared
-	call	TFT_box
-
-	; Restore win_top
+	; restore win_top
 	call	TFT_standard_color
-	decf	win_top,F					; restore win_top
+	decf	win_top,F						; restore win_top
 	return
 
 ;-----------------------------------------------------------------------------
 ; Clear unused area below last stop
-; Inputs: win_top : last used area...
+; Inputs: win_top : last used area
+;
 deco_plan_show_clear_bottom:
-	movf	win_top,W					; get back from bank0
-	sublw	.239						; bottom row in planning
+	movf	win_top,W						; get back from bank0
+	sublw	.239							; bottom row in planning
 	movwf	win_height
 
-	WIN_LEFT .85						; full dive menu width
-	movlw	.159-.85+.1
-	movwf	win_width+0
-	clrf	win_width+1
+	WIN_LEFT .85							; full dive menu width
+	MOVLI	.75,win_width					; .159-.85+.1
 
-	clrf	win_color1					; fill with black
+	clrf	win_color1						; fill with black
 	clrf	win_color2
 
-	goto	TFT_box						; and return
+	goto	TFT_box							; and return
 
 ;-----------------------------------------------------------------------------
-; Display the deco plan (simulator).
+; Display the deco plan (simulator)
 ; Inputs: char_O_deco_table (array of stop times, in minutes)
 ;         decoplan_page = page number.
 ;
-deco_show_plan_page:
-	bcf		win_invert					; reset invert flag
+deco_results_page:
+	bcf		win_invert						; reset invert flag
+	WIN_COLOR color_greenish
+ IFDEF _ccr_pscr
+	btfss	bailout_mode					; bailout results?
+	bra		deco_results_page_1				; NO
+	TEXT_SMALL .80,.1, tDiveBailout			; YES
+	bra		deco_results_page_2
+ ENDIF
+deco_results_page_1:
+	TEXT_SMALL .80,.1, tDivePlan
+deco_results_page_2:
+	movff	char_O_deco_depth,WREG			; get depth of the first deco stop
+	iorwf	WREG							; is there at least one deco stop?
+	bnz		deco_plan_show_1				; YES
 
-	;---- Are there deco stops ? ------------------------------------------
-	movff	char_O_first_deco_depth,WREG
-	iorwf	WREG
-	bnz		deco_plan_show_1
-
-	;---- No Deco --------------------------------------------------------
+	;---- no deco --------------------------------------------------------
 	call	TFT_standard_color
-	TEXT_SMALL .80, .0, tNoDeco
+	TEXT_SMALL .80, .25, tNoDeco
 
 	; output of remaining NDL time
-	WIN_SMALL	.80, .50				; same line as bottom time
-	movff	char_O_nullzeit,lo			; remaining NDL at end of bottom time
+	WIN_SMALL .80, .50						; same line as bottom time
+	movff	char_O_NDL_norm,lo				; get NDL time in normal plan
 	output_8
 	PUTC	"'"
 	PUTC	" "
-	STRCAT_TEXT_PRINT tNDLleft			; "left"
+	STRCAT_TEXT_PRINT tNDLleft				; "left"
 
-	bsf		decoplan_last_ceiling_shown
+	bsf		decoplan_last_stop_shown
 	return
 
+	;---- deco stops ---------------------------------------------------------
 deco_plan_show_1:
-	lfsr	FSR0,char_O_deco_depth		; initialize indexed addressing
+	lfsr	FSR0,char_O_deco_depth			; initialize indexed addressing
 	lfsr	FSR1,char_O_deco_time
 
-	clrf	decoplan_index				; start with index = 0
+	clrf	decoplan_index					; start with index = 0
 	movlw	.24
-	movwf	win_top						; and row = 0 at position 24
+	movwf	win_top							; and row = 0 at position 24
 
-	; Read stop parameters, indexed by decoplan_index and decoplan_page
-	movf	decoplan_page,W				; decoplan_gindex = 6*decoplan_page + decoplan_index
-	mullw	.8							; 8 lines/page in deco plan
+	; read stop parameters, indexed by decoplan_index and decoplan_page
+	movf	decoplan_page,W					; decoplan_gindex = 6*decoplan_page + decoplan_index
+	mullw	.8								; 8 lines/page in deco plan
 	movf	decoplan_index,W
 	addwf	PRODL,W
-	movwf	decoplan_gindex				; --> decoplan_gindex
+	movwf	decoplan_gindex					; --> decoplan_gindex
 
-	bcf		decoplan_last_ceiling_shown	; not done yet...
+	bcf		decoplan_last_stop_shown		; not done yet...
 
 deco_plan_show_2:
-	btfsc	decoplan_gindex,5			; reached table length (32) ?
-	bra		deco_plan_show_99			; YES - done
+	btfsc	decoplan_gindex,5				; reached table length (32) ?
+	bra		deco_plan_show_99				; YES - done
 
-	; Read stop parameters, indexed by decoplan_index
-	movf	decoplan_gindex,W			; index
-	movff	PLUSW0,lo					; char_O_deco_depth[gindex]
-	movff	PLUSW1,hi					; char_O_deco_time [gindex]
+	; read stop parameters, indexed by decoplan_index
+	movf	decoplan_gindex,W				; index
+	movff	PLUSW0,lo						; char_O_deco_depth[decoplan_gindex]
+	movff	PLUSW1,hi						; char_O_deco_time [decoplan_gindex]
 	movf	lo,W
-	bz		deco_plan_show_99			; depth == 0 : done
+	bz		deco_plan_show_99				; depth == 0 -> done
 
-	; Display the stop line
+	; display the stop line
 	rcall	deco_plan_show_stop
 
-	; Next
+	; next
 	movlw	.24
-	addwf	win_top,F					; row: += 24
-	incf	decoplan_index,F			; local index += 1
-	incf	decoplan_gindex,F			; global index += 1
+	addwf	win_top,F						; row: += 24
+	incf	decoplan_index,F				; local index += 1
+	incf	decoplan_gindex,F				; global index += 1
 
-	; Max number of lines/page reached ?
-	movlw	.8							; 8 lines/page in deco plan
+	; max number of lines/page reached?
+	movlw	.8								; 8 lines/page in deco plan
 	cpfseq	decoplan_index
-	bra		deco_plan_show_2			; NO - loop
+	bra		deco_plan_show_2				; NO - loop
 
-	; Check if next stop is end-of-list ?
+	; check if next stop is end-of-list?
 	movf	decoplan_gindex,W
-	movf	PLUSW0,W					; char_O_deco_depth[gindex]
-	bz		deco_plan_show_99			; end of list
+	movf	PLUSW0,W						; char_O_deco_depth[decoplan_gindex]
+	bz		deco_plan_show_99				; end of list
 
-	; Display the message "more..."
-	rcall	deco_plan_show_clear_bottom	; clear from next line
+	; display the message "more..."
+	rcall	deco_plan_show_clear_bottom		; clear from next line
 
 	call	TFT_standard_color
 	TEXT_SMALL .88, .220, tMore
 	return
 
 deco_plan_show_99:
-	bsf		decoplan_last_ceiling_shown ; nothing more in table to display
-	rcall	deco_plan_show_clear_bottom ; clear from next line
+	bsf		decoplan_last_stop_shown		; nothing more in table to display
+	rcall	deco_plan_show_clear_bottom		; clear from next line
+	call	TFT_standard_color
 	return
 
-;-----------------------------------------------------------------------------
-; Loop to show all pages of the deco plan (surface mode)
-
-	global	deco_show_plan
-deco_show_plan:
-	clrf	decoplan_page
+;=============================================================================
+; Show Deco Calculation Results
+;
+deco_results:
 	call	TFT_ClearScreen
-	WIN_COLOR color_greenish
-	btfsc	FLAG_bailout_mode
-	bra		deco_show_plan_bail_title
-	TEXT_SMALL .1,.1, tDivePlan
-	bra		deco_show_plan2
-deco_show_plan_bail_title:
-	TEXT_SMALL .1,.1, tDiveBailout
-deco_show_plan2:
 	call	TFT_standard_color
-	;---- Display Plan Parameters
+
+	; display plan parameters
 	WIN_SMALL .0,.25
-	STRCPY	"Int.:"
+	STRCPY	"Int. :"
 	movff	char_I_dive_interval,lo
-	bsf		leftbind
 	output_8
-	bcf		leftbind
 	STRCAT_PRINT "'"
 	WIN_SMALL .0,.50
 	STRCPY_TEXT tBtTm_short
 	movff	char_I_bottom_time,lo
-	bsf		leftbind
 	output_8
-	bcf		leftbind
 	STRCAT_PRINT "'"
 	WIN_SMALL .0,.75
 	STRCPY_TEXT tDepth
 	PUTC	":"
 	movff	char_I_bottom_depth,lo
-	bsf		leftbind
 	output_8
-	bcf		leftbind
 	STRCAT_PRINT "m"
 	WIN_SMALL .0,.105								; set position for warnings or sat/dsat factors
 
-	;---- Check for Stop Table Overflow
+	; check for stop table overflow
 	btfss	decoplan_warnings,stoptable_overflow	; check if we have a overflow warning
-	bra		deco_show_plan2a						; NO  - skip
-	;---- Display Overflow warning
-	call	TFT_warnings_color						; YES - show overflow warning
+	bra		deco_results_0a							; NO  - skip
+
+	; display overflow warning
+	call	TFT_warning_color						; YES - show overflow warning
 	STRCAT_PRINT "incomplete"						; max 10 characters
-	bra		deco_show_plan_m1						; skip displaying sat/dsat factors
+	bra		deco_results_m1							; skip displaying sat/dsat factors
+
+deco_results_0a:
 
-deco_show_plan2a:
-	;---- Check for IBCD Warning
+ IFDEF _helium
+	; check for IBCD warning
 	btfss	decoplan_warnings,IBCD_warning_lock		; check if we have a locked IBCD warning
-	bra		deco_show_plan2b						; NO  - skip
-	;---- Display IBCD warning
+	bra		deco_results_2b							; NO  - skip
+
+	; display IBCD warning
 	call	TFT_attention_color						; YES - show IBCD warning
 	STRCAT_PRINT "IBCD!"							; max 10 characters
-	bra		deco_show_plan_m1						; skip displaying sat/dsat factors
+	bra		deco_results_m1							; skip displaying sat/dsat factors
+ ENDIF
 
-deco_show_plan2b:
-	;---- Display Sat/Desat Factors --> omitted if there were warnings
+deco_results_2b:
+
+	; display Sat/Desat factors --> omitted if there were warnings
 	STRCAT_PRINT "SD:"
 	WIN_SMALL .25,.105
 	movff	char_I_saturation_multiplier,lo
@@ -498,15 +523,16 @@
 	output_8
 	STRCAT_PRINT ""
 
-deco_show_plan_m1:
+deco_results_m1:
+
 	call	TFT_standard_color				; clean-up from warnings
 
-	;---- get Model
-	movff	char_I_deco_model,WREG
-	iorwf	WREG
-	bz		deco_show_plan_m2
+	; get model
+	movff	char_I_deco_model,WREG			; 0: straight Buhlmann, 1: with GF
+	iorwf	WREG							; GF factors in use?
+	bz		deco_results_m2					; NO
 
-	;---- Display GF low/high values
+	; display GF low/high factors
 	WIN_SMALL .0,.130
 	STRCAT_PRINT "GF:"
 	WIN_SMALL .25,.130
@@ -517,14 +543,17 @@
 	output_8
 	STRCAT_PRINT ""
 
-deco_show_plan_m2:
-	;---- Display Deco Mode
+deco_results_m2:
+
+	; display deco mode
 	WIN_SMALL .0,.155
 	lfsr	FSR2,buffer
-	movff	opt_dive_mode,lo				; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR
-	call	TFT_display_decotype_surface1
+	movff	opt_dive_mode,lo				; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=pSCR
+	call	TFT_decotype_logbook
+
+ IFDEF _ccr_pscr
 	btfss	FLAG_ccr_mode					; current dive mode = CCR ?
-	bra		deco_show_plan2c				; NO  - branch
+	bra		deco_results_2c					; NO - skip
 	WIN_SMALL .25,.155
 	STRCPY	"SP:"							; output setpoint used for calculation
 	movff	opt_sim_setpoint_number,lo
@@ -532,31 +561,39 @@
 	output_8
 	bcf		leftbind
 	STRCAT_PRINT ""
+ ENDIF
 
-deco_show_plan2c:
-	;---- Display TTS result
+deco_results_2c:
+
+	btfss	FLAG_oc_mode					; current dive mode = OC ?
+	bra		deco_results_2d					; NO  - skip
+	TSTOSS	opt_extended_stops				; YES - extended stops activated?
+	bra		deco_results_2d					;       NO  - skip
+	WIN_SMALL .18,.155						;       YES - set position
+	STRCAT_PRINT "ext.Stop"					;           - print notice
+
+deco_results_2d:
+
+	; display TTS result
 	WIN_SMALL .0,.180
 	STRCPY_TEXT tTTS
 	STRCAT	": "
-	movff	int_O_ascenttime+0,lo
-	movff	int_O_ascenttime+1,hi
+	MOVII	int_O_TTS_norm,mpr
 	bsf		leftbind
 	output_16
 	bcf		leftbind
 	STRCAT_PRINT "'"
 
-	;---- Display CNS result
+	; display CNS result
 	WIN_TOP	.205
 	STRCPY_TEXT tCNS2						; "CNS:"
-	movff	int_O_CNS_fraction+0,lo
-	movff	int_O_CNS_fraction+1,hi
+	MOVII	int_O_CNS_current,mpr			; get current CNS
 	call	TFT_color_code_cns				; color-code CNS output
 	bsf		leftbind
 	output_16_3								; limit to 999 and display only (0-999)
 	bcf		leftbind
 	STRCAT	"%\x92"							; "->"
-	movff	int_O_normal_CNS_fraction+0,lo
-	movff	int_O_normal_CNS_fraction+1,hi
+	MOVII	int_O_CNS_norm,mpr				; get CNS at end of dive in normal plan
 	call	TFT_color_code_cns				; color-code CNS output
 	bsf		leftbind
 	output_16_3								; limit to 999 and display only (0-999)
@@ -564,124 +601,154 @@
 	STRCAT_PRINT "%"
 	call	TFT_standard_color
 
-	;---- Loop through pages
-deco_show_plan_1:
-	; Clear the complete stop result column:
-	WIN_BOX_BLACK .0, .239, .80, .159		; top, bottom, left, right
-
-	rcall	deco_show_plan_page
-	incf	decoplan_page,F
-	call	logbook_preloop_tasks
-deco_show_plan_2:
-	btfsc	switch_right
-	bra		deco_show_plan_3
-	btfsc	switch_left
-	return									; return to simulator menu
-	call	log_screendump_and_onesecond	; check if we need to make a screen shot and check for new second
-	btfsc	sleepmode						; timeout?
-	goto	restart
-	bra		deco_show_plan_2
-
-deco_show_plan_3:
-	btfss	decoplan_last_ceiling_shown
-	bra		deco_show_plan_1
-	; all stops shown
-
-;----in CCR and pSCR mode, compute a BAILOUT deco plan -----------------------
-	movff	char_O_deco_status,WREG			; get deco calculation status
-	btfss	WREG,DECO_MODE_LOOP_FLAG		; check if in CCR or pSCR mode
-	bra		simulator_show_decoplan5_0		; NO  - normal OC mode: just display
-	bsf		FLAG_bailout_mode				; YES - redo 2nd deco-plan in bailout mode
-	rcall	deco_planer_redo				;       redo plan computation
-
-	btfss	decoplan_abort					; shall we abort?
-	bra		deco_show_plan					; NO  - display bailout stops
+	; loop through deco plan pages
+deco_results_1:
+	clrf	decoplan_page					; start from first page
+	bcf		decoplan_pressures_shown		; when showing the gas needs, start with volumes (liter)
+deco_results_1a:
+	WIN_BOX_BLACK .0, .239, .80, .159		; clear the complete stop result column (top, bottom, left, right)
+	rcall	deco_results_page				; show a results page
+	incf	decoplan_page,F					; increment results page number
+	call	reset_timeout_surfmode			; reset timeout
+	bcf		switch_right					; clear left-over right button event
+	bcf		switch_left						; clear left-over left  button event
+deco_results_2:
+	btfsc	switch_right					; right button pressed?
+	bra		deco_results_3					; YES - show further results
+	btfsc	switch_left						; left button pressed?
+	return									; YES - return to deco calculator main function
+	call	housekeeping					; NO to both - handle screen dump request, timeout and need to enter dive mode
+	btfsc	divemode						; shall go into dive mode?
+	bsf		decoplan_abort					; YES - set abort flag
+	btfsc	trigger_timeout					; timeout on any button press?
+	bsf		decoplan_abort					; YES - set abort flag
+	btfss	decoplan_abort					; shall abort?
+	bra		deco_results_2					; NO  - loop
 	return									; YES
 
-
-;---- in OC+BAIL modes, show the gas usage special page -----------------------
-simulator_show_decoplan5_0:
-	; Clear the complete stop result column:
-	WIN_BOX_BLACK .0, .239, .80, .159		; top, bottom, left, right
+deco_results_3:
+	btfss	decoplan_last_stop_shown		; was the last stop shown already?
+	bra		deco_results_1a					; NO - loop
 
-	movlw	.25
-	movwf	row_pos							; row for gas list is .25+.25
-	clrf	gas_counter						; gas counter
-	lfsr	FSR0,int_O_ascent_volumes		; initialize indexed addressing
+ IFDEF _ccr_pscr
+	movff	char_O_deco_status,WREG			; YES - get deco calculation status
+	btfss	WREG,DECO_MODE_LOOP_FLAG		;     - check if calculation was made for loop mode (CCR/pSCR)
+	bra		deco_results_gas_volumes		;       NO  - normal OC mode or bailout mode, show gas needs
+	bsf		bailout_mode					;       YES - do a 2nd deco-plan in bailout mode
+	rcall	deco_calculate_redo				;           - redo deco calculation
+	btfss	decoplan_abort					;           - was the calculation aborted?
+	bra		deco_results					;             NO  - redo display of deco stops
+	return									;             YES - return to deco calculator main function
+ ENDIF
 
+	;---- show the gas needs (OC and bailout only) ---------------------------
+deco_results_gas_volumes:
+	lfsr	FSR0,int_O_gas_need_vol			; load base address of gas needs in volume
+
+deco_results_gas_common:
+	WIN_BOX_BLACK .0, .239, .80, .159		; clear the complete stop result column (top, bottom, left, right)
+	movlw	.25								; output row is 25 (fixed offset set here) + n*25 (line increment, see below)
+	movwf	output_row						; set fixed vertical offset for output row
 	WIN_LEFT .80							; set column
 	call	TFT_standard_color
-
-	bcf		FLAG_diluent_setup				; steer gaslist_strcat_gas to use OC gases
+	clrf	gas_index						; initialize gas counter
+	bcf		is_diluent_menu					; working on OC gases
 
-simulator_show_decoplan5_loop:
-	movff	gas_counter,PRODL				; copy to PRODL first
-	incf	gas_counter,F					; increment gas #
+deco_results_gas_loop:
+	movff	gas_index,PRODL					; copy gas index to PRODL (interface to gaslist_strcat_gas)
+	incf	gas_index,F						; increment gas index
 
-	movff	gas_counter,WREG				; copy current gas to WREG for color-coding
+	movf	gas_index,W						; copy gas index to WREG for color-coding
 	call	TFT_color_code_gas				; set output color according to gas (1-5)
 
-	lfsr	FSR2,buffer
-	bsf		short_gas_decriptions
-	bsf		divemode						; tweak "customview_show_mix:"
-	call	gaslist_strcat_gas				; input: PRODL : gas number (0..4), Output: "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2
-	bcf		divemode						; tweak "customview_show_mix:"
+	lfsr	FSR2,buffer						; load base address of output buffer
+	bsf		short_gas_descriptions			; configure gaslist_strcat_gas output format
+	bsf		divemode						; configure gaslist_strcat_gas output format
+	call	gaslist_strcat_gas				; write "Nxlo", "Txlo/hi", "Air" or "O2" into output buffer
+	bcf		divemode						; cleanup above
 
-	movlw	.25
-	addwf	row_pos,F						; increase row position
-	movff	row_pos,win_top					; set row
+	movlw	.25								; spacing between outputs
+	addwf	output_row,F					; increase row position
+	movff	output_row,win_top				; set      row position
 
-	movff	POSTINC0,lo						; read (16bit) result, low first,
-	movff	POSTINC0,hi						; then high
+	movff	POSTINC0,lo						; read gas volume low  byte
+	movff	POSTINC0,hi						;                 high byte
+
+	bcf		decoplan_overflow				; no overflow in gas needs by default
+
+	btfsc	decoplan_pressures_shown		; results in bar?
+	bra		deco_results_gas_volumes_1		; YES
 
-	movf	lo,W
-	andwf	hi,W
-	incf	WREG							; > 65535 ?
-	bnz		simulator_show_decoplan5_1		; NO
-	STRCAT_PRINT ">65500"					; YES
-	bra		simulator_show_decoplan5_2
+	; output of gas needs in liter
+	movf	lo,W							; check if hi:lo = 65535: copy low byte to WREG
+	andwf	hi,W							; and do a bitwise AND with the high byte
+	incfsz	WREG							; add 1, result zero now?
+	bra		deco_results_gas_volumes_2		; NO  - print volume
+	STRCAT_PRINT ">65500"					; YES - print ">65500"
+	bra		deco_results_gas_volumes_3		;     - continue checking if all gases are shown
 
-simulator_show_decoplan5_1:
-	PUTC	":"
-	bsf		leftbind
-	output_16								; no decimal anymore
-	bcf		leftbind
-	STRCAT_PRINT ""
+	; output of gas needs in bar
+deco_results_gas_volumes_1:
+	btfsc	hi,int_high_flag				; overflow in result?
+	bsf		decoplan_overflow				; YES - remember it
+	bcf		hi,int_high_flag				; clear flag for overflow in result
+	btfsc	hi,int_warning_flag				; gas needs above available amount?
+	bsf		win_invert						; YES - print in inverse
+	bcf		hi,int_warning_flag				; clear flag for gas needs above    available amount
+	bcf		hi,int_attention_flag			; clear flag for gas needs close to available amount
+	bcf		hi,int_invalid_flag				; clear flag for invalid data
+	bcf		hi,int_is_zero					; clear flag for zero
 
-	; Loop for all 5 gas
-simulator_show_decoplan5_2:
-	movlw	d'5'							; list all five gases
-	cpfseq	gas_counter						; all gases shown?
-	bra		simulator_show_decoplan5_loop	; NO - loop
-
-	WIN_COLOR color_greenish
+deco_results_gas_volumes_2:
+	PUTC	":"								; print ":"
+	output_16								; print 16 bit number
+	movlw	'>'								; load coding of ">" sign into WREG
+	btfsc	decoplan_overflow				; overflow in result?
+	movff	WREG,buffer+.7					; YES - place ">" before number
+	STRCAT_PRINT ""							; finalize output
+	bcf		win_invert						; back to none-inverse printing
 
-	WIN_SMALL .80,.25
-	STRCPY_TEXT tGasUsage					; "Gas Usage"
-	STRCAT_PRINT ":"
+deco_results_gas_volumes_3:
+	movlw	NUM_GAS							; 5 gases to show
+	cpfseq	gas_index						; all gases shown?
+	bra		deco_results_gas_loop			; NO - loop
+
+	WIN_COLOR color_greenish				; set color
+	TEXT_SMALL .80,.01,tGasUsage			; "Gas Usage"
 
-	WIN_SMALL .120,.175
-	STRCPY_TEXT_PRINT tLiterLong			; "Liter"
+	btfsc	decoplan_pressures_shown		; results shown in bar?
+	bra		deco_results_gas_volumes_4		; YES
+	TEXT_SMALL .120,.25,tLiterLong			; NO  - in Liter then
+	bra		deco_results_gas_volumes_5		;     - continue with initialization of housekeeping
 
-	call	TFT_standard_color
-	call	logbook_preloop_tasks
+deco_results_gas_volumes_4:
+	TEXT_SMALL .120,.25,tbar				; " bar" (with leading space)
 
-simulator_show_decoplan5_3:
-	btfss	switch_right
-	bra		simulator_show_decoplan5_3a
-	bcf		switch_right
-	clrf	decoplan_page
-	bra		deco_show_plan_1				; toggle between stops plan and gas usage
-simulator_show_decoplan5_3a:
-	btfss	switch_left
-	bra		simulator_show_decoplan5_4
-	bcf		FLAG_bailout_mode				; back to normal
-	return									; return to simulator menu
+deco_results_gas_volumes_5:
+	call	TFT_standard_color				; revert to standard color
+	call	reset_timeout_surfmode			; reset timeout
+	bcf		switch_right					; clear left-over right button event
+	bcf		switch_left						; clear left-over left  button event
+deco_results_gas_volumes_6:
+	btfsc	switch_right					; right button pressed?
+	bra		deco_results_gas_volumes_7		; YES - show results in bar or restart with deco stops again
+	btfsc	switch_left						; left button pressed?
+	return									; YES - return to deco calculator main function
+	call	housekeeping					; NO to both - handle screen dump request, timeout and need to enter dive mode
+	btfsc	divemode						; shall go into dive mode?
+	bsf		decoplan_abort					; YES - set abort flag
+	btfsc	trigger_timeout					; timeout on any button press?
+	bsf		decoplan_abort					; YES - set abort flag
+	btfss	decoplan_abort					; shall abort?
+	bra		deco_results_gas_volumes_6		; NO  - loop
+	return									; YES
 
-simulator_show_decoplan5_4:
-	call	log_screendump_and_onesecond	; check if we need to make a screen shot and check for new second
-	btfsc	sleepmode						; timeout?
-	goto	restart
-	bra		simulator_show_decoplan5_3
+deco_results_gas_volumes_7:
+	btfsc	decoplan_pressures_shown		; results shown in bar?
+	bra		deco_results_1					; YES - show deco stops again
+	bsf		decoplan_pressures_shown		; NO  - but now
+	lfsr	FSR0,int_O_gas_need_pres		;     - load base address of gas needs in bar
+	bra		deco_results_gas_common			;     - re-run gas needs output in pressure mode
+
 
 	END
\ No newline at end of file