view code_part1/OSTC_code_asm_part1/pled_outputs.asm @ 107:a2b9eca1f396

customview for the surfacemode
author heinrichsweikamp
date Mon, 20 Dec 2010 18:30:16 +0100
parents 966ebf905514
children 2a31948dbcb7
line wrap: on
line source


; 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
; last updated: 06/06/08
; known bugs:
; ToDo:	More comments

PLED_divemask_color:
	GETCUSTOM8	d'36'			; Divemask output color
	bra		PLED_standard_color_0

PLED_warnings_color:
	GETCUSTOM8	d'37'			; Warnings output color
	bra		PLED_standard_color_0

PLED_standard_color:
	GETCUSTOM8	d'35'			; Standard output color
PLED_standard_color_0:			; Common entry point
	movwf	oled1_temp			; copy
	movlw	d'0'
	cpfseq	oled1_temp
	bra		PLED_standard_color_1
	bra		PLED_standard_color2
PLED_standard_color_1:
	movlw	d'4'
	cpfseq	oled1_temp
	bra		PLED_standard_color_2
	bra		PLED_standard_color2
PLED_standard_color_2:
	movlw	d'8'
	cpfseq	oled1_temp
	bra		PLED_standard_color_3
	bra		PLED_standard_color2
PLED_standard_color_3:
	movlw	d'192'
	cpfseq	oled1_temp
	bra		PLED_standard_color_4
	bra		PLED_standard_color2
PLED_standard_color_4:
	movlw	d'196'
	cpfseq	oled1_temp
	bra		PLED_standard_color_5
	bra		PLED_standard_color2
PLED_standard_color_5:
	movlw	d'200'
	cpfseq	oled1_temp
	bra		PLED_standard_color_6
	bra		PLED_standard_color2
PLED_standard_color_6:
	movf	oled1_temp,W		; Color should be OK...
	call	PLED_set_color
	return
PLED_standard_color2:
	movlw	0xFF		        ; Force full white.
	call	PLED_set_color
	return

PLED_color_code macro color_code_temp
	movlw	color_code_temp
	call	PLED_color_code1
	endm

PLED_color_code1:				; Color-codes the output, if required
	movwf	debug_temp
	dcfsnz	debug_temp,F
	bra		PLED_color_code_depth		; CF43 [mBar], 16Bit
	dcfsnz	debug_temp,F
	bra		PLED_color_code_cns			; CF44 [%]
	dcfsnz	debug_temp,F
	bra		PLED_color_code_gf			; CF45 [%]
	dcfsnz	debug_temp,F
	bra		PLED_color_code_ppo2		; CF46 [cBar]
	dcfsnz	debug_temp,F
	bra		PLED_color_code_velocity	; CF47 [m/min]
	dcfsnz	debug_temp,F
	bra		PLED_color_code_ceiling		; Show warning if CF41=1 and current depth>shown ceiling
	dcfsnz	debug_temp,F
	bra		PLED_color_code_gaslist		; Color-code current row in Gaslist (%O2 in "EEDATA")


PLED_color_code_gaslist:				; %O2 in "EEDATA"
; Check very high ppO2 manually
	movff		amb_pressure+0,xA+0
	movff		amb_pressure+1,xA+1
	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			PLED_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			PLED_color_code_gaslist1; too high -> Warning Color!
	call		PLED_standard_color
	return

PLED_color_code_gaslist1:
	call	PLED_warnings_color
	return


PLED_color_code_ceiling:
	GETCUSTOM8	d'40'			; =1: Warn at all?
	movwf	lo					
	movlw	d'1'
	cpfseq	lo					; =1?
	bra		PLED_color_code_ceiling1	; No, Set to default color

	movff	char_O_array_decodepth+0,lo	; Ceiling in m
	decf	lo,F	; -1
	movff	rel_pressure+1,xA+1
	movff	rel_pressure+0,xA+0
	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		PLED_color_code_ceiling2	; Set to warning color
PLED_color_code_ceiling1:
	call	PLED_standard_color
	return
PLED_color_code_ceiling2:
	call	PLED_warnings_color
	return

PLED_color_code_depth:
	movff	hi,hi_temp
	movff	lo,lo_temp
	movff	rel_pressure+1,hi
	movff	rel_pressure+0,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		PLED_color_code_depth2; Set to warning color
	call	PLED_standard_color
	movff	hi_temp,hi
	movff	lo_temp,lo			; Restore hi, lo
	return
PLED_color_code_depth2:
	call	PLED_warnings_color
	movff	hi_temp,hi
	movff	lo_temp,lo			; Restore hi, lo
	return

PLED_color_code_cns:
	movff	char_O_CNS_fraction,lo
	GETCUSTOM8	d'44'			; CNS Warn [%]
	subwf	lo,W
	btfsc	STATUS,C
	bra		PLED_color_code_cns2		; Set to warning color
	call	PLED_standard_color
	return
PLED_color_code_cns2:
	call	PLED_warnings_color
	return

PLED_color_code_gf:
	movff	char_O_gradient_factor,lo		; gradient factor
	GETCUSTOM8	d'45'			; GF Warn [%]
	subwf	lo,W
	btfsc	STATUS,C
	bra		PLED_color_code_gf2		; Set to warning color
	call	PLED_standard_color
	return
PLED_color_code_gf2:
	call	PLED_warnings_color
	return

PLED_color_code_ppo2:
; Check very high ppO2 manually
	tstfsz	xC+2					; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55Bar?
	bra		PLED_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		PLED_color_code_ppo22; Set to warning color
	call	PLED_standard_color
	return
PLED_color_code_ppo22:
	call	PLED_warnings_color
	return

PLED_color_code_velocity:
	btfss	neg_flag			; Ignore for ascend!
	bra		PLED_color_code_velocity1		; Skip check!
	movff	divA+0,lo
	GETCUSTOM8	d'47'			; Velocity warn [m/min]
	subwf	lo,W
	btfsc	STATUS,C
	bra		PLED_color_code_velocity2		; Set to warning color
PLED_color_code_velocity1:
	call	PLED_standard_color
	return
PLED_color_code_velocity2:
	call	PLED_warnings_color
	return

ostc_debug	macro debug_temp
	movlw	debug_temp
	call	ostc_debug1
	endm

ostc_debug1:
	movwf	debug_temp

	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	debug_temp,debug_char+0

	btfss	debug_mode				; Are we in debugmode?
	return							; No, return!

	WIN_TOP		.200
	WIN_LEFT	.100
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_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
	movlw	' '
	movwf	POSTINC2
	call	word_processor
	return


PLED_resetdebugger:
	bcf		LED_blue
	call	PLED_boot				; PLED boot
	call	PLED_ClearScreen		; clean up OLED
	call	PLED_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
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_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
	movlw	'.'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	movff	flag1,lo
	output_8		
	movlw	' '
	movwf	POSTINC2
	movff	flag2,lo
	output_8		
	call	word_processor

	WIN_TOP		.125
	WIN_LEFT	.10
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	lfsr	FSR2,letter
	movff	flag3,lo
	output_8		
	movlw	' '
	movwf	POSTINC2
	movff	flag4,lo
	output_8		
	movlw	' '
	movwf	POSTINC2
	movff	flag5,lo
	output_8		
	movlw	' '
	movwf	POSTINC2
	movff	flag6,lo
	output_8		
	movlw	' '
	movwf	POSTINC2
	movff	flag7,lo
	output_8		
	call	word_processor

	WIN_TOP		.150
	WIN_LEFT	.10
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	lfsr	FSR2,letter
	movff	flag8,lo
	output_8		
	movlw	' '
	movwf	POSTINC2
	movff	flag9,lo
	output_8		
	movlw	' '
	movwf	POSTINC2
	movff	flag10,lo
	output_8		
	movlw	' '
	movwf	POSTINC2
	movff	flag11,lo
	output_8		
	movlw	' '
	movwf	POSTINC2
	movff	flag12,lo
	output_8		
	call	word_processor

PLED_resetdebugger_loop:
	btfss	switch_left
	bra		PLED_resetdebugger_loop		; Loop
	bcf		LED_red
	return

PLED_divemode_mask:					; Displays mask in Dive-Mode
	call		PLED_divemask_color	; Set Color for Divemode mask
	DISPLAYTEXTH	.267		; Max.
	DISPLAYTEXT		.86			; Divetime
	DISPLAYTEXT		.87			; Depth
	call	PLED_standard_color
	return

PLED_clear_customview_divemode:
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.168
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.239
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.090
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.159	
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	return

PLED_clear_customview_surfacemode:
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.25
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.121
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.82
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.159
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	return

PLED_clear_decoarea:
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.54
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.168
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.090
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.159	
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	return

PLED_display_ndl_mask:
	; Clear Dekostop and Dekosum
	rcall	PLED_clear_decoarea	

	call	PLED_divemask_color	; Set Color for Divemode mask
	DISPLAYTEXT		d'84'			; NoStop
	call	PLED_standard_color

