diff src/start.asm @ 634:4050675965ea

3.10 stable release
author heinrichsweikamp
date Tue, 28 Apr 2020 17:34:31 +0200
parents 690c48db7b5b
children 8c1f1f334275
line wrap: on
line diff
--- a/src/start.asm	Thu Mar 05 15:06:14 2020 +0100
+++ b/src/start.asm	Tue Apr 28 17:34:31 2020 +0200
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File start.asm                            combined next generation V3.09.1 fix
+;   File start.asm                          * combined next generation V3.09.5
 ;
 ;   Startup subroutines
 ;
@@ -36,7 +36,7 @@
 	extern	option_check_and_store
 	extern	option_reset
 	extern	rtc_init
-	extern	do_new_battery_select
+	extern	new_battery_select
 	extern	get_battery_data
 	extern	use_old_prior_209
 	extern	get_first_gas_to_WREG
@@ -59,29 +59,49 @@
  IFDEF _rx_update
 	extern	rx_firmware_new_major
 	extern	rx_firmware_new_minor
+	extern	dyn_show_firmware_rx
  ENDIF
 
-;-----------------------------------------------------------------------------
-
 
 ;=============================================================================
-; Reset Vector: entry point on device wake-up and hard reset
+; Reset Vector: Entry Point on Device Wake-up and hard Reset
 ;
 reset_v		CODE 0x00000
 	goto	0x1FF00							; jump to bootloader
 
 start_v		CODE 0x00004					; jump to application (cold-)start
 	goto	start
-
+;
 ;=============================================================================
 
-boot	CODE
 
 ;=============================================================================
-; Entry point after cold start
+; Firmware Identification
+;
+fingerprint	CODE 0x0000A
+	db	fw_version_major,		fw_version_minor		; major,         minor
+	db	fw_version_beta,		FW_ID					; beta/release,  firmware ID
+	db	firmware_creation_year,	firmware_creation_month	; creation year, month
+	db	firmware_creation_day,	FW_CONF 				; creation day,  firmware configuration
+	db	0x00,					0x00					; reserved for future use
+	db	0x00,					0x00					; reserved for future use
+	db	0x00,					0x00					; reserved for future use
+;
+;=============================================================================
+
+
+;=============================================================================
+boot1	CODE
+;=============================================================================
+
+
+;-----------------------------------------------------------------------------
+;
+; Entry Point after cold Start
 ;
 	global	start
 start:
+
 	; clear RAM banks 0-14
 	lfsr	FSR0,0x000						; load start address into FSR0
 	movlw	0x0F							; load end   address into WREG (actually its high byte)
@@ -90,19 +110,19 @@
 	cpfseq	FSR0H							; has FSR0 reached begin of bank 15, i.e. banks 0-14 done?
 	bra		start_clear_rambank				; NO - loop
 
-	; initialize hardware (ports, timers, interrupts, etc.)
+	; initialize averaging for analog buttons before IRQ gets enabled
+	movlw	.16								; set averaging span
+	movff	WREG,analog_counter				; write to counter (in bank isr_backup)
+
+	; initialize hardware (ports, timers) and start interrupts
 	call	init_ostc						; also selects bank common and sets CPU to normal speed
 
 	; flag that later restart origins from a cold start
 	bsf		cold_start
 
-	; initialize averaging for analog buttons
-	movlw	.16								; set averaging span
-	movff	WREG,analog_counter				; write to counter (in bank isr_backup)
-
 	; get button type from bootloader info
 	bsf		analog_switches					; assume analog buttons by default
-	movlw	0x7C							; address bootloader at 0x01F77C
+	movlw	0x7C							; set up read from 0x01F77C
 	movwf	TBLPTRL							; ...
 	movlw	0xF7							; ...
 	movwf	TBLPTRH							; ...
@@ -114,10 +134,14 @@
 	bcf		analog_switches					; NO - no analog buttons
 
 	; get screen type (2) from bootloader info
-	bsf		screen_type2
-	bsf		screen_type3
-	movlw	0x80
-	movwf	TBLPTRL							; only low byte adjustment needed, high and upper are still at 0x01F7xx
+	bsf		screen_type2					; set flags for later clear of the false one
+	bsf		screen_type3					; ...
+	movlw	0x80							; set up read from 0x01F780
+	movwf	TBLPTRL							; ...
+	;movlw	0xF7							; high and upper are still at 0x01F7xx
+	;movwf	TBLPTRH							; ...
+	;movlw	0x01							; ...
+	;movwf	TBLPTRU							; ...
 	TBLRD*+									; read configuration byte
 	movlw	0x83							; coding for screen type 2
 	cpfseq	TABLAT							; equal?
