diff code_part1/OSTC_code_asm_part1/outputs.asm @ 681:6e456a6398e0

Hardware4 support
author heinrichsweikamp
date Fri, 25 Jan 2013 18:00:49 +0100
parents code_part1/OSTC_code_asm_part1/pled_outputs.asm@3927bc5019c9
children 8aaacf6eee3f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/outputs.asm	Fri Jan 25 18:00:49 2013 +0100
@@ -0,0 +1,4163 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+;    This program is free software: you can redistribute it and/or modify
+;    it under the terms of the GNU General Public License as published by
+;    the Free Software Foundation, either version 3 of the License, or
+;    (at your option) any later version.
+
+;    This program is distributed in the hope that it will be useful,
+;    but WITHOUT ANY WARRANTY; without even the implied warranty of
+;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;    GNU General Public License for more details.
+
+;    You should have received a copy of the GNU General Public License
+;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+; routines for display outputs
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 15/01/05
+;
+; History:
+; 2008-06-06 [MH] last updated
+; 2010-12-31 [jDG] Multi-page display for GF decoplan
+; 2011-01-04 [jDG] Saturation graphs in customview divemode
+;
+; known bugs:
+; ToDo:	More comments
+
+    global   DISP_divemask_color
+DISP_divemask_color:
+	GETCUSTOM8	d'36'			; Divemask output color
+	bra		DISP_standard_color_0
+
+    global  DISP_warnings_color
+DISP_warnings_color:
+	GETCUSTOM8	d'37'			; Warnings output color
+	bra		DISP_standard_color_0
+
+    global  DISP_standard_color
+DISP_standard_color:
+	GETCUSTOM8	d'35'			; Standard output color
+DISP_standard_color_0:			; Common entry point
+	movwf	DISPLAY1_temp			; copy
+	movlw	d'0'
+	cpfseq	DISPLAY1_temp
+	bra		DISP_standard_color_1
+	bra		DISP_standard_color2
+DISP_standard_color_1:
+	movlw	d'4'
+	cpfseq	DISPLAY1_temp
+	bra		DISP_standard_color_2
+	bra		DISP_standard_color2
+DISP_standard_color_2:
+	movlw	d'8'
+	cpfseq	DISPLAY1_temp
+	bra		DISP_standard_color_3
+	bra		DISP_standard_color2
+DISP_standard_color_3:
+	movlw	d'192'
+	cpfseq	DISPLAY1_temp
+	bra		DISP_standard_color_4
+	bra		DISP_standard_color2
+DISP_standard_color_4:
+	movlw	d'196'
+	cpfseq	DISPLAY1_temp
+	bra		DISP_standard_color_5
+	bra		DISP_standard_color2
+DISP_standard_color_5:
+	movlw	d'200'
+	cpfseq	DISPLAY1_temp
+	bra		DISP_standard_color_6
+	bra		DISP_standard_color2
+DISP_standard_color_6:
+	movf	DISPLAY1_temp,W		; Color should be OK...
+	call	DISP_set_color
+	return
+DISP_standard_color2:
+	movlw	0xFF		        ; Force full white.
+	call	DISP_set_color
+	return
+
+DISP_color_code macro color_code_temp
+	movlw	color_code_temp
+	call	DISP_color_code1
+	endm
+
+DISP_color_code1:				; Color-codes the output, if required
+	dcfsnz	WREG
+	bra		DISP_color_code_depth		; CF43 [mbar], 16Bit
+	dcfsnz	WREG
+	bra		DISP_color_code_cns			; CF44 [%]
+	dcfsnz	WREG
+	bra		DISP_color_code_gf			; CF45 [%]
+	dcfsnz	WREG
+	bra		DISP_color_code_ppo2		; CF46 [cbar]
+	dcfsnz	WREG
+	bra		DISP_color_code_velocity	; CF47 [m/min]
+	dcfsnz	WREG
+	bra		DISP_color_code_ceiling		; Show warning if CF41=1 and current depth>shown ceiling
+	dcfsnz	WREG
+	bra		DISP_color_code_gaslist		; Color-code current row in Gaslist (%O2 in "EEDATA")
+
+
+DISP_color_code_gaslist:				; %O2 in "EEDATA"
+; Check very high ppO2 manually
+    SAFE_2BYTE_COPY amb_pressure,xA
+	movlw		d'10'
+	movwf		xB+0
+	clrf		xB+1
+	call		div16x16				; xC=p_amb/10
+	movff		xC+0,xA+0
+	movff		xC+1,xA+1
+	movff		EEDATA,xB+0
+	clrf		xB+1
+	call		mult16x16				; EEDATA * p_amb/10
+
+	tstfsz		xC+2						; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar?
+	bra			DISP_color_code_gaslist1	; Yes, warn in warning color
+; Check if ppO2>3,30bar
+	btfsc		xC+1,7
+	bra			DISP_color_code_gaslist1	; Yes, warn in warning color
+
+	movff		xC+0,sub_a+0
+	movff		xC+1,sub_a+1
+	GETCUSTOM8	d'46'					; color-code ppO2 warning [cbar]
+	mullw		d'100'					; ppo2_warning_high*100
+	movff		PRODL,sub_b+0
+	movff		PRODH,sub_b+1
+	call		sub16					;  sub_c = sub_a - sub_b	
+	btfss		neg_flag
+	bra			DISP_color_code_gaslist1; too high -> Warning Color!
+	call		DISP_standard_color
+	return
+
+DISP_color_code_gaslist1:
+	call		DISP_warnings_color
+	return
+
+DISP_color_code_ceiling:
+	GETCUSTOM8	d'40'			; =1: Warn at all?
+	movwf	lo					
+	movlw	d'1'
+	cpfseq	lo					; =1?
+	bra		DISP_color_code_ceiling1	; No, Set to default color
+
+    SAFE_2BYTE_COPY rel_pressure, lo
+	call	adjust_depth_with_salinity			; computes salinity setting into lo:hi [mbar]
+	movff	hi,xA+1
+	movff	lo,xA+0
+	movff	char_O_first_deco_depth,lo  ; Ceiling in m
+	decf	lo,F	                    ; -1
+	movlw	LOW		d'100'
+	movwf	xB+0
+	clrf	xB+1						; Devide/100 -> xC+0 = Depth in m
+	call	div16x16					; xA/xB=xC with xA as remainder 	
+	movf	xC+0,W						; Depth in m
+	subwf	lo,W
+	btfsc	STATUS,C
+	bra		DISP_color_code_ceiling2	; Set to warning color
+DISP_color_code_ceiling1:
+	call	DISP_standard_color
+	return
+DISP_color_code_ceiling2:
+	call	DISP_warnings_color
+	return
+
+DISP_color_code_depth:
+	movff	hi,hi_temp
+	movff	lo,lo_temp
+    SAFE_2BYTE_COPY rel_pressure, lo
+	call	adjust_depth_with_salinity			; computes salinity setting into lo:hi [mbar]
+	movff	lo,sub_a+0
+	movff	hi,sub_a+1
+	GETCUSTOM15	d'43'				; Depth warn [mbar]
+	movff	lo,sub_b+0
+	movff	hi,sub_b+1
+	call	sub16			;  sub_c = sub_a - sub_b
+	btfss	neg_flag
+	bra		DISP_color_code_depth2; Set to warning color
+	call	DISP_standard_color
+	movff	hi_temp,hi
+	movff	lo_temp,lo			; Restore hi, lo
+	return
+DISP_color_code_depth2:
+	call	DISP_warnings_color
+	movff	hi_temp,hi
+	movff	lo_temp,lo			; Restore hi, lo
+	return
+
+DISP_color_code_cns:
+	movff	char_O_CNS_fraction,lo
+	GETCUSTOM8	d'44'			; CNS Warn [%]
+	subwf	lo,W
+	btfsc	STATUS,C
+	bra		DISP_color_code_cns2		; Set to warning color
+	call	DISP_standard_color
+	return
+DISP_color_code_cns2:
+	call	DISP_warnings_color
+	return
+
+DISP_color_code_gf:
+	movff	char_O_gradient_factor,lo		; gradient factor
+	GETCUSTOM8	d'45'			; GF Warn [%]
+	subwf	lo,W
+	btfsc	STATUS,C
+	bra		DISP_color_code_gf2		; Set to warning color
+	call	DISP_standard_color
+	return
+DISP_color_code_gf2:
+	call	DISP_warnings_color
+	return
+
+DISP_color_code_ppo2:
+; Check if ppO2>6,55bar
+	tstfsz	xC+2					; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar?
+	bra		DISP_color_code_ppo22	; Yes, warn in warning color
+; Check if ppO2>3,30bar
+	btfsc	xC+1,7
+	bra		DISP_color_code_ppo22	; Yes, warn in warning color
+
+	movff	xC+0,sub_a+0
+	movff	xC+1,sub_a+1
+	GETCUSTOM8	d'46'			; color-code ppO2 warning [cbar]
+	mullw	d'100'
+	movff	PRODL,sub_b+0
+	movff	PRODH,sub_b+1
+	call	sub16			  	;  sub_c = sub_a - sub_b
+	btfss	neg_flag
+	bra		DISP_color_code_ppo22; Set to warning color
+	call	DISP_standard_color
+	return
+DISP_color_code_ppo22:
+	call	DISP_warnings_color
+	return
+
+DISP_color_code_velocity:
+	btfss	neg_flag			; Ignore for ascend!
+	bra		DISP_color_code_velocity1		; Skip check!
+	movff	divA+0,lo
+	GETCUSTOM8	d'47'			; Velocity warn [m/min]
+	subwf	lo,W
+	btfsc	STATUS,C
+	bra		DISP_color_code_velocity2		; Set to warning color
+DISP_color_code_velocity1:
+	call	DISP_standard_color
+	return
+DISP_color_code_velocity2:
+	call	DISP_warnings_color
+	return
+
+ostc_debug	macro value
+	movlw	value
+	call	ostc_debug1
+	endm
+
+ostc_debug1:
+	movff	debug_char+4,debug_char+5		; Save for background debugger
+	movff	debug_char+3,debug_char+4
+	movff	debug_char+2,debug_char+3
+	movff	debug_char+1,debug_char+2
+	movff	debug_char+0,debug_char+1
+	movff	WREG,debug_char+0
+
+	btfss	debug_mode				; Are we in debugmode?
+	return							; No, return!
+
+	WIN_TOP		.192
+	WIN_LEFT	.100
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+	lfsr	FSR2,letter
+	movf	debug_char+0,W
+	movwf 	POSTINC2
+	movf	debug_char+1,W
+	movwf 	POSTINC2
+	movf	debug_char+2,W
+	movwf 	POSTINC2
+	movf	debug_char+3,W
+	movwf 	POSTINC2
+	movf	debug_char+4,W
+	movwf 	POSTINC2
+	movf	debug_char+5,W
+	movwf 	POSTINC2
+	
+	STRCAT_PRINT " "
+	return
+
+;=============================================================================
+; BlueScreen function.
+;
+DISP_resetdebugger:
+    global DISP_resetdebugger
+    global temp10
+
+    movlb   1                       ; For C-code calls
+	call	DISPLAY_boot				; DISP boot
+	call	DISP_standard_color
+	WIN_INVERT	.0					; Init new Wordprocessor
+
+	DISPLAYTEXT	.133
+	DISPLAYTEXT	.134
+	DISPLAYTEXT	.135
+	DISPLAYTEXT	.136				; Display Debug intro
+	
+	WIN_TOP		.100
+	WIN_LEFT	.10
+
+	lfsr	FSR2,letter
+	movff	temp10+0,lo             ; Code-stack point at crash time.
+	movff	temp10+1,hi             ; Code-stack point at crash time.
+	output_16
+	movlw	' '
+	movwf	POSTINC2
+	movf	debug_char+0,W
+	movwf 	POSTINC2
+	movf	debug_char+1,W
+	movwf 	POSTINC2
+	movf	debug_char+2,W
+	movwf 	POSTINC2
+	movf	debug_char+3,W
+	movwf 	POSTINC2
+	movf	debug_char+4,W
+	movwf 	POSTINC2
+	movf	debug_char+5,W
+	movwf 	POSTINC2
+	STRCAT  ". "
+	movff	flag1,lo
+	output_8		
+	PUTC    ' '
+	movff	flag2,lo
+	output_8		
+	call	word_processor
+
+	WIN_TOP		.125
+
+	lfsr	FSR2,letter
+	movff	flag3,lo
+	output_8		
+	PUTC    ' '
+	movff	flag4,lo
+	output_8		
+	PUTC    ' '
+	movff	flag5,lo
+	output_8		
+	PUTC    ' '
+	movff	flag6,lo
+	output_8		
+	PUTC    ' '
+	movff	flag7,lo
+	output_8		
+	call	word_processor
+
+	WIN_TOP		.150
+
+	lfsr	FSR2,letter
+	movff	flag8,lo
+	output_8		
+	PUTC    ' '
+	movff	flag9,lo
+	output_8		
+	PUTC    ' '
+	movff	flag10,lo
+	output_8		
+	PUTC    ' '
+	movff	flag11,lo
+	output_8		
+	PUTC    ' '
+	movff	flag12,lo
+	output_8		
+	call	word_processor
+
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+DISP_resetdebugger_loop:
+    bcf     LED_blue            ; Blink blue led every seconds..
+    btfss   secs,0
+    bsf     LED_blue
+
+	btfss	switch_left
+	bra		DISP_resetdebugger_loop		; Loop
+
+    bcf     LED_blue
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+	return
+
+DISP_divemode_mask:					; Displays mask in Dive-Mode
+	call		DISP_divemask_color	; Set Color for Divemode mask
+	DISPLAYTEXTH	.267		; Max.
+	DISPLAYTEXT		.86			; Divetime
+	DISPLAYTEXT		.87			; Depth
+	call	DISP_standard_color
+	return
+
+DISP_clear_customview_divemode:
+    WIN_BOX_BLACK   .168, .239, .90, .159		;top, bottom, left, right
+	return
+
+DISP_clear_customview_surfmode:
+    WIN_BOX_BLACK   .25, .121, .82, .159		;top, bottom, left, right
+	return
+
+DISP_clear_decoarea:
+    WIN_BOX_BLACK   .54, .168, .90, .159		;top, bottom, left, right
+	return
+
+DISP_display_ndl_mask:
+	; Clears Gradient Factor
+	movlw	d'8'
+	movwf	temp1
+	WIN_TOP		.145
+	WIN_LEFT	.0
+	call	DISP_display_clear_common_y1	
+
+	btfsc	menubit					; Divemode menu active?
+	return							; Yes, return
+
+	; Clear Dekostop and Dekosum
+	rcall	DISP_clear_decoarea	
+	call	DISP_divemask_color	; Set Color for Divemode mask
+	DISPLAYTEXT		d'84'			; NoStop
+	call	DISP_standard_color
+	return
+
+DISP_display_ndl:
+	GETCUSTOM8	d'66'				; Always show GF?
+	decfsz		WREG,F				; WREG=1?	
+	bra		DISP_display_ndl2		; No
+	rcall	DISP_display_gf			; Show GF (If GF > CF08)
+
+DISP_display_ndl2:
+	btfsc	menubit					; Divemode menu active?
+	return							; Yes, return
+
+	ostc_debug	'z'		; Sends debug-information to screen if debugmode active
+	
+	WIN_TOP		.136
+	WIN_LEFT	.119
+	WIN_FONT 	FT_MEDIUM
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+	lfsr	FSR2,letter
+	movff	char_O_nullzeit,lo				; NDL in minutes
+	output_8
+	STRCAT_PRINT    "'"
+	WIN_FONT 	FT_SMALL
+	return
+
+DISP_display_deko_mask:
+	btfsc	menubit					; Divemode menu active?
+	return							; Yes, return
+
+    rcall	DISP_clear_decoarea	
+    ; total deco time word
+	bcf			show_safety_stop	; Clear safety stop flag
+    call		DISP_divemask_color	; Set Color for Divemode mask
+    DISPLAYTEXT	d'85'			; TTS
+	DISPLAYTEXT	d'82'			; DEKOSTOP
+    call	DISP_standard_color
+    return
+
+DISP_display_deko:
+	btfsc	menubit					; Divemode menu active?
+	bra		DISP_display_deko1		; Yes, do not display deco, only GF (if required)
+
+	ostc_debug	'y'		; Sends debug-information to screen if debugmode active
+	WIN_TOP		.80
+	WIN_LEFT	.94
+	WIN_FONT 	FT_MEDIUM
+	WIN_INVERT	.0                      ; Init new Wordprocessor
+	bcf     leftbind
+	DISP_color_code		warn_ceiling    ; Color-code Output
+    btfsc   decoplan_invalid            ; The decoplan needs to updated...
+    call    DISP_grey                   ; .. so set the color to grey
+	lfsr	FSR2,letter
+	movff	char_O_first_deco_depth,lo  ; Ceiling in m
+	output_99
+	PUTC    TXT_METER_C
+	movff	char_O_first_deco_time,lo   ; length of first stop in m
+	output_99
+	STRCAT_PRINT "'"
+	WIN_FONT 	FT_SMALL
+	
+	ostc_debug	'x'		; Sends debug-information to screen if debugmode active
+	
+	WIN_TOP		.136
+	WIN_LEFT	.140 - 6*7 - 4          ; let space for sign + 5 digits + '
+	WIN_FONT 	FT_MEDIUM
+	WIN_INVERT	.0					    ; Init new Wordprocessor
+
+	call	DISP_standard_color
+    btfsc   decoplan_invalid            ; The decoplan needs to updated...
+    call    DISP_grey                   ; .. so set the color to grey
+	lfsr	FSR2,letter
+	movff	int_O_ascenttime+0,lo       ; TTS
+	movff	int_O_ascenttime+1,hi       ; on 16bits
+	output_16
+	STRCAT_PRINT    "'"
+	call	DISP_standard_color
+
+DISP_display_deko1:
+	rcall	DISP_display_gf				; Show GF (If GF > CF08)
+	return								; Done.
+
+DISP_display_gf:
+	movff	char_O_gradient_factor,lo	; gradient factor
+	GETCUSTOM8	d'8'					; threshold for display
+	cpfslt	lo							; show value?
+	bra		DISP_display_deko2			; Yes
+	; No
+	; Clears Gradient Factor
+	movlw	d'8'
+	movwf	temp1
+	WIN_TOP		.145
+	WIN_LEFT	.0
+	call	DISP_display_clear_common_y1	
+	return
+
+DISP_display_deko2:
+	ostc_debug	'w'		; Sends debug-information to screen if debugmode active
+;GF
+	WIN_TOP		.145
+	WIN_LEFT	.0
+	WIN_FONT 	FT_SMALL
+	DISP_color_code		warn_gf		; Color-code Output
+
+	STRCPY  TXT_GF3
+	movff	char_O_gradient_factor,lo		; gradient factor
+	output_8
+	STRCAT_PRINT  "% "
+	call	DISP_standard_color
+	return
+
+DISP_show_safety_stop:
+	tstfsz	safety_stop_countdown			; Countdown at zero?
+	bra		DISP_show_safety_stop2			; No, show stop
+
+	bcf		show_safety_stop				; Clear flag
+
+	btfsc	safety_stop_active				; Displayed?
+    rcall	DISP_clear_decoarea				; Yes, Clear stop
+	bcf		safety_stop_active				; Clear flag
+	bra		DISP_display_ndl_mask			; Show NDL again
+
+DISP_show_safety_stop2:
+	btfsc	safety_stop_active				; Displayed?
+	bra		DISP_show_safety_stop3			; Yes.
+
+	bsf		safety_stop_active				; Set flag
+ 
+	btfsc	menubit							; Divemode menu active?
+	bra		DISP_show_safety_stop3			; Yes, do not display now but countdown
+
+	call	DISP_divemask_color				; Set Color for Divemode mask
+	DISPLAYTEXT	d'227'						; Safety stop
+
+DISP_show_safety_stop3:
+	decf	safety_stop_countdown,F			; Reduce countdown
+	btfsc	menubit							; Divemode menu active?
+	return									; Yes, do not show
+	movff	safety_stop_countdown,lo
+	call	DISP_standard_color
+	WIN_TOP		.80
+	WIN_LEFT	.104
+	WIN_FONT 	FT_MEDIUM
+	WIN_INVERT	.0                      	; Init new Wordprocessor
+	lfsr	FSR2,letter
+	clrf	hi
+	call	convert_time					; converts hi:lo in seconds to mins (hi) and seconds (lo)
+	movf	hi,W
+	movff	lo,hi
+	movwf	lo								; exchange lo and hi
+	output_99
+	PUTC    ':'
+	movff	hi,lo
+	output_99x
+	STRCAT_PRINT ""
+	WIN_FONT 	FT_SMALL
+	call	DISP_standard_color
+	return
+
+;=============================================================================
+; Update simulator menu with time/depth
+; Note: because translations might change a bit the string length, we reprint
+;       that part of the mask to be sure the numbers fit in the right places.
+DISP_simulator_data:
+	WIN_LEFT	.20
+	WIN_FONT 	FT_SMALL
+	call	DISP_standard_color
+
+    ;---- Updates interval line ----------------------------------------------
+	WIN_TOP    .35
+	lfsr	    FSR2,letter
+	OUTPUTTEXTH .307                    ; Interval:
+
+	movff	    char_I_dive_interval,lo
+    movf        lo,W
+    bnz         DISP_simulator_data_1
+    OUTPUTTEXTH .308                    ; Now
+    clrf        POSTINC2                ; End buffer.
+    bra         DISP_simulator_data_2
+
+DISP_simulator_data_1:
+	bsf		leftbind
+	output_8
+	STRCAT      TXT_0MIN5
+
+DISP_simulator_data_2:
+    call        word_processor
+
+    ;---- Updates bottom time line -------------------------------------------
+	WIN_TOP		.95
+	lfsr        FSR2,letter
+	OUTPUTTEXTH .277                    ; Bottom Time:
+
+	movff	sim_btm_time,lo
+	bsf		leftbind
+	output_8
+	STRCAT_PRINT  TXT_MIN4
+
+    ;---- Updates depth line -------------------------------------------------
+	WIN_TOP		.125
+	lfsr	FSR2,letter
+	OUTPUTTEXTH .278                    ; Max. Depth:
+
+	movff	sim_btm_depth,lo
+	bsf		leftbind
+	output_8
+	STRCAT_PRINT  TXT_METER3
+
+	bcf		leftbind
+	return
+
+;=============================================================================
+
+DISP_divemode_timeout2:
+	WIN_TOP		.54
+	WIN_LEFT	.112
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.1
+	call    DISP_warnings_color
+	STRCPY  0x94					; "End of dive" icon
+	movff	timeout_counter, lo
+	movff	timeout_counter2, hi
+	call	convert_time				; converts hi:lo in minutes to hours (hi) and minutes (lo)
+	movf	hi,W
+	movff	lo,hi
+	movwf	lo							; exchange lo and hi
+	output_99x
+	PUTC    ':'
+	movff	hi,lo
+	output_99x
+	STRCAT_PRINT " "
+	bsf		timeout_display				; Set Flag
+	call	DISP_standard_color
+	WIN_INVERT	.0
+	return
+
+DISP_divemode_timeout:
+	WIN_TOP		.54
+	WIN_LEFT	.112
+	WIN_FONT 	FT_SMALL
+	call	DISP_standard_color
+	STRCPY  0x94						; "End of dive" icon
+	GETCUSTOM15	d'2'					; diveloop_timeout
+	movff	lo,sub_a+0
+	movff	hi,sub_a+1
+	movff	timeout_counter, sub_b+0
+	movff	timeout_counter2, sub_b+1	; Divemode timeout
+	call	sub16						;  sub_c = sub_a - sub_b
+	movff	sub_c+0,lo
+	movff	sub_c+1,hi
+	call	convert_time				; converts hi:lo in minutes to hours (hi) and minutes (lo)
+	movf	hi,W
+	movff	lo,hi
+	movwf	lo							; exchange lo and hi
+	output_99x
+	PUTC    ':'
+	movff	hi,lo
+	output_99x
+	STRCAT_PRINT " "
+	bsf		timeout_display				; Set Flag
+	return
+
+DISP_divemode_timeout_clear:
+	btfsc		dekostop_active				; Is a deco stop displayed?
+	call		DISP_display_deko_mask		; Yes, redraw mask
+
+	WIN_TOP		.54
+	WIN_LEFT	.112
+	movlw		d'6'
+	movwf		temp1
+	bcf			timeout_display				; Clear flag
+	bra			DISP_display_clear_common_y1
+
+DISP_display_velocity_graph_clr:
+	WIN_BOX_BLACK	 .20, .90, .65, .75		; Clear graphic display
+	bra		DISP_display_velocity			; Continue with normal output
+
+DISP_display_velocity_graphical:
+	btfss	neg_flag
+	bra		DISP_display_velocity_graph_clr
+	bsf		DISP_velocity_display
+	; divA+0 holding the ascend speed in m/min
+	movff	divA+0,hi	; Copy
+	WIN_BOX_BLACK	 .20, .90, .65, .75		; Clear graphic display
+	GETCUSTOM8		d'36'					; Divemode mask
+    WIN_FRAME_COLOR   .20, .90, .65, .75	; Outer frame
+	GETCUSTOM8		d'36'					; Divemode mask
+	WIN_FRAME_COLOR   .20+.10, .90-.10, .65, .75	; Inner frames
+	GETCUSTOM8		d'36'					; Divemode mask
+	WIN_FRAME_COLOR   .20+.20, .90-.20, .65, .75	;
+	GETCUSTOM8		d'36'					; Divemode mask
+	WIN_FRAME_COLOR   .20+.30, .90-.30, .65, .75	;
+	
+	GETCUSTOM8		d'47'					; color_warn_celocity_mmin	
+	movwf	xA+0
+	clrf	xA+1
+	movlw	.5
+	movwf	xB+0							; Threshold for color warning (5 color normal + 2 color warning)
+	clrf	xB+1
+	call	div16x16						;xA/xB=xC with xA as remainder 	
+	; xC+0 holds stepsize in m/min (e.g. =3 for 15m/min warning treshold)
+	movff	hi,xA+0							; Velocity in m/min
+	clrf	xA+1
+	movff	xC+0,xB+0						; Step size
+	clrf	xB+1
+	call	div16x16						;xA/xB=xC with xA as remainder 	
+	; xC+0 now holds amount of segments to show
+
+	movff	hi,divA+0	; Copy back for numeric output
+	movlw	d'7'
+	cpfslt	xC+0
+	bra		DISP_graph_vel_7
+	movlw	d'6'
+	cpfslt	xC+0
+	bra		DISP_graph_vel_6
+	movlw	d'5'
+	cpfslt	xC+0
+	bra		DISP_graph_vel_5
+	movlw	d'4'
+	cpfslt	xC+0
+	bra		DISP_graph_vel_4
+	movlw	d'3'
+	cpfslt	xC+0
+	bra		DISP_graph_vel_3
+	movlw	d'2'
+	cpfslt	xC+0
+	bra		DISP_graph_vel_2
+	movlw	d'1'
+	cpfslt	xC+0
+	bra		DISP_graph_vel_1
+	bra		DISP_graph_vel_0			; Should not happen...
+
+DISP_graph_vel_7:
+	GETCUSTOM8		d'37'					; Color warning
+    WIN_BOX_COLOR   .22, .22+.6, .67, .73	; Fill box
+DISP_graph_vel_6:
+	GETCUSTOM8		d'37'					; Color warning
+    WIN_BOX_COLOR   .32, .32+.6, .67, .73	; Fill box
+DISP_graph_vel_5:
+    WIN_BOX_STD   	.42, .42+.6, .67, .73	; Fill box
+DISP_graph_vel_4:
+    WIN_BOX_STD   	.52, .52+.6, .67, .73	; Fill box
+DISP_graph_vel_3:
+    WIN_BOX_STD   	.62, .62+.6, .67, .73	; Fill box
+DISP_graph_vel_2:
+    WIN_BOX_STD   	.72, .72+.6, .67, .73	; Fill box
+DISP_graph_vel_1:
+    WIN_BOX_STD   	.82, .82+.6, .67, .73	; Fill box
+DISP_graph_vel_0:
+
+DISP_display_velocity:
+	ostc_debug	'v'		; Sends debug-information to screen if debugmode active
+	WIN_TOP		.90
+	WIN_LEFT	.0
+	WIN_FONT 	FT_SMALL
+	DISP_color_code		warn_velocity		; Color code output
+	lfsr	FSR2,letter
+	movlw	'-'
+	btfsc	neg_flag
+	movlw	'+'
+	movwf	POSTINC2
+	movff	divA+0,lo
+	output_99
+	OUTPUTTEXT	d'83'			; m/min
+	call	word_processor
+	call	DISP_standard_color
+	bsf		DISP_velocity_display
+	return
+
+DISP_display_velocity_clear:
+	GETCUSTOM8	d'60'			; use graphic velocity (=1)?
+	movwf	lo
+	movlw	d'1'
+	cpfseq	lo					; =1?
+	bra		DISP_display_velocity_clear1	; No, clear text display
+	WIN_BOX_BLACK	 .20, .90, .65, .75		; Clear graphic display
+
+DISP_display_velocity_clear1:
+	movlw	d'8'
+	movwf	temp1
+	WIN_TOP		.90
+	WIN_LEFT	.0
+	bcf		DISP_velocity_display
+	bra		DISP_display_clear_common_y1
+
+DISP_display_wait_clear:
+    WIN_BOX_BLACK   .0, .25, .0, .159		;top, bottom, left, right
+	return
+
+DISP_display_clear_common_y2:				; Clears with y-scale=2
+	WIN_FONT 	FT_MEDIUM
+	bra		DISP_display_clear_common1
+
+DISP_display_clear_common_y1:				; Clears with y-scale=1
+	WIN_FONT 	FT_SMALL
+DISP_display_clear_common1:
+	lfsr	FSR2,letter
+DISP_display_clear_common2:
+	PUTC    ' '
+	decfsz	temp1,F
+	bra 	DISP_display_clear_common2
+	call	word_processor
+	WIN_FONT 	FT_SMALL
+	return
+
+
+DISP_diveclock:
+	call	DISP_divemask_color	; Set Color for Divemode mask
+	DISPLAYTEXT		d'255'			; Clock
+	call	DISP_standard_color
+
+DISP_diveclock2:
+	WIN_TOP		.192
+	WIN_LEFT	.123
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+	lfsr	FSR2,letter
+	movff	hours,lo
+	output_99x
+	PUTC    ':'
+	movff	mins,lo
+	output_99x
+	call	word_processor
+	return
+
+DISP_clock:
+	ostc_debug	'c'
+	WIN_TOP		.50
+	WIN_LEFT	.1
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+	lfsr	FSR2,letter
+	movff	hours,lo
+	output_99x
+	PUTC    ':'
+	movff	mins,lo
+	output_99x
+	PUTC    ':'
+	movff	secs,lo
+	output_99x
+	STRCAT_PRINT " "
+	return
+
+DISP_interval:
+	WIN_TOP		.75
+	WIN_LEFT	.90
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+	lfsr	FSR2,letter
+
+	movff	surface_interval+0,lo
+	movff	surface_interval+1,hi
+	call	convert_time			; lo=mins, hi=hours
+
+	movf	hi,W
+	movff	lo,hi
+	movwf	lo					; exchange lo and hi
+	output_99x
+	PUTC    ':'
+	movff	hi,lo
+	output_99x
+	STRCAT_PRINT " "
+	return
+
+DISP_show_gf_customview:
+	WIN_LEFT	.93
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+    call    DISP_divemask_color     ; Set Color for Divemode mask
+    DISPLAYTEXTH .268               ;"Gradient Factors"
+
+   	GETCUSTOM8	d'64'               ; Set to grey
+	call	DISP_set_color
+    btfss   use_aGF
+    call    DISP_standard_color
+
+	WIN_TOP		.192
+    STRCPY  TXT_GF3             ; "GF:"
+    GETCUSTOM8  d'32'            ; GF_lo
+    movwf   lo
+	bsf		leftbind
+	output_8
+	STRCAT  "/"
+    GETCUSTOM8  d'33'            ; GF_hi
+    movwf   lo
+    output_8
+    STRCAT_PRINT  ""
+
+   	GETCUSTOM8	d'64'               ; Set to grey
+	call	DISP_set_color
+    btfsc   use_aGF
+    call    DISP_standard_color
+
+	WIN_TOP		.216
+    STRCPY  TXT_aGF4             ; "aGF:"
+    GETCUSTOM8  d'67'            ; aGF_lo
+    movwf   lo
+    bsf		leftbind
+	output_8
+	STRCAT  "/"
+    GETCUSTOM8  d'68'            ; aGF_hi
+    movwf   lo
+	output_8
+    STRCAT_PRINT  ""
+    bcf		leftbind
+
+    call    DISP_standard_color
+    return
+
+DISP_show_cf11_cf12_cf29:; Display saturations/desaturation multiplier and last deco in the customview field
+	WIN_TOP		.25
+	WIN_LEFT	.90
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+	STRCPY  TXT_BSAT5
+
+	GETCUSTOM8	d'11'
+	movwf	lo
+	bsf		leftbind
+	output_8
+	STRCAT_PRINT  "%"
+
+	WIN_TOP		.50
+	STRCPY  TXT_BDES5
+
+	GETCUSTOM8	d'12'
+	movwf	lo
+	bsf		leftbind
+	output_8
+	STRCAT_PRINT  "%"
+
+DISP_show_cf11_cf12_cf29_2:
+	WIN_TOP		.75
+    STRCPY  TXT_LAST5
+	GETCUSTOM8	d'29'
+	movwf	lo
+	bsf		leftbind
+	output_8
+	STRCAT_PRINT  TXT_METER1
+
+	bcf		leftbind
+	return
+
+DISP_show_cf32_cf33_cf62_cf63:	; Display GF_LOW, GF_HIGH, pSCR ratio and drop in the customview field
+	WIN_TOP		.25
+	WIN_LEFT	.90
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+	GETCUSTOM8	d'32'				; GF_lo
+	movwf	lo
+    STRCPY  TXT_GFLO6
+	bsf		leftbind
+	output_8
+	STRCAT_PRINT  "%"
+
+	WIN_TOP		.50
+	GETCUSTOM8	d'33'				; GF_hi
+	movwf	lo
+    STRCPY  TXT_GFHI6
+	bsf		leftbind
+	output_8
+	STRCAT_PRINT  "%"
+
+	WIN_TOP		.75
+	lfsr        FSR2,letter
+	GETCUSTOM8  d'62'		; O2 Drop in percent
+	movwf		lo
+	bsf			leftbind
+	output_8
+
+	STRCAT		 "% 1/"
+	GETCUSTOM8  d'63'		; Counter lung ratio in 1/X
+	movwf		lo
+	output_8
+	bcf			leftbind
+    STRCAT_PRINT ""
+	return
+
+
+
+DISP_show_cf32_cf33_cf29:; Display GF_LOW, GF_HIGH and last deco in the customview field
+	WIN_TOP		.25
+	WIN_LEFT	.90
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+	GETCUSTOM8	d'32'				; GF_lo
+	movwf	lo
+
+    STRCPY  TXT_GFLO6
+	bsf		leftbind
+	output_8
+	STRCAT_PRINT  "%"
+
+	WIN_TOP		.50
+	GETCUSTOM8	d'33'				; GF_hi
+	movwf	lo
+    STRCPY  TXT_GFHI6
+	bsf		leftbind
+	output_8
+	STRCAT_PRINT  "%"
+
+	bra		DISP_show_cf11_cf12_cf29_2		; Display CF29 in the third row and RETURN
+
+
+DISP_logbook_cursor:
+
+DISP_menu_cursor:
+    WIN_BOX_BLACK   .35, .239, .0, .16		;top, bottom, left, right
+
+	WIN_LEFT	.0
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+	movff	menupos,temp1
+	dcfsnz	temp1,F
+	movlw	d'35'
+	dcfsnz	temp1,F
+	movlw	d'65'
+	dcfsnz	temp1,F
+	movlw	d'95'
+	dcfsnz	temp1,F
+	movlw	d'125'
+	dcfsnz	temp1,F
+	movlw	d'155'
+	dcfsnz	temp1,F
+	movlw	d'185'
+	
+	movff	WREG,win_top
+	STRCPY_PRINT "\xB7"
+	return
+
+DISP_menu_mask:
+	call	DISP_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor
+	DISPLAYTEXT	.5			; Menu:
+	WIN_INVERT	.0	; Init new Wordprocessor
+	DISPLAYTEXT .6			; Logbook
+	DISPLAYTEXT .7			; Gas Setup
+	DISPLAYTEXT .9			; Reset all
+	DISPLAYTEXT .10			; Setup...
+	DISPLAYTEXT	.142		; More...
+	DISPLAYTEXT .11			; Exit
+
+; Write OSTC serial in Main Menu
+	WIN_TOP		.215
+	WIN_LEFT	.47
+	GETCUSTOM8	d'64'					; Write header in blue when
+    call    DISP_set_color              ; compiled in DEBUG mode...
+	lfsr	FSR2,letter
+	OUTPUTTEXTH		d'262'              ; "OSTC "
+	clrf	EEADRH
+	clrf	EEADR                       ; Get Serial number LOW
+	call	read_eeprom                 ; read byte
+	movff	EEDATA,lo
+	incf	EEADR,F                     ; Get Serial number HIGH
+	call	read_eeprom                 ; read byte
+	movff	EEDATA,hi
+	bsf		leftbind
+	output_16
+	call	word_processor
+	call	DISP_standard_color
+	return	
+
+DISP_setup_menu_mask:
+	call	DISP_topline_box
+	WIN_INVERT	.1          ; Init new Wordprocessor
+	DISPLAYTEXT	.98			; Setup Menu:
+	WIN_INVERT	.0          ; Init new Wordprocessor
+	DISPLAYTEXT .99			; Custom FunctionsI
+	DISPLAYTEXT	.153		; Custom FunctionsII
+	DISPLAYTEXTH .295		; Custom FunctionsIII
+	DISPLAYTEXT .100		; Decotype:
+	DISPLAYTEXT	.142		; More...
+	DISPLAYTEXT .11			; Exit
+	return	
+
+DISP_ccr_setup_menu_mask:
+	call	DISP_topline_box
+	WIN_INVERT	.1          ; Init new Wordprocessor
+    DISPLAYTEXT	.111		; CCR Setup Menu
+	WIN_INVERT	.0          ; Init new Wordprocessor
+	DISPLAYTEXT .229        ; Diluent Setup
+	DISPLAYTEXT	.230		; Setpoint Setup
+	DISPLAYTEXT .11			; Exit
+	return
+
+
+DISP_more_setup_menu_mask:
+	call	DISP_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor	
+	DISPLAYTEXTH	.258	; Setup Menu 2:
+	WIN_INVERT	.0	; Init new Wordprocessor	
+	DISPLAYTEXTH	.257	; Date format:
+	DISPLAYTEXT		.129	; Debug: 
+	DISPLAYTEXT		.187	; Show License
+	DISPLAYTEXTH 	.276	; Salinity:
+	DISPLAYTEXTH	.280 	; Brightness:
+	DISPLAYTEXT .11			; Exit
+	return	
+
+DISP_more_menu_mask:
+	call	DISP_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor
+	DISPLAYTEXT	.144		; Menu 2:
+	WIN_INVERT	.0	; Init new Wordprocessor
+	DISPLAYTEXT .8			; Set Time
+	DISPLAYTEXT	.110		; Const. ppO2 Setup
+	DISPLAYTEXT	.113		; Battery Info
+	DISPLAYTEXT	.247		; Simulator
+	DISPLAYTEXTH .287		; Altimeter
+	DISPLAYTEXT .11			; Exit
+	return
+
+DISP_reset_menu_mask:
+	call	DISP_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor	
+	DISPLAYTEXT	.28				; Reset Menu
+	WIN_INVERT	.0	; Init new Wordprocessor	
+	DISPLAYTEXT	.21				; Cancel Reset
+	DISPLAYTEXT	.245			; Reset CF,Gases & Deco
+	DISPLAYTEXTH .284			; Reset Logbook
+	DISPLAYTEXTH .285			; Reboot OSTC
+	DISPLAYTEXTH .286			; Reset Decodata
+	DISPLAYTEXT .11			; Exit
+	return
+
+DISP_simulator_mask:
+	call	DISP_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor	
+	DISPLAYTEXT	.248		; OSTC Simulator
+	WIN_INVERT	.0	; Init new Wordprocessor
+    DISPLAYTEXTH    .307                ; Interval:
+	DISPLAYTEXT	    .249                ; Start Dive
+	DISPLAYTEXTH	.277                ; Bottom Time:
+	DISPLAYTEXTH	.278                ; Max. Depth:
+	DISPLAYTEXTH	.279                ; Calculate Deco
+	DISPLAYTEXT     .11                 ; Exit
+	return
+	
+DISP_temp_surfmode:
+	ostc_debug	'e'
+    SAFE_2BYTE_COPY    temperature, last_temperature
+	WIN_TOP		.100
+	WIN_LEFT	.1
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0                      ; Init new Wordprocessor
+	call	DISP_standard_color
+
+	movff	last_temperature+1,hi
+	movff	last_temperature+0,lo
+	lfsr	FSR2,letter
+	call	DISP_convert_signed_temperature	; converts lo:hi into signed-short and adds '-' to POSTINC2 if required
+	movlw	d'3'
+	movwf	ignore_digits
+	bsf		leftbind			; left orientated output
+	output_16dp	d'2'
+	bcf		leftbind
+	STRCAT_PRINT  "°C "
+	return
+
+DISP_temp_divemode:
+	ostc_debug	'u'		; Sends debug-information to screen if debugmode active
+
+; temperature
+    SAFE_2BYTE_COPY temperature, last_temperature
+
+	WIN_TOP		.216
+	WIN_LEFT	.50
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+	movff	last_temperature+1,hi
+	movff	last_temperature+0,lo
+
+	lfsr	FSR2,letter
+	call	DISP_convert_signed_temperature	; converts lo:hi into signed-short and adds '-' to POSTINC2 if required
+	movlw	d'3'
+	movwf	ignore_digits
+	bsf		leftbind			; left orientated output
+	output_16dp	d'2'
+	bcf		leftbind
+    STRCAT "° "
+    clrf    WREG				; Allow up to 5 chars to avoid
+    movff   WREG,letter+5		; collision with sat graphs
+    call    word_processor
+	return
+
+DISP_show_ppO2:					; Show ppO2 (ppO2 stored in xC)
+	ostc_debug	't'		; Sends debug-information to screen if debugmode active
+	WIN_TOP		.117
+	WIN_LEFT	.0
+	WIN_FONT 	FT_SMALL
+	DISP_color_code		warn_ppo2		; Color-code output (ppO2 stored in xC)
+    STRCPY  TXT_PPO2_5
+
+; Check very high ppO2 manually
+	tstfsz		xC+2					; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar?
+	bra			DISP_show_ppO2_3		; Yes, display fixed Value!
+
+	movff	xC+0,lo
+	movff	xC+1,hi
+	bsf		ignore_digit4
+	output_16dp	d'1'
+	bcf		ignore_digit4
+DISP_show_ppO2_2:
+    STRCAT_PRINT " "
+	call	DISP_standard_color
+	return
+
+DISP_show_ppO2_3:
+    STRCAT  ">6.6"
+	bra		DISP_show_ppO2_2
+
+DISP_show_ppO2_clear:					; Clear ppO2
+	movlw	d'10'
+	movwf	temp1
+	WIN_TOP		.117
+	WIN_LEFT	.0
+	call	DISP_display_clear_common_y1
+	return
+
+DISP_active_gas_clear:					; clears active gas!
+	WIN_TOP		.192
+	WIN_LEFT	.50
+	movlw	d'5'
+	movwf	temp1
+	bra		DISP_display_clear_common_y1; also returns!
+
+DISP_active_gas_divemode:				; Displays current gas (e.g. 40/20) if a) He>0 or b) O2>Custom9
+	btfsc	FLAG_apnoe_mode				; Ignore in Apnoe mode
+	return
+
+	WIN_INVERT	.0					; Init new Wordprocessor	
+	call	DISP_active_gas_divemode_show	; Show gas (Non-Inverted in all cases)
+
+	btfss	better_gas_available	;=1: A better gas is available and a gas change is advised in divemode
+	return					; Done.
+
+; Check if Gas Output should blink when a better gas is available...
+	GETCUSTOM8	d'42'			; =1 if gas should blink
+	movwf	lo
+	movlw	d'1'
+	cpfseq	lo					; =1?
+	return						; No, Done.
+
+	btg		blinking_better_gas		; Toggle blink bit...
+	btfss	blinking_better_gas		; blink now?
+	return							; No, Done.
+	movlw	color_yellow			; Blink in yellow
+    call	DISP_set_color
+	WIN_INVERT	.1					; Init new Wordprocessor	
+	call	DISP_active_gas_divemode_show1	; Show gas (Non-Inverted in all cases)
+	WIN_INVERT	.0					; Init new Wordprocessor	
+	call	DISP_standard_color
+	return							; Done.
+
+DISP_active_gas_divemode_show:
+	call	DISP_standard_color
+DISP_active_gas_divemode_show1:
+	ostc_debug	's'		; Sends debug-information to screen if debugmode active
+; gas
+	WIN_TOP		.192
+	WIN_LEFT	.50
+	WIN_FONT 	FT_SMALL
+
+	movlw	d'100'						; 100% in the tank
+	movff	char_I_N2_ratio,lo			; minus N2
+	bsf		STATUS,C					; set borrow bit
+	subfwb	lo,W
+	movff	char_I_He_ratio,lo			; minus He
+	bsf		STATUS,C					; set borrow bit
+	subfwb	lo,F						; =% O2
+	GETCUSTOM8		d'9'				; get oxygen treshold
+	movff	char_I_He_ratio,hi			; He ratio
+	cpfsgt	lo
+	bra		DISP_active_gas_divemode2		; Check He
+	bra		DISP_active_gas_divemode3		; Skip He check, display gas
+	
+DISP_active_gas_divemode2:
+	tstfsz	hi							; He = 0 %
+	bra		DISP_active_gas_divemode3	; display gas
+
+    call    DISP_warnings_color         ; O2 below treshold, He=0 : Bad stuff !
+    bra     DISP_active_gas_divemode4	
+
+DISP_active_gas_divemode3:
+	movlw	d'21'
+	cpfseq	lo				; Air? (O2=21%)
+	bra		DISP_active_gas_divemode4 ; No!
+	tstfsz	hi				; Air? (He=0%)
+	bra		DISP_active_gas_divemode4 ; No!
+	
+							; Yes, display "Air" instead of 21/0
+	lfsr	FSR2,letter
+	OUTPUTTEXTH		d'264'			;"Air  "
+	PUTC	' '
+    clrf    WREG				; Allow up to 5 chars to avoid
+    movff   WREG,letter+5		; collision with sat graphs
+	bcf		leftbind
+	call	word_processor
+DISP_active_better_gas:
+	WIN_TOP		.192
+	WIN_LEFT	.43
+	WIN_FONT 	FT_SMALL
+	lfsr	FSR2,letter
+	movlw	' '
+	btfsc	better_gas_available	;=1: A better gas is available and a gas change is advised in divemode
+	movlw	'*'
+	movwf	POSTINC2
+	call	word_processor
+	return
+
+DISP_active_gas_divemode4:
+	lfsr	FSR2,letter
+	bsf		leftbind			; left orientated output
+	output_8					; O2 ratio is still in "lo"
+	PUTC    '/'
+	movff	char_I_He_ratio,lo		; copy He ratio into lo
+	output_8
+	PUTC	' '
+    clrf    WREG				; Allow up to 5 chars to avoid
+    movff   WREG,letter+5		; collision with sat graphs
+	bcf		leftbind
+	call	word_processor
+	rcall	DISP_active_better_gas	; show *, if required
+    call    DISP_standard_color ; Back to normal (if O2<21 and He=0)
+	return
+
+;-----------------------------------------------------------------------------
+; Set color to grey when gas is inactive
+; Inputs: WREG : gas# (0..4)
+; Trashes: lo
+; New v1.44se
+DISP_grey_inactive_gas:
+	movwf	lo		                    ; copy gas number 0-4
+	incf	lo,F				        ; 1-5
+
+    read_int_eeprom		d'33'       	; Get First gas (1-5)
+    movf    EEDATA,W            
+    subwf   lo,W                        ; Compare with current
+    bz      DISP_white_gas              ; First is always on.
+
+    movlw   .28-1                       ; Depth for gas# is at idx+28
+    addwf   lo,W
+    movwf   EEADR                       ; address in EEPROM.
+    call    read_eeprom                 ; Read depth
+    clrf    WREG                
+    cpfsgt  EEDATA                      ; is depth > 0 ?
+    bra     DISP_grey_gas
+
+    clrf    EEADRH                      ; Lower page of EEPROM.
+    read_int_eeprom		d'27'	        ; read flag register
+DISP_grey_inactive_gas1:
+	rrcf	EEDATA			            ; roll flags into carry
+	decfsz	lo,F			            ; max. 5 times...
+	bra		DISP_grey_inactive_gas1
+	
+	bnc		DISP_grey_gas               ; test carry
+
+DISP_white_gas:
+	GETCUSTOM8	d'35'		            ;movlw	color_white	
+	goto	DISP_set_color	            ; grey out inactive gases!
+    ; return
+
+DISP_grey_gas:
+DISP_grey:
+	GETCUSTOM8	d'64'					;movlw	color_grey
+	goto	DISP_set_color	            ; grey out inactive gases!
+    ; return
+
+;-----------------------------------------------------------------------------
+; Display Pre-Dive Screen
+
+DISP_pre_dive_screen:			
+	; List active gases/Setpoints
+
+	btfsc	FLAG_const_ppO2_mode		; in ppO2 mode?
+	bra		DISP_pre_dive_screen3		; Yes, display SetPoint/Sensor result list
+
+DISP_pre_dive_screen2:
+	ostc_debug	'm'		; Sends debug-information to screen if debugmode active
+
+	WIN_LEFT	.90
+	WIN_FONT	FT_SMALL
+	bsf		leftbind
+	
+	movlw	d'2'
+	movwf	wait_temp			; here: stores eeprom address for gas list
+	movlw	d'0'
+	movwf	waitms_temp		; here: stores row for gas list
+	clrf	hi					; here: Gas counter
+
+DISP_pre_dive_screen2_loop:
+	incf	hi,F				; Increase Gas
+	movlw	d'4'
+	addwf	wait_temp,F			; Increase eeprom address for gas list
+	
+	STRCPY  TXT_GAS1
+	movff	hi,lo			; copy gas number
+	output_8				; display gas number
+	STRCAT  ": "
+	movff	wait_temp, EEADR; Gas #hi: %O2 - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+	PUTC    '/'
+	incf	EEADR,F			; Gas #hi: %He - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+
+    decf    hi,W            ; Gas # in 0..4
+	call    DISP_grey_inactive_gas
+
+	read_int_eeprom 	d'33'			; Read start gas (1-5)
+	movf	EEDATA,W
+	cpfseq	hi				; Current Gas the active gas?
+	bra		DISP_pre_dive_screen2a
+	bra		DISP_pre_dive_screen2b
+
+DISP_pre_dive_screen2a:
+	movlw	d'25'
+	addwf	waitms_temp,F		; Increase row
+	WIN_LEFT	.90
+	movff	waitms_temp,win_top ; Set Row
+	call	word_processor	; No, display gas
+
+DISP_pre_dive_screen2b:
+	movlw	d'5'			; list all four (remaining) gases
+	cpfseq	hi				; All gases shown?
+	bra		DISP_pre_dive_screen2_loop	; No
+	
+	return							; No, return (OC mode)
+
+DISP_pre_dive_screen3:	
+	WIN_LEFT	.90
+	WIN_FONT	FT_SMALL
+	bsf		leftbind
+	call    DISP_standard_color
+
+	; list three SP in Gaslist
+	movlw	d'35'				; 36 = current SP position in EEPROM
+	movwf	wait_temp			; here: stores eeprom address for gas list
+	movlw	d'0'
+	movwf	waitms_temp			; here: stores row for gas list
+	clrf 	apnoe_mins          ; here: SP counter
+
+DISP_pre_dive_screen3_loop:
+	incf	wait_temp,F			; EEPROM address
+	incf	apnoe_mins,F	    ; Increase SP
+
+	movlw	d'25'
+	addwf	waitms_temp,F		; Increase row
+	WIN_LEFT	.90
+	movff	waitms_temp,win_top ; Set Row
+	
+	STRCPY  TXT_SP2
+	movff	apnoe_mins,lo       ; copy gas number
+	output_8			        ; display gas number
+	STRCAT  ": "
+	movff	wait_temp, EEADR    ; SP #hi position
+	call	read_eeprom		    ; get byte (stored in EEDATA)
+	movff	EEDATA,lo		    ; copy to lo
+	clrf	hi
+	output_16dp	d'3'		    ; outputs into Postinc2!
+	call	word_processor	
+
+	movlw	d'3'		        ; list all three SP
+	cpfseq	apnoe_mins          ; All gases shown?
+	bra		DISP_pre_dive_screen3_loop	;no
+
+
+    call    get_first_diluent           ; Read first diluent into lo(O2) and hi(He)
+	WIN_LEFT	.90
+	WIN_TOP		.100
+	STRCPY  TXT_DIL4
+	output_8				; O2 Ratio
+	PUTC    '/'
+	movff	hi,lo
+	output_8				; He Ratio
+	call	word_processor		
+
+	bcf		leftbind
+	return				; Return (CC Mode)
+
+DISP_active_gas_surfmode:				; Displays start gas/SP 1
+	ostc_debug	'q'		; Sends debug-information to screen if debugmode active
+		
+	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
+	return								; Yes, return
+
+	btfsc	gauge_mode					; In Gauge mode?
+	return								; Yes, return
+
+	btfss	FLAG_const_ppO2_mode	; are we in const. ppO2 mode?	
+	bra		DISP_active_gas_surfmode2	; No, display gases
+
+; In CC Mode
+	WIN_TOP		.135
+	WIN_LEFT	.90
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+	lfsr	FSR2,letter		
+	read_int_eeprom	d'36'
+	movff	EEDATA,lo				; copy to lo
+	clrf	hi
+	output_16dp	d'3'		; outputs into Postinc2!
+	bcf		leftbind
+
+	STRCAT_PRINT  TXT_BAR3
+	return								; Done.
+
+DISP_active_gas_surfmode2:
+	WIN_TOP		.130
+	WIN_LEFT	.100
+	WIN_FONT 	FT_MEDIUM
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+	read_int_eeprom 	d'33'			; Read byte (stored in EEDATA)
+	movff	EEDATA,active_gas			; Read start gas (1-5)
+
+	decf	active_gas,W				; Gas 0-4
+	mullw	d'4'
+	movf	PRODL,W			
+	addlw	d'7'						; = address for He ratio
+	movwf	EEADR
+	call	read_eeprom					; Read He ratio
+	movff	EEDATA,char_I_He_ratio		; And copy into hold register
+
+	decf	active_gas,W				; Gas 0-4
+	mullw	d'4'
+	movf	PRODL,W			
+	addlw	d'6'						; = address for O2 ratio
+	movwf	EEADR
+	call	read_eeprom					; Read O2 ratio
+	movff	EEDATA, char_I_O2_ratio		; O2 ratio
+	movff	char_I_He_ratio, wait_temp	; copy into bank1 register
+	bsf		STATUS,C					; Borrow bit
+	movlw	d'100'						; 100%
+	subfwb	wait_temp,W					; minus He
+	bsf		STATUS,C					; Borrow bit
+	subfwb	EEDATA,F					; minus O2
+	movff	EEDATA, char_I_N2_ratio		; = N2!
+
+	movlw	d'100'						; 100% in the tank
+	movff	char_I_N2_ratio,lo			; minus N2
+	bsf		STATUS,C					; set borrow bit
+	subfwb	lo,W
+	movff	char_I_He_ratio,lo			; minus He
+	bsf		STATUS,C					; set borrow bit
+	subfwb	lo,F						; =% O2
+
+	movff	char_I_He_ratio,hi			; Copy into Bank1 register
+
+	movlw	d'21'
+	cpfseq	lo							; Air? (O2=21%)
+	bra		DISP_active_gas_surfmode4 	; No!
+	tstfsz	hi							; Air? (He=0%)
+	bra		DISP_active_gas_surfmode4 	; No!
+	
+							; Yes, display "Air" instead of 21/0
+	DISPLAYTEXTH		d'265'		;"Air  ", y-scale=2
+	return								; Done.
+
+DISP_active_gas_surfmode4:
+	lfsr	FSR2,letter
+	bsf		leftbind			; left orientated output
+	output_99					; O2 ratio is still in "lo"
+	movff	char_I_He_ratio,lo	; copy He ratio into lo
+	tstfsz	lo					; He>0?
+	bra		DISP_active_gas_surfmode5	; Yes.
+	bra		DISP_active_gas_surfmode6	; No, skip He
+DISP_active_gas_surfmode5:	
+	PUTC    '/'
+	output_99
+DISP_active_gas_surfmode6:
+	bcf		leftbind
+	call	word_processor
+
+	rcall	DISP_mainscreen_show_nx
+	tstfsz	lo					; He>0?
+	rcall	DISP_mainscreen_show_tx	; Yes
+	return								; Done.
+
+DISP_mainscreen_show_tx:
+	WIN_LEFT	.85
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+   	WIN_TOP		.127
+
+   	STRCPY_PRINT TXT_TX1
+  	WIN_TOP		.148
+	STRCPY_PRINT TXT_TX2
+	return
+DISP_mainscreen_show_nx:
+	WIN_LEFT	.85
+   	WIN_TOP		.127
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+
+   	STRCPY_PRINT TXT_NX1
+  	WIN_TOP		.148
+	STRCPY_PRINT TXT_NX2
+	return
+
+
+DISP_confirmbox:
+    WIN_BOX_BLACK   .68, .146, .34, .101		;top, bottom, left, right
+	WIN_FRAME_STD   .70, .144, .35, .100
+
+	DISPLAYTEXT	.143			; Confirm:
+	DISPLAYTEXT	.145			; Cancel
+	DISPLAYTEXT	.146			; OK!
+
+	movlw		d'1'
+	movwf		menupos
+
+DISP_confirmbox2:
+    WIN_BOX_BLACK   .96, .143, .39, .51		;top, bottom, left, right
+
+	movff	menupos,temp1
+	movlw	d'96'
+	dcfsnz	temp1,F
+	movlw	d'96'
+	dcfsnz	temp1,F
+	movlw	d'120'
+	movff	WREG,win_top
+	WIN_LEFT	.39
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+    STRCPY_PRINT "\xB7"				; Cursor
+
+	bcf			sleepmode					; clear some flags
+	bcf			menubit2
+	bcf			menubit3
+	bcf			switch_right
+	bcf			switch_left
+	clrf		timeout_counter2
+	WAITMS		d'100'
+
+DISP_confirmbox_loop:
+	call		check_switches_logbook
+	
+	btfsc		menubit3					; SET/MENU?
+	bra			DISP_confirmbox_move_cursor; Move Cursor
+	btfsc		menubit2					; ENTER?
+	bra			DISP_confirmbox_menu_do		; Do task
+
+	btfsc		onesecupdate
+	call		timeout_surfmode			; timeout
+
+	btfsc		onesecupdate
+	call		set_dive_modes				; check, if divemode must be entered
+	bcf			onesecupdate				; one second update
+
+	btfsc		sleepmode					; Timeout?
+	bra			DISP_confirmbox_cancel		; back with cancel
+	btfsc		divemode
+	bra			DISP_confirmbox_cancel		; back with cancel
+
+	bra			DISP_confirmbox_loop		; wait for something to do
+
+DISP_confirmbox_cancel:
+	retlw	.0
+DISP_confirmbox_ok:
+	retlw	.1
+
+DISP_confirmbox_menu_do:
+	dcfsnz	menupos,F
+	bra		DISP_confirmbox_cancel
+	dcfsnz	menupos,F
+	bra		DISP_confirmbox_ok
+	bra		DISP_confirmbox_cancel
+
+DISP_confirmbox_move_cursor:
+	incf	menupos,F
+	movlw	d'3'						; number of menu options+1
+	cpfseq	menupos						; =limit?
+	bra		DISP_confirmbox_move_cursor2	; No!
+	movlw	d'1'							; Yes, reset to position 1!
+	movwf	menupos
+DISP_confirmbox_move_cursor2:
+	bra		DISP_confirmbox2		; Return to Profile Menu, also updates cursor
+
+
+DISP_depth:
+;	ostc_debug	'r'		; Sends debug-information to screen if debugmode active
+    SAFE_2BYTE_COPY rel_pressure, lo
+	call	adjust_depth_with_salinity			; computes salinity setting into lo:hi [mbar]
+
+	movlw	.039
+	cpfslt	hi
+    bra		depth_greater_99_84mtr
+
+	btfsc	depth_greater_100m			; Was depth>100m during last call
+	call	DISP_clear_depth			; Yes, clear depth area
+	bcf		depth_greater_100m			; Do this once only...
+
+	lfsr	FSR2,letter
+
+	movlw	HIGH	d'1000'
+	movwf	sub_a+1
+	movlw	LOW		d'1000'
+	movwf	sub_a+0
+	movff	hi,sub_b+1
+	movff	lo,sub_b+0
+	incf	sub_b+0,F
+	movlw	d'0'
+	addwfc	sub_b+1,F				; Add 1mbar offset
+	call	sub16					; sub_c = sub_a - sub_b
+	btfss	neg_flag				; Depth lower then 10m?
+	rcall	depth_less_10mtr		; Yes, add extra space
+
+	WIN_TOP		.24
+	WIN_LEFT	.0
+	WIN_FONT 	FT_LARGE
+	WIN_INVERT	.0					; Init new Wordprocessor
+	DISP_color_code	warn_depth		; Color-code the output
+
+	movlw	HIGH	d'99'
+	movwf	sub_a+1
+	movlw	LOW		d'99'
+	movwf	sub_a+0
+	movff	hi,sub_b+1
+	movff	lo,sub_b+0
+	call	sub16					; sub_c = sub_a - sub_b
+	btfss	neg_flag				; Depth lower then 1m?
+	bra		DISP_depth2				; Yes, display manual Zero
+
+	bsf		leftbind
+	bsf		ignore_digit4
+	output_16						; Full meters in Big font
+	bcf		leftbind
+	bra		DISP_depth3
+
+DISP_depth2:
+	PUTC	'0'
+
+DISP_depth3:
+	call	word_processor
+	bcf		ignore_digit4
+
+	WIN_FONT 	FT_MEDIUM
+	WIN_TOP		.50
+	WIN_LEFT	.40
+	DISP_color_code	warn_depth		; Color-code the output
+
+    SAFE_2BYTE_COPY rel_pressure, lo
+	call	adjust_depth_with_salinity			; computes salinity setting into lo:hi [mbar]
+	
+	STRCPY  "."
+
+	movlw	HIGH	d'20'			; Display 0.0m if lower then 20cm
+	movwf	sub_a+1
+	movlw	LOW		d'20'
+	movwf	sub_a+0
+	movff	hi,sub_b+1
+	movff	lo,sub_b+0
+	call	sub16					; sub_c = sub_a - sub_b
+	btfss	neg_flag				; Depth lower then 0.3m?
+	bra		DISP_depth4				; Yes, display manual Zero
+
+	movlw	d'4'
+	movwf	ignore_digits
+	bsf		ignore_digit5
+	output_16dp	d'0'
+	bra		DISP_depth5
+
+DISP_depth4:
+	PUTC	'0'
+
+DISP_depth5:
+	call	word_processor			; decimeters in medium font
+	bcf		ignore_digit5
+	WIN_FONT 	FT_SMALL
+	return
+
+depth_greater_99_84mtr:			; Display only in full meters
+	btfss	depth_greater_100m			; Is depth>100m already?
+	call	DISP_clear_depth			; No, clear depth area and set flag
+	; Depth is already in hi:lo
+	; Show depth in Full meters
+	; That means ignore figure 4 and 5
+	lfsr	FSR2,letter
+	WIN_TOP		.24
+	WIN_LEFT	.0
+	WIN_FONT 	FT_LARGE
+	WIN_INVERT	.0					; Init new Wordprocessor
+	DISP_color_code	warn_depth		; Color-code the output
+
+	bsf		ignore_digit4
+	bsf		leftbind
+	output_16
+	bcf		leftbind
+	call	word_processor
+	bcf		ignore_digit4
+	WIN_FONT 	FT_SMALL
+	return
+	
+depth_less_10mtr:
+	PUTC    ' '
+	return
+
+DISP_clear_depth			; No, clear depth area and set flag
+    WIN_BOX_BLACK   .24, .90, .0, .90		;top, bottom, left, right
+	bsf		depth_greater_100m			; Set Flag
+	return
+
+DISP_desaturation_time:	
+	movff		int_O_desaturation_time+0,lo
+	movff		int_O_desaturation_time+1,hi		; Copy
+	tstfsz		lo									; =0?
+	bra			DISP_desaturation_time2				; No!
+	tstfsz		hi									; =0?
+	bra			DISP_desaturation_time2				; No!
+	return											; Do not display Desat
+	
+DISP_desaturation_time2:
+	ostc_debug	'h'
+	WIN_TOP		.150
+	WIN_LEFT	.1
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+	lfsr	FSR2,letter
+	OUTPUTTEXT	d'14'				; Desat
+	PUTC    ' '
+	movff		desaturation_time_buffer+0,lo			; divide by 60...
+	movff		desaturation_time_buffer+1,hi
+
+	call		convert_time				; converts hi:lo in minutes to hours (hi) and minutes (lo)
+	bsf			leftbind
+	movf		lo,W
+	movff		hi,lo
+	movwf		hi							; exchange lo and hi...
+	output_8								; Hours
+	PUTC        ':'
+	movff		hi,lo						; Minutes
+	output_99x
+	bcf		leftbind
+	PUTC	' '
+;   clrf    WREG							; Allow up to 5 chars to avoid
+;   movff   WREG,letter+6					; collision with decotype letters
+	call	word_processor
+	return
+
+DISP_nofly_time:	
+ 	movf    nofly_time+0,W              ; Is nofly null ?
+    iorwf   nofly_time+1,W
+    bnz     DISP_nofly_time2            ; No...
+	return
+ 
+DISP_nofly_time2:
+	ostc_debug	'g'
+	WIN_TOP		.125
+	WIN_LEFT	.1
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+	lfsr	FSR2,letter
+	OUTPUTTEXT	d'35'				; NoFly
+	PUTC    ' '
+	movff		nofly_time+0,lo			; divide by 60...
+	movff		nofly_time+1,hi
+	call		convert_time			; converts hi:lo in minutes to hours (hi) and minutes (lo)
+	bsf			leftbind
+	movf		lo,W
+	movff		hi,lo
+	movwf		hi                      ; exchange lo and hi...
+	output_8                            ; Hours
+	PUTC        ':'
+	movff		hi,lo					; Minutes
+	output_99x
+	bcf		leftbind
+	PUTC	' '
+;   clrf    WREG							; Allow up to 5 chars to avoid
+;   movff   WREG,letter+6					; collision with decotype letters
+	call	word_processor
+	return
+
+
+update_surf_press:
+	btfsc	premenu		; Do not update when "Menu?" is displayed!
+	return
+
+	ostc_debug	'b'		; Sends debug-information to screen if debugmode active
+	WIN_TOP		.25
+	WIN_LEFT	.1
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+
+;	btfss	high_altitude_mode		; In high altitude mode?
+	call	DISP_standard_color		; No
+;	btfsc	high_altitude_mode		; In high altitude mode?
+;	call	DISP_warnings_color		; Yes, display ambient pressure in red
+
+    SAFE_2BYTE_COPY amb_pressure, lo
+	lfsr	FSR2,letter
+
+	movff	lo,sub_a+0
+	movff	hi,sub_a+1
+	movff	last_surfpressure_30min+0,sub_b+0
+	movff	last_surfpressure_30min+1,sub_b+1
+	call	sub16					; sub_c = sub_a - sub_b
+	btfsc	neg_flag				; Pressure lower?
+	rcall	update_surf_press2		; Yes, test threshold
+
+	tstfsz	sub_c+1					; >255mbar difference?
+	bra		update_surf_press_common; Yes, display!
+	movlw	d'5'
+	subwf	sub_c+0,W
+	btfsc	STATUS,C
+	bra		update_surf_press_common; Yes, display!
+;	PUTC	'+'						; For debug only
+    SAFE_2BYTE_COPY last_surfpressure_30min, lo	; Overwrite with stable value...
+
+update_surf_press_common:
+	bsf		leftbind
+	output_16
+	bcf		leftbind
+	STRCAT_PRINT  TXT_MBAR5
+	call	DISP_standard_color		; Reset color
+	return
+
+update_surf_press2:
+	movff	lo,sub_b+0
+	movff	hi,sub_b+1
+	movff	last_surfpressure_30min+0,sub_a+0
+	movff	last_surfpressure_30min+1,sub_a+1
+	call	sub16					; sub_c = sub_a - sub_b
+;	PUTC	'-'						; For debug only
+	return
+
+update_batt_voltage_divemode:
+	call	DISP_warnings_color
+	DISPLAYTEXT		d'246'		; LowBatt!
+	call	DISP_standard_color
+	return
+
+update_batt_voltage:
+	ostc_debug	'f'
+
+	GETCUSTOM8	d'31'			; =1 if battery voltage should be visible
+	movwf	lo
+	movlw	d'1'
+	cpfseq	lo					; =1?
+	bra		update_batt_voltage2	; No, show symbol
+
+	WIN_TOP		.175
+	WIN_LEFT	.1
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+	lfsr	FSR2,letter
+	movff	batt_voltage+0,lo
+	movff	batt_voltage+1,hi
+	movlw	d'1'
+	movwf	ignore_digits
+	bsf		ignore_digit5		; do not display mV
+	bsf		leftbind
+	output_16dp	d'2'			; e.g. 3.45V
+	bcf		leftbind
+	STRCAT_PRINT  TXT_VOLT2
+	return
+	
+update_batt_voltage2:
+    WIN_FRAME_STD .174, .194, .1, .32
+
+; 4100-Vbatt
+	movlw	LOW		d'4100'
+	movwf	sub_a+0
+	movlw	HIGH	d'4100'
+	movwf	sub_a+1
+	movff	batt_voltage+0,sub_b+0
+	movff	batt_voltage+1,sub_b+1
+	call	sub16				;  sub_c = sub_a - sub_b
+; Battery full (>4100mV?
+	btfsc	neg_flag
+	bra		update_batt_voltage2_full
+
+; Vbatt-3500
+	movlw	LOW		d'3500'
+	movwf	sub_b+0
+	movlw	HIGH	d'3500'
+	movwf	sub_b+1
+	movff	batt_voltage+0,sub_a+0
+	movff	batt_voltage+1,sub_a+1
+	call	sub16				;  sub_c = sub_a - sub_b
+; Battery lower then 3500mV?
+	btfsc	neg_flag
+	bra		update_batt_voltage2_empty
+
+; Battery is between 3500 and 4100mV
+; sub_c:2 is between 0 and 600	
+	movff	sub_c+0,xA+0
+	movff	sub_c+1,xA+1
+	movlw	d'20'
+	movwf	xB+0
+	clrf	xB+1
+	call	div16x16					;xA/xB=xC with xA as remainder 	
+; xC is between 0 and 30
+	movff	xC+0,wait_temp				;save value
+	incf	wait_temp,F					; +1
+
+	movlw	d'3'
+	cpfsgt	wait_temp
+	movwf	wait_temp					; Minimum = 3
+
+update_batt_voltage2a:
+    WIN_BOX_STD .181, .187, .32, .34    ; Battery nose
+
+update_batt_voltage3:
+	GETCUSTOM8	d'34'			; Color battery
+	btfsc	cc_active
+	movlw	color_yellow		; CC active
+	btfsc	charge_done
+	movlw	color_green			; Charge done.
+    call	DISP_set_color
+
+	movlw   .175
+	movff   WREG,win_top		; row top (0-239)
+	movlw   .19
+	movff   WREG,win_height
+	movlw   .2
+	movff   WREG,win_leftx2		; column left (0-159)
+    movff   wait_temp,win_width	; column right (0-159)
+	call    DISP_box
+	call    DISP_standard_color
+	return
+
+update_batt_voltage2_empty:
+	movlw	d'1'
+	movwf	wait_temp
+	bra		update_batt_voltage2a
+
+update_batt_voltage2_full:
+	movlw	d'30'
+	movwf	wait_temp
+	bra		update_batt_voltage2a
+
+DISP_convert_signed_temperature:
+   	btfss   	hi,7                    ; Negative temperature ?
+    return								; No, return
+; Yes, negative temperature!
+	PUTC		'-'                     ; Display "-"
+    comf    	hi                      ; Then, 16bit sign changes.
+    negf    	lo
+    btfsc   	STATUS,C
+    incf    	hi
+	return								; and return
+
+DISP_convert_date:	; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
+	read_int_eeprom d'91'			; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
+	tstfsz	EEDATA
+	bra		DISP_convert_date1
+
+; Use MMDDYY
+	movff	convert_value_temp+0,lo			;month
+	bsf		leftbind
+	output_99x
+	bcf		leftbind
+	PUTC    '.'
+	movff	convert_value_temp+1,lo			;day
+	bra 	DISP_convert_date1_common		;year
+
+DISP_convert_date1:
+	read_int_eeprom d'91'			; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
+	decfsz	EEDATA,F
+	bra		DISP_convert_date2
+
+; Use DDMMYY
+	movff	convert_value_temp+1,lo			;day
+	bsf		leftbind
+	output_99x
+	bcf		leftbind
+	PUTC    '.'
+	movff	convert_value_temp+0,lo			;month
+
+DISP_convert_date1_common:
+	bsf		leftbind
+	output_99x
+	bcf		leftbind
+	PUTC    '.'
+	movff	convert_value_temp+2,lo			;year
+	bsf		leftbind
+	output_99x
+	return
+
+DISP_convert_date2:
+; Use YYMMDD
+	movff	convert_value_temp+2,lo			;year
+	bsf		leftbind
+	output_99x
+	bcf		leftbind
+    PUTC    '.'
+	movff	convert_value_temp+0,lo			;month
+	bsf		leftbind
+	output_99x
+	bcf		leftbind
+    PUTC    '.'
+	movff	convert_value_temp+1,lo			;day
+	bsf		leftbind
+	output_99x
+	return
+
+DISP_convert_date_short:	; converts into "DD/MM" or "MM/DD" or "MM/DD" in postinc2
+	read_int_eeprom d'91'			; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
+	tstfsz	EEDATA
+	bra		DISP_convert_date_short1
+
+; Use MMDDYY
+DISP_convert_date_short_common:
+	movff	convert_value_temp+0,lo			;month
+	bsf		leftbind
+	output_99x
+	bcf		leftbind
+    PUTC    '.'
+	movff	convert_value_temp+1,lo			;day
+	bsf		leftbind
+	output_99x
+	bcf		leftbind
+	return
+
+DISP_convert_date_short1:
+	read_int_eeprom d'91'			; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
+	decfsz	EEDATA,F
+	bra		DISP_convert_date_short_common	; Use YYMMDD
+
+; Use DDMMYY
+	movff	convert_value_temp+1,lo			;day
+	bsf		leftbind
+	output_99x
+	bcf		leftbind
+    PUTC    '.'
+	movff	convert_value_temp+0,lo			;month
+	bsf		leftbind
+	output_99x
+	bcf		leftbind
+	return
+
+update_date:
+	ostc_debug	'd'
+	WIN_TOP		.75
+	WIN_LEFT	.1
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+	lfsr	FSR2,letter
+
+	movff	month,convert_value_temp+0
+	movff	day,convert_value_temp+1
+	movff	year,convert_value_temp+2
+	call	DISP_convert_date		; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2	
+	call	word_processor
+	return
+
+DISP_menu_clear:
+    WIN_BOX_BLACK   .0, .26, .50, .100			;top, bottom, left, right
+	return
+
+DISP_max_pressure:
+	ostc_debug	'p'		; Sends debug-information to screen if debugmode active
+	movff	max_pressure+0,lo
+	movff	max_pressure+1,hi
+	call	adjust_depth_with_salinity			; computes salinity setting into lo:hi [mbar]
+
+	movlw	.039
+	cpfslt	hi
+    bra		maxdepth_greater_99_84mtr
+
+; Display normal "xx.y"
+	lfsr	FSR2,letter
+	call	DISP_standard_color
+	WIN_TOP		.207
+	WIN_LEFT	.0
+	WIN_FONT 	FT_MEDIUM
+	WIN_INVERT	.0					; Init new Wordprocessor
+	bsf		leftbind
+	bsf		ignore_digit5		; do not display 1cm depth
+	output_16dp	d'3'
+	bcf		leftbind
+	bcf		show_last3
+	call	word_processor
+	WIN_FONT 	FT_SMALL
+	return
+
+maxdepth_greater_99_84mtr:			; Display only in full meters
+	btfss	maxdepth_greater_100m	; Is max.depth>100m already?
+	call	DISP_clear_maxdepth		; No, clear maxdepth area and set flag
+	; max Depth is already in hi:lo
+	; Show max depth in Full meters
+	; That means ignore figure 4 and 5
+	lfsr	FSR2,letter
+	call	DISP_standard_color
+	WIN_TOP		.207
+	WIN_LEFT	.0
+	WIN_FONT 	FT_MEDIUM
+	WIN_INVERT	.0					; Init new Wordprocessor
+
+	bsf		ignore_digit4
+	bsf		leftbind
+	output_16
+	bcf		leftbind
+	call	word_processor
+	bcf		ignore_digit4
+	WIN_FONT 	FT_SMALL
+	return
+
+DISP_clear_maxdepth:
+    WIN_BOX_BLACK   .207, .239, .0, .41		;top, bottom, left, right
+	bsf		maxdepth_greater_100m	; Set Flag
+	return
+
+DISP_divemins:
+	btfsc	menubit					; Divemode menu active?
+	return							; Yes, do not update divetime
+
+	ostc_debug	'A'		; Sends debug-information to screen if debugmode active
+
+	btfsc	gauge_mode				; different display in gauge mode
+	bra		DISP_divemins_gauge
+
+	btfsc	FLAG_apnoe_mode			; different display in apnoe mode
+	bra		DISP_divemins_apnoe
+
+	GETCUSTOM8	d'38'		; Show seconds (=1?)
+	movwf	lo
+	movlw	d'1'
+	cpfseq	lo					; =1?
+	bra		DISP_divemins2		; No, minutes only
+	bra		DISP_divemins_gauge	; Yes, use Gauge routine
+	
+DISP_divemins2:
+	movff	divemins+0,lo
+	movff	divemins+1,hi
+	bcf		leftbind
+	lfsr	FSR2,letter
+	output_16_3	; displays only last three figures from a 16Bit value (0-999)
+	WIN_TOP		.20
+	WIN_LEFT	.120
+	WIN_FONT	FT_MEDIUM
+	call	DISP_standard_color
+	call	word_processor
+	WIN_FONT	FT_SMALL
+	return
+
+DISP_display_apnoe_surface:
+	btfsc	menubit					; Divemode menu active?
+	return							; Yes, do not display surface mode timeout
+
+	call		DISP_divemask_color	; Set Color for Divemode mask
+	DISPLAYTEXT	d'140'			; "SURFACE"
+	call	DISP_standard_color
+
+	WIN_TOP		.85
+	WIN_LEFT	.90
+	WIN_FONT	FT_MEDIUM
+	call	DISP_standard_color
+
+
+	movff	apnoe_surface_mins,lo
+	bcf		leftbind
+	lfsr	FSR2,letter
+	output_8
+    PUTC    ':'
+	movff	apnoe_surface_secs,lo
+	output_99x
+	call	word_processor
+	WIN_FONT	FT_SMALL
+	return
+
+DISP_apnoe_clear_surface:
+	; Clear Surface timer....
+	WIN_BOX_BLACK   .60, .119, .90, .159			;top, bottom, left, right
+	return
+
+
+DISP_display_apnoe_descent:
+	btfsc	menubit					; Divemode menu active?
+	return							; Yes, do not display/update descent time
+
+	call		DISP_divemask_color	; Set Color for Divemode mask
+	DISPLAYTEXT		d'139'			; "Descent"
+	call	DISP_standard_color
+
+
+	WIN_TOP		.145
+	WIN_LEFT	.90
+	WIN_FONT	FT_MEDIUM
+	call	DISP_standard_color
+
+
+	movff	apnoe_mins,lo
+	lfsr	FSR2,letter
+	output_8
+    PUTC    ':'
+	movff	apnoe_secs,lo
+	output_99x
+	call	word_processor
+	WIN_FONT	FT_SMALL
+	return
+	
+DISP_divemins_apnoe:
+
+DISP_divemins_gauge:
+	movff	divemins+0,lo
+	movff	divemins+1,hi
+	bcf		leftbind
+	bsf		show_last3
+	lfsr	FSR2,letter
+	output_16_3					;Displays only 0...999
+    PUTC    ':'
+	movff	divesecs,lo
+	output_99x
+	WIN_TOP		.20
+	WIN_LEFT	.90
+	WIN_FONT	FT_MEDIUM
+	call	DISP_standard_color
+
+	call	word_processor
+	bcf		show_last3
+	WIN_FONT	FT_SMALL
+	return
+
+DISP_stopwatch_show:
+	; Stopwatch
+	call		DISP_divemask_color	; Set Color for Divemode mask
+	DISPLAYTEXTH	d'283'			; Stopwatch
+
+DISP_stopwatch_show2:
+	call	DISP_standard_color
+	ostc_debug	'V'		; Sends debug-information to screen if debugmode active
+	WIN_TOP		.192
+	WIN_LEFT	.110
+	WIN_FONT	FT_SMALL
+	call	DISP_standard_color
+
+	lfsr	FSR2,letter
+	movff	average_divesecs+0,lo				; Stopwatch
+	movff	average_divesecs+1,hi				; Stopwatch
+	movlw	d'2'
+	subwf	lo,F
+	movlw	d'0'
+	subwfb	hi,F						; Subtract 2 seconds
+
+	call	convert_time				; converts hi:lo in seconds to mins (hi) and secs (lo)
+
+	movff	lo,wait_temp
+	movff	hi,lo
+	clrf	hi	
+
+	movlw	d'0'
+	bcf		leftbind
+	bsf		show_last3
+	output_16_3					;Displays only 0...999
+    PUTC    ':'
+	movff	wait_temp,lo
+	output_99x
+	call	word_processor
+
+	ostc_debug	'U'				; Sends debug-information to screen if debugmode active
+
+	WIN_TOP		.216
+	WIN_LEFT	.110
+	WIN_FONT	FT_SMALL
+	call	DISP_standard_color
+
+	lfsr	FSR2,letter
+	movff	avr_rel_pressure+0,lo
+	movff	avr_rel_pressure+1,hi
+	call	adjust_depth_with_salinity			; computes salinity setting into lo:hi [mbar]
+	bsf		ignore_digit5		; do not display 1cm depth
+	output_16dp	d'3'
+	bcf		leftbind
+	STRCAT_PRINT TXT_METER1
+	return
+
+DISP_stopwatch_show_gauge:
+	btfsc	menubit					; Divemode menu active?
+	return							; Yes, return
+	; BIG Stopwatch
+	call	DISP_divemask_color	; Set Color for Divemode mask
+	DISPLAYTEXTH	d'310'			; Stopwatch
+	DISPLAYTEXTH	d'309'			; Average
+	call	DISP_standard_color
+	ostc_debug	'V'		; Sends debug-information to screen if debugmode active
+	WIN_TOP		.80
+	WIN_LEFT	.90
+	WIN_FONT	FT_MEDIUM
+	call	DISP_standard_color
+
+	lfsr	FSR2,letter
+	movff	average_divesecs+0,lo				; Stopwatch
+	movff	average_divesecs+1,hi				; Stopwatch
+	movlw	d'2'
+	subwf	lo,F
+	movlw	d'0'
+	subwfb	hi,F						; Subtract 2 seconds
+	call	convert_time				; converts hi:lo in seconds to mins (hi) and secs (lo)
+	movff	lo,wait_temp
+	movff	hi,lo
+	clrf	hi	
+	movlw	d'0'
+	bcf		leftbind
+	bsf		show_last3
+	output_16_3					;Displays only 0...999
+    PUTC    ':'
+	movff	wait_temp,lo
+	output_99x
+	call	word_processor
+
+	ostc_debug	'U'				; Sends debug-information to screen if debugmode active
+	WIN_TOP		.136
+	WIN_LEFT	.90
+	WIN_FONT	FT_MEDIUM
+	call	DISP_standard_color
+	lfsr	FSR2,letter
+	movff	avr_rel_pressure+0,lo
+	movff	avr_rel_pressure+1,hi
+	call	adjust_depth_with_salinity		; computes salinity setting into lo:hi [mbar]
+	bsf		ignore_digit5					; do not display 1cm depth
+	output_16dp	d'3'
+	bcf		leftbind
+	STRCAT_PRINT TXT_METER1
+	WIN_FONT	FT_SMALL				; Reset...
+	return
+
+
+DISP_total_average_show:
+	; Non-Resettable Average
+	call		DISP_divemask_color	; Set Color for Divemode mask
+	DISPLAYTEXTH	d'281'			; Avr.Depth
+
+DISP_total_average_show2:
+	WIN_TOP		.192
+	WIN_LEFT	.110
+	WIN_FONT	FT_SMALL
+	call	DISP_standard_color
+
+	lfsr	FSR2,letter
+	movff	avr_rel_pressure_total+0,lo
+	movff	avr_rel_pressure_total+1,hi
+	call	adjust_depth_with_salinity			; computes salinity setting into lo:hi [mbar]
+	bsf		ignore_digit5		; do not display 1cm depth
+	bcf		leftbind
+	output_16dp	d'3'
+	STRCAT_PRINT TXT_METER1
+	return
+
+;=============================================================================
+; Writes OSTC #Serial and Firmware version in surfacemode
+;
+DISP_serial:			
+	ostc_debug	'a'		; Sends debug-information to screen if debugmode active
+	WIN_TOP		.0
+	WIN_LEFT	.1
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0                      ; Init new Wordprocessor
+	
+  ifdef __DEBUG
+	GETCUSTOM8	d'64'					; Write header in blue when
+    call    DISP_set_color              ; compiled in DEBUG mode...
+  else
+	call	DISP_standard_color
+  endif
+
+	lfsr	FSR2,letter
+	read_int_eeprom d'34'		; Read deco data
+	tstfsz	EEDATA
+	bra		show_decotype_mainscreen2
+	OUTPUTTEXT	.101			; ZH-L16 OC =0
+	bra		show_decotype_mainscreen8	; Done.
+show_decotype_mainscreen2:
+	decfsz	EEDATA,F
+	bra		show_decotype_mainscreen3
+	OUTPUTTEXT	.102			; Gauge	=1
+	bra		show_decotype_mainscreen8	; Done.
+show_decotype_mainscreen3:
+	decfsz	EEDATA,F
+	bra		show_decotype_mainscreen4
+	OUTPUTTEXT	.104			; ZH-L16 CC =2
+	bra		show_decotype_mainscreen8	; Done.
+show_decotype_mainscreen4:
+	decfsz	EEDATA,F
+	bra		show_decotype_mainscreen5
+	OUTPUTTEXT	.138			; Apnoe	=3
+	bra		show_decotype_mainscreen8	; Done.
+show_decotype_mainscreen5:
+	decfsz	EEDATA,F
+	bra		show_decotype_mainscreen6
+	OUTPUTTEXT	.152			; L16-GF OC	=4
+	bra		show_decotype_mainscreen8	; Done.
+show_decotype_mainscreen6:
+	decfsz	EEDATA,F
+	bra		show_decotype_mainscreen7
+	OUTPUTTEXT	.236			; L16-GF CC	=5
+	bra		show_decotype_mainscreen8	; Done.
+show_decotype_mainscreen7:
+	decfsz	EEDATA,F
+	bra		show_decotype_mainscreen8	; Done.
+	OUTPUTTEXT	.226			; pSCR-GF =6
+show_decotype_mainscreen8:
+	STRCAT  " \x90\x91 V"               ; Scribble logo...
+	movlw	softwareversion_x
+	movwf	lo
+	bsf		leftbind
+	output_8
+    PUTC    '.'
+	movlw	softwareversion_y
+	movwf	lo
+	bsf		leftbind
+	output_99x
+	bcf		leftbind
+
+  ifdef __DEBUG
+    STRCAT_PRINT "-Dbg"    
+  else
+	call	word_processor
+
+	movlw	softwareversion_beta        ; =1: Beta, =0: Release
+	decfsz	WREG,F
+	return                              ; Release version -> Return
+
+	call	DISP_warnings_color
+	DISPLAYTEXT		d'243'              ; beta
+	call	DISP_standard_color
+  endif
+
+	return
+
+;=============================================================================
+
+DISP_divemode_menu_mask_first:			; Write Divemode menu1 mask
+	ostc_debug	'o'		; Sends debug-information to screen if debugmode active
+	call	DISP_menu_clear			; clear "Menu?"
+	call    DISP_standard_color
+
+	btfsc	FLAG_const_ppO2_mode	; are we in ppO2 mode?
+	bra		DISP_divemode_menu_mask_first2
+
+; in OC Mode
+	DISPLAYTEXT	.32					;"Gaslist"
+	DISPLAYTEXT	.31					;"Decoplan"
+	bra		DISP_divemode_menu_mask_first3
+
+DISP_divemode_menu_mask_first2:
+; in CC Mode
+	DISPLAYTEXT	.238				;"SetPoint"
+	DISPLAYTEXT	.31					;"Decoplan"
+
+DISP_divemode_menu_mask_first3:
+; In all modes
+	call	customview_menu_entry3	; Show customview-dependent menu entry
+	DISPLAYTEXT	.241				;"Display"
+	DISPLAYTEXT	.34					;"Exit"
+	return							
+
+DISP_divemode_set_xgas:				; Displayes the "Set Gas" menu
+	WIN_LEFT	.100
+	WIN_TOP		.0
+	WIN_FONT	FT_SMALL
+	call	DISP_standard_color
+
+    STRCPY  TXT_G6_3
+	read_int_eeprom	d'24'			; Get Gas6 %O2
+	movff	EEDATA,lo
+	bcf		leftbind
+	output_99					; outputs into Postinc2!
+    PUTC    '/'
+	read_int_eeprom	d'25'			; Get Gas6 %He
+	movff	EEDATA,lo
+	output_99					; outputs into Postinc2!
+	call	word_processor
+	DISPLAYTEXT	.123			; O2 +
+	DISPLAYTEXT	.124			; O2 -
+	DISPLAYTEXT	.125			; He +
+	DISPLAYTEXT	.126			; He -
+	DISPLAYTEXTH	d'300'		; Active? (Enable/Disable Gas underwater)
+	return
+
+DISP_divemode_simulator_mask:
+	    call    DISP_standard_color
+        DISPLAYTEXT	.254			; Close
+        DISPLAYTEXT	.250			; + 1m
+        DISPLAYTEXT	.251			; - 1m
+        DISPLAYTEXT	.252			; +10m
+        DISPLAYTEXT	.253			; -10m
+		DISPLAYTEXTH .306			; Quit Sim
+        return
+
+;-----------------------------------------------------------------------------
+; Draw a stop of the deco plan (simulator or dive).
+; Inputs: lo      = depth. Range 3m...93m
+;                 + 80 if this is a switch-gas stop.
+;         hi      = minutes. range 1'..240'.
+;         win_top = line to draw on screen.
+; Trashed: hi, lo, win_height, win_leftx2, win_width, win_color*,
+;          WREG, PROD, TBLPTR TABLAT.
+;
+DISP_decoplan_show_stop:
+        ;---- Print depth ----------------------------------------------------
+        WIN_LEFT .100
+        
+        btfss   lo,7                    ; Bit set ?
+        bra     DISP_decoplan_std_stop  ; No : Just an usual stop
+
+        bcf     lo,7                    ; cleanup depth
+		
+		GETCUSTOM8	d'55'				; Load gas switch [min] in wreg
+		tstfsz	WREG					; =0?
+		bra		DISP_decoplan_show_stop1; No: Show gas switch stop
+		bra     DISP_decoplan_std_stop  ; Yes: Just an usual stop
+		
+DISP_decoplan_show_stop1:		
+        movlw   color_yellow
+        call    DISP_set_color			; Show in yellow for gas switch
+        bra     DISP_decoplan_nstd_stop
+
+DISP_decoplan_std_stop:
+	    call    DISP_standard_color
+
+DISP_decoplan_nstd_stop:        
+	    lfsr	FSR2,letter
+	    bsf     leftbind
+	    output_8					    ; outputs into Postinc2!
+        STRCAT_PRINT TXT_METER2
+
+        ;---- Print duration -------------------------------------------------
+	    WIN_LEFT	.140
+	    lfsr	FSR2,letter
+	    
+	    movf    lo,W                    ; Swap hi & lo
+	    movff   hi,lo
+	    movwf   hi
+
+	    output_8					    ; Allow up to 240'
+        STRCAT_PRINT "'  "              ; 1 to 3 chars for depth.
+
+	    movf    lo,W                    ; Swap back hi & lo
+	    movff   hi,lo
+	    movwf   hi
+
+        ;---------------------------------------------------------------------
+        ; Draw the bar graph used for deco stops (decoplan in simulator or dive).
+        movff   win_top,WREG            ; Increment win_top (BANK SAFE)
+        incf    WREG
+        movff   WREG,win_top
+        movlw	d'18'+1                 ; 19 --> height (bank safe !)
+        movff   WREG,win_height
+        movlw	.122
+        movff	WREG,win_leftx2    		; column left (0-159)
+        movlw	.16
+        movff	WREG,win_width    		; column max width.
+
+        ; Draw used area (hi = minutes):
+        movlw	d'16'                   ; Limit length (16min)
+        cpfslt	hi
+        movwf	hi
+        movff	hi,win_bargraph         ; Active width, the rest is cleared.
+        call	DISP_box
+
+        ; Restore win_top
+        call    DISP_standard_color
+        movff   win_top,WREG            ; decf win_top (BANK SAFE)
+        decf    WREG
+        movff   WREG,win_top
+        return
+
+;-----------------------------------------------------------------------------
+; Clear unused area belw last stop
+; Inputs: win_top : last used area...
+DISP_decoplan_clear_bottom:
+        movff   win_top,WREG            ; Get back from bank0
+        btfsc   divemode                ; In dive mode ?
+        sublw   .168                    ; Yes: bottom row in divemode
+        btfss   divemode                ; In dive mode ?
+        sublw   .240                    ; No: bottom row in planning
+        movff   WREG,win_height
+
+        WIN_LEFT .85                    ; Full divemenu width
+        movlw   .160-.85+1
+        movff   WREG,win_width
+
+        clrf    WREG                    ; Fill with black
+        movff   WREG,win_color1
+        movff   WREG,win_color2
+        
+        goto	DISP_box
+
+;-----------------------------------------------------------------------------
+; Display the decoplan (simulator or divemode) for GF model
+; Inputs: char_O_deco_table (array of stop times, in minutes)
+;         decoplan_page = page number. Displays 5 stop by page.
+;
+#define decoplan_index  apnoe_mins          ; within each page
+#define decoplan_gindex apnoe_secs          ; global index
+#define decoplan_last   apnoe_max_pressure  ; Depth of last stop (CF#29)
+#define decoplan_max    apnoe_max_pressure+1; Number of lines per page. 7 in planning, 5 in diving.
+
+DISP_decoplan:
+        ostc_debug	'n'		; Sends debug-information to screen if debugmode active
+
+        WIN_INVERT 0
+
+        ;---- Is there deco stops ? ------------------------------------------
+    	movff   char_O_first_deco_depth,WREG
+    	iorwf   WREG
+        bnz		DISP_decoplan_1
+
+        ;---- No Deco --------------------------------------------------------
+        call    DISP_standard_color
+        DISPLAYTEXT	d'239'              ;"No Deco"
+        bsf     last_ceiling_gf_shown
+        return
+
+DISP_decoplan_1:
+    	lfsr	FSR0,char_O_deco_depth  ; Initialize indexed addressing.
+	    lfsr	FSR1,char_O_deco_time
+
+        movlw   .8                      ; 8 lines/page in decoplan
+        btfsc   divemode
+        movlw   .6                      ; 6 lines/page in divemode.
+        movwf   decoplan_max
+
+        clrf   decoplan_index           ; Start with index = 0
+        clrf	WREG
+        movff	WREG,win_top            ; and row = 0
+
+        ; Read stop parameters, indexed by decoplan_index and decoplan_page
+        movf    decoplan_page,W         ; decoplan_gindex = 6*decoplan_page + decoplan_index
+        mulwf   decoplan_max
+        movf    decoplan_index,W
+        addwf   PRODL,W
+        movwf   decoplan_gindex         ; --> decoplan_gindex
+        
+        bcf     last_ceiling_gf_shown   ; Not finished yet...
+
+DISP_decoplan_2:
+        btfsc   decoplan_gindex,5       ; Reached table length (32) ?
+        bra     DISP_decoplan_99        ; YES: finished...
+
+        ; Read stop parameters, indexed by decoplan_index
+        movf    decoplan_gindex,W       ; index
+    	movff	PLUSW1,hi               ; char_O_deco_time [gindex] --> hi
+	    movff	PLUSW0,lo               ; char_O_deco_depth[gindex]
+        movf    lo,W
+        bz      DISP_decoplan_99        ; depth == 0 : finished.
+
+        ; Display the stop line
+    	call	DISP_decoplan_show_stop
+
+        ; Next
+        movff   win_top,WREG            ; row: += 24
+	    addlw	.24
+        movff   WREG,win_top
+	    incf	decoplan_index,F        ; local index += 1
+	    incf	decoplan_gindex,F       ; global index += 1
+
+        ; Max number of lines/page reached ?
+    	movf    decoplan_max,W          ; index+1 == max ?
+    	cpfseq	decoplan_index
+    	bra		DISP_decoplan_2         ; NO: loop
+
+    	; Check if next stop if end-of-list ?
+    	movf    decoplan_gindex,W
+	    movff	PLUSW0,WREG             ; char_O_deco_depth[gindex]
+	    iorwf   WREG
+    	bz      DISP_decoplan_99        ; End of list...
+
+        ; Display the message "more..."
+        bcf		last_ceiling_gf_shown	; More page to display...
+
+        rcall   DISP_decoplan_clear_bottom  ; Clear from next line
+
+    	WIN_LEFT .130 - 7*3
+    	call    DISP_standard_color
+    	lfsr    FSR2,letter
+    	OUTPUTTEXT .142                 ; More...
+    	goto    word_processor
+
+DISP_decoplan_99:
+        bsf		last_ceiling_gf_shown   ; Nothing more in table to display.
+        rcall   DISP_decoplan_clear_bottom  ; Clear from next line
+        return
+;-----------------------------------------------------------------------------
+; Toggle gas activity flag during dive.
+; 
+; Input: gaslist_active
+;        Gaslist from eeprom[2...]
+;
+; Output: gaslist_active
+;
+; Note: Gas with a zero depth cannot be used in deco simulation, hence
+;       should not be displayed as selected here...
+;
+DISP_de_activelist:			; show (de)active gaslist
+	call	DISP_standard_color	
+    DISPLAYTEXT	.254			; Close
+
+	WIN_LEFT	.100
+	WIN_FONT	FT_SMALL
+	bsf		leftbind
+	
+	movlw	d'2'
+	movwf	wait_temp			; here: stores eeprom address for gas list
+	movlw	d'0'
+	movwf	waitms_temp			; here: stores row for gas list
+	clrf	hi					; here: Gas counter
+
+DISP_de_activelist_loop:
+	incf	hi,F				; Increase Gas
+	movlw	d'4'
+	addwf	wait_temp,F			; Increase eeprom address for gas list
+	movlw	d'25'
+	addwf	waitms_temp,F		; Increase row
+	WIN_LEFT	.100
+	movff	waitms_temp,win_top ; Set Row
+	
+  	lfsr	FSR2,letter
+	movff	wait_temp, EEADR; Gas #hi: %O2 - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+    PUTC    '/'
+	incf	EEADR,F			; Gas #hi: %He - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+    PUTC    '@'
+
+	movlw	d'27'
+	addwf	hi,W
+	movwf	EEADR			; Point to Change depth
+
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+	
+	movf    lo,w            ; Gas with a zero depth
+	bz      DISP_de_activelist_grey ; should be displayed inactive.
+	
+; Check if gas needs to be greyed-out (inactive)	
+	movff	gaslist_active,EEDATA	; Get flag register
+	movff	hi,lo			; copy gas number
+DISP_de_activelist_loop1:
+	rrcf	EEDATA			; roll flags into carry
+	decfsz	lo,F			; max. 5 times...
+	bra		DISP_de_activelist_loop1
+    bc      DISP_de_activelist_white
+
+DISP_de_activelist_grey:    ; grey out inactive gases!
+	GETCUSTOM8	d'64'					;movlw	color_grey
+	call	DISP_set_color
+
+DISP_de_activelist_white:
+	call	word_processor	
+	call	DISP_standard_color	
+
+	movlw	d'5'			; list all five gases
+	cpfseq	hi				; All gases shown?
+	bra		DISP_de_activelist_loop	; No
+
+	return					;  return 
+
+DISP_show_change_depth:		; Yes, show change depth for gas #menupos
+	btfsc	display_set_setpoint	; In Setpoint list?
+	return							; Yes, return.
+	movlw	color_yellow			; Blink in yellow
+    call	DISP_set_color
+	WIN_LEFT	.95
+	WIN_TOP		.148
+	WIN_FONT	FT_SMALL
+
+	movlw	.6
+	cpfslt	menupos							; <6?
+	bra		DISP_show_change_depth_clear	; Yes!
+
+	bsf		leftbind
+	STRCPY  TXT_GAS1
+	movff	menupos,lo
+	output_8					; Show gas number
+    STRCAT  TXT_AT4				; " at "
+	decf	menupos,W
+	addlw	d'28'				; offset in memory
+	movwf	EEADR
+	call	read_eeprom			; Low-value
+	movff	EEDATA,lo
+	output_8					; Show gas number
+    STRCAT_PRINT  TXT_METER2	; "m "
+	bcf		leftbind
+	call	DISP_standard_color
+	return
+
+DISP_show_change_depth_clear:
+	STRCPY_PRINT  "         "
+	return
+
+DISP_diluent_list:
+	ostc_debug	'm'		; Sends debug-information to screen if debugmode active
+	WIN_LEFT	.100
+	WIN_FONT	FT_SMALL
+	bsf		leftbind
+    movlw	d'94'
+	movwf	wait_temp			; here: stores eeprom address for diluent list (96-2)
+	movlw	d'231'
+	movwf	waitms_temp			; here: stores row for gas list
+	clrf	hi					; here: Diluent counter
+
+DISP_diluent_list_loop:
+   	incf	hi,F				; Increase Diluent
+    movlw   .2
+	addwf   wait_temp,F			; Increase eeprom address for gas list
+	movlw	d'25'
+	addwf	waitms_temp,F		; Increase row
+	WIN_LEFT	.100
+	movff	waitms_temp,win_top ; Set Row
+	STRCPY  TXT_DIL_C
+	movff	hi,lo			; copy dil number
+	output_8				; display dil number
+    PUTC    ':'
+	movff	wait_temp, EEADR; Dil #hi: %O2 - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+    PUTC    '/'
+	incf	EEADR,F			; Dil #hi: %He - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+
+	decf	EEADR,F			; Dil #hi: %O2 - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	DISP_color_code		warn_gas_in_gaslist		; Color-code output	(%O2 in "EEDATA")
+    
+	call	word_processor
+	call	DISP_standard_color
+
+	movlw	d'5'			; list all five Diluents
+	cpfseq	hi				; All diluents shown?
+	bra		DISP_diluent_list_loop	; No
+	return					;  return
+
+
+DISP_gas_list:
+	ostc_debug	'm'		; Sends debug-information to screen if debugmode active
+
+	WIN_LEFT	.100
+	WIN_FONT	FT_SMALL
+	bsf		leftbind
+	
+	movlw	d'2'
+	movwf	wait_temp			; here: stores eeprom address for gas list
+	movlw	d'231'
+	movwf	waitms_temp			; here: stores row for gas list
+	clrf	hi					; here: Gas counter
+
+DISP_gas_list_loop:
+	incf	hi,F				; Increase Gas
+	movlw	d'4'
+	addwf	wait_temp,F			; Increase eeprom address for gas list
+	movlw	d'25'
+	addwf	waitms_temp,F		; Increase row
+	WIN_LEFT	.100
+	movff	waitms_temp,win_top ; Set Row
+	STRCPY  TXT_GAS1
+	movff	hi,lo			; copy gas number
+	output_8				; display gas number
+    PUTC    ':'
+	movff	wait_temp, EEADR; Gas #hi: %O2 - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+    PUTC    '/'
+	incf	EEADR,F			; Gas #hi: %He - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+
+	decf	EEADR,F			; Gas #hi: %O2 - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	DISP_color_code		warn_gas_in_gaslist		; Color-code output	(%O2 in "EEDATA")
+
+; Check if the "better gas" should be highlighted
+
+	WIN_INVERT	.0					; Init new Wordprocessor	
+	movf	better_gas_number,W	; better gas 1-5?
+	cpfseq	hi					; compare with gas#
+	bra		DISP_gas_list_loop2	; No equal, skip
+	
+	movlw	color_yellow			; Blink in yellow
+    call	DISP_set_color
+	WIN_INVERT	.1					; Init new Wordprocessor	
+	
+DISP_gas_list_loop2:
+; Check if gas needs to be greyed-out (inactive)
+	movff	gaslist_active, EEDATA		; Work with sorted list
+	movff	hi,lo			; copy gas number
+DISP_gas_list_loop1:
+	rrcf	EEDATA			; roll flags into carry
+	decfsz	lo,F			; max. 5 times...
+	bra		DISP_gas_list_loop1
+
+	btfss	STATUS,C		; test carry
+	rcall	DISP_gas_list_grey
+		
+	call	word_processor	
+	call	DISP_standard_color	
+
+	movlw	d'5'			; list all five gases
+	cpfseq	hi				; All gases shown?
+	bra		DISP_gas_list_loop	; No
+
+	DISPLAYTEXT		d'122'		; More
+	return					;  return (OC mode)
+
+DISP_gas_list_grey:
+	GETCUSTOM8	d'64'					;movlw	color_grey
+	call	DISP_set_color	; grey out inactive gases!
+	return
+
+DISP_splist_start:	
+	WIN_LEFT	.100
+	WIN_FONT	FT_SMALL
+	bsf		leftbind
+	call    DISP_standard_color
+
+	; list three SP in Gaslist
+	movlw	d'35'				; 36 = current SP position in EEPROM
+	movwf	wait_temp			; here: stores eeprom address for gas list
+	movlw	d'0'
+	movwf	waitms_temp			; here: stores row for gas list
+	clrf 	decoplan_index	    ; here: SP counter
+
+DISP_splist_loop:
+	incf	wait_temp,F			; EEPROM address
+	incf	decoplan_index,F	; Increase SP
+
+	movlw	d'25'
+	addwf	waitms_temp,F		; Increase row
+	movff	waitms_temp,win_top ; Set Row
+	WIN_LEFT	.100
+	
+	STRCPY  TXT_SP2
+	movff	decoplan_index,lo	; copy gas number
+	output_8				; display gas number
+    PUTC    ':'
+	movff	wait_temp, EEADR; SP #hi position
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	clrf	hi
+	output_16dp	d'3'		; outputs into Postinc2!
+	call	word_processor	
+
+	movlw	d'3'		; list all three SP
+	cpfseq	decoplan_index          ; All gases shown?
+	bra		DISP_splist_loop	; No
+
+	bcf		leftbind
+	return						; no, return
+
+DISP_clear_divemode_menu:
+    WIN_BOX_BLACK   .0, .168, .85, .160		;top, bottom, left, right
+	return
+
+DISP_divemenu_cursor:
+	ostc_debug	'l'		; Sends debug-information to screen if debugmode active
+
+    WIN_BOX_BLACK   .0, .150, .85, .95			;top, bottom, left, right
+
+	WIN_TOP		.0
+	WIN_LEFT	.85
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call	DISP_standard_color
+
+	movff	menupos,temp1
+	movlw	d'0'
+	dcfsnz	temp1,F
+	movlw	d'0'
+	dcfsnz	temp1,F
+	movlw	d'25'
+	dcfsnz	temp1,F
+	movlw	d'50'
+	dcfsnz	temp1,F
+	movlw	d'75'
+	dcfsnz	temp1,F
+	movlw	d'100'
+	dcfsnz	temp1,F
+	movlw	d'125'
+
+	movff	WREG,win_top
+    STRCPY_PRINT "\xB7"				; Cursor
+	return
+
+
+;=============================================================================
+; Draw saturation graph, is surface mode or in dive mode.
+;
+DISP_tissue_saturation_graph:
+	ostc_debug	'i'		; Sends debug-information to screen if debugmode active
+
+    ;---- Draw Frame ---------------------------------------------------------
+    btfsc   divemode
+    bra     DISP_tsg_1
+    
+    WIN_FRAME_STD   .25, .120, .82, .159    ; Surfmode
+    bra     DISP_tsg_2
+DISP_tsg_1:    
+    WIN_FRAME_STD   .169, .239, .90, .159   ; Divemode
+DISP_tsg_2:
+
+    ;---- Draw grid ----------------------------------------------------------
+    btfss   divemode
+    bra     DISP_no_graph_grid
+    
+	GETCUSTOM8	d'64'					;movlw	color_grey
+    call	DISP_set_color
+
+    movlw   .169+.1                     ; divemode
+	movff	WREG,win_top
+    movlw   .239-.169-.1                ; divemode
+	movff	WREG,win_height
+
+    movlw   1
+    movff   WREG,win_width
+
+    movlw   .122
+    movff   WREG,win_leftx2
+    call    DISP_box
+    movlw   .131
+    movff   WREG,win_leftx2
+    call    DISP_box
+    movlw   .140
+    movff   WREG,win_leftx2
+    call    DISP_box
+    movlw   .149
+    movff   WREG,win_leftx2
+    call    DISP_box
+DISP_no_graph_grid:
+    
+    ;---- Draw N2 Tissues ----------------------------------------------------
+	lfsr	FSR2, char_O_tissue_N2_saturation
+	movlw	d'16'
+	movwf	wait_temp                   ; 16 tissues
+	clrf	waitms_temp                 ; Row offset
+
+	movlw	.1
+	movff	WREG,win_height             ; row bottom (0-239)
+	movlw	.82+.18                     ; surfmode
+    btfsc   divemode
+    movlw   .90+.18                     ; divemode
+	movff	WREG,win_leftx2             ; column left (0-159)
+    movlw	.57                         ; surfmode: max width 57pix
+    btfsc   divemode
+	movlw	.57-8                       ; divemode: 8pix less...
+	movff   WREG,win_width
+
+DISP_tissue_saturation_graph3:
+    call    DISP_standard_color         ; Reset color foreach iteration
+
+	movlw	.25+3                       ; surfmode: 3pix below top border
+    btfsc   divemode
+    movlw   .169+3                      ; divemode
+	addwf	waitms_temp,W
+	movff	WREG,win_top                ; row top (0-239)
+
+	incf	waitms_temp,F
+	incf	waitms_temp,F
+
+	movf	POSTINC2,W
+	bcf		STATUS,C                    ; Clear carry
+	rrcf	WREG                        ; And divide by 4
+	bcf		STATUS,C
+	rrcf	WREG
+	movwf   temp1
+
+	movff   win_width,WREG              ; Max width.
+	cpfslt	temp1                       ; skip if 57 (WREG) < win_width
+	movwf	temp1
+	movff   temp1,win_bargraph
+
+	call	DISP_box	
+
+	decfsz	wait_temp,F
+	bra		DISP_tissue_saturation_graph3
+
+    ;---- Draw He Tissues ----------------------------------------------------
+	lfsr	FSR2, char_O_tissue_He_saturation
+	movlw	d'16'
+	movwf	wait_temp                   ; 16 tissues
+	clrf	waitms_temp                 ; Row offset
+
+DISP_tissue_saturation_graph2:
+    call    DISP_standard_color         ; Reset color foreach iteration
+
+	movlw	.120-.33                    ; surfmode : 33pix above bottom border
+    btfsc   divemode
+    movlw   .239-.33                    ; divemode
+	addwf	waitms_temp,W
+	movff	WREG,win_top                ; row top (0-239)
+
+	incf	waitms_temp,F
+	incf	waitms_temp,F
+
+	movf	POSTINC2,W
+	bcf		STATUS,C                    ; Clear carry
+	rrcf	WREG                        ; And divide by 4
+	bcf		STATUS,C
+	rrcf	WREG
+	movwf   temp1
+
+	movff   win_width,WREG              ; Max width.
+	cpfslt	temp1                       ; skip if 57 (WREG) < win_width
+	movwf	temp1
+	movff   temp1,win_bargraph
+
+	call	DISP_box	
+
+	decfsz	wait_temp,F
+	bra		DISP_tissue_saturation_graph2
+
+    ;---- Draw N2/He Text ----------------------------------------------------
+    call    DISP_standard_color         ; Reset color after last iterarion.
+
+	movlw	.82+2                       ; surfmode: 2pix right of left border
+    btfsc   divemode
+    movlw   .90+2                       ; divemode
+    movff   WREG,win_leftx2
+
+	movlw	.25+7                       ; surfmode: 7pix below top border
+    btfsc   divemode
+    movlw   .169+7                      ; divemode
+    movff   WREG,win_top
+	STRCPY_PRINT  TXT_N2_2
+
+	movlw	.120-.30                    ; surfmode: 30pix above bottom border
+    btfsc   divemode
+    movlw   .239-.30                    ; divemode
+    movff   WREG,win_top
+	STRCPY_PRINT  TXT_HE2
+	
+    ;---- Draw scale and O2[16]% ---------------------------------------------
+    btfsc   divemode
+    return
+
+	movff	char_O_gtissue_no,wait_temp			; used as temp
+
+	lfsr	FSR1,char_O_tissue_N2_saturation
+	movf	wait_temp,W			; W <- 0-15
+	movff	PLUSW1,lo			; lo <- FSR1[W]
+
+	WIN_TOP		.62
+	WIN_FONT	FT_SMALL
+	lfsr	FSR2,letter
+	bsf		leftbind
+	output_8
+	bcf		leftbind
+
+	STRCAT_PRINT  "% "
+
+    ;---- Draw Scale ---------------------------------------------------------
+    WIN_BOX_STD .73, .74, .121, .157
+    WIN_BOX_STD .61, .84, .121, .122
+    WIN_BOX_STD .65, .80, .130, .131
+    WIN_BOX_STD .65, .80, .139, .140
+    WIN_BOX_STD .65, .80, .148, .149
+    WIN_BOX_STD .61, .84, .157, .158
+	return
+
+;=============================================================================
+
+DISP_startupscreen1:
+	call	DISP_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor
+	DISPLAYTEXT d'3'			; "HeinrichsWeikamp"
+	WIN_INVERT	.0	; Init new Wordprocessor
+	DISPLAYTEXT	.68				; Licence 1/2
+	DISPLAYTEXT	.69
+	DISPLAYTEXT	.70
+	DISPLAYTEXT	.71
+	DISPLAYTEXT	.72
+	DISPLAYTEXT	.73
+	DISPLAYTEXT	.74
+	return
+
+DISP_startupscreen2:
+	call	DISP_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor
+	DISPLAYTEXT d'3'			; "HeinrichsWeikamp"
+	WIN_INVERT	.0	; Init new Wordprocessor
+	DISPLAYTEXT	.75				; Licence 2/2
+	DISPLAYTEXT	.76
+	DISPLAYTEXT	.77
+	DISPLAYTEXT	.78
+	DISPLAYTEXT	.79
+	DISPLAYTEXT	.80
+	DISPLAYTEXT	.81
+	return
+
+DISP_new_cf_warning:
+	call	DISP_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor	
+	DISPLAYTEXTH	.271		; New CF added!
+	WIN_INVERT	.0	; Init new Wordprocessor	
+	DISPLAYTEXTH .272		; New CustomFunctions
+	DISPLAYTEXTH .273		; were added! Check
+	DISPLAYTEXTH .274		; CF I and CF II Menu
+	DISPLAYTEXTH .275		; for Details!
+	return
+
+DISP_const_ppO2_value:
+	ostc_debug	'j'		; Sends debug-information to screen if debugmode active
+	
+	WIN_TOP		.168
+	WIN_LEFT 	.50
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+
+	lfsr	FSR2,letter
+	movff	char_I_const_ppO2,lo
+	
+	tstfsz	lo						; In Bailout mode (char_I_const_ppO2=0)?
+	bra		DISP_const_ppO2_value2	; No, display Setpoint
+
+; Yes, Display "Bail"
+	call		DISP_standard_color
+	OUTPUTTEXTH		d'263'			;"Bail "
+	call	word_processor
+	return
+
+DISP_const_ppO2_value2:				; Display SetPoint
+;Show fixed SP value
+    SAFE_2BYTE_COPY amb_pressure, xA
+
+	movlw		d'10'
+	movwf		xB+0
+	clrf		xB+1
+	;xA/xB=xC with xA as remainder 	
+	call		div16x16				; xC+0=p_amb/10
+
+	; char_I_const_ppO2 > p_amb/10 -> Not physically possible! -> Display actual value!
+	tstfsz	xC+1				; xC>255
+	setf	xC+0				; Yes, set xC+0 to 2,55bar ppO2
+
+	movff		ppO2_setpoint_store,WREG
+	cpfslt		xC+0							; Setpoint value possible?
+	bra			DISP_const_ppO2_value1			; Yes
+
+	clrf		hi								; Reset hi
+	movff		xC+0,char_I_const_ppO2			; No, Overwrite with actual value
+	bra			DISP_const_ppO2_value1a
+
+DISP_const_ppO2_value1:
+	; char_I_const_ppO2 < ppO2[Diluent] -> Not physically possible! -> Display actual value!
+    SAFE_2BYTE_COPY amb_pressure, xA
+	movlw		d'10'
+	movwf		xB+0
+	clrf		xB+1
+	call		div16x16				; xC=p_amb/10
+	movff		xC+0,xA+0
+	movff		xC+1,xA+1
+	movff		char_I_O2_ratio,xB+0
+	clrf		xB+1
+	call		mult16x16				; xC:2=char_I_O2_ratio * p_amb/10
+
+	movff		xC+0,sub_b+0
+	movff		xC+1,sub_b+1
+	movff		ppO2_setpoint_store,WREG; Setpoint
+	mullw		d'100'					; Setpoint*100
+	movff		PRODL,sub_a+0
+	movff		PRODH,sub_a+1
+	call		sub16					; sub_c = sub_a - sub_b
+
+	btfss		neg_flag
+	bra			DISP_const_ppO2_value11	; Value in range (lower then fix Setpoint)
+
+	; char_I_const_ppO2 < ppO2[Diluent] -> Not physically possible! -> Display actual value!
+
+	movff		xC+0,xA+0				; xC=p_amb/10
+	movff		xC+1,xA+1
+	movlw		d'100'
+	movwf		xB+0
+	clrf		xB+1
+	call		div16x16				;xA/xB=xC with xA as remainder 	
+
+	movff		xC+0,char_I_const_ppO2	; No, Overwrite with actual value
+	movff		xC+1,hi					; For test if ppO2>2,55bar
+	
+	GETCUSTOM8	d'39'					; Adjust fixed SP?
+	dcfsnz		WREG,F
+	bra			DISP_const_ppO2_value1a	; Yes!
+	; Do not adjust -> restore original SetPoint
+
+DISP_const_ppO2_value11:
+; Setpoint in possible limits
+	movff		ppO2_setpoint_store,char_I_const_ppO2		; Restore Setpoint
+	clrf		hi
+	
+DISP_const_ppO2_value1a:
+	movff	char_I_const_ppO2,lo
+
+	movff	lo,WREG					; copy to WREG
+	mullw	.100
+	movff	PRODH,xC+1
+	movff	PRODL,xC+0				; For color code
+	DISP_color_code		warn_ppo2	; Color-code output (ppO2 stored in xC)	
+
+	tstfsz	hi						; >2,55bar?
+	rcall	DISP_const_ppO2_too_hi	; Yes
+
+	bsf		leftbind
+	output_16dp	d'3'
+	bcf		leftbind
+	STRCAT_PRINT  " "				; Display Setpoint with trailing zero
+	call	DISP_standard_color		; Reset color
+	return
+
+DISP_const_ppO2_too_hi:
+	PUTC	'>'
+	setf	lo						; show ">2.55"
+	clrf	hi						; clear hi
+	call	DISP_warnings_color		; Set Warning color
+	return
+
+;=============================================================================
+; Display EAD/END computed in calc_hauptroutine_update_tissues() every 2sec.
+;
+DISP_show_end_ead_divemode:
+	call		DISP_divemask_color     ; Set Color for Divemode mask
+
+	WIN_FONT	FT_SMALL
+	WIN_LEFT	.95
+	WIN_TOP		.192
+	lfsr	FSR2,letter
+	OUTPUTTEXTH	.299                    ; EAD:
+	call        word_processor
+
+	WIN_TOP		.216
+	lfsr        FSR2,letter
+	OUTPUTTEXTH	.298                    ; END:
+	call        word_processor
+
+	call        DISP_standard_color     ; Back to white.
+	WIN_LEFT	.125
+	WIN_TOP		.192
+	lfsr        FSR2,letter
+	movff       char_O_EAD,lo
+	bsf         leftbind
+	output_8                            ; Print EAD w/o leading space.
+	STRCAT_PRINT TXT_METER2
+
+	WIN_TOP		.216
+	lfsr        FSR2,letter
+	movff       char_O_END,lo
+	output_8                            ; Print END w/o leading space.
+	bcf	        leftbind
+	STRCAT_PRINT TXT_METER2
+
+; Show ppO2[Flush] iff in CCR mode & not in Bailout:
+	btfsc       is_bailout              ; In bailout mode?
+	return                              ; Yes: done.
+
+	btfss       FLAG_const_ppO2_mode    ; In (true) CCR mode ?
+	return                              ; No: done.
+
+	WIN_LEFT	.95
+	WIN_TOP		.168
+	call        DISP_divemask_color     ; Set Color for Divemode mask
+	STRCPY_PRINT TXT_PPO2_5                ; ppO2 of diluent
+
+	movff       char_O_flush_ppO2,WREG  ; copy to WREG
+	mullw       .100
+	movff       PRODH,xC+1
+	movff       PRODL,xC+0              ; For color code
+	DISP_color_code		warn_ppo2		; Color-code output (ppO2 stored in xC)	
+
+	WIN_LEFT	.130
+	WIN_TOP		.168
+
+    movff       char_O_flush_ppO2, lo
+    incf        lo,W                    ; ppO2 == 2.55 ?
+    bnz         DISP_show_end_ead_divemode_1
+
+    STRCPY_PRINT "----"                 ; YES: mark overflow.
+	goto        DISP_standard_color     ; Back to white.
+
+DISP_show_end_ead_divemode_1:    
+	lfsr		FSR2,letter
+    clrf        hi
+	bsf		leftbind
+	output_16dp	d'3'					; Show ppO2 w/o leading zero
+	bcf		leftbind
+	STRCAT_PRINT  " "					;  Display ppO2[Diluent]
+	goto    DISP_standard_color         ; Back to white.
+
+;=============================================================================
+; Display TTS after extra time at the same depth.
+;
+DISP_show_@5:
+	WIN_FONT    FT_SMALL
+    WIN_LEFT    .160-.70                ; 10 chars aligned right.
+    WIN_TOP     .170
+	call		DISP_divemask_color     ; Set Color for Divemode mask
+    lfsr        FSR2,letter
+
+    OUTPUTTEXTH .305                    ; "Future TTS"
+    call        word_processor
+
+    WIN_LEFT	.97
+    WIN_TOP     .194
+    STRCPY      "@"
+	GETCUSTOM8  d'58'
+	movwf       lo
+	bsf         leftbind
+	output_8
+	bcf         leftbind
+	STRCAT_PRINT "': "
+    
+	WIN_LEFT    .97+7*5                 ; "@10':" is 5 chars long
+	call        DISP_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                    ; extra_ascenttime == 0 ?
+	bz          DISP_show_@5_nodeco
+	movf        lo,W                    ; extra_ascenttime == 0xFFFF ?
+	andwf       hi,W
+	incf        WREG,w
+	bz          DISP_show_@5_wait
+
+	bsf         leftbind
+	output_16
+	bcf         leftbind
+	STRCAT_PRINT "'  "                  ; From "none" to "1'" we need 2 trailing spaces
+	return
+
+DISP_show_@5_nodeco:
+DISP_show_@5_wait:
+    STRCPY_PRINT "--- "
+    return
+
+;=============================================================================
+
+compute_pscr_ppo2:
+; (Pressure[mbar]*char_I_O2_ratio)-(100-char_I_O2_ratio)*CF61*CF62*10	
+	movff	char_I_O2_ratio,WREG
+	sublw	.100			; 100-char_I_O2_ratio -> WREG
+	mullw	.10				; (100-char_I_O2_ratio)*10 -> PROD:2
+	movff	PRODL,xA+0
+	movff	PRODH,xA+1
+	GETCUSTOM8  d'62'		; O2 Drop
+	movff	WREG,xB+0
+	clrf	xB+1
+	call	mult16x16	;xA*xB=xC -> (100-char_I_O2_ratio)*10*CF61
+	movff	xC+0,xA+0
+	movff	xC+1,xA+1
+ 	GETCUSTOM8  d'63'		; Lung ratio
+	movff	WREG,xB+0
+	clrf	xB+1
+	call	mult16x16	;xA*xB=xC -> (100-char_I_O2_ratio)*10*CF61*CF62
+
+	movlw	.10
+	movwf	xB+0
+	clrf	xB+1
+	call	div32x16	  ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+	; store xC:2 in lo:hi
+	movff	xC+0,lo
+	movff	xC+1,hi
+
+	SAFE_2BYTE_COPY amb_pressure, xA
+	movff	char_I_O2_ratio,xB+0
+	clrf	xB+1
+	call	mult16x16	;xA*xB=xC -> xC:4 = Pressure[mbar]*char_I_O2_ratio
+
+	movlw	.10
+	movwf	xB+0
+	clrf	xB+1
+	call	div32x16	  ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+
+	; store xC:2 in sub_a
+	movff	xC+0,sub_a+0
+	movff	xC+1,sub_a+1
+	; reload result from lo:hi
+	movff	lo,sub_b+0
+	movff	hi,sub_b+1
+
+	call	subU16		;sub_c = sub_a - sub_b (with UNSIGNED values)
+	return
+
+; Display pSCR ppO2
+DISP_show_pSCR_ppO2:
+	WIN_FONT    FT_SMALL
+    WIN_LEFT    .160-.63                ; 9 chars aligned right.
+    WIN_TOP     .170
+	call		DISP_divemask_color     ; Set Color for Divemode mask
+    lfsr        FSR2,letter
+    OUTPUTTEXTH .266                    ; "pSCR Info"
+    call        word_processor			; pCCR
+
+	rcall		compute_pscr_ppo2		; pSCR ppO2 into sub_c:2
+
+	WIN_FONT	FT_SMALL
+	WIN_LEFT	.95
+	WIN_TOP		.192
+	lfsr	FSR2,letter
+	STRCPY_PRINT TXT_PPO2_5             ; ppO2:
+
+	movff	sub_c+0,xC+0
+	movff	sub_c+1,xC+1
+	clrf	xC+2
+	clrf	xC+3			; For color coding
+	DISP_color_code		warn_ppo2		; Color-code output (ppO2 stored in xC)	
+	WIN_LEFT	.130
+	WIN_TOP		.192
+	lfsr        FSR2,letter
+	movff		xC+0,lo
+	movff		xC+1,hi
+	bsf		ignore_digit4
+	output_16dp	d'1'
+	bcf		ignore_digit4
+    STRCAT_PRINT " "
+	call        DISP_standard_color     ; Back to white.
+; Show O2 drop and counter lung ration in second row
+	WIN_LEFT	.98
+	WIN_TOP		.216
+	lfsr        FSR2,letter
+	GETCUSTOM8  d'62'		; O2 Drop in percent
+	movwf		lo
+	bsf			leftbind
+	output_8
+	STRCAT		 "% 1/"
+	GETCUSTOM8  d'63'		; Counter lung ratio in 1/X
+	movwf		lo
+	output_8
+	bcf			leftbind
+    STRCAT_PRINT " "		; Trailing space needed when changing the O2 drop
+	return
+
+;=============================================================================
+; Display cave consomation prediction (and warning).
+;
+DISP_show_cave_bailout:
+	WIN_FONT    FT_SMALL
+    WIN_LEFT    .160-.70                ; 10 chars aligned right.
+    WIN_TOP     .170
+	call		DISP_divemask_color     ; Set Color for Divemode mask
+    lfsr        FSR2,letter
+
+    OUTPUTTEXTH .311                    ; "Cave Bail."
+    call        word_processor
+    
+;   WIN_TOP     .240 - 24               ; DO NOT display liter units, as this
+;   WIN_LEFT    .160 - 7                ; can be Bars also...
+;   STRCPY_PRINT "l"
+
+	WIN_FONT    FT_MEDIUM
+    WIN_LEFT	.90
+    WIN_TOP     .201                    ; 170 + 24 + 14/2 + 32 + 14/2 = 240.
+	call        DISP_standard_color 
+	lfsr        FSR2,letter
+    
+    ;---- Retrieve divetime in seconds (since last reset)
+	movff	    average_divesecs+0,xA+0
+	movff	    average_divesecs+1,xA+1
+	
+	;---- Multiply by SAC, and divide by 60 (SAC inliters per minutes)
+    GETCUSTOM8	d'56'			        ; Get bottom SAC
+    movwf       xB+0
+    clrf        xB+1
+	call	    mult16x16               ; xC:4=xA:2*xB:2
+
+	movlw       LOW(.60)
+	movwf       xB+0
+	movlw       HIGH(.60)
+	movwf       xB+1
+	call	    div32x16                ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+
+    ;---- Multiply by average pressure [absolute, in bar]
+    movff       xC+0,xA+0               ; Get result (in xC+0, noy xC+2 !) into xA
+    movff       xC+1,xA+1
+    
+    movf        avr_rel_pressure+0,W    ; Add surface pressure to get absolute pressure
+    addwf       last_surfpressure_30min+0,W
+    movwf       xB+0
+    movf        avr_rel_pressure+1,W
+    addwfc      last_surfpressure_30min+1,W
+    movwf       xB+1                    ; --> Into xB
+
+	call	    mult16x16               ; xC:4=xA:2*xB:2
+	
+	movlw       LOW(.1000)              ; Pressure was in milibar, so divide by 1000.
+	movwf       xB+0
+	movlw       HIGH(.1000)
+	movwf       xB+1
+	call	    div32x16                ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+
+    ;---- Go RED when limit is exceeded
+    movff       xC+0,sub_a+0
+    movff       xC+1,sub_a+1
+    GETCUSTOM15 d'59'			        ; Get Cave bailout alarm threshold
+    movff       lo, sub_b+0
+    movff       hi, sub_b+1
+    call        sub16                   ; Computes prediction - limit
+    btfss       neg_flag                ; Negativ ?
+    call        DISP_warnings_color     ; NO: go RED.
+    
+    ;---- Then display...
+	movff       xC+0,lo
+	movff       xC+1,hi
+
+    bcf         leftbind
+    output_16
+    call        word_processor
+	WIN_FONT    FT_SMALL
+	return
+
+;=============================================================================
+
+DISP_show_leading_tissue:
+	call		DISP_divemask_color	; Set Color for Divemode mask
+	DISPLAYTEXTH	.282		; L. Tissue:
+DISP_show_leading_tissue_2:
+	call	deco_calc_desaturation_time	; calculate desaturation time
+	movlb	b'00000001'						; select ram bank 1
+
+    STRCPY  "#"
+	movff	char_O_gtissue_no,lo
+	movff	char_O_gtissue_no,wait_temp			; used as temp
+	bsf		leftbind
+	output_8
+	STRCAT  " ("
+	
+	movlw	d'16'
+	cpfslt	wait_temp
+	bra		DISP_show_leading_tissue_he
+	STRCAT  TXT_N2_2
+	bra		DISP_show_leading_tissue2
+
+DISP_show_leading_tissue_he:	
+    STRCAT  TXT_HE2
+
+DISP_show_leading_tissue2:	
+	WIN_LEFT	.95
+	WIN_TOP		.192
+	WIN_FONT	FT_SMALL
+	call	DISP_standard_color
+
+    STRCAT_PRINT  ") "
+
+	lfsr	FSR1,char_O_tissue_N2_saturation
+	movf	wait_temp,W			; W <- 0-15
+	movff	PLUSW1,lo			; lo <- FSR1[W]
+
+	WIN_LEFT	.95
+	WIN_TOP		.216
+	WIN_FONT	FT_SMALL
+
+	lfsr	FSR2,letter
+	output_8	
+	STRCAT_PRINT  "% "
+	bcf		leftbind
+	return
+
+DISP_marker_set:
+	WIN_LEFT	.105
+    WIN_TOP		.170
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+    call    DISP_divemask_color     ; Set Color for Divemode mask
+    SAFE_2BYTE_COPY marker_depth, lo
+	call	adjust_depth_with_salinity			; computes salinity setting into lo:hi [mbar]
+    lfsr	FSR2,letter
+   	bsf		leftbind
+	bsf		ignore_digit5		; do not display 1cm depth
+	output_16dp	d'3'
+    PUTC    TXT_METER_C
+    bcf		show_last3
+	call	word_processor
+
+	WIN_LEFT	.105
+    WIN_TOP		.192
+	WIN_INVERT	.0					; Init new Wordprocessor
+	movff	marker_time+0,lo
+	movff	marker_time+1,hi
+	bsf		leftbind
+	lfsr	FSR2,letter
+	output_16_3	; displays only last three figures from a 16Bit value (0-999)
+    PUTC    ':'
+	movff	marker_time+2,lo
+	output_99x
+	call	word_processor
+	bcf		leftbind
+	call	DISP_standard_color
+    return
+
+DISP_topline_box_clear:			; Writes an empty box
+	movlw	.0
+	bra		DISP_topline_box2
+DISP_topline_box:				; Writes a filled box...
+	GETCUSTOM8		d'35'		; ... with the standard color
+DISP_topline_box2:
+    WIN_BOX_COLOR   .0, .26, .0, .159	
+	call    DISP_standard_color	; Reset to standard color in case of unreadable color
+	return
+
+DISP_display_cns:
+	btfsc	gauge_mode			; Do not display in gauge mode
+	 return
+
+	btfsc	FLAG_apnoe_mode		; Do not display in apnoe mode
+	 return
+
+	btfsc	DISP_velocity_display	; Is velocity displayed?`
+	 return							; Yes, do not overwrite until DISP_velocity_clear was called
+
+	ostc_debug	'k'				; Sends debug-information to screen if debugmode active
+
+	WIN_TOP		.090
+	WIN_LEFT	.0
+	WIN_FONT 	FT_SMALL
+	DISP_color_code		warn_cns		; Color-code CNS output
+	
+	STRCPY  TXT_CNS4
+	movff	char_O_CNS_fraction,lo
+	bsf		leftbind
+	output_8
+	bcf		leftbind
+	STRCAT_PRINT "%"
+	return
+
+;-----------------------------------------------------------------------------
+;
+DISP_display_cns_surface:
+; Check if CNS should be displayed
+	movff	char_O_CNS_fraction,lo		; copy into bank1
+	GETCUSTOM8	d'15'					; cns_display_high_surfacemode
+	subwf	lo,W
+	btfss	STATUS,C
+	return								; Do not show...
+	; Show CNS
+
+	ostc_debug	'W'				; Sends debug-information to screen if debugmode active
+
+	WIN_TOP		.175
+	WIN_LEFT	.45
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	DISP_color_code		warn_cns		; Color-code CNS output
+	
+	STRCPY  TXT_CNS4
+	movff	char_O_CNS_fraction,lo
+	bsf		leftbind
+	output_8
+	bcf		leftbind
+	STRCAT_PRINT "% "
+	return
+
+;-----------------------------------------------------------------------------
+; Display GF at furface, if > CF8.
+;
+DISP_display_gf_surface:
+        movff	char_O_gradient_factor,lo   ; gradient factor
+        GETCUSTOM8	d'8'                ; threshold for display
+        cpfslt	lo                      ; show value?
+        bra		DISP_display_gf_surf_1  ; YES: do it.
+        return
+
+DISP_display_gf_surf_1:
+        WIN_TOP	    .175
+        WIN_LEFT	.45
+        WIN_FONT 	FT_SMALL
+        DISP_color_code		warn_gf		; Color-code Output
+
+        STRCPY  TXT_GF3
+        movff   char_O_gradient_factor,lo		; gradient factor
+        output_8
+        STRCAT_PRINT  "%  "
+        goto    DISP_standard_color
+
+;-----------------------------------------------------------------------------
+
+DISP_custom_text:
+	read_int_eeprom	d'64'
+	movlw	d'1'
+	cpfseq	EEDATA						; Custom text active?
+	bra		DISP_custom_text_serial		; No, show serial instead
+	WIN_TOP		.200
+	WIN_LEFT	.0
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call		DISP_divemask_color	; Set Color for Divemode mask
+
+	lfsr	FSR2,letter	
+	movlw	d'64'
+	movwf	lo
+	movlw	d'24'
+	movwf	hi					; counter
+
+DISP_custom_text1:
+	incf	lo,F
+	call	DISP_get_custom_letter			; Get one letter for the custom text
+	movlw	'}'							; End marker found?
+	cpfseq	EEDATA
+	bra		DISP_custom_text2			; No
+	bra		DISP_custom_text3
+DISP_custom_text2:
+	movff	EEDATA,POSTINC2				; Copy into Postinc
+
+	decfsz	hi,F				; Max. numbers?
+	bra		DISP_custom_text1			; No, get next letters
+
+DISP_custom_text3:
+	call	word_processor
+	call	DISP_standard_color
+	return
+
+DISP_get_custom_letter:
+	movff	lo,EEADR			; Address for next custom text letter
+	call	read_eeprom					; Read letter
+	return
+
+DISP_custom_text_serial:
+	WIN_TOP		.200
+	WIN_LEFT	.50
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	call		DISP_divemask_color	; Set Color for Divemode mask
+
+	lfsr	FSR2,letter
+	OUTPUTTEXTH		d'262'              ; "OSTC "
+	clrf	EEADRH
+	clrf	EEADR                       ; Get Serial number LOW
+	call	read_eeprom                 ; read byte
+	movff	EEDATA,lo
+	incf	EEADR,F                     ; Get Serial number HIGH
+	call	read_eeprom                 ; read byte
+	movff	EEDATA,hi
+	bsf		leftbind
+	output_16
+	call	word_processor
+	call	DISP_standard_color
+	return
+
+DISP_simdata_screen:			;Display Pre-Dive Screen
+	; List active gases/Setpoints
+	btfsc	FLAG_const_ppO2_mode		; in ppO2 mode?
+	bra		DISP_simdata_screen3		; Yes, display SetPoint/Sensor result list
+
+DISP_simdata_screen2:
+	ostc_debug	'm'		; Sends debug-information to screen if debugmode active
+
+	WIN_LEFT	.0
+	WIN_FONT	FT_SMALL
+	bsf		leftbind
+	
+	movlw	d'2'
+	movwf	wait_temp			; here: stores eeprom address for gas list
+	movlw	d'10'
+	movwf	waitms_temp		; here: stores row for gas list
+	clrf	hi					; here: Gas counter
+
+DISP_simdata_screen2_loop:
+	incf	hi,F				; Increase Gas
+	movlw	d'4'
+	addwf	wait_temp,F			; Increase eeprom address for gas list
+	
+	STRCPY  TXT_GAS1
+	movff	hi,lo			; copy gas number
+	output_8				; display gas number
+	PUTC    ':'
+	movff	wait_temp, EEADR            ; Gas #hi: %O2 - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+	PUTC    '/'
+	incf	EEADR,F			; Gas #hi: %He - Set address in internal EEPROM
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	output_8				; outputs into Postinc2!
+	PUTC    ' '
+	movf	hi,W			; Gas number
+	addlw	d'27'			; -> Adress of change depth register
+	call	read_int_eeprom_1
+	movff	EEDATA,lo		; Change depth in m
+	movff	lo,divemins		; Store for grey-out
+	output_99				; outputs into Postinc2!
+    PUTC    TXT_METER_C
+
+    ; Check if gas is first gas ?
+	read_int_eeprom d'33'	            ; First gas (1-5)?
+	movf	hi,W                        ; Current gas in WREG
+	cpfseq	EEDATA				        ; Is equal first gas?
+	bra		DISP_simdata_screen2_loop2	; No : more tests...
+
+	bra		DISP_simdata_white	        ; Yes
+
+DISP_simdata_screen2_loop2:	
+    ; Check if gas is inactive ?
+	read_int_eeprom d'27'	            ; read flag register
+	movff	hi,lo			            ; copy gas number
+DISP_simdata_screen2_loop1:
+	rrcf	EEDATA			            ; roll flags into carry
+	decfsz	lo,F		            	; max. 5 times...
+	bra		DISP_simdata_screen2_loop1
+
+	btfss	STATUS,C		            ; test inactive flag
+	bra		DISP_simdata_grey	        ; Is inactive!
+
+	tstfsz	divemins		            ; Test change depth=0?
+	bra		DISP_simdata_white      	; Is not zero
+
+DISP_simdata_grey:
+	GETCUSTOM8	d'64'					;movlw	color_grey
+	call	DISP_set_color	            ; grey out inactive gases!
+	bra		DISP_simdata_color_done
+
+DISP_simdata_white:
+	call	DISP_standard_color
+
+DISP_simdata_color_done:	
+	movlw	d'25'
+	addwf	waitms_temp,F		; Increase row
+	WIN_LEFT	.0
+	movff	waitms_temp,win_top ; Set Row
+	call	word_processor		; display gas
+
+DISP_simdata_screen2b:
+	call		DISP_standard_color
+
+	movlw	d'5'			; list all five gases
+	cpfseq	hi				; All gases shown?
+	bra		DISP_simdata_screen2_loop	; No
+	
+	return							; No, return (OC mode)
+
+DISP_simdata_screen3:	
+	WIN_LEFT	.0
+	WIN_FONT	FT_SMALL
+	bsf		leftbind
+
+	; list three SP in Gaslist
+	movlw	d'35'				; 36 = current SP position in EEPROM
+	movwf	wait_temp			; here: stores eeprom address for gas list
+	movlw	d'10'
+	movwf	waitms_temp			; here: stores row for gas list
+	clrf 	decoplan_index		; here: SP counter
+
+DISP_simdata_screen3_loop:
+	incf	wait_temp,F			; EEPROM address
+	incf	decoplan_index,F    ; Increase SP
+
+	movlw	d'25'
+	addwf	waitms_temp,F		; Increase row
+	WIN_LEFT	.0
+	movff	waitms_temp,win_top ; Set Row
+	
+	STRCPY  TXT_SP2
+	movff	decoplan_index,lo   ; copy gas number
+	output_8				; display gas number
+	STRCAT  ": "
+	movff	wait_temp, EEADR; SP #hi position
+	call	read_eeprom		; get byte (stored in EEDATA)
+	movff	EEDATA,lo		; copy to lo
+	clrf	hi
+	output_16dp	d'3'		; outputs into Postinc2!
+	call	word_processor	
+
+	movlw	d'3'		; list all three SP
+	cpfseq	decoplan_index		; All gases shown?
+	bra		DISP_simdata_screen3_loop	;no
+
+    ; Show Diluent
+    call    get_first_diluent           ; Read first diluent into lo(O2) and hi(He)
+	WIN_LEFT	.0
+	WIN_TOP		.110
+	STRCPY  TXT_DIL4
+	output_8				; O2 Ratio
+	STRCAT  "/"
+	movff	hi,lo
+	output_8				; He Ratio
+	call	word_processor		
+
+	bcf		leftbind
+	return				; Return (CC Mode)
+
+adjust_depth_with_salinity:			; computes salinity setting into lo:hi [mbar]
+
+	btfsc	simulatormode_active	; Do apply salinity in Simulatormode
+	return
+
+	read_int_eeprom	d'26'			; Read Salinity from EEPROM
+	movff	EEDATA, wait_temp		; salinity
+	
+	movlw	d'105'					; 105% ?
+	cpfslt	wait_temp				; Salinity higher limit
+	return							; Out of limit, do not adjust lo:hi
+	
+	movlw	d'99'					; 99% ?
+	cpfsgt	wait_temp				; Salinity lower limit
+	return							; Out of limit, do not adjust lo:hi
+
+	movff	lo,xA+0
+	movff	hi,xA+1
+
+	movlw	d'102'					; 0,98bar/10m
+	movwf	xB+0
+	clrf	xB+1
+	
+	call	mult16x16				;xA*xB=xC (lo:hi * 100)
+	
+	movff	wait_temp,xB+0			; Salinity
+	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
+	
+	return
\ No newline at end of file