PLED_display_ndl_mask2:
	; Clears Gradient Factor
	movlw	d'8'
	movwf	temp1
	WIN_TOP		.145
	WIN_LEFT	.0
	call	PLED_display_clear_common_y1	
	return

PLED_display_ndl:
	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	PLED_standard_color

	lfsr	FSR2,letter
	movff	char_O_nullzeit,lo				; NDL in minutes
	output_8
	movlw	0x27			; "'"
	movwf	POSTINC2
	call	word_processor
	WIN_FONT 	FT_SMALL
	return

PLED_display_deko_mask:
	rcall	PLED_clear_decoarea	
; total deco time word
	call		PLED_divemask_color	; Set Color for Divemode mask
	DISPLAYTEXT	d'85'			; TTS
	call	PLED_standard_color
	return

PLED_display_deko:
	btfsc	menubit					; Divemode menu active?
	bra		PLED_display_deko1		; Yes, do not display deco, only GF (if required)

	ostc_debug	'y'		; Sends debug-information to screen if debugmode active
; deco stop word
	call		PLED_divemask_color	; Set Color for Divemode mask
	DISPLAYTEXT	d'82'			; DEKOSTOP
	call	PLED_standard_color

	WIN_TOP		.80
	WIN_LEFT	.94
	WIN_FONT 	FT_MEDIUM
	WIN_INVERT	.0					; Init new Wordprocessor
	PLED_color_code		warn_ceiling	; Color-code Output
	lfsr	FSR2,letter
	movff	char_O_array_decodepth+0,lo		; Ceiling in m
	output_99
	movlw	'm'		;	"m"
	movwf	POSTINC2
	movff	char_O_array_decotime,lo		; length of first stop in m
	output_99
	movlw	0x27				; "'"
	movwf	POSTINC2
	call	word_processor
	WIN_FONT 	FT_SMALL
	
;PLED_display_deko1:
	ostc_debug	'x'		; 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	PLED_standard_color
	lfsr	FSR2,letter
	movff	char_O_ascenttime,lo		; complete ascend time
	movlw	d'199'							; limit display of total ascend time to 99mins....
	cpfslt	lo								; skip if 199 (WREG) > lo
	movwf	lo
	bcf		leftbind
	output_8
	movlw	0x27			; "'"
	movwf	POSTINC2
	call	word_processor

PLED_display_deko1:
	movff	char_O_gradient_factor,lo		; gradient factor
	GETCUSTOM8	d'8'		; threshold for display
	cpfslt	lo				; show value?
	bra		PLED_display_deko2	; Yes
	; No
	bra		PLED_display_ndl_mask2	; Clear gradient factor

PLED_display_deko2:
	ostc_debug	'w'		; Sends debug-information to screen if debugmode active
;GF
	WIN_TOP		.145
	WIN_LEFT	.0
	WIN_FONT 	FT_SMALL
	PLED_color_code		warn_gf		; Color-code Output
	lfsr	FSR2,letter
	movlw	'G'
	movwf	POSTINC2
	movlw	'F'
	movwf	POSTINC2
	movlw	':'
	movwf	POSTINC2
	movff	char_O_gradient_factor,lo		; gradient factor
	output_8
	movlw	'%'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	call	word_processor
	call	PLED_standard_color
	return

PLED_simulator_data:
	WIN_TOP		.65
	WIN_LEFT	.105
	WIN_FONT 	FT_SMALL
	call	PLED_standard_color
	lfsr	FSR2,letter
	movff	logbook_temp1,lo
	bsf		leftbind
	output_8
	bcf		leftbind
	movlw	'm'
	movwf	POSTINC2
	movlw	'i'
	movwf	POSTINC2
	movlw	'n'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	call	word_processor	

	WIN_TOP		.95
	WIN_LEFT	.100
	WIN_FONT 	FT_SMALL
	call	PLED_standard_color
	lfsr	FSR2,letter
	movff	logbook_temp2,lo
	bsf		leftbind
	output_8
	bcf		leftbind
	movlw	'm'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	call	word_processor	
	return

PLED_display_velocity:
	btfsc	multi_gf_display			; Is the Multi-GF Table displayed?
	return							; Yes, No update and return!

	ostc_debug	'v'		; Sends debug-information to screen if debugmode active
	WIN_TOP		.90
	WIN_LEFT	.0
	WIN_FONT 	FT_SMALL
	PLED_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	PLED_standard_color
	bsf		pled_velocity_display
	return

PLED_display_velocity_clear:
	movlw	d'8'
	movwf	temp1
	WIN_TOP		.90
	WIN_LEFT	.0
	bcf		pled_velocity_display
	bra		PLED_display_clear_common_y1

PLED_display_wait_clear
	movlw	d'6'
	movwf	temp1
	WIN_TOP		.2
	WIN_LEFT	.115
	bra		PLED_display_clear_common_y1

PLED_display_clear_common_y2:				; Clears with y-scale=2
	WIN_FONT 	FT_MEDIUM
	bra		PLED_display_clear_common1

PLED_display_clear_common_y1:				; Clears with y-scale=1
	WIN_FONT 	FT_SMALL
PLED_display_clear_common1:
	lfsr	FSR2,letter
PLED_display_clear_common2:
	movlw	' '
	movwf	POSTINC2
	decfsz	temp1,F
	bra 	PLED_display_clear_common2
	call	word_processor
	WIN_FONT 	FT_SMALL
	return


PLED_diveclock:
	call		PLED_divemask_color	; Set Color for Divemode mask
	DISPLAYTEXT		d'255'			; Clock
	call	PLED_standard_color

PLED_diveclock2:
;	GETCUSTOM8	d'39'			; =1: Show clock in Divemode
;	movwf	lo
;	movlw	d'1'
;	cpfseq	lo					; =1?
;	return						; No, Done.

;	btfsc	menubit	; is the Dive mode menu displayed?
;	return			; Yes

	WIN_TOP		.192
	WIN_LEFT	.123
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color
	lfsr	FSR2,letter
	movff	hours,lo
	output_99x
	movlw	':'
	movwf	POSTINC2
	movff	mins,lo
	output_99x
	call	word_processor
	return

PLED_clock:
	ostc_debug	'c'
	
	;If > 0 display surface_interval:2 and clock changing every 5 seconds
	;use timeout_counter for this
	WIN_TOP		.50
	WIN_LEFT	.1
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	lfsr	FSR2,letter

	movff	surface_interval+0,lo
	tstfsz	lo
	bra		PLED_clock0				; Not Zero, switch between Interval and clock
	movff	surface_interval+1,lo
	tstfsz	lo
	bra		PLED_clock0				; Not Zero, switch between Interval and clock
	bra		PLED_clock3				; surface_interval=0, always display clock!

PLED_clock0:
	btfss	show_interval			; Show Interval?
	bra		PLED_clock2				; No, display clock and reset counter

PLED_clock1:
	decfsz	timeout_counter,F		; =0?
	bra		PLED_clock1a			; No...
	bra		PLED_clock3				; Yes, display clock and reset counter

PLED_clock1a:
	bsf		show_interval
	movlw	d'6'
	cpfslt	timeout_counter			; f < w? -> timeout_counter>5?
	rcall	PLED_clock_reload_timer	; No, reload counter

	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

	movlw	'I'
	movwf	POSTINC2
	movlw	'n'
	movwf	POSTINC2
	movlw	't'
	movwf	POSTINC2
	movlw	':'
	movwf	POSTINC2
	output_99x
	movlw	':'
	movwf	POSTINC2
	movff	hi,lo
	output_99x
	movlw	' '
	movwf	POSTINC2
	call	word_processor
	return

PLED_clock_reload_timer:
	bcf		show_interval
	movlw	d'5'
	movwf	timeout_counter
	return

PLED_interval_reload_timer:
	bsf		show_interval
	movlw	d'5'
	movwf	timeout_counter
	return

PLED_clock2:
	decfsz	timeout_counter,F		; =0?
	bra		PLED_clock3				; No...
	bra		PLED_clock1a			; Yes, display interval and reset counter

PLED_clock3:
	bcf		show_interval
	movlw	d'6'
	cpfslt	timeout_counter			; f < w? -> timeout_counter>5?
	rcall	PLED_interval_reload_timer; No, reload counter

	movff	hours,lo
	output_99x
	movlw	':'
	movwf	POSTINC2
	movff	mins,lo
	output_99x
	movlw	':'
	movwf	POSTINC2
	movff	secs,lo
	output_99x
	movlw	' '
	movwf	POSTINC2
	call	word_processor
	return

PLED_logbook_cursor:

PLED_menu_cursor:
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.35
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.239
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.0
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.16
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box

	WIN_LEFT	.0
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_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
	lfsr	FSR2,letter
	movlw	0xB7
	movwf	POSTINC2
	call	word_processor
	return