@@ -131,27 +155,21 @@
 
 	; initialize pressure sensor calibration
 	call	get_calibration_data			; get calibration data from pressure sensor
+
 	call	TFT_DisplayOff					; turn off display
-
-	; wait for calibration data to take effect
 	bsf		LEDr							; turn on red LED
 
-	; first pass, will not have valid temperature yet
-	call	wait_1s
-	call	wait_1s
-
-	; second pass - complete sensor initialization
-	call	wait_1s
-	call	wait_1s
+	; wait for valid temperature and pressure
+	WAITS	.3								; wait 3 seconds
 
 	; sensor calibration completed, first valid pressure value is available
-	bcf		LEDr							; turn off red LED again
+	bcf		LEDr							; turn off red LED
 
-	; load surface pressure into ISR
-	; initially needs to be done twice in order to shift the current absolute pressure through the
-	; 15 minutes sampling buffer into the reference buffer from where it is loaded by the ISR
-	rcall	sample_surface_pressure			; 1st pass
-	rcall	sample_surface_pressure			; 2nd pass
+	; initial loading of the surface pressure into the ISR
+	; needs to be done twice in order to shift the current absolute pressure through
+	; the sampling buffer into the reference buffer from where it is loaded by the ISR
+	call	sample_surface_pressure			; 1st pass
+	call	sample_surface_pressure			; 2nd pass
 
 	; wait until initial surface pressure value has been loaded into the ISR
 	btfsc	update_surface_pressure			; has the ISR confirmed loading of the surface pressure?
@@ -222,18 +240,18 @@
 	;bz		start_check_new_firmware_old	; YES - same  firmware as  before
 
 start_check_new_firmware_old:
-	call	show_fw_mesg_kept				; show firmware is kept message
+	call	TFT_message_fw_kept				; show firmware is kept message
 	bra		start_check_new_firmware_common	; continue with common part
 
 start_check_new_firmware_new:
-	call	show_fw_mesg_update				; show firmware update message
+	call	TFT_message_fw_update			; show firmware is updated message
 
-	; reset the pressure sensor correction to factory default
-	lfsr	FSR0,oPressureAdjust			; address pressure sensor correction
-	call	option_reset					; set correction to default
-
-	lfsr	FSR0,oPressureAdjust			; address pressure sensor correction
-	call	option_check_and_store			; update correction in EEPROM
+;	; reset the pressure sensor correction to factory default
+;	lfsr	FSR0,oPressureAdjust			; address pressure sensor correction
+;	call	option_reset					; set correction to default
+;
+;	lfsr	FSR0,oPressureAdjust			; address pressure sensor correction
+;	call	option_check_and_store			; update correction in EEPROM
 
 start_check_new_firmware_common:
 	call	TFT_Display_FadeIn				; display resulting screen
@@ -241,23 +259,61 @@
 	call	backup_flash_page				; back-up the first 128 bytes from program flash memory to EEPROM
 	call	option_restore_and_check_all	; restore all option values from EEPROM and check them
 
-	; pause 5 seconds
-	movlw	.5								; load loop counter
-start_check_new_firmware_wait:
-	call	wait_1s							; wait <= 1 second
-	decfsz	WREG,W							; decrement loop counter, did it became zero?
-	bra		start_check_new_firmware_wait	; NO  - loop
-	;bra	restart							; YES - proceed with restart
+	WAITS	.5								; wait 5 second
+
+	goto	restart							; proceed with restart
 
 
 ;=============================================================================
