diff code_part1/OSTC_code_asm_part1/menu_gassetup.asm @ 0:96a35aeda5f2

Initial setup
author heinrichsweikamp
date Tue, 12 Jan 2010 15:05:59 +0100
parents
children 3cf8af30b36e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/menu_gassetup.asm	Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,1111 @@
+
+; 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/>.
+
+
+; Gas Setup menu
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/08/07
+; last updated: 080906
+; known bugs:
+; ToDo: 
+
+menu_gassetup:				
+	movlw	d'1'
+	movwf	menupos
+
+menu_gassetup_prelist:
+	call	PLED_ClearScreen
+	clrf	timeout_counter2
+	bcf		sleepmode
+	bcf		menubit2
+	bcf		menubit3
+	call	PLED_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor
+	DISPLAYTEXT	.106			; Gas List
+	WIN_INVERT	.0	; Init new Wordprocessor
+	clrf	decodata+0				; Here: # of gas 0-4
+	clrf	divemins+0				; Here: # of Gas * 4
+	movlw	d'5'
+	movwf	waitms_temp		; here: stores row for gas list
+	movlw	d'2'
+	movwf	wait_temp			; here: stores eeprom address for gas list
+
+; Changed v1.44se
+menu_gassetup_list:
+	WIN_LEFT	.20
+	movlw	d'4'
+	addwf	wait_temp,F			; Increase eeprom address for gas list
+	movlw	d'30'
+	addwf	waitms_temp,F		; Increase row
+	movf	waitms_temp,W		; Load row into WREG
+	movff	WREG,win_top
+	lfsr	FSR2,letter
+	movlw	'G'
+	movwf	POSTINC2
+	movff	decodata+0,lo		
+	incf	lo,F				
+	bsf		leftbind
+	output_99
+	movlw	':'
+	movwf	POSTINC2
+	
+	call	menu_gassetup_grey_inactive			; Sets Greyvalue for inactive gases
+	call	word_processor
+	WIN_LEFT	.40
+	movf	waitms_temp,W		; Load row into WREG
+	movff	WREG,win_top
+	lfsr	FSR2,letter
+
+	movlw	d'33'
+	movwf	EEADR
+	call	read_eeprom			; Get current startgas 1-5 # into EEDATA
+	decf	EEDATA,W			; 0-4
+	cpfseq	decodata+0			; =current displayed gas #?
+	bra		menu_gassetup_Tx	; no, do not display *
+	movlw	'*'					; display *
+	movwf	POSTINC2	
+
+; New v1.44se
+menu_gassetup_Tx:
+	call	menu_gassetup_grey_inactive			; Sets Greyvalue for inactive gases	
+	call	word_processor
+
+	WIN_LEFT	.48
+	movf	waitms_temp,W		; Load row into WREG
+	movff	WREG,win_top
+	lfsr	FSR2,letter
+
+	movff	wait_temp, EEADR	; Gas %He - Set address in internal EEPROM
+	incf	EEADR,F				; Gas %He - Set address in internal EEPROM
+	call	read_eeprom			; Read He value from EEPROM
+	movff	EEDATA,lo			; Move EEDATA -> lo
+	movf	lo,f				; Move lo -> f
+	movlw	d'0'				; Move 0 -> WREG
+	cpfsgt	lo					; He > 0?
+	bra 	menu_gassetup_Nx	; NO check o2
+
+	; YES Write TX 15/55
+	call 	gassetup_write_Tx
+	movff	wait_temp, EEADR	; Gas %O2 - Set address in internal EEPROM
+	call	read_eeprom			; O2 value
+	movff	EEDATA,lo
+	output_8
+	movlw	'/'
+	movwf	POSTINC2
+	incf	EEADR,F				; Gas #hi: %He - Set address in internal EEPROM
+	call	read_eeprom			; He value
+	movff	EEDATA,lo
+	output_8
+	bra 	menu_gassetup_list0
+
+; New v1.44se
+menu_gassetup_Nx:
+	movff	wait_temp, EEADR	; Gas %O2 - Set address in internal EEPROM
+	call	read_eeprom			; Read O2 value from EEPROM
+	movff	EEDATA,lo			; Move EEDATA -> lo
+	movf	lo,f				; Move lo -> f
+	movlw	d'21'				; Move 21 -> WREG
+	cpfsgt	lo					; o2 > 21%
+	bra 	menu_gassetup_Air	; NO AIR
+	movlw	d'100'				; Move 100 -> WREG
+	cpfslt	lo					; o2 < 100%
+	bra		menu_gassetup_O2	; NO write O2
+	
+	; YES Write NX 32
+	call	gassetup_write_Nx
+	output_8
+	bra 	menu_gassetup_list0
+
+; New v1.44se
+menu_gassetup_O2:
+	movlw	'O'
+	movwf	POSTINC2
+	movlw	'2'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	output_8
+	bra 	menu_gassetup_list0
+
+; New v1.44se
+menu_gassetup_Air:
+	cpfseq	lo					; o2 = 21%
+	call menu_gassetup_Err
+
+	movlw	'A'
+	movwf	POSTINC2
+	movlw	'I'
+	movwf	POSTINC2
+	movlw	'R'
+	movwf	POSTINC2
+	movlw	' '		
+	movwf	POSTINC2
+	output_8
+	bra 	menu_gassetup_list0
+
+; New v1.44se
+menu_gassetup_Err:
+	movlw	'E'
+	movwf	POSTINC2
+	movlw	'R'
+	movwf	POSTINC2
+	movlw	'R'
+	movwf	POSTINC2
+	movlw	' '		
+	movwf	POSTINC2
+	output_8
+
+; Changed v1.44se
+menu_gassetup_list0:
+	call	menu_gassetup_grey_inactive			; Sets Greyvalue for inactive gases
+	call	word_processor
+
+	WIN_LEFT	.105
+	movf	waitms_temp,W		; Load row into WREG
+	movff	WREG,win_top
+	lfsr	FSR2,letter
+
+	movlw	' '
+	movwf	POSTINC2
+	movlw	'i'
+	movwf	POSTINC2
+	movlw	'n'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movf	decodata+0,W		; read current value 
+	addlw	d'28'				; offset in memory
+	movwf	EEADR
+	call	read_eeprom			; Low-value
+	movff	EEDATA,lo
+	output_8
+	movlw	'm'
+	movwf	POSTINC2
+	call	menu_gassetup_grey_inactive			; Sets Greyvalue for inactive gases
+	call	word_processor	
+
+	WIN_COLOR	color_white	
+	
+	incf	decodata+0,F
+	movlw	d'5'	
+	cpfseq	decodata+0
+	goto	menu_gassetup_list
+
+	DISPLAYTEXT	.11			; Exit
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+	call	PLED_menu_cursor
+
+gassetup_list_loop:
+	call	check_switches_logbook
+
+	btfsc	menubit3
+	bra		gassetup_list2		; move cursor
+
+	btfsc	menubit2
+	bra		do_gassetup_list; call gas-specific submenu
+
+	btfsc	divemode
+	goto	restart			; dive started!
+
+	btfsc	onesecupdate
+	call	timeout_surfmode
+
+	btfsc	onesecupdate
+	call	set_dive_modes
+
+	bcf		onesecupdate	; 1 sec. functions done
+
+	btfsc	sleepmode
+	bra		exit_gassetup_list
+
+	bra		gassetup_list_loop
+
+gassetup_list2:
+	incf	menupos,F
+	movlw	d'7'
+	cpfseq	menupos			; =7?
+	bra		gassetup_list3	; No
+	movlw	d'1'
+	movwf	menupos
+
+gassetup_list3:
+	clrf	timeout_counter2
+	call	PLED_menu_cursor
+
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+
+	bcf		menubit3		; clear flag
+	bra		gassetup_list_loop
+
+exit_gassetup_list:			; exit...
+	movlw	d'2'
+	movwf	menupos
+	goto	menu2
+
+do_gassetup_list:
+	dcfsnz	menupos,F
+	bra		gassetup_list_edit_gas1
+	dcfsnz	menupos,F
+	bra		gassetup_list_edit_gas2
+	dcfsnz	menupos,F
+	bra		gassetup_list_edit_gas3
+	dcfsnz	menupos,F
+	bra		gassetup_list_edit_gas4
+	dcfsnz	menupos,F
+	bra		gassetup_list_edit_gas5
+	bra		exit_gassetup_list			; Exit List
+
+gassetup_list_edit_gas1:
+	movlw	d'0'
+	movwf	decodata+0
+	movlw	d'0'
+	movwf	divemins+0
+	bra		menu_gassetup_page1
+
+gassetup_list_edit_gas2:
+	movlw	d'1'
+	movwf	decodata+0
+	movlw	d'4'
+	movwf	divemins+0
+	bra		menu_gassetup_page1
+
+gassetup_list_edit_gas3:
+	movlw	d'2'
+	movwf	decodata+0
+	movlw	d'8'
+	movwf	divemins+0
+	bra		menu_gassetup_page1
+
+gassetup_list_edit_gas4:
+	movlw	d'3'
+	movwf	decodata+0
+	movlw	d'12'
+	movwf	divemins+0
+	bra		menu_gassetup_page1
+
+gassetup_list_edit_gas5:
+	movlw	d'4'
+	movwf	decodata+0
+	movlw	d'16'
+	movwf	divemins+0
+	bra		menu_gassetup_page1
+
+menu_gassetup_page1:
+	movlw	d'1'
+	movwf	menupos
+	bcf		gas_setup_page2			; Page 1 of gassetup
+	bcf		menubit4
+	bcf		cursor
+	bcf		sleepmode
+	bcf		first_FA				; Here: =1: -, =0: +
+
+menu_gassetup0:
+	call	PLED_ClearScreen
+	DISPLAYTEXT	.30			; More...
+	DISPLAYTEXT	.11			; Exit
+
+menu_gassetup1:
+	clrf	timeout_counter2
+	bcf		menubit2
+	bcf		menubit3
+
+	rcall	gassetup_title_bar2			; Displays the title bar with the current Gas info
+
+	WIN_TOP		.65
+	WIN_LEFT	.20
+	lfsr	FSR2,letter
+	movlw	'O'
+	movwf	POSTINC2
+	movlw	'2'
+	movwf	POSTINC2
+	movlw	':'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+
+	movf	divemins+0,W
+	addlw	0x06
+	movwf	EEADR
+	call	read_eeprom		; O2 value
+	movff	EEDATA,lo
+	output_8
+	movlw	'%'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	'('
+	movwf	POSTINC2
+	movlw	'M'
+	movwf	POSTINC2
+	movlw	'O'
+	movwf	POSTINC2
+	movlw	'D'
+	movwf	POSTINC2
+	movlw	':'
+	movwf	POSTINC2
+
+; Show MOD in m
+	GETCUSTOM8 .18				; ppO2 warnvalue in WREG
+	mullw	d'10'
+	movff	PRODL,xA+0
+	movff	PRODH,xA+1			; ppO2 in [0.01Bar] * 10
+
+	movf	divemins+0,W
+	addlw	0x06
+	movwf	EEADR
+	call	read_eeprom			; O2 value
+	movff	EEDATA,xB+0
+	clrf	xB+1
+	call	div16x16			;xA/xB=xC with xA as remainder
+	movlw	d'10'
+	subwf	xC+0,F				; Subtract 10m...
+	movff	xC+0,lo
+	movlw	d'0'
+	subwfb	xC+1,F
+	movff	xC+1,hi
+	output_16
+	movlw	'm'
+	movwf	POSTINC2
+	movlw	')'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	call	word_processor	
+
+	WIN_TOP		.95
+	lfsr	FSR2,letter
+	movlw	'H'
+	movwf	POSTINC2
+	movlw	'e'
+	movwf	POSTINC2
+	movlw	':'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movf	divemins+0,W
+	addlw	0x07
+	movwf	EEADR
+	call	read_eeprom		; He value
+	movff	EEDATA,lo
+	output_8
+	movlw	'%'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	call	word_processor		
+
+	WIN_TOP		.125
+	lfsr	FSR2,letter
+	movlw	'+'
+	movwf	POSTINC2
+	movlw	'/'
+	movwf	POSTINC2
+	movlw	'-'
+	movwf	POSTINC2
+	movlw	':'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	'+'
+	btfsc	first_FA
+	movlw	'-'
+	movwf	POSTINC2
+	call	word_processor	
+
+	WIN_TOP		.155
+	lfsr	FSR2,letter
+	OUTPUTTEXT	.89			; Default: 
+	movf	divemins+0,W
+	addlw	0x04
+	movwf	EEADR
+	call	read_eeprom		; Default O2 value
+	movff	EEDATA,lo
+	output_8
+	movlw	'/'
+	movwf	POSTINC2
+	movf	divemins+0,W
+	addlw	0x05
+	movwf	EEADR
+	call	read_eeprom		; Default He value
+	movff	EEDATA,lo
+	output_8
+	movlw	' '
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	call	word_processor		
+
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+	call	PLED_menu_cursor
+
+gassetup_loop:
+	call	check_switches_logbook
+
+	btfsc	menubit3
+	bra		gassetup2	; move cursor
+
+	btfsc	menubit2
+	bra		do_gassetup		; call submenu
+
+	btfsc	divemode
+	goto	restart			; dive started!
+
+	btfsc	onesecupdate
+	call	timeout_surfmode
+
+	btfsc	onesecupdate
+	call	set_dive_modes
+
+	bcf		onesecupdate	; 1 sec. functions done
+
+	btfsc	sleepmode
+	bra		exit_gassetup
+
+	bra	gassetup_loop
+
+gassetup2:
+	incf	menupos,F
+	movlw	d'7'
+	cpfseq	menupos			; =7?
+	bra		gassetup3	; No
+	movlw	d'1'
+	movwf	menupos
+
+gassetup3:
+
+	clrf	timeout_counter2
+	call	PLED_menu_cursor
+
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+
+	bcf		menubit3		; clear flag
+	bra		gassetup_loop
+
+do_gassetup:
+	dcfsnz	menupos,F
+	bra		next_gas_page
+	dcfsnz	menupos,F
+	bra		adjust_o2
+	dcfsnz	menupos,F
+	bra		adjust_he
+	dcfsnz	menupos,F
+	bra		toggle_plus_minus_gassetup
+	dcfsnz	menupos,F
+	bra		restore_gas
+exit_gassetup:			; exit...
+	movff	decodata+0,menupos
+	incf	menupos,F
+	bra		menu_gassetup_prelist
+
+toggle_plus_minus_gassetup:
+	btg		first_FA
+	movlw	d'4'
+	movwf	menupos
+	bra		menu_gassetup1	; return
+
+next_gas:
+	movlw	d'1'
+	movwf	menupos
+	bra		menu_gassetup0		; incl. clear screen
+
+adjust_o2:
+	movf	divemins+0,W			; read current value 
+	addlw	0x06
+	movwf	EEADR
+	call	read_eeprom		; Low-value
+	movff	EEDATA,lo
+
+	btfsc	first_FA				; Minus?
+	bra		adjust_o2_1			; yes, minus!
+	
+	incf	lo,F			; increase O2
+	movlw	d'101'
+	cpfseq	lo
+	bra		adjust_o2_2
+	movlw	d'4'			; LOWER O2 Limit
+	movwf	lo
+	bra		adjust_o2_2
+
+adjust_o2_1:
+	decf	lo,F			; decrease O2
+	movlw	d'3'
+	cpfseq	lo
+	bra		adjust_o2_2
+
+	movf	divemins+0,W
+	addlw	0x07
+	movwf	EEADR
+	call	read_eeprom		; read He value
+
+	movlw	d'100'
+	movwf	lo
+	movf	EEDATA,W		; He value
+	subwf	lo,F			; lo=100% - He%
+
+adjust_o2_2:				; test if O2+He>100...
+	movf	divemins+0,W
+	addlw	0x07
+	movwf	EEADR
+	call	read_eeprom		; read He value
+	movf	EEDATA,W		; He value
+	addwf	lo,W			; add O2 value
+	movwf	hi				; store in temp
+	movlw	d'101'
+	cpfseq	hi				; O2 and He > 100?
+	bra		adjust_o2_3		; No!
+
+	movlw	d'4'			; LOWER O2 Limit
+	movwf	lo
+	
+adjust_o2_3:
+	movf	divemins+0,W			; save current value
+	addlw	0x06
+	movwf	EEADR
+	movff	lo,EEDATA
+	call	write_eeprom		; Low-value
+
+	movlw	d'2'
+	movwf	menupos
+	bra		menu_gassetup1	
+
+adjust_he:
+	movf	divemins+0,W			; read current value
+	addlw	0x07
+	movwf	EEADR
+	call	read_eeprom		; Low-value
+	movff	EEDATA,lo
+
+	btfsc	first_FA			; Minus?
+	bra		adjust_he_1			; yes, minus!
+	
+	incf	lo,F
+	movlw	d'92'			; He limited to (useless) 90%
+	cpfseq	lo
+	bra		adjust_he_2
+	clrf	lo
+	bra		adjust_he_2
+
+adjust_he_1:
+	decf	lo,F			; decrease He
+	movlw	d'255'
+	cpfseq	lo
+	bra		adjust_he_2
+	clrf	lo
+
+adjust_he_2:				; test if O2+He>100...
+	movf	divemins+0,W
+	addlw	0x06
+	movwf	EEADR
+	call	read_eeprom		; read He value
+	movf	EEDATA,W		; He value
+	addwf	lo,W			; add O2 value
+	movwf	hi				; store in temp
+	movlw	d'101'
+	cpfseq	hi				; O2 and He > 100?
+	bra		adjust_he_3		; No!
+;	clrf	lo				; Yes, clear He to zero
+	decf	lo,F			; reduce He again = unchanged after operation
+
+adjust_he_3:
+	movf	divemins+0,W			; save current value
+	addlw	0x07
+	movwf	EEADR
+	movff	lo,EEDATA
+	call	write_eeprom		; Low-value
+
+	movlw	d'3'
+	movwf	menupos
+	bra		menu_gassetup1	; 
+
+restore_gas:
+	movf	divemins+0,W			; read Default value 
+	addlw	0x04
+	movwf	EEADR
+	call	read_eeprom		; Low-value
+	movff	EEDATA,lo
+	movf	divemins+0,W
+	addlw	0x05
+	movwf	EEADR
+	call	read_eeprom		; High-value
+	movff	EEDATA,hi
+
+	movf	divemins+0,W			; save Default value
+	addlw	0x06
+	movwf	EEADR
+	movff	lo,EEDATA
+	call	write_eeprom		; Low-value
+	movf	divemins+0,W
+	addlw	0x07
+	movwf	EEADR
+	movff	hi,EEDATA
+	call	write_eeprom		; High-value
+
+	movlw	d'5'
+	movwf	menupos
+	bra		menu_gassetup1	; 
+
+
+next_gas_page:
+	call	PLED_ClearScreen		
+	movlw	d'1'
+	movwf	menupos
+	DISPLAYTEXT	.109		; Back
+
+	DISPLAYTEXT	.11			; Exit
+
+next_gas_page1:
+	clrf	timeout_counter2
+	bcf		menubit2
+	bcf		menubit3
+
+	rcall	gassetup_title_bar2			; Displays the title bar with the current Gas info
+	rcall	gassetup_show_ppO2			; Display the ppO2 of the change depth with the current gas
+
+	WIN_TOP		.65
+	WIN_LEFT	.20
+	lfsr	FSR2,letter
+	OUTPUTTEXT	.105			; "Active Gas? "
+	read_int_eeprom		d'27'	; read flag register
+
+	; hi contains active gas flags in BIT0:4 ....
+
+	movff	decodata+0,lo	; Gas 0-4
+	incf	lo,F			; Gas 1-5
+
+active_gas_display:
+	rrcf	EEDATA			; roll flags into carry
+	decfsz	lo,F			; max. 5 times...
+	bra		active_gas_display
+	
+	btfss	STATUS,C		; test carry
+	bra		active_gas_display_no
+	
+	OUTPUTTEXT	.96			; Yes 
+	bra		active_gas_display_end
+	
+active_gas_display_no:
+	movlw	' '					; three spaces instead of "Yes"
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+
+active_gas_display_end:	
+	call	word_processor	
+
+	WIN_TOP		.95
+	WIN_LEFT	.20
+	lfsr	FSR2,letter
+	OUTPUTTEXT	.88			; First Gas?
+	movlw	' '
+	movwf	POSTINC2
+
+	movlw	d'33'
+	movwf	EEADR
+	call	read_eeprom		; Get current startgas 1-5 # into EEDATA
+	decf	EEDATA,W		; 0-4
+	cpfseq	decodata+0		; =current displayed gas #?
+	bra		menu_firstgas0	; no, display three spaces
+
+	OUTPUTTEXT	.96			; Yes 
+	bra		menu_firstgas1
+
+menu_firstgas0:
+	movlw	' '
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+
+menu_firstgas1:
+	call	word_processor			
+
+	WIN_TOP		.125
+	WIN_LEFT	.20
+	lfsr	FSR2,letter
+	OUTPUTTEXT	.107		; Change+
+	call	word_processor		
+
+	WIN_TOP		.155
+	WIN_LEFT	.20
+	lfsr	FSR2,letter
+	OUTPUTTEXT	.108		; Change-
+	call	word_processor		
+
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+	call	PLED_menu_cursor
+
+next_gas_page_loop:
+	call	check_switches_logbook
+
+	btfsc	menubit3
+	bra		next_gas_page2	; move cursor
+
+	btfsc	menubit2
+	bra		do_next_gas_page		; call submenu
+
+	btfsc	divemode
+	goto	restart			; dive started!
+
+	btfsc	onesecupdate
+	call	timeout_surfmode
+
+	btfsc	onesecupdate
+	call	set_dive_modes
+
+	bcf		onesecupdate	; 1 sec. functions done
+
+	btfsc	sleepmode
+	bra		exit_gassetup
+
+	bra		next_gas_page_loop
+
+next_gas_page2:
+	incf	menupos,F
+
+	movlw	d'7'
+	cpfseq	menupos			; =7?
+	bra		next_gas_page3	; No
+	movlw	d'1'
+	movwf	menupos
+
+next_gas_page3:
+	clrf	timeout_counter2
+	call	PLED_menu_cursor
+	
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+
+	bcf		menubit3		; clear flag
+	bra		next_gas_page_loop
+
+do_next_gas_page:
+	dcfsnz	menupos,F
+	bra		next_gas
+	dcfsnz	menupos,F
+	bra		toggle_active_gas
+	dcfsnz	menupos,F
+	bra		make_first_gas
+	dcfsnz	menupos,F
+	bra		change_gas_depth_plus
+	dcfsnz	menupos,F
+	bra		change_gas_depth_minus
+	bra		exit_gassetup			; Exit menu
+
+make_first_gas:
+	movff	decodata+0,EEDATA		; current gas (0-4) into EEDATA
+	incf	EEDATA,F				; current gas (1-5) into EEDATA
+	movlw	d'33'
+	movwf	EEADR
+	call	write_eeprom			; store in internal EEPROM
+	movlw	d'3'
+	movwf	menupos
+	bra		next_gas_page1
+
+toggle_active_gas:
+	read_int_eeprom		d'27'		; read flag register
+	movff	decodata+0,lo			; selected gas 0-4
+	incf	lo,F
+	dcfsnz	lo,F
+	btg		EEDATA,0
+	dcfsnz	lo,F
+	btg		EEDATA,1
+	dcfsnz	lo,F
+	btg		EEDATA,2
+	dcfsnz	lo,F
+	btg		EEDATA,3
+	dcfsnz	lo,F
+	btg		EEDATA,4
+	write_int_eeprom	d'27'		; write flag register
+	movlw	d'2'
+	movwf	menupos
+	bra		next_gas_page1
+	
+change_gas_depth_plus:
+	movf	decodata+0,W		; read current value 
+	addlw	d'28'				; offset in memory
+	movwf	EEADR
+	call	read_eeprom			; Low-value
+	movff	EEDATA,lo
+	
+	incf	lo,F				; increase depth
+	movlw	d'100'				; Change depth limit + 1
+	cpfseq	lo
+	bra		change_gas_depth_plus2
+	movlw	d'99'				; Change depth limit
+	movwf	lo
+change_gas_depth_plus2:
+	movff	lo,EEDATA			; write result
+	call	write_eeprom		; save result in EEPROM
+
+	movlw	d'4'
+	movwf	menupos
+	bra		next_gas_page1
+
+
+change_gas_depth_minus:
+	movf	decodata+0,W		; read current value 
+	addlw	d'28'				; offset in memory
+	movwf	EEADR
+	call	read_eeprom			; Low-value
+	movff	EEDATA,lo
+	
+	decf	lo,F				; decrease depth
+	movlw	d'255'
+	cpfseq	lo
+	bra		change_gas_depth_minus2
+	movlw	d'0'
+	movwf	lo
+
+change_gas_depth_minus2:
+	movff	lo,EEDATA			; write result
+	call	write_eeprom		; save result in EEPROM
+
+	movlw	d'5'
+	movwf	menupos
+	bra		next_gas_page1
+
+; Changed v1.44se
+gassetup_title_bar2:
+	call	PLED_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor	
+	WIN_TOP		.2
+	WIN_LEFT	.0
+	lfsr	FSR2,letter
+	OUTPUTTEXT	.95				; Gas# 
+	movff	decodata+0,lo		
+	incf	lo,F				
+	bsf		leftbind
+	output_99
+	movlw	':'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	call	word_processor
+	
+	WIN_TOP		.2
+	WIN_LEFT	.50
+	lfsr	FSR2,letter
+
+	;He check
+	movf	divemins+0,W
+	addlw	0x07
+	movwf	EEADR
+	call	read_eeprom			; He value
+	movff	EEDATA,lo			; Move EEData -> lo
+	movf	lo,f				; Move lo -> f
+	movlw	d'0'				; Move 0 -> WREG
+	cpfsgt	lo					; He > 0?
+	bra 	gassetup_title_bar3	; NO check o2
+	
+	; YES Write TX 15/55
+	call 	gassetup_write_Tx	; Write TX
+	movf	divemins+0,W
+	addlw	0x06
+	movwf	EEADR
+	call	read_eeprom			; O2 value
+	movff	EEDATA,lo
+	output_8					; Write O2
+	movlw	'/'
+	movwf	POSTINC2
+	movf	divemins+0,W
+	addlw	0x07
+	movwf	EEADR
+	call	read_eeprom			; He value
+	movff	EEDATA,lo
+	output_8					; Write He
+	bra		gassetup_title_bar7
+
+; New v1.44se
+gassetup_title_bar3:			; O2 Check		
+	movf	divemins+0,W
+	addlw	0x06
+	movwf	EEADR
+	call	read_eeprom			; O2 value
+	movff	EEDATA,lo	
+	movf	lo,f				; Move lo -> f
+	movlw	d'21'				; Move 21 -> WREG
+	cpfseq	lo					; o2 = 21
+	cpfsgt	lo					; o2 > 21%
+	bra 	gassetup_title_bar5	; NO AIR
+	movlw	d'100'				; Move 100 -> WREG
+	cpfslt	lo					; o2 < 100%
+	bra		gassetup_title_bar4	; NO write O2
+
+	; YES Write NX 32
+	call	gassetup_write_Nx 	
+	output_8
+	bra 	gassetup_title_bar7
+
+; New v1.44se
+gassetup_title_bar4:
+	movlw	'O'
+	movwf	POSTINC2
+	movlw	'2'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	output_8
+	bra 	gassetup_title_bar7
+
+; New v1.44se
+gassetup_title_bar5:
+	cpfseq	lo					; o2 = 21%
+	bra 	gassetup_title_bar6
+
+	movlw	'A'
+	movwf	POSTINC2
+	movlw	'I'
+	movwf	POSTINC2
+	movlw	'R'
+	movwf	POSTINC2
+	movlw	' '		
+	movwf	POSTINC2
+	output_8
+	bra 	gassetup_title_bar7
+
+; New v1.44se
+gassetup_title_bar6:		; ERROR
+	movlw	'E'
+	movwf	POSTINC2
+	movlw	'R'
+	movwf	POSTINC2
+	movlw	'R'
+	movwf	POSTINC2
+	movlw	' '		
+	movwf	POSTINC2
+	output_8
+	bra 	gassetup_title_bar7
+
+gassetup_title_bar7:
+	movlw	' '
+	movwf	POSTINC2
+	movlw	'i'
+	movwf	POSTINC2
+	movlw	'n'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movf	decodata+0,W		; read current value 
+	addlw	d'28'				; offset in memory
+	movwf	EEADR
+	call	read_eeprom			; Low-value
+	movff	EEDATA,lo
+	output_8
+	movlw	'm'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+
+	call	word_processor	
+	WIN_INVERT	.0	; Init new Wordprocessor	
+	return
+
+; New v1.44se
+gassetup_write_Nx:
+	movlw	'N'
+	movwf	POSTINC2
+	movlw	'X'
+	movwf	POSTINC2
+	movlw	' '					
+	movwf	POSTINC2	
+	return
+
+; New v1.44se
+gassetup_write_Tx:
+	movlw	'T'
+	movwf	POSTINC2
+	movlw	'X'
+	movwf	POSTINC2
+	movlw	' '					
+	movwf	POSTINC2
+	return
+
+; New v1.44se
+menu_gassetup_grey_inactive:
+; Set Greyvalue to lower value when gas is inactive
+	read_int_eeprom		d'27'	; read flag register
+	movff	decodata+0,lo		; copy gas number 0-4
+	incf	lo,F				; 1-5
+menu_gassetup_list1:
+	rrcf	EEDATA			; roll flags into carry
+	decfsz	lo,F			; max. 5 times...
+	bra		menu_gassetup_list1
+	movlw	color_white	
+	btfss	STATUS,C		; test carry
+	movlw	color_grey
+	call	PLED_set_color	; grey out inactive gases!
+	return
+	
+gassetup_show_ppO2:
+	movf	divemins+0,W
+	addlw	0x06
+	movwf	EEADR
+	call	read_eeprom			; O2 value
+	movff	EEDATA,hi
+
+	movf	decodata+0,W		; read current value 
+	addlw	d'28'				; offset in memory
+	movwf	EEADR
+	call	read_eeprom			; Change depth in m
+	movff	EEDATA,lo
+	movlw	d'10'
+	addwf	lo,F				; Depth+10m=lo
+	movf	hi,W
+	mulwf	lo					; (Depth+10m)*O2
+	movff	PRODL,xA+0
+	movff	PRODH,xA+1
+	movlw	d'10'
+	movwf	xB+0
+	clrf	xB+1
+	call	div16x16			;xA/xB=xC with xA as remainder 	
+	movff	xC+0,lo				; ((Depth+10m)*O2)/10 = [0.01Bar] ppO2
+	movff	xC+1,hi
+
+	WIN_LEFT	.55
+	WIN_TOP		.35
+	lfsr	FSR2,letter
+	movlw	'('
+	movwf	POSTINC2
+	movlw	'p'
+	movwf	POSTINC2
+	movlw	'p'
+	movwf	POSTINC2
+	movlw	'O'
+	movwf	POSTINC2
+	movlw	'2'
+	movwf	POSTINC2
+	movlw	':'
+	movwf	POSTINC2
+	output_16dp	d'3'
+	movlw	'B'
+	movwf	POSTINC2
+	movlw	'a'
+	movwf	POSTINC2
+	movlw	'r'
+	movwf	POSTINC2
+	movlw	')'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	call	word_processor
+	return
\ No newline at end of file