PLED_menu_mask:
	call	PLED_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
	return	

PLED_setup_menu_mask:
	call	PLED_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	.276	; Salinity:
	DISPLAYTEXT .100		; Decotype:
	DISPLAYTEXT	.142		; More...
	DISPLAYTEXT .11			; Exit
	return	

PLED_more_setup_menu_mask:
	call	PLED_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
	
	DISPLAYTEXT .11			; Exit
	return	

PLED_more_menu_mask:
	call	PLED_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

	DISPLAYTEXT .11			; Exit
	return

PLED_reset_menu_mask:
	call	PLED_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

PLED_simulator_mask:
	call	PLED_topline_box
	WIN_INVERT	.1	; Init new Wordprocessor	
	DISPLAYTEXT	.248		; OSTC Simulator
	WIN_INVERT	.0	; Init new Wordprocessor	
	DISPLAYTEXT	.249		; Start Dive
	DISPLAYTEXTH	.277	; Bottom Time:
	DISPLAYTEXTH	.278	; Max. Depth:
	DISPLAYTEXTH	.279	; Calculate Deco
	DISPLAYTEXTH	.280	; Show Decoplan
	DISPLAYTEXT .11			; Exit
	return
	
PLED_temp_surfmode:
	ostc_debug	'e'
	movff	temperature+0,last_temperature+0
	movff	temperature+1,last_temperature+1
	WIN_TOP		.100
	WIN_LEFT	.1
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	lfsr	FSR2,letter
	movlw	'-'
	btfsc	neg_temp			; Show "-"?
	movwf	POSTINC2			; Yes
	movff	temperature+0,lo
	movff	temperature+1,hi
	movlw	d'3'
	movwf	ignore_digits
	bsf		leftbind			; left orientated output
	output_16dp	d'2'
	bcf		leftbind
	movlw	'°'
	movwf	POSTINC2
	movlw	'C'
	movwf	POSTINC2
	movlw	' '						
	movwf	POSTINC2
	call	word_processor
	return

PLED_temp_divemode:
	btfsc	multi_gf_display			; Is the Multi-GF Table displayed?
	return								; Yes, No update and return!

	ostc_debug	'u'		; Sends debug-information to screen if debugmode active

; temperature
	movff	temperature+0,last_temperature+0
	movff	temperature+1,last_temperature+1

	WIN_TOP		.216
	WIN_LEFT	.50
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	lfsr	FSR2,letter
	movlw	'-'
	btfsc	neg_temp			; Show "-"?
	movwf	POSTINC2			; Yes
	movff	temperature+0,lo
	movff	temperature+1,hi
	movlw	d'3'
	movwf	ignore_digits
	bsf		leftbind			; left orientated output
	output_16dp	d'2'
	bcf		leftbind
	movlw	'°'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	call	word_processor
	return

PLED_show_ppO2:					; Show ppO2
	ostc_debug	't'		; Sends debug-information to screen if debugmode active
	WIN_TOP		.120
	WIN_LEFT	.0
	WIN_FONT 	FT_SMALL
	PLED_color_code		warn_ppo2		; Color-code output (ppO2 stored in xC)

	lfsr	FSR2,letter
	movlw	'p'
	movwf	POSTINC2
	movlw	'p'
	movwf	POSTINC2
	movlw	'O'
	movwf	POSTINC2
	movlw	'2'
	movwf	POSTINC2
	movlw	':'
	movwf	POSTINC2

; Check very high ppO2 manually
	tstfsz		xC+2					; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55Bar?
	bra			PLED_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
PLED_show_ppO2_2:
	movlw	' '
	movwf	POSTINC2
	call	word_processor
	call	PLED_standard_color
	return

PLED_show_ppO2_3:
	movlw	'>'
	movwf	POSTINC2
	movlw	'6'
	movwf	POSTINC2
	movlw	'.'
	movwf	POSTINC2
	movlw	'6'
	movwf	POSTINC2
	bra		PLED_show_ppO2_2

PLED_show_ppO2_clear:					; Clear ppO2
	movlw	d'10'
	movwf	temp1
	WIN_TOP		.120
	WIN_LEFT	.0
	call	PLED_display_clear_common_y1
	return

PLED_active_gas_clear:					; clears active gas!
	WIN_TOP		.192
	WIN_LEFT	.50
	movlw	d'5'
	movwf	temp1
	bra		PLED_display_clear_common_y1; also returns!

PLED_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

	btfsc	multi_gf_display			; Is the Multi-GF Table displayed?
	return								; Yes, No update and return!

	WIN_INVERT	.0					; Init new Wordprocessor	
	call	PLED_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.
	WIN_INVERT	.1					; Init new Wordprocessor	
	call	PLED_active_gas_divemode_show	; Show gas (Non-Inverted in all cases)
	WIN_INVERT	.0					; Init new Wordprocessor	
	return							; Done.

PLED_active_gas_divemode_show:
	ostc_debug	's'		; Sends debug-information to screen if debugmode active
; gas
	WIN_TOP		.192
	WIN_LEFT	.50
	WIN_FONT 	FT_SMALL
	call	PLED_standard_color

	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		PLED_active_gas_divemode2		; Check He
	bra		PLED_active_gas_divemode3		; Skip He check, display gas
	
PLED_active_gas_divemode2:
	tstfsz	hi							; He = 0 %
	bra		PLED_active_gas_divemode3	; display gas
										; O2 below treshold, He=0 -> Skip display!
	movlw	d'5'
	movwf	temp1
	bra		PLED_display_clear_common_y1		; also returns!

PLED_active_gas_divemode3:
	movlw	d'21'
	cpfseq	lo				; Air? (O2=21%)
	bra		PLED_active_gas_divemode4 ; No!
	tstfsz	hi				; Air? (He=0%)
	bra		PLED_active_gas_divemode4 ; No!
	
							; Yes, display "Air" instead of 21/0
	lfsr	FSR2,letter
	OUTPUTTEXTH		d'264'			;"Air "
	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

PLED_active_gas_divemode4:
	lfsr	FSR2,letter
	bsf		leftbind			; left orientated output
	output_8					; O2 ratio is still in "lo"
	movlw	'/'
	movwf	POSTINC2
	movff	char_I_He_ratio,lo		; copy He ratio into lo
	output_8
	movlw	' '
	btfsc	better_gas_available	;=1: A better gas is available and a gas change is advised in divemode
	movlw	'*'
	movwf	POSTINC2
	bcf		leftbind
	call	word_processor
	return



PLED_display_decotype_surface:
	WIN_LEFT	.85
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	clrf	EEADRH
	read_int_eeprom d'34'		; Read deco data	
	tstfsz	EEDATA
	bra		show_decotype_surface2

;ZH-L16
	WIN_TOP		.125
	call	PLED_standard_color

	lfsr	FSR2,letter		
	movlw	'O'
	movwf	POSTINC2
	call	word_processor
	WIN_LEFT	.85
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	WIN_TOP		.150
	call	PLED_standard_color

	lfsr	FSR2,letter		
	movlw	'C'
	movwf	POSTINC2
	call	word_processor
	return		
show_decotype_surface2:
	decf	EEDATA,F
	tstfsz	EEDATA
	bra		show_decotype_surface3
; Gauge
	return
	
show_decotype_surface3:
	decf	EEDATA,F
	tstfsz	EEDATA
	bra	show_decotype_surface4
	; const. ppO2
	WIN_TOP		.125
	call	PLED_standard_color

	lfsr	FSR2,letter		
	movlw	'C'
	movwf	POSTINC2
	WIN_LEFT	.85
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	word_processor
	WIN_TOP		.150
	call	PLED_standard_color

	lfsr	FSR2,letter		
	movlw	'C'
	movwf	POSTINC2
	WIN_LEFT	.85
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	word_processor
	return
show_decotype_surface4:
	decf	EEDATA,F
	tstfsz	EEDATA
	bra		show_decotype_surface5
; Apnoe
	return
show_decotype_surface5:
	decf	EEDATA,F
	tstfsz	EEDATA
	bra		show_decotype_surface6
	; Multi-GF OC
	WIN_TOP		.125
	lfsr	FSR2,letter		
	movlw	'G'
	movwf	POSTINC2
	WIN_LEFT	.85
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	call	word_processor
	WIN_TOP		.150
	lfsr	FSR2,letter		
	movlw	'F'
	movwf	POSTINC2
	WIN_LEFT	.85
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	call	word_processor
	return

show_decotype_surface6:
	; Multi-GF CC
	WIN_TOP		.125
	lfsr	FSR2,letter		
	movlw	'G'
	movwf	POSTINC2
	WIN_LEFT	.85
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	call	word_processor
	WIN_TOP		.150
	lfsr	FSR2,letter		
	movlw	'F'
	movwf	POSTINC2
	WIN_LEFT	.85
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	call	word_processor
	return