-; Entry point after warm start
+boot2	CODE
+;=============================================================================
+
+
+;-----------------------------------------------------------------------------
+; Sample and store the current Surface Pressure
+; Update ISR and Deco Engine with Pressure sampled on last Invocation
+;
+	global	sample_surface_pressure
+sample_surface_pressure:
+	; make sure the ISR does not read the surface pressure reference buffer while it is updated
+	bcf		update_surface_pressure			; cancel any pending load request
+
+	; propagate the surface pressure sampled on last invocation to the reference pressure buffer
+	MOVII	pressure_abs_sampled,pressure_abs_ref
+
+	; update surface pressure in the ISR
+	bsf		update_surface_pressure			; request ISR to update its surface pressure
+
+	; update surface pressure in the deco engine
+	MOVII	pressure_abs_ref,int_I_pres_surface
+
+	; sample current absolute pressure (ISR-safe 2 byte copy)
+	SMOVII	pressure_abs,pressure_abs_sampled
+
+	; limit sampled pressure to max allowed surface pressure
+	MOVLI	max_surfpressure,    sub_a		; load upper limit    into sub_a
+	MOVII	pressure_abs_sampled,sub_b		; copy sampled pressure to sub_b
+	call	cmpU16							; sub_a - sub_b = max_surfpressure - pressure_abs_sampled
+	btfss	neg_flag						; sampled pressure > max_surfpressure ?
+	return									; NO  - below limit, done
+	MOVII	sub_a,pressure_abs_sampled		; YES - limit to max_surfpressure (still stored in sub_a)
+	return									;     - done
+
+
+;=============================================================================
+boot3	CODE
+;=============================================================================
+
+
+;-----------------------------------------------------------------------------
+; Entry Point for warm Start
 ;
 ; called on leaving sleep mode, surface menu, communication mode, and
-; when a start of a dive is detected in all modes except surface mode.
+; when a start of a dive is detected in all modes except surface mode
 ;
 	global	restart
 restart:
+
 	; for safety purpose only
 	banksel	common							; select bank common
 	clrf	STKPTR							; clear return addresses stack
@@ -271,7 +327,7 @@
 	; clear flag groups
 	clrf	HW_descriptor					; hardware - OSTC model descriptor
 	clrf	HW_flags_state1					; hardware - states
-	;										; do not clear HW_flags_state2 !
+	;										; DO NOT clear HW_flags_state2 !
 	clrf	DM_flags_sensor					; hardware - O2 sensors
 	clrf	OS_flags_ISR1					; operating system - ISR control 1
 	clrf	OS_flags_ISR2					; operating system - ISR control 2
@@ -279,13 +335,13 @@
 	clrf	DM_flags_deco					; dive deco modes
 	clrf	MS_flags_control				; menu system - control
 	clrf	MS_flags_imprint				; menu system - data imprinting
-	clrf	CVT_flags1						; convert and display functions
-	clrf	CVT_flags2						; convert and display functions
+	clrf	CVT_flags1						; control of numerical outputs 1
+	clrf	CVT_flags2						; control of numerical outputs 2
 
 	; configure the OSTC model descriptor (stored in HW_descriptor)
 	bcf		tft_power						; inverted, here needed for I2C_probe_OSTC_rx, to wake-up RX circuity
 	bsf		ambient_sensor					; set ambient light sensor as available by default
-	bsf		optical_input					; set optical input        as available by default
+	bsf		ext_input_optical				; set optical input        as available by default
 
 	call	lt2942_get_status				; check for gauge IC
 	btfss	battery_gauge_available			; OSTC 2, cR or TR?
@@ -293,7 +349,7 @@
 
 	; OSTC 2, cR or TR
 	call	lt2942_init						; initialize battery gauge IC
-	bcf		optical_input					; OSTC 2, cR and TR do not have an optical input
+	bcf		ext_input_optical				; OSTC 2, cR and TR do not have an optical input
 
 	banksel	ANCON0							; ANCON0 is outside access RAM
 	bcf		ANCON0,7						; AN7 digital input
@@ -311,21 +367,21 @@
 restart2:
  IFNDEF _hwos_sport
 	btfsc	vusb_in							; USB power detected?
-	bra		restart3						; YES - no BLE then
+	bra		restart3						; YES - no BT then
 	bcf		PORTE,0							; NO  - power up BT chip (if available)
 	WAITMS	d'5'							;     - wait 5 ms
 	btfss	vusb_in							;     - BT chip detected?
-	bra		restart3						;       NO  - no BLE then
+	bra		restart3						;       NO  - no BT then
  ENDIF
-	bsf		ble_available					;       YES - BLE available
+	bsf		ble_available					;       YES - BT available
 
 restart3:
-	bsf		PORTE,0							; power down BLE chip
-	btfsc	ble_available					; BLE available?
+	bsf		PORTE,0							; power down BT chip
+	btfsc	ble_available					; BT available?
 	bra		restart4						; YES - can't be a cR then
 	btfss	battery_gauge_available			; NO  - rechargeable?
 	bra		restart4						;       NO  - can't be a cR
-	bsf		analog_o2_input					;       YES - it's a cR, analog input available
+	bsf		ext_input_s8_ana				;       YES - it's a cR, S8/analog sensor input available
 
 restart4:
 	bsf		lv_core							; default to low voltage core