PLED_pre_dive_screen:			;Display Pre-Dive Screen
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.25
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.120
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.82
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.159
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box

	; List active gases/Setpoints

	btfsc	FLAG_const_ppO2_mode		; in ppO2 mode?
	bra		PLED_pre_dive_screen3		; Yes, display SetPoint/Sensor result list

PLED_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

PLED_pre_dive_screen2_loop:
	incf	hi,F				; Increase Gas
	movlw	d'4'
	addwf	wait_temp,F			; Increase eeprom address for gas list
	
	lfsr	FSR2,letter		
	movlw	'G'
	movwf	POSTINC2
	movff	hi,lo			; copy gas number
	output_8				; display gas number
	movlw	':'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	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!
	movlw	'/'
	movwf	POSTINC2
	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!
	
	read_int_eeprom		d'27'	; read flag register
	movff	hi,lo			; copy gas number
PLED_pre_dive_screen2_loop1:
	rrcf	EEDATA			; roll flags into carry
	decfsz	lo,F			; max. 5 times...
	bra		PLED_pre_dive_screen2_loop1
	
	btfsc	STATUS,C		; test carry
	bra		PLED_pre_dive_white

	movlw	color_grey
	call	PLED_set_color	; grey out inactive gases!
	bra		PLED_pre_dive_color_done

PLED_pre_dive_white:
	call	PLED_standard_color

PLED_pre_dive_color_done:	
	read_int_eeprom 	d'33'			; Read start gas (1-5)
	movf	EEDATA,W
	cpfseq	hi				; Current Gas the active gas?
	bra		PLED_pre_dive_screen2a
	bra		PLED_pre_dive_screen2b

PLED_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

PLED_pre_dive_screen2b:
	call		PLED_standard_color

	movlw	d'5'			; list all four (remaining) gases
	cpfseq	hi				; All gases shown?
	bra		PLED_pre_dive_screen2_loop	; No
	
	return							; No, return (OC mode)

PLED_pre_dive_screen3:	
	WIN_LEFT	.90
	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'0'
	movwf	waitms_temp			; here: stores row for gas list
	clrf 	temp6				; here: SP counter

PLED_pre_dive_screen3_loop:
	incf	wait_temp,F			; EEPROM address
	incf	temp6,F			; Increase SP

	movlw	d'25'
	addwf	waitms_temp,F		; Increase row
	WIN_LEFT	.90
	movff	waitms_temp,win_top ; Set Row
	
	lfsr	FSR2,letter		
	movlw	'S'
	movwf	POSTINC2
	movlw	'P'
	movwf	POSTINC2
	movff	temp6,lo		; copy gas number
	output_8				; display gas number
	movlw	':'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	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	temp6		; All gases shown?
	bra		PLED_pre_dive_screen3_loop	;no

	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,hi		; 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, lo		; O2 ratio

	WIN_LEFT	.90
	WIN_TOP		.100
	lfsr	FSR2,letter		
	movlw	'D'
	movwf	POSTINC2
	movlw	'i'
	movwf	POSTINC2
	movlw	'l'
	movwf	POSTINC2
	movlw	':'
	movwf	POSTINC2
	output_8				; O2 Ratio
	movlw	'/'
	movwf	POSTINC2
	movff	hi,lo
	output_8				; He Ratio
	call	word_processor		

	bcf		leftbind
	return				; Return (CC Mode)

PLED_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		PLED_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	PLED_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!
	movlw	'B'
	movwf	POSTINC2
	movlw	'a'
	movwf	POSTINC2
	movlw	'r'
	movwf	POSTINC2
	bcf		leftbind
	call	word_processor
	bra		PLED_active_gas_surfmode_exit

PLED_active_gas_surfmode2:
	WIN_TOP		.130
	WIN_LEFT	.100
	WIN_FONT 	FT_MEDIUM
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_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		PLED_active_gas_surfmode4 ; No!
	tstfsz	hi							; Air? (He=0%)
	bra		PLED_active_gas_surfmode4 ; No!
	
							; Yes, display "Air" instead of 21/0
	DISPLAYTEXTH		d'265'		;"Air  ", y-scale=2
	bra		PLED_active_gas_surfmode_exit

PLED_active_gas_surfmode4:
	lfsr	FSR2,letter
	bsf		leftbind			; left orientated output
	output_99					; O2 ratio is still in "lo"
	movlw	'/'
	movwf	POSTINC2
	movff	char_I_He_ratio,lo		; copy He ratio into lo
	output_99
	bcf		leftbind
	call	word_processor
	bra		PLED_active_gas_surfmode_exit

PLED_active_gas_surfmode_exit:
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.122
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.175
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.82
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.159
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_frame
	return

PLED_confirmbox:
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.68
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.146
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.34
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.101
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box

	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.70
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.144
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.35
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.100
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_frame
	DISPLAYTEXT	.143			; Confirm:
	DISPLAYTEXT	.145			; Cancel
	DISPLAYTEXT	.146			; OK!

	movlw		d'1'
	movwf		menupos

PLED_confirmbox2:
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.96
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.143
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.39
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.51
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box

	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	PLED_standard_color

	lfsr	FSR2,letter
	movlw	0xB7			; Arrow for menu
	movwf	POSTINC2
	call	word_processor

	bcf			sleepmode					; clear some flags
	bcf			menubit2
	bcf			menubit3
	bcf			switch_right
	bcf			switch_left
	clrf		timeout_counter2
	WAITMS		d'100'

PLED_confirmbox_loop:
	call		check_switches_logbook
	
	btfsc		menubit3					; SET/MENU?
	bra			PLED_confirmbox_move_cursor; Move Cursor
	btfsc		menubit2					; ENTER?
	bra			PLED_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			PLED_confirmbox_cancel		; back with cancel
	btfsc		divemode
	bra			PLED_confirmbox_cancel		; back with cancel

	bra			PLED_confirmbox_loop		; wait for something to do

PLED_confirmbox_cancel:
	retlw	.0
PLED_confirmbox_ok:
	retlw	.1

PLED_confirmbox_menu_do:
	dcfsnz	menupos,F
	bra		PLED_confirmbox_cancel
	dcfsnz	menupos,F
	bra		PLED_confirmbox_ok
	bra		PLED_confirmbox_cancel

PLED_confirmbox_move_cursor:
	incf	menupos,F
	movlw	d'3'						; number of menu options+1
	cpfseq	menupos						; =limit?
	bra		PLED_confirmbox_move_cursor2	; No!
	movlw	d'1'							; Yes, reset to position 1!
	movwf	menupos
PLED_confirmbox_move_cursor2:
	bra		PLED_confirmbox2		; Return to Profile Menu, also updates cursor


PLED_depth:
	ostc_debug	'r'		; Sends debug-information to screen if debugmode active
	movff	rel_pressure+1,hi
	movff	rel_pressure+0,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	PLED_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
	PLED_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		pled_depth2				; Yes, display manual Zero

	bsf		leftbind
	bsf		ignore_digit4
	output_16		; Full meters in Big font
	bcf		leftbind
	bra		pled_depth3

pled_depth2:
	movlw	'0'
	movwf	POSTINC2
pled_depth3:
	call	word_processor
	bcf		ignore_digit4

	WIN_FONT 	FT_MEDIUM
	WIN_TOP		.50
	WIN_LEFT	.40
	PLED_color_code	warn_depth		; Color-code the output

	movff	rel_pressure+1,hi
	movff	rel_pressure+0,lo
	call	adjust_depth_with_salinity			; computes salinity setting into lo:hi [mBar]
	lfsr	FSR2,letter
	movlw	'.'
	movwf	POSTINC2

	movlw	HIGH	d'9'
	movwf	sub_a+1
	movlw	LOW		d'9'
	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.1m?
	bra		pled_depth4				; Yes, display manual Zero

	movlw	d'4'
	movwf	ignore_digits
	bsf		ignore_digit5
	output_16dp	d'0'
	bra		pled_depth5

pled_depth4:
	movlw	'0'
	movwf	POSTINC2

pled_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	PLED_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
	PLED_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:
	movlw	' '
	movwf	POSTINC2
	return

PLED_clear_depth			; No, clear depth area and set flag
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.24
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.90
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.0
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.90
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	bsf		depth_greater_100m			; Set Flag
	return


PLED_desaturation_time:	
	ostc_debug	'h'
	WIN_TOP		.150
	WIN_LEFT	.1
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	lfsr	FSR2,letter
	OUTPUTTEXT	d'14'				; Desat
	movlw		' '
	movwf		POSTINC2
	movff		int_O_desaturation_time+0,lo			; divide by 60...
	movff		int_O_desaturation_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
	movlw		':'
	movwf		POSTINC2
	movff		hi,lo					; Minutes
	output_99x
	bcf		leftbind
	call	word_processor
	return