@@ -347,6 +403,17 @@
 restart4a:
 	bcf		lv_core							;       NO - no low voltage core then
 
+	; OSTC sport 2019 hardware does not have an optical input
+	btfsc	lv_core							; low voltage core?
+	bcf		ext_input_optical				; YES - no optical input available
+
+	; check FLASH for block-write capability
+	bsf		flash_block_write				; default to block-write capability available
+	call	ext_flash_read_jedec			; read JEDEC IDs
+	movlw	0x26							; device type 26h supports block-write
+	cpfseq	hi								; dive type = 26h ?
+	bcf		flash_block_write				; NO  - revoke capability
+
 
  IFDEF _rx_functions
 
@@ -391,7 +458,7 @@
 	btfss	ostc_rx_present					; data transfer successful and TR module up & running again?
 	bra		restart4c						; NO
 	STRCAT	"to "							; YES - print success message
-	call	TFT_print_firmware_rx			;     - print installed version
+	call	dyn_show_firmware_rx			;     - print installed version
 	STRCAT_PRINT " done"					;     - complete result message
 	bra		restart4d						;     - show message for a while
 
@@ -399,9 +466,7 @@
 	STRCAT_PRINT "failed"					; complete result message - failure
 
 restart4d:
-	call	wait_1s							; wait (up to)        1 second
-	call	wait_1s							; wait (another full) 1 second
-	call	wait_1s							; wait (another full) 1 second
+	WAITS	.3								; wait 3 seconds
 
  ENDIF	; _rx_update
 
@@ -417,7 +482,7 @@
 
 restart5:
 	; manage hardware
-	btfss	analog_o2_input					; OSTC with analog input?
+	btfss	ext_input_s8_ana				; OSTC with S8/analog input?
 	bsf		TRISB,3							; NO - shut down power supply for S8 bulkhead
 
 	btfss	battery_gauge_available			; OSTC with gauge IC?
@@ -429,14 +494,13 @@
 	call	get_battery_data				; YES - get last battery data
 
 	; check if option values have changed and thus if the EEPROM needs to be updated
-	btfsc	options_changed					; do the options need to be stored to EEPROM ?
+	btfsc	option_changed					; do the options need to be stored to EEPROM ?
 	call	option_check_and_store_all		; YES - check and store all option values in EEPROM
-	bcf		options_changed					; clear flag
 
 	; set screen orientation
-	bcf		flip_screen						; set default screen orientation
+	bcf		flip_screen						; disable upside-down orientation by default
 	TSTOSC	opt_flip_screen					; shall show screen outputs upside down? (=1: flip the screen)
-	bsf		flip_screen						; YES - set upside-down orientation
+	bsf		flip_screen						; YES - enable upside-down orientation
 
 	; check if high-altitude mode is applicable
 	bcf		high_altitude_mode				; disable high altitude mode by default
@@ -455,39 +519,40 @@
 	banksel	common							;     - back to bank common
 
 restart6:
-	; the dive mode flag can not be set right after cold start, must have been in surface mode before
+	call	TFT_load_std_color_pallet	; load standard color pallet
 	btfsc	divemode						; shall enter dive mode?
-	goto	diveloop						; YES
-
-	btfsc	RCON,POR						; was this a power-on reset?
-	goto	surfloop						; NO  - enter surface mode
-	bsf		RCON,POR						; YES - acknowledge detection and re-arm detector
-	goto	do_new_battery_select			;     - prompt for battery selection, will proceed to surface mode
+	goto	diveloop						; YES - enter dive mode
+	btfsc	RCON,POR						; NO  - was this a power-on reset?
+	goto	surfloop						;       NO  - enter surface mode
+	bsf		RCON,POR						;       YES - acknowledge detection and re-arm detector
+	goto	new_battery_select				;           - prompt for battery selection, will proceed to surface mode
 
 
 ;=============================================================================
-; Setup all flags and parameters for dive mode and simulator computations
+boot4	CODE
+;=============================================================================
+
+;-----------------------------------------------------------------------------
+; Setup of all Flags and Parameters for Dive Mode and Simulator Computations
 ;
 ; called from divemode.asm, menu_tree.asm and surfmode.asm
 ;
 	global	restart_set_modes_and_flags
 restart_set_modes_and_flags:
-	call	disable_ir_s8					; switch off IR/S8 digital interface by default (for all compile versions!)
+	call	disable_ir_s8_analog			; switch off IR/S8/analog interface by default (for all compile versions!)
 
  IFDEF _external_sensor
-	WAITMS	d'100'							; some delay to power down S8-HUD properly
+	WAITMS	d'100'							; wait 100 ms to S8-HUD powered down properly
  ENDIF
 
-	; setup sampling rate
+	; setup sampling rate for dice data recording
 	movlw	.2								; default to 2 seconds
-	movwf	sampling_rate					; write setting
-	TSTOSS	opt_sampling_rate				; check option: 1= 10s, 0= 2s
-	bra		restart_set_modes_and_flags1	; 0 - 2 seconds selected, done
+	TSTOSC	opt_sampling_rate				; check option: 0= 2s, 1= 10s
 	movlw	.10								; 1 - change to 10 seconds
-	movwf	sampling_rate					;   - write setting
+	movwf	sampling_rate					; store selection
 
-restart_set_modes_and_flags1:
-	clrf	DM_flags_deco					; clear all deco mode flags
+	; clear all deco mode flags
+	clrf	DM_flags_deco
 
 	; initialize active_gas and active_dil for surface mode pressure display
 	call	get_first_gas_to_WREG
@@ -507,10 +572,12 @@
 	movff	opt_desat_multiplier_non_gf,char_I_desaturation_multiplier	;     - ...
 
 restart_set_modes_and_flags2:
+
 	; configure GF settings, GF high is needed for color-coding the current GF (supersaturation) factor
 	movff	opt_GF_low, char_I_GF_Low_percentage
 	movff	opt_GF_high,char_I_GF_High_percentage
 
+	; dive mode specific setup
 	movff	opt_dive_mode,lo				; get dive mode: 0= OC, 1= CCR, 2= gauge, 3= apnea, 4= pSCR
 	tstfsz	lo								; OC?
 	bra		restart_set_modes_and_flags3	; NO
@@ -530,7 +597,7 @@
 	call	option_cleanup_oTrMode_CCR		;     - revert TR mode from 'ind.double' to 'on'
  ENDIF	; _rx_functions
  IFDEF _external_sensor
-	call	enable_ir_s8					;     - enable IR/S8 digital interface
+	call	enable_ir_s8_analog				;     - enable IR/S8/analog interface
  ENDIF	; _external_sensor
  ENDIF	; _ccr_pscr
 	return									;     - done
@@ -564,41 +631,11 @@
 	call	option_cleanup_oTrMode_no_CCR	;     - revert TR mode from 'CCR Dil+O2' to 'on'
  ENDIF	; _rx_functions
  IFDEF _external_sensor
-	call	enable_ir_s8					;     - enable IR/S8 digital interface
+	call	enable_ir_s8_analog				;     - enable IR/S8/analog interface
  ENDIF	; _external_sensor
  ENDIF	; _ccr_pscr
 	return									;     - done
 
-
-;=============================================================================
-; Sample and store the current surface pressure, update ISR and deco engine
-; with the surface pressure sampled on last invocation.
-;
-	global	sample_surface_pressure
-sample_surface_pressure:
-	; make sure the ISR does not read the surface pressure reference buffer while it is updated
-	bcf		update_surface_pressure			; cancel any pending load request
-
-	; propagate the surface pressure sampled on last invocation to the reference pressure buffer
-	MOVII	pressure_abs_sampled,pressure_abs_ref
-
-	; update surface pressure in the ISR
-	bsf		update_surface_pressure			; request ISR to update its surface pressure
+;-----------------------------------------------------------------------------
 
-	; update surface pressure in the deco engine
-	MOVII	pressure_abs_ref,int_I_pres_surface
-
-	; sample current absolute pressure (ISR-safe 2 byte copy)
-	SMOVII	pressure_abs,pressure_abs_sampled
-
-	; limit sampled pressure to max allowed surface pressure
-	MOVLI	max_surfpressure,    sub_a		; load upper limit    into sub_a
-	MOVII	pressure_abs_sampled,sub_b		; copy sampled pressure to sub_b
-	call	cmpU16							; sub_a - sub_b = max_surfpressure - pressure_abs_sampled
-	btfss	neg_flag						; sampled pressure > max_surfpressure ?
-	return									; NO  - below limit, done
-	MOVII	sub_a,pressure_abs_sampled		; YES - limit to max_surfpressure (still stored in sub_a)
-	return									;     - done
-
-
-	END
\ No newline at end of file
+	END