PLED_nofly_time:	
	ostc_debug	'g'
	WIN_TOP		.125
	WIN_LEFT	.1
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color

	lfsr	FSR2,letter
	OUTPUTTEXT	d'35'				; NoFly
	movlw		' '
	movwf		POSTINC2
	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
	movlw		':'
	movwf		POSTINC2
	movff		hi,lo					; Minutes
	decf		lo,F
	btfsc		lo,7					; keep Nofly time
	clrf		lo
	output_99x
	bcf		leftbind
	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
	call	PLED_standard_color

	lfsr	FSR2,letter
	movff	amb_pressure+0,lo
	movff	amb_pressure+1,hi
	bsf		leftbind
	output_16
	bcf		leftbind
	movlw	'm'
	movwf	POSTINC2
	movlw	'b'
	movwf	POSTINC2
	movlw	'a'
	movwf	POSTINC2
	movlw	'r'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	call	word_processor
	return

update_batt_voltage_divemode:

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	PLED_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
	movlw	'V'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	call	word_processor
	return
	
update_batt_voltage2:
	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.174
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.194
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.1
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.32
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_frame

; 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:
	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.181
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.187
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.32
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.34
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box			; Full Cap

update_batt_voltage3:
	GETCUSTOM8	d'34'			; Color battery
	movff	WREG,box_temp+0		; Color Data
	movlw	.176
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.192
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.2
	movff	WREG,box_temp+3		; column left (0-159)
	movff	wait_temp,box_temp+4		; column right (0-159)
	call	PLED_box

	call		PLED_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

PLED_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		PLED_convert_date1

; Use MMDDYY
	movff	convert_value_temp+0,lo			;month
	bsf		leftbind
	output_99x
	bcf		leftbind
	movlw	'/'
	movwf	POSTINC2
	movff	convert_value_temp+1,lo			;day
	bra 	PLED_convert_date1_common		;year

PLED_convert_date1:
	read_int_eeprom d'91'			; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
	decfsz	EEDATA,F
	bra		PLED_convert_date2

; Use DDMMYY
	movff	convert_value_temp+1,lo			;day
	bsf		leftbind
	output_99x
	bcf		leftbind
	movlw	'/'
	movwf	POSTINC2
	movff	convert_value_temp+0,lo			;month

PLED_convert_date1_common:
	bsf		leftbind
	output_99x
	bcf		leftbind
	movlw	'/'
	movwf	POSTINC2
	movff	convert_value_temp+2,lo			;year
	bsf		leftbind
	output_99x
	return

PLED_convert_date2:
; Use YYMMDD
	movff	convert_value_temp+2,lo			;year
	bsf		leftbind
	output_99x
	bcf		leftbind
	movlw	'/'
	movwf	POSTINC2
	movff	convert_value_temp+0,lo			;month
	bsf		leftbind
	output_99x
	bcf		leftbind
	movlw	'/'
	movwf	POSTINC2
	movff	convert_value_temp+1,lo			;day
	bsf		leftbind
	output_99x
	return

PLED_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		PLED_convert_date_short1

; Use MMDDYY
PLED_convert_date_short_common:
	movff	convert_value_temp+0,lo			;month
	bsf		leftbind
	output_99x
	bcf		leftbind
	movlw	'/'
	movwf	POSTINC2
	movff	convert_value_temp+1,lo			;day
	bsf		leftbind
	output_99x
	bcf		leftbind
	return

PLED_convert_date_short1:
	read_int_eeprom d'91'			; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
	decfsz	EEDATA,F
	bra		PLED_convert_date_short_common	; Use YYMMDD

; Use DDMMYY
	movff	convert_value_temp+1,lo			;day
	bsf		leftbind
	output_99x
	bcf		leftbind
	movlw	'/'
	movwf	POSTINC2
	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	PLED_standard_color

	lfsr	FSR2,letter

	movff	month,convert_value_temp+0
	movff	day,convert_value_temp+1
	movff	year,convert_value_temp+2
	call	PLED_convert_date		; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2	
	call	word_processor
	return

PLED_menu_clear:
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.0
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.26
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.65
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.100	
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	return

PLED_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	PLED_standard_color
	WIN_TOP		.184
	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	PLED_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	PLED_standard_color
	WIN_TOP		.184
	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

PLED_clear_maxdepth:
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.184
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.215
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.0
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.41
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	bsf		maxdepth_greater_100m	; Set Flag
	return

PLED_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		PLED_divemins_gauge

	btfsc	FLAG_apnoe_mode			; different display in apnoe mode
	bra		PLED_divemins_apnoe

	GETCUSTOM8	d'38'		; Show seconds (=1?)
	movwf	lo
	movlw	d'1'
	cpfseq	lo					; =1?
	bra		PLED_divemins2		; No, minutes only
	bra		PLED_divemins_gauge	; Yes, use Gauge routine
	
PLED_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	PLED_standard_color
	call	word_processor
	WIN_FONT	FT_SMALL
	return

PLED_display_apnoe_surface:
	btfsc	menubit					; Divemode menu active?
	return							; Yes, do not display surface mode timeout

	call		PLED_divemask_color	; Set Color for Divemode mask
	DISPLAYTEXT	d'140'			; "SURFACE"
	call	PLED_standard_color


	WIN_TOP		.85
	WIN_LEFT	.90
	WIN_FONT	FT_MEDIUM
	call	PLED_standard_color


	movff	apnoe_surface_mins,lo
	bcf		leftbind
	lfsr	FSR2,letter
	output_8
	movlw	':'
	movwf	POSTINC2
	movff	apnoe_surface_secs,lo
	output_99x
	call	word_processor
	WIN_FONT	FT_SMALL
	return

PLED_apnoe_clear_surface:
	; Clear Surface timer....
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.60
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.119
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.90
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.159	
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	return


PLED_display_apnoe_descent:
	call		PLED_divemask_color	; Set Color for Divemode mask
	DISPLAYTEXT		d'139'			; "Descent"
	call	PLED_standard_color


	WIN_TOP		.145
	WIN_LEFT	.90
	WIN_FONT	FT_MEDIUM
	call	PLED_standard_color


	movff	apnoe_mins,lo
	lfsr	FSR2,letter
	output_8
	movlw	':'
	movwf	POSTINC2
	movff	apnoe_secs,lo
	output_99x
	call	word_processor
	WIN_FONT	FT_SMALL
	return
	
PLED_divemins_apnoe:

PLED_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
	movlw	':'
	movwf	POSTINC2
	movff	divesecs,lo
	output_99x
	WIN_TOP		.20
	WIN_LEFT	.90
	WIN_FONT	FT_MEDIUM
	call	PLED_standard_color

	call	word_processor
	bcf		show_last3
	WIN_FONT	FT_SMALL
	return

PLED_stopwatch_show:
	; Stopwatch
	call		PLED_divemask_color	; Set Color for Divemode mask
	DISPLAYTEXTH	d'283'			; Stopwatch

PLED_stopwatch_show2:
	call	PLED_standard_color
	ostc_debug	'V'		; Sends debug-information to screen if debugmode active
	WIN_TOP		.192
	WIN_LEFT	.110
	WIN_FONT	FT_SMALL
	call	PLED_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
	movlw	':'
	movwf	POSTINC2
	movff	wait_temp,lo
	output_99x
	bcf		leftbind
	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	PLED_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
	movlw	'm'
	movwf	POSTINC2
	call	word_processor
	return


PLED_serial:			; Writes OSTC #Serial and Firmware version in surfacemode
	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
	call	PLED_standard_color

	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
	movlw	' '
	movwf	POSTINC2
	movlw   0x85                        ; New aa_font_28 5 grays HW logo.
	movwf   POSTINC2
	movlw   0x86
	movwf   POSTINC2
	movlw	' '
	movwf	POSTINC2
	movlw	'V'
	movwf	POSTINC2
	movlw	softwareversion_x
	movwf	lo
	bsf		leftbind
	output_8
	movlw	'.'
	movwf	POSTINC2
	movlw	softwareversion_y
	movwf	lo
	bsf		leftbind
	output_99x
	bcf		leftbind
	call	word_processor
	return

PLED_divemode_menu_mask_first:			; Write Divemode menu1 mask
	ostc_debug	'o'		; Sends debug-information to screen if debugmode active
	call	PLED_menu_clear			; clear "Menu?"

	btfsc	FLAG_const_ppO2_mode	; are we in ppO2 mode?
	bra		PLED_divemode_menu_mask_first2

; in OC Mode
	DISPLAYTEXT	.32					;"Gaslist"
	DISPLAYTEXT	.31					;"Decoplan"
	bra		PLED_divemode_menu_mask_first3

PLED_divemode_menu_mask_first2:
; in CC Mode
	DISPLAYTEXT	.238				;"SetPoint"
	DISPLAYTEXT	.31					;"Decoplan"

PLED_divemode_menu_mask_first3:
; In all modes
	call	customview_menu_entry3	; Show customview-dependent menu entry
	DISPLAYTEXT	.241				;"Display"
	DISPLAYTEXT	.34					;"Exit"
	return							

PLED_divemode_set_xgas:				; Displayes the "Set Gas" menu
	WIN_LEFT	.100
	WIN_TOP		.0
	WIN_FONT	FT_SMALL
	call	PLED_standard_color

	lfsr	FSR2,letter	
	movlw	'S'
	movwf	POSTINC2
	movlw	'e'
	movwf	POSTINC2
	movlw	'l'
	movwf	POSTINC2
	read_int_eeprom	d'24'			; Get Gas6 %O2
	movff	EEDATA,lo
	bcf		leftbind
	output_99					; outputs into Postinc2!
	movlw	'/'
	movwf	POSTINC2
	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 -
	return

PLED_divemode_simulator_mask:
	DISPLAYTEXT	.254			; Close
	DISPLAYTEXT	.250			; + 1m
	DISPLAYTEXT	.251			; - 1m
	DISPLAYTEXT	.252			; +10m
	DISPLAYTEXT	.253			; -10m
	return

PLED_decoplan_bargraph:
	GETCUSTOM8	d'35'				; Standard output color
	movff	WREG,box_temp+0			; Data
	movff	hi,win_top
	incf	win_top,F				; +1
	movff	win_top,box_temp+1		; row top (0-239)
	movff	win_top,box_temp+2		; 
	movlw	d'18'
	addwf	box_temp+2,F			; row bottom (0-239)
	movlw	.122
	movff	WREG,box_temp+3			; column left (0-159)
	addwf	lo,F					; Add time offset
	btfsc	STATUS,C				; >255?
	setf	lo						; limit to 255
	decf	lo,F					; No, minus one
	movlw	d'138'					; Limit length (16min)
	cpfslt	lo
	movwf	lo					
	movff	lo,box_temp+4			; column right (0-159)
	call	PLED_box
	
	movlw	.0
	movff	WREG,box_temp+0			; Data
	movff	win_top,box_temp+1		; row top (0-239)
	movff	win_top,box_temp+2		; 
	movlw	d'18'
	addwf	box_temp+2,F			; row bottom (0-239)
	movff	lo,box_temp+3			; 
	incf	box_temp+3,F			; column left (0-159)
	movlw	.139
	movff	WREG,box_temp+4			; column right (0-159)
	call	PLED_box
	return

PLED_decoplan_delete_gf:		; Delete unused rows
	movlw	.238
	movff	WREG,box_temp+2	; row bottom (0-239)
	bra		PLED_decoplan_delete_common

PLED_decoplan_delete:			; Delete unused rows
	movlw	.184
	movff	WREG,box_temp+2	; row bottom (0-239)
PLED_decoplan_delete_common:
	movlw	.0
	movff	WREG,box_temp+0	; data 00, x0, 0y, xy clear, links, rechts, beide
	movff	hi,box_temp+1	; row top (0-239)
	movlw	.100
	movff	WREG,box_temp+3	; column left (0-159)
	movlw	.159	
	movff	WREG,box_temp+4	; column right (0-159)
	call	PLED_box				
	bsf		last_ceiling_gf_shown		; Set flag
	return


PLED_decoplan_gf_page_current:
	movlw	d'0'
	cpfseq	temp8
	bra		PLED_decoplan_gf_page2				; =1: Dispplay Page 2
	bra		PLED_decoplan_gf_page1				; =0, Display Page 1

PLED_decoplan_gf_page1:
	ostc_debug	'n'		; Sends debug-information to screen if debugmode active

	movff	char_O_array_decodepth+0,lo		; Get Depth
	tstfsz	lo
	bra		PLED_decoplan_gf_page1x
	; No Deco, show "no Deco"
	DISPLAYTEXT	d'239'						;"No Deco"
	return

PLED_decoplan_gf_page2:
	; temp7 holds last displayed depth
	; temp5 list entry
	movff	temp5,temp9		; save
	movff	temp7,temp10	; save
	movlw	.231
	movwf	temp6			; row
PLED_decoplan_gf_page2y:
	movlw	d'3'
	addwf	temp7,F			; Add 3m for next stop
	movlw	d'25'
	addwf	temp6,F
	incf	temp5,F
	call	PLED_decoplan_show_stop_gf
	movlw	d'15'			; the next 8 Stops...
	cpfseq	temp5
	bra		PLED_decoplan_gf_page2y
	movff	temp9,temp5			; restore
	movff	temp10,temp7		; restore
	bsf		last_ceiling_gf_shown		; Set flag
	return

PLED_decoplan_gf_page1x:
	clrf	temp8				; Page 0-3 of deco list
	GETCUSTOM8	d'29'			; Last Deco in m
	movwf	temp7				; Start with last stop
	setf	temp5
	movlw	.231
	movwf	temp6			; row

	; Show last stop manually
	movlw	d'25'
	addwf	temp6,F
	incf	temp5,F
	call	PLED_decoplan_show_stop_gf
	GETCUSTOM8	d'29'			; Last Deco in m
	movwf	temp7				; Last deco
	movlw	d'4'
	cpfslt	temp7				; >=3m?
	bra		PLED_decoplan_gf_page1x_next_6m

	movlw	d'3'
	movwf	temp7
	bra		PLED_decoplan_gf_page1y

PLED_decoplan_gf_page1x_next_6m:
	movlw	d'6'
	movwf	temp7
	incf	temp5,F
PLED_decoplan_gf_page1y:
	movlw	d'3'
	addwf	temp7,F			; Add 3m for next stop
	movlw	d'25'
	addwf	temp6,F
	incf	temp5,F
	call	PLED_decoplan_show_stop_gf
	movlw	d'7'			; the next 7 Stops...
	cpfseq	temp5
	bra		PLED_decoplan_gf_page1y
	return


PLED_decoplan_show_stop_gf:
	bsf		leftbind
	WIN_LEFT	.100
	movff	temp6,win_top
	movff	temp6,hi						; copy for PLED_decoplan_bargraph

	movff	char_O_array_decodepth+0,WREG	; Ceiling
	cpfslt	temp7							; Ceiling already displayed?
	goto	PLED_decoplan_delete_gf			; Yes, quit display	and RETURN	
	movff	temp7,lo						; Decodepth

	lfsr	FSR2,letter		
	output_99x								; outputs into Postinc2!
	movlw	'm'
	movwf	POSTINC2
	call	word_processor	
	WIN_LEFT	.140
	movff	temp6,win_top
;	lfsr	FSR1,0x251
	lfsr	FSR1,0x0E1						; Gf_decolist_copy
	movf	temp5,W							; number of entry
	movff	PLUSW1,lo						; Stop length
	incf	lo,F							; add one dummy minute
	lfsr	FSR2,letter	
	output_99x								; outputs into Postinc2!
	movlw	d'39'							;"'"
	movwf	POSTINC2
	call	word_processor	
	tstfsz	lo								; 0 min "Stop"?
	rcall	PLED_decoplan_bargraph			; draws a box representing the decotime (stored in lo...) for this depth
	return


PLED_decoplan:				; display the Decoplan
	ostc_debug	'n'		; Sends debug-information to screen if debugmode active

	movff	char_O_array_decodepth+0,lo		; Get Depth
	tstfsz	lo
	bra		PLED_decoplan1
	; No Deco, show "no Deco"
;	call	PLED_clear_divemode_menu		; Clear Deco area
	DISPLAYTEXT	d'239'						;"No Deco"
	return

PLED_decoplan1:
	setf	temp5
	movlw	.231
	movwf	temp6			; row
PLED_decoplan2:
	movlw	d'25'
	addwf	temp6,F
	incf	temp5,F
	call	PLED_decoplan_show_stop
	movlw	d'5'			; 6 Stops...
	cpfseq	temp5
	bra		PLED_decoplan2
	return

PLED_decoplan_show_stop:
	bsf		leftbind
	WIN_LEFT	.100
	movff	temp6,win_top
	movff	temp6,hi						; copy for PLED_decoplan_bargraph

	lfsr	FSR1,char_O_array_decodepth;+0
	movf	temp5,W							; number of entry
	movff	PLUSW1,lo
	movf	lo,w
	btfsc	STATUS,Z						; =0
	goto	PLED_decoplan_delete			; Yes, quit display		

	lfsr	FSR2,letter		
	output_8								; outputs into Postinc2!
	movlw	'm'
	movwf	POSTINC2
	call	word_processor	

	WIN_LEFT	.140
	movff	temp6,win_top

	lfsr	FSR1,char_O_array_decotime;+0
	movf	temp5,W							; number of entry
	movff	PLUSW1,lo

	lfsr	FSR2,letter	
	output_99x								; outputs into Postinc2!
	movlw	d'39'							;"'"
	movwf	POSTINC2
	call	word_processor	
	tstfsz	lo								; 0 min "Stop"?
	rcall	PLED_decoplan_bargraph			; draws a box representing the decotime (stored in lo...) for this depth
	return


PLED_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

PLED_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
	
	lfsr	FSR2,letter		
	movlw	'G'
	movwf	POSTINC2
	movff	hi,lo			; copy gas number
	output_8				; display gas number
	movlw	':'
	movwf	POSTINC2
	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!
	movlw	'/'
	movwf	POSTINC2
	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)
	PLED_color_code		warn_gas_in_gaslist		; Color-code output	(%O2 in "EEDATA")
; Check if gas needs to be greyed-out (inactive)	
	read_int_eeprom		d'27'	; read flag register
	movff	hi,lo			; copy gas number
PLED_gas_list_loop1:
	rrcf	EEDATA			; roll flags into carry
	decfsz	lo,F			; max. 5 times...
	bra		PLED_gas_list_loop1

	movlw	color_grey
	btfss	STATUS,C		; test carry
	call	PLED_set_color	; grey out inactive gases!
	
	call	word_processor	
	call	PLED_standard_color	

	movlw	d'5'			; list all five gases
	cpfseq	hi				; All gases shown?
	bra		PLED_gas_list_loop	; No

	DISPLAYTEXT	d'122'		; Gas 6..

	return					;  return (OC mode)

PLED_splist_start:	
	WIN_LEFT	.100
	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'231'
	movwf	waitms_temp			; here: stores row for gas list
	clrf 	temp5				; here: SP counter

PLED_splist_loop:
	incf	wait_temp,F			; EEPROM address
	incf	temp5,F			; Increase SP

	movlw	d'25'
	addwf	waitms_temp,F		; Increase row
	movff	waitms_temp,win_top ; Set Row
	WIN_LEFT	.100
	
	lfsr	FSR2,letter		
	movlw	'S'
	movwf	POSTINC2
	movlw	'P'
	movwf	POSTINC2
	movff	temp5,lo		; copy gas number
	output_8				; display gas number
	movlw	':'
	movwf	POSTINC2
	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	temp5		; All gases shown?
	bra		PLED_splist_loop	; No

	bcf		leftbind
	return						; no, return

PLED_clear_divemode_menu:
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.0
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.169
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.082
	movff	WREG,box_temp+3		; column left (0-159)
movlw	.160
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	return

PLED_divemenu_cursor:
	ostc_debug	'l'		; Sends debug-information to screen if debugmode active

	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.0
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.150
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.85
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.95	
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box

	WIN_TOP		.0
	WIN_LEFT	.85
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_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

	lfsr	FSR2,letter
	movlw	0xB7			; Arrow for menu
	movwf	POSTINC2
	call	word_processor
	return

;PLED_profileview_menu:
;	DISPLAYTEXT	.127					;"Exit"
;	DISPLAYTEXT	.128					;"Delete"
;;	DISPLAYTEXT	.132					;"Format"
;	return

custom_warn_surfmode:			; With CF in temp1
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.56
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.88
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.69
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.115
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box

	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.58
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.86
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.70
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.114
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_frame
	; warning text

	WIN_TOP		.60
	WIN_LEFT	.71
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.1					; Init new Wordprocessor
	call	PLED_warnings_color		; Set Color for Warning
 	lfsr	FSR2,letter
	movlw	'C'
	movwf	POSTINC2
	movlw	'F'
	movwf	POSTINC2
	movff	temp1,lo
	output_8
	movlw	'!'
	movwf	POSTINC2
	call	word_processor

	WIN_INVERT	.0					; Init new Wordprocessor
	call	PLED_standard_color
	return

PLED_saturation_graph_divemode:
	ostc_debug	'h'		; Sends debug-information to screen if debugmode active
PLED_tissue_saturation_graph:
	ostc_debug	'i'		; Sends debug-information to screen if debugmode active

; Clear graph area...
	movlw	.0
	movff	WREG,box_temp+0		; Data
	movlw	.25
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.120
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.82
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.159
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box

; Draw Frame
	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.25
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.120
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.82
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.159
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_frame

; Draw N2 Tissues
	lfsr	FSR2, char_O_tissue_saturation+.000	; N2
	movlw	d'16'
	movwf	wait_temp		; 16 tissues
	clrf	waitms_temp		; Row offset
PLED_tissue_saturation_graph3:
	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.28
	addwf	waitms_temp,W
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.28
	addwf	waitms_temp,W
	movff	WREG,box_temp+2		; row bottom (0-239)

	incf	waitms_temp,F
	incf	waitms_temp,F

	movlw	.100
	movff	WREG,box_temp+3		; column left (0-159)

	movff	POSTINC2,box_temp+4
	bcf		STATUS,C
	rrcf	box_temp+4,F
	bcf		STATUS,C
	rrcf	box_temp+4,F		
	movlw	.100
	addwf	box_temp+4,F		; column right (0-159)

	movlw	d'157'							; limit display 
	cpfslt	box_temp+4						; skip if 157 (WREG) < box_temp+4
	movwf	box_temp+4

	call	PLED_box	

	decfsz	wait_temp,F
	bra		PLED_tissue_saturation_graph3

; Draw He Tissues
	lfsr	FSR2, char_O_tissue_saturation+.016	; He
	movlw	d'16'
	movwf	wait_temp		; 16 tissues
	clrf	waitms_temp		; Row offset
PLED_tissue_saturation_graph2:
	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.86
	addwf	waitms_temp,W
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.86
	addwf	waitms_temp,W
	movff	WREG,box_temp+2		; row bottom (0-239)

	incf	waitms_temp,F
	incf	waitms_temp,F

	movlw	.100
	movff	WREG,box_temp+3		; column left (0-159)

	movff	POSTINC2,box_temp+4
	bcf		STATUS,C
	rrcf	box_temp+4,F
	bcf		STATUS,C
	rrcf	box_temp+4,F		
	movlw	.100
	addwf	box_temp+4,F		; column right (0-159)

	movlw	d'157'							; limit display 
	cpfslt	box_temp+4						; skip if 157 (WREG) < box_temp+4
	movwf	box_temp+4

	call	PLED_box	

	decfsz	wait_temp,F
	bra		PLED_tissue_saturation_graph2

; Draw Text
	WIN_LEFT	.84
	WIN_TOP		.32
	call	PLED_standard_color
	lfsr	FSR2,letter
	movlw	'N'
	movwf	POSTINC2
	movlw	'2'
	movwf	POSTINC2
	call	word_processor
	WIN_LEFT	.84
	WIN_TOP		.90
	call	PLED_standard_color
	lfsr	FSR2,letter
	movlw	'H'
	movwf	POSTINC2
	movlw	'e'
	movwf	POSTINC2
	call	word_processor

	movff	char_O_gtissue_no,wait_temp			; used as temp

	lfsr	FSR2,letter
	lfsr	FSR1,char_O_tissue_saturation+0
	incf	wait_temp,F			; make 1-16 of 0-15
PLED_tissue_saturation_graph4:		; point to leading tissue...
	movff	POSTINC1,lo			; copy/overwrite to lo register
	decfsz	wait_temp,F			; count until zero
	bra		PLED_tissue_saturation_graph4	;loop
	output_8
	movlw	'%'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	WIN_LEFT	.84
	WIN_TOP		.62
	WIN_FONT	FT_SMALL
	call	PLED_standard_color
	call	word_processor
	bcf		leftbind

; Draw Scale
	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.73
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.74
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.121
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.157
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_frame

	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.61
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.84
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.121
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.122
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.65
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.80
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.121+.9
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.122+.9
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.65
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.80
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.121+.18
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.122+.18
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.65
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.80
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.121+.27
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.122+.27
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	GETCUSTOM8	d'35'			; Standard output color
	movff	WREG,box_temp+0		; Data
	movlw	.61
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.84
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.121+.36
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.122+.36
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box

	return


PLED_startupscreen1:
	call	PLED_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

PLED_startupscreen2:
	call	PLED_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

PLED_new_cf_warning:
	call	PLED_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

PLED_const_ppO2_value:
	btfsc	multi_gf_display			; Is the Multi-GF Table displayed?
	return								; Yes, No update and return!

	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		PLED_const_ppO2_value2	; No, display Setpoint

; Yes, Display "Bail"
	call		PLED_standard_color
	OUTPUTTEXTH		d'263'			;"Bail"
	call	word_processor
	return

PLED_const_ppO2_value2:				; Display SetPoint
;Show fixed SP value
	movff		amb_pressure+0,xA+0
	movff		amb_pressure+1,xA+1
	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			PLED_const_ppO2_value1			; Yes

	movff		xC+0,char_I_const_ppO2			; No, Overwrite with actual value
	bra			PLED_const_ppO2_value1a

PLED_const_ppO2_value1:
	; char_I_const_ppO2 < ppO2[Diluent] -> Not physically possible! -> Display actual value!
	movff		amb_pressure+0,xA+0
	movff		amb_pressure+1,xA+1
	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			PLED_const_ppO2_value11			; Value in range

	; char_I_const_ppO2 < ppO2[Diluent] -> Not physically possible! -> Display actual value!

	movff		xC+0,xA+0
	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
	bra			PLED_const_ppO2_value1a

PLED_const_ppO2_value11:

; Setpoint in possible limits
	movff		ppO2_setpoint_store,char_I_const_ppO2		; Restore Setpoint

PLED_const_ppO2_value1a:
	PLED_color_code		warn_ppo2		; Color-code output
	movff	char_I_const_ppO2,lo
	clrf	hi
	bsf		leftbind
	output_16dp	d'3'
	bcf		leftbind
	call	word_processor
	call	PLED_standard_color
	return

PLED_show_leading_tissue:
	call		PLED_divemask_color	; Set Color for Divemode mask
	DISPLAYTEXTH	.282		; L. Tissue:
PLED_show_leading_tissue_2:
	call	deco_main_calc_desaturation_time	; calculate desaturation time
	movlb	b'00000001'						; select ram bank 1

	lfsr	FSR2,letter
	movlw	'#'
	movwf	POSTINC2
	movff	char_O_gtissue_no,lo
	movff	char_O_gtissue_no,wait_temp			; used as temp
	bsf		leftbind
	output_8
	movlw	' '
	movwf	POSTINC2
	movlw	'('
	movwf	POSTINC2
	
	movlw	d'16'
	cpfslt	wait_temp
	bra		PLED_show_leading_tissue_he
	movlw	'N'
	movwf	POSTINC2
	movlw	'2'
	movwf	POSTINC2
	bra		PLED_show_leading_tissue2
PLED_show_leading_tissue_he:	
	movlw	'H'
	movwf	POSTINC2
	movlw	'e'
	movwf	POSTINC2
PLED_show_leading_tissue2:	
	movlw	')'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	WIN_LEFT	.95
	WIN_TOP		.192
	WIN_FONT	FT_SMALL
	call	PLED_standard_color
	call	word_processor

	lfsr	FSR2,letter
	lfsr	FSR1,char_O_tissue_saturation+0
	incf	wait_temp,F			; make 1-16 of 0-15
PLED_show_leading_tissue3:		; point to leading tissue...
	movff	POSTINC1,lo			; copy/overwrite to lo register
	decfsz	wait_temp,F			; count until zero
	bra		PLED_show_leading_tissue3	;loop
	output_8
	movlw	'%'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	WIN_LEFT	.95
	WIN_TOP		.216
	WIN_FONT	FT_SMALL
	call	word_processor
	bcf		leftbind
	return

PLED_topline_box_clear:			; Writes an empty box
	movlw	.0
	bra		PLED_topline_box2
PLED_topline_box:				; Writes a filled box...
	GETCUSTOM8		d'35'		; ... with the standard color
PLED_topline_box2:
	movff	WREG,box_temp+0		; Data
	movlw	.000
	movff	WREG,box_temp+1		; row top (0-239)
	movlw	.026
	movff	WREG,box_temp+2		; row bottom (0-239)
	movlw	.000
	movff	WREG,box_temp+3		; column left (0-159)
	movlw	.159	
	movff	WREG,box_temp+4		; column right (0-159)
	call	PLED_box
	return

PLED_display_cns:
	btfsc	multi_gf_display			; Is the Multi-GF Table displayed?
	return								; Yes, No update and return!

	btfsc	gauge_mode			; Do not display in gauge mode
	 return

	btfsc	FLAG_apnoe_mode		; Do not display in apnoe mode
	 return

	btfsc	pled_velocity_display	; Is velocity displayed?`
	 return							; Yes, do not overwrite until pled_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
	PLED_color_code		warn_cns		; Color-code CNS output
	
 	lfsr	FSR2,letter
	movlw	'C'
	movwf	POSTINC2
	movlw	'N'
	movwf	POSTINC2
	movlw	'S'
	movwf	POSTINC2
	movlw	':'
	movwf	POSTINC2
	movff	char_O_CNS_fraction,lo
	bsf		leftbind
	output_8
	bcf		leftbind
	movlw	'%'
	movwf	POSTINC2
	call	word_processor
	return

PLED_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
	PLED_color_code		warn_cns		; Color-code CNS output
	
 	lfsr	FSR2,letter
	movlw	'C'
	movwf	POSTINC2
	movlw	'N'
	movwf	POSTINC2
	movlw	'S'
	movwf	POSTINC2
	movlw	':'
	movwf	POSTINC2
	movff	char_O_CNS_fraction,lo
	bsf		leftbind
	output_8
	bcf		leftbind
	movlw	'%'
	movwf	POSTINC2
	call	word_processor
	return


PLED_custom_text:
	read_int_eeprom	d'64'
	movlw	d'1'
	cpfseq	EEDATA						; Custom text active?
	bra		PLED_clear_custom_text		; No, Delete row
	WIN_TOP		.200
	WIN_LEFT	.0
	WIN_FONT 	FT_SMALL
	WIN_INVERT	.0					; Init new Wordprocessor
	call		PLED_divemask_color	; Set Color for Divemode mask

	lfsr	FSR2,letter	
	movlw	d'64'
	movwf	lo
	movlw	d'24'
	movwf	hi					; counter

PLED_custom_text1:
	incf	lo,F
	call	PLED_get_custom_letter			; Get one letter for the custom text
	movlw	'}'							; End marker found?
	cpfseq	EEDATA
	bra		PLED_custom_text2			; No
	bra		PLED_custom_text3
PLED_custom_text2:
	movff	EEDATA,POSTINC2				; Copy into Postinc

	decfsz	hi,F				; Max. numbers?
	bra		PLED_custom_text1			; No, get next letters

PLED_custom_text3:
	call	word_processor
	call	PLED_standard_color
	return

PLED_get_custom_letter:
	movff	lo,EEADR			; Address for next custom text letter
	call	read_eeprom					; Read letter
	return

PLED_clear_custom_text:
	movlw		d'24'
	movwf		temp1
	WIN_TOP		.200
	WIN_LEFT	.0
	call		PLED_display_clear_common_y1
	return

PLED_simdata_screen:			;Display Pre-Dive Screen
	; List active gases/Setpoints
	btfsc	FLAG_const_ppO2_mode		; in ppO2 mode?
	bra		PLED_simdata_screen3		; Yes, display SetPoint/Sensor result list

PLED_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

PLED_simdata_screen2_loop:
	incf	hi,F				; Increase Gas
	movlw	d'4'
	addwf	wait_temp,F			; Increase eeprom address for gas list
	
	lfsr	FSR2,letter		
	movlw	'G'
	movwf	POSTINC2
	movff	hi,lo			; copy gas number
	output_8				; display gas number
	movlw	':'
	movwf	POSTINC2
	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!
	movlw	'/'
	movwf	POSTINC2
	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!
	movlw	' '
	movwf	POSTINC2
	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
	output_99				; outputs into Postinc2!
	movlw	'm'
	movwf	POSTINC2
	read_int_eeprom		d'27'	; read flag register
	movff	hi,lo			; copy gas number
PLED_simdata_screen2_loop1:
	rrcf	EEDATA			; roll flags into carry
	decfsz	lo,F			; max. 5 times...
	bra		PLED_simdata_screen2_loop1
	
	btfsc	STATUS,C		; test carry
	bra		PLED_simdata_white

	movlw	color_grey
	call	PLED_set_color	; grey out inactive gases!
	bra		PLED_simdata_color_done

PLED_simdata_white:
	call	PLED_standard_color

PLED_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

PLED_simdata_screen2b:
	call		PLED_standard_color

	movlw	d'5'			; list all five gases
	cpfseq	hi				; All gases shown?
	bra		PLED_simdata_screen2_loop	; No
	
	return							; No, return (OC mode)

PLED_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 	temp6				; here: SP counter

PLED_simdata_screen3_loop:
	incf	wait_temp,F			; EEPROM address
	incf	temp6,F			; Increase SP

	movlw	d'25'
	addwf	waitms_temp,F		; Increase row
	WIN_LEFT	.0
	movff	waitms_temp,win_top ; Set Row
	
	lfsr	FSR2,letter		
	movlw	'S'
	movwf	POSTINC2
	movlw	'P'
	movwf	POSTINC2
	movff	temp6,lo		; copy gas number
	output_8				; display gas number
	movlw	':'
	movwf	POSTINC2
	movlw	' '
	movwf	POSTINC2
	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	temp6		; All gases shown?
	bra		PLED_simdata_screen3_loop	;no

	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,hi		; 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, lo		; O2 ratio

	WIN_LEFT	.0
	WIN_TOP		.110
	lfsr	FSR2,letter		
	movlw	'D'
	movwf	POSTINC2
	movlw	'i'
	movwf	POSTINC2
	movlw	'l'
	movwf	POSTINC2
	movlw	':'
	movwf	POSTINC2
	output_8				; O2 Ratio
	movlw	'/'
	movwf	POSTINC2
	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'100'